0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机堆栈的小故事让你更容易理解堆栈的概念

GReq_mcu168 来源:未知 作者:工程师曾玲 2018-09-23 15:58 次阅读

因为单片机CPU、存储器、IO等等,使他(人性化一点以配合下文)看起来就像一个比较小的计算机,所以在理解单片机的时候如果能把你之前有的那些也许仅仅是直觉上的对计算机的理解融入进来的话,可能会对你学习单片机的概念有极大的帮助,至少对于我是这样的。

我想在关于单片机的众多让你头晕脑胀、摸不着头脑甚至想撞墙的概念里面,“堆栈”可能是其中最可恶的一个,因为即使单单是从汉语的角度来理解这个词就已经让你很晕了,其实我最初也想不通这是哪位大侠的创意,不过不用担心,这里我们完全不去讨论关于这个词的问题(这个词用得其实很好“堆”和“栈”都有他们各自思,准确的概括了这个区域的功能,有兴趣可以Baidu一下),这里我会打一个比较有趣的比方,以此来绕过那些令你想撞墙的概念,并使你在直觉上对“堆栈”这个概念有一个深刻的理解。

你基本上应该清楚,单片机里面是有存储区和CPU的,如果你不清楚,那么我刚刚告诉你了,请记住。现在,请你把单片中的CPU想成一个人(你完全可以把他想成是你宿舍的那个天天和你吵嘴的同学,一会你就会发现这会非常有趣)在这里就叫他C哥吧,不过这个人不同于常人,有一些特点,一会我们会慢慢说清楚,现在要告诉你的关于这个人的第一个特点

是:他的记忆能力很差。下面,请你把存储区想象成一个一个排好的小盒子,这些盒子的作用大致可以分成两类:1、保存写有你命令的纸条,比如你在某个盒子里面的纸条上写着:去洗我的袜子!;2、保存你的一些东西,比如你那双正在污染宿舍空气的臭袜子。因为C哥是一个记忆力不怎么好的人,所以,这些盒子都有自己的编号,以方便他查找。

那么,现在,我们可以来说明一下单片机是如何工作的了。首先,你要把所有的命令还有需要处理的东西放进那些小盒子,比如刚才提到的你那双待洗的袜子还有那张纸条,这时你应该发现C哥另一个特点:笨——他只会做你明确告诉他的事情,也就是说,如果你没有在纸条上写“去洗我的袜子!”,那么C哥极有可能会无动于衷地看着你的袜子直到他被熏晕倒,当然,更可能的情况是他根本找不到你的袜子…

好了,当你把要做的事情和该怎么做写到盒子里之后,下面的任务就交给C哥了。C哥做事真的很讲原则,他会按照你给定的顺序或者——如果你没有给定的话,根据盒子上面的编号按照从小到大的顺序——一个一个地打开盒子,读取里面的命令、处理相应的事件,直到所有的事情都执行完毕,他就会休息。请你牢记这个简单而有趣的过程,因为其实单片机就是这样工作的,当然,这里忽略了许多细节,但是这对你从直觉上理解单片机的概念以及足够了。

下面,就要开始说明堆栈这个概念了,思来想去,还是觉得如果直接把“堆栈”这个词用到文中来,实在不符合本文的风格,考虑到其实“堆栈”也是存贮区(这一点你要记住,堆栈并不是一个像专用寄存器那样专门的一个区域,它是由你在通用RAM区指定的。),按照本文的说法也就是一些盒子,所以,现在我们把“堆栈”改名“记忆盒子”,你可以感觉到,“堆栈”的作用和记忆有极大的关系,不过你也不用在这里纠结这个名字的由来,下面我会说的。

现在,请注意,我要开始解释“记忆盒子”了,也就是“堆栈”。大致上说,“记忆盒子”的作用是当C哥执行某任务到一半的时候突然有了更紧急的是事情要执行的时候用来保存当前任务的(包括盒子的编号和盒子里面的东西)。这么说你肯定晕了,其实,通俗一点,就是当C哥洗袜子洗到一半的时候突然接到你的命令要去打开另一个盒子(那个盒子里的纸条上可能写着“给我换尿布”)并执行里面的命令,因为C哥记忆力很差,以至于他做完那件紧急的事情后记不起要回到哪个盒子来继续执行“洗袜子”这个命令,这时候,他要把现在手头的东西保存到“记忆盒子”里,要保存的东西有:

