历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | 51单片机的内存映射(二)

2022-12-15 来源:zhihu

本篇主要讲述单片机的FLASH内存映射,首先来看一下FLASH的内存映射表:

上图中启动地址是0x0000,也就是单片机上电后PC指向的这个位置,我们把需要执行的程序的首地址放在其中,对应的汇编语言如下图所示:



0地址去执行内部RAM的初始化工作,后面的代码控制寄存器指挥PC去取地址,以此来决定程序的运行!


在这里大家有没有觉得很奇怪:51单片机里面为什么没有时钟的初始化和中断向量表的初始化呢?其实原因很简单, 51单片机对12M晶振的时钟进行12分频,它就是固定的1M,因此就不需要设置时钟了。而STM32就不一样了,用户可以随意配置单片机的工作时钟。另外还有一个问题,单片机为什么不去中断向量表的注册呢?这是因为51在内部ROM中做了固定的映射,不需要再去重定向,所以在线升级就很难了。而STM32是支持中断向量表重定义的,它是将注册好的中断向量表搬运到SRAM中去,然后NVIC就会对中断作出更加快速的响应,显然51中断向量表在ROM中,中断反应就没有那么迅速了。这就是51单片机不需要做系统时钟的初始化和注册中断向量表的原因。


接下来要做的工作是初始化系统堆栈和可重入函数栈的初始化,下面是51系统堆栈初始化的汇编代码:


注意:汇编里面用;号来表示代码的注释。

栈的大小是可以重新设计的,因为SP初始化的时候它指向的地址是0x07,为了不让它与中断向量表和位寻址区重叠,我们可以将SP设置在30H以后(推荐0x60),即通用RAM区以后最安全。这是因为一般的C编译器是将局部变量放入栈中,而C51是将其放入内部RAM,开辟一片存储空间,多个函数共享该覆盖区。【是不是很怪异呢?】这样我们不得不留出一部分空间给局部变量。其实这并没什么好奇怪的,51只是单纯的想用SP传递参数和保护现场以及恢复现场等功能,这和一些单片机是有区别的,但是也导致了一些问题,各函数之间没有直接或间接的调用关系,则其局部变量空间便可覆盖。

如果一个函数同时被多个函数调用,可能会造成某些变量被冲掉,因此C51中的函数基本上都是不可重入的。也就说明一个问题,51没法调用递归函数,多任务调用同一个函数时会把一些参数覆盖掉。因为他们占用的内存地址是一样的,当然会被冲刷掉啦!!但我们也不必为之烦恼,51为我们提供了如下的解决方案,启动器文件中的可重入栈的设置和关键字reentrant。


上图是设置可重入栈空间的汇编代码,不过该栈是向上增长的,上面代码就是初始化了栈顶而已。

再看下图:


这样,关键字reentrant的使用就可以实现函数的递归调用,上图中的程序就是一个递归程序案例,以此来实现一个数的阶乘运算。


再看看我们的ROM是如何扩展的。


P0是地址总线的低八位,和数据总线共用同一个端口,ALE决定了你输出的是地址还是数据,幸运的是ALE的高低电平CPU会自动控制,不需要我们去操作。PSEN连接EPROM的片选。最后P2端口连接EPROM的高八位地址总线,这样就实现了内部ROM的扩展。


好了,让我们再来回顾总结一下以上内容吧,本篇主要讲述了三个方面的内容:第一,51单片机ROM向量表地址和启动地址。第二,系统栈以及可重入栈的初始化,可重入栈的重要作用(尤其是在可重入函数传递参数方面的使用)。其实这两个方面的内容也可以说是51单片机进入C世界所进行的大部分设置。除此之外,还讲述了51单片机在硬件电路设计上扩展ROM(最大可扩展64K.因为只有16跟地址线)的方式。(完)


推荐阅读

史海拾趣

EXCELSEMI [ EXCEL SEMICONDUCTOR INC. ]公司的发展小趣事

为了满足不同客户的需求,EXCELSEMI公司不断扩展产品线。除了传统的半导体芯片产品外,公司还涉足了功率半导体、传感器、智能模块等领域。通过多元化的产品线布局,EXCELSEMI能够为客户提供一站式解决方案,增强了市场竞争力。

BILIN公司的发展小趣事

为了满足不同客户的需求,EXCELSEMI公司不断扩展产品线。除了传统的半导体芯片产品外,公司还涉足了功率半导体、传感器、智能模块等领域。通过多元化的产品线布局,EXCELSEMI能够为客户提供一站式解决方案,增强了市场竞争力。

GSR Technology Ltd公司的发展小趣事