1、放着纸条和袜子的盒子的编号(注意这里其实是两项内容);

2、那双袜子。这样,当他执行完紧急任务后会去记忆盒子里,从里面找到两张纸条,和一双袜子(这个时候C哥还是没有想起来他要洗袜子,他必须要到那张写着洗袜子命令的纸条),他按照两张纸条的信息知道自己要去哪个盒子去洗袜子,并在那里继续完成洗袜子的任务。你可能会发现,在这一段的解释里面有一个重要的漏洞,那就是在C哥执行完紧急任务后他是如何知道储存着原来的任务信息的盒子的编号是存储在哪个“记忆盒子”里呢?

别着急,下面我会解释的。从本质来说,“记忆盒子”与普通的盒子是没有区别的,他们都是单片机里面的存储单元,证明这一点的最好证据就是堆栈是需要你来指定的,也就是说,你要预先把一些盒子指定为“记忆盒子”。下面,说明一下是如何指定“记忆盒子”的。

其实这个过程很简单,在单片机的专用寄存器里面有一个SP指针(81H),这个指针里面记录着堆栈的开始处的地址。用符合本文的话来解释就是,C哥的衣服上有一个口袋(也就是SP指针),这个口袋里面的“神奇纸条”上记录着第一个“记忆盒子”的编号,而指定“记忆盒子”的过程就是你在这张“神奇纸条”上写上一个盒子的编号(作为第一个“记忆盒子”的编号),这个纸条会自动地将纸条上的编号加1或者减1,所以,某个目前并不确定的区域内盒子具备了成为“记忆盒子”的可能,注意,堆栈的大小是不能规定的,这就是为什么用“生长”这个词来形容堆栈。

现在,关于堆栈的概念基本上都介绍完了,但是,我知道,你可能还是很晕,甚至比看之前还晕,那是因为刚才叙述的这个过程是分开的,而且逻辑上并不是顺序的,下面,顺序的说一下,相信你马上就明白了。主角仍然是傻傻笨笨但任劳任怨的C哥,他一个一个的打开盒子按照里面的纸条上的说明执行你规定的任务。而你,为了防止他在执行复杂任务时犯傻,把一个盒子指定为“记忆盒子”,并把这个“记忆盒子”的位置写在了一张“神奇纸条”上放在了C哥的口袋里。

现在,C哥正在洗你的袜子,这个时候,他突然接到你的命令要去给你换尿布,而C哥知道自己很笨,所以他自动地掏出了口袋里的纸条,找到了第一个“记忆盒子”,然后拿出一张空白纸条,把装着“给我洗袜子”那张纸条的盒子的编号写在了上面并放进“记忆子”。然后,他把“神奇纸条”放回了口袋里。当这个任务完成后“神奇纸条”会自动将写在它上面的编号加1也就是将一个新的、空的“忆盒子”的编号写在上面。

之后,他会按照刚才的过程把装着袜子的那个盒子的以及袜子本身分别放进不同的记忆盒子(现在已经有三个盒子成为“记忆盒子”,堆栈已经长大了,红色下划线的字体就是这三个盒子里的内容,注意是有先后顺序的)。再然后,他就去给你换尿布了… 现在,尿布换完了,不过,果不其然,C哥完全忘记了他要给你洗袜子这件事情了,不过,他记得一件事,那就是看口袋里的纸条。于是,他摸出了口袋里的纸条,上面当然是一个“记忆盒子”的编号,他按照编号找到了第一个“记忆盒子”(按照上一段的顺序应该是第三个“记忆盒子”),里面应该是一双你的袜子,于是他拿到了你的袜子。但是,他还是不知道。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632731
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211100
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19728

原文标题:一个讲透了单片机堆栈的小故事

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详解STM32单片机堆栈

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对理解堆栈有帮助。 对于
    发表于 01-12 11:30

    单片机堆栈理解

    参考链接:对单片机堆栈理解STM8数据手册给出了堆栈的位置及大小。栈是从高到低分配,堆是从低到高分配。堆栈是内存中一段连续的存储区域,用来
    发表于 02-21 07:29

    合泰单片机HT48软件堆栈的应用

    对于 Holtek 八位元单片机来说,堆栈资源往往是有限的。例如,HT48R10A-1 就只有两级堆栈。 本文将介绍如何利用软件堆栈来解决这一问题。软件
    发表于 04-20 17:40 95次下载

    关于堆栈的深入理解

    这里提了三个概念: 堆,栈,以及堆栈。我把栈和堆栈概念等同了。所以,接下来只要把两个概念弄清楚就可以了:堆和栈。先说由来。由于我的工作大部
    的头像 发表于 03-04 15:57 4193次阅读
    关于<b class='flag-5'>堆栈</b>的深入<b class='flag-5'>理解</b>

    51单片机堆栈的作用和使用资料讲解

    堆栈的作用是用在调用子程序或中断程序时保护现场,因为51单片机的寄存器是十分有限的,而相对来说普通数据存储器充足,通过入栈将寄存器中的内容临时保存到堆栈中(普通数据存储器),这是一个
    发表于 06-13 17:45 2次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>堆栈</b>的作用和使用资料讲解

    什么是单片机堆栈单片机堆栈有什么作用和原理说明

    什么是单片机堆栈?在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈
    的头像 发表于 08-03 09:29 2w次阅读

    51单片机多任务定时器和公共堆栈与私堆栈的源代码和工程文件

    本文档的主要内容详细介绍的是51单片机多任务定时器和公共堆栈与私堆栈的源代码和工程文件。
    发表于 12-26 15:37 15次下载
    51<b class='flag-5'>单片机</b>多任务定时器和公共<b class='flag-5'>堆栈</b>与私<b class='flag-5'>堆栈</b>的源代码和工程文件

    STM32单片机堆栈深入解析

    学习STM32单片机的时候,总是能遇到堆栈这个概念。分享本文,希望对理解堆栈有帮助。 对于了解
    的头像 发表于 10-30 17:31 4683次阅读
    STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>堆栈</b>深入解析

    一个简短的小故事带你摸透单片机堆栈

    学习单片机概念有极大的帮助,至少对于我是这样的。 我想在关于单片机的众多头晕脑胀、摸不
    的头像 发表于 10-30 20:55 443次阅读

    单片机堆栈是什么?它的原理和作用又是什么?

    什么是单片机堆栈?在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。它的作用子程序调用和中断服务时CPU自动将
    发表于 11-11 10:51 70次下载
    <b class='flag-5'>单片机</b><b class='flag-5'>堆栈</b>是什么?它的原理和作用又是什么?

    分析单片机堆栈,分享个人理解

    看关于单片机方面的书籍的时候,总是能看到别人说的一些堆栈啊什么的操作,之前看到这个术语就直接跳过,没想到去探究单片机内部的原理。但是最近课程学习微机原理这门课,需要我们写汇编程序,汇编里面经常遇到
    发表于 11-22 09:21 6次下载
    分析<b class='flag-5'>单片机</b><b class='flag-5'>堆栈</b>,分享个人<b class='flag-5'>理解</b>

    51单片机堆栈深入剖析

    上的扩展,既有C语言的共性,又有它自己的特点。本文介绍的是Cx51程序设计时堆栈的计算方法。   1.堆栈的溢出问题。MCS51系列单片机堆栈设置在片内RAM中,由于片内RAM资源有
    发表于 11-22 16:36 16次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>堆栈</b>深入剖析

    详解STM32单片机堆栈

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对理解堆栈有帮助。
    发表于 02-08 15:41 5次下载
    详解STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>堆栈</b>

    一个故事看懂单片机中的堆栈

    理解单片机的时候如果能把之前有的那些也许仅仅是直觉上的对计算机的理解融入进来的话,可能会对学习单片
    发表于 02-08 17:00 0次下载
    一个<b class='flag-5'>故事</b>看懂<b class='flag-5'>单片机</b>中的<b class='flag-5'>堆栈</b>

    普通单片机与STM32单片机堆栈的区别

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对理解堆栈有帮助。
    的头像 发表于 04-13 11:15 3136次阅读