为了应对市场需求的多样化,GSR Technology Ltd开始实施多元化产品策略。公司在保持GSR技术领先的同时,逐步向汽车电子、智能家居、安全监控等领域拓展。通过技术创新和定制化解决方案,公司成功推出了多款具有市场竞争力的电子产品,进一步拓宽了市场份额。同时,公司加强市场营销和品牌建设,提升了品牌知名度和美誉度。

星海公司的发展小趣事

星海钢琴集团有限公司的起点可以追溯到1949年成立的北京钢琴厂。在那个特殊的年代,陈艾生等红军战士为实现张贞黻的遗愿,即“北平解放后,一定要办起我们自己的乐器厂”,他们四处奔走,多方求助,最终成功创办了星海钢琴厂。从最初的手工制作到现代化生产线的建立,星海钢琴不断传承和发展,成为中国乃至世界知名的钢琴品牌。

Connection One公司的发展小趣事

在电子行业的初期,Connection One公司凭借其创始人对半导体技术的深刻理解,成功研发出一款具有划时代意义的芯片。这款芯片不仅性能卓越,而且功耗极低,立即在市场上引起了轰动。公司因此迅速积累了第一笔资金,为后续的研发和扩展打下了坚实基础。

Continental公司的发展小趣事

Continental公司,即大陆集团,始建于1871年,总部位于德国的汉诺威市。最初,公司的主营业务是生产橡胶制品以及实心马车和自行车轮胎。在公司的早期历史中,一个关键的转折点出现在1882年,公司决定以猖獗的烈马作为品牌LOGO,象征着所生产的轮胎像强壮的烈马一般所向披靡。这一标志不仅赋予了轮胎强大的象征意义,还让人们开始将这些轮胎称为“马牌轮胎”。进入19世纪90年代,大陆集团成为了第一家生产充气马车和自行车胎的德国公司,这标志着其在轮胎制造技术上的重要突破。

问答坊 | AI 解惑

WinCE6.0似乎读写文件比较5.0的慢

200K的数据,每次16个字节去写,5.0只要7秒左右,6.0要2分半钟左右,同一段代码产生的结果,非常疑惑。 另外,6.0似乎在写文件的过程中,我拔掉SD卡,似乎非常容易造成SD卡乱码(似乎是FAT乱了才导致文件全是乱码),上述写文件过程中会不断改变文 ...…

查看全部问答>

Protel99se如何设置PCB层数啊

Protel99se如何设置PCB层数啊, 现在一只要一创建PCB文件就是N层的,我也不知道在那编辑层数. 但我现在想设计单层,双层,4层板,因该怎么设置啊. 新手.谢谢.…

查看全部问答>

arm的jtag小板上复位电路三极管作用?

现在调试arm都要用jtag,常用的是wigger jtag,我看上面就是一个244,然后就是一些上拉电阻。 我在网上看有的电路图有2中情况: 情况1:PC并口的DB2经过一个三极管,然后连到jtag的rst信号, 情况2:PC并口的DB2先经过244,然后从244出来后再经 ...…

查看全部问答>

对于一个初学编程的人,怎么算学完c语言,要达到什么程度

我学C语言有2个月了潭号强的书看了2遍了,可我觉得对c语言还是很迷茫,对于一个初学编程的人,怎么算学完c语言,要达到什么程度,我对c语言的方向还有了解一点的,c语言的未来是底层开发和嵌入式系统,想用他就业不可能,那C语言要学到什么时候才可以 ...…

查看全部问答>

为了项目需要开始学习WinCE嵌入式开发,都需要什么工具

为了项目需要开始学习WinCE嵌入式开发,在开发中会用到SQL数据库,那么我都需要什么开发工具来展开项目呢?…

查看全部问答>

LED制造应用相辅相成 五大因素决定显示屏质量

replyreload += \',\' + 679766;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

求助 UART通讯的问题

大家好啊,我用的是6713的板子作为高速数据处理。DSP能够处理的过来,但是在利用两个UART进行数据通信,PC对两个口进行发数据的时候,刚开始可能接受到几帧数据,但是马上DSP就不会响应中断了! 各位大侠知道是怎么回事啊?…

查看全部问答>

家用电话怎么通过51单片机和isd2560相连接啊?非常感谢啊

家用电话怎么通过51单片机和isd2560相连接啊?非常感谢啊…

查看全部问答>

关于单片机开发软件Keil的问题

我是个新手,请大家多多指教! 我的电脑系统是win7的64位系统,请问下大家Keil在这个系统下能否正常 运行C程序??? 顺便再问下大家有没有支持win7 64位系统的VC环境,如果有可不可以发 给我一下,我的QQ是121268270. 谢谢大家帮忙解答!!!…

查看全部问答>

NAND FALSH可以进行位扩展码

我手头上有两块Micron的8-bit的NAND FLASH,想扩展成一片16-bit的,不知道可不可以实现呢? …

查看全部问答>