历史上的今天
返回首页

历史上的今天

今天是:2025年03月17日(星期一)

正在发生

2021年03月17日 | 51单片机是怎样存储程序和数据的?

2021-03-17 来源:eefocus

MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。


好,说回MCS-51。


对于程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0000-0x0FFF的这一部分是否使用呢,这取决于单片机EA引脚的电平值。EA=1时就是使用内部ROM的这一部分,外部ROM的这一部分浪费不用;EA=0时就是使用外部ROM的这一部分,内部ROM浪费不用。从CODE段读取数据要使用汇编的MOVC指令,单片机会根据MOVC指令、EA状态、要读取的地址值,来自动地判断从什么存储器里取数据。


对于数据存储器,则分为内部数据存储器(IDATA/RAM)和外部数据存储器(XDATA)两个部分,但这两个存储器就不像code存储器那样共享地址空间的了。一般的8051芯片,内部RAM只有128B,从0x00-0x7F,而从0x80-0xFF则是SFR(CPU工作寄存器和各种外设寄存器都在此)的区域。对于8052来说,内部RAM有256B,所以0x80-0xFF是高128B的RAM在使用。可这部分不是SFR专用的吗?是SFR专用,但注意,SFR的访问只能使用“直接寻址方式”(使用特定的汇编指令来实现),区别就在这里。只有通过直接寻址访问的地址才是SFR,否则就是普通的RAM。至于外扩的RAM(XDATA),地址也是从0x0000-0xFFFF的,而且这里的0x0000和内部RAM的0x00是不同的,是完全独立的两个空间。他们的访问方法也是不同的。MCS-51使用MOVX指令,来读写XDATA区。而且,访问XDATA区,是需要DPTR寄存器来辅助的。因为只有DPTR才能装得下十六位的XDATA地址。


所以说,MCS-51读写IDATA区的速度是最快的,而且访问方法也是最多的。访问XDATA区的速度相对就要慢很多。MCS-51的堆栈要优先开辟在IDATA区中,并且在IDATA区中开辟的堆栈,可以使用栈指针寄存器SP来控制。如果栈实在太大,只能开辟在XDATA区中,那么CPU的SP寄存器就很难借力,只能由我们自己来构造堆栈结构和堆栈指针。既然外部程序空间和数据空间都是0-64K(0x0000-0xFFFF),那么我实际上可以为了省事/方便改写程序等原因,外部的CODE和DATA就可以共用一个可擦写存储器了(比如各种RAM什么可擦可写的)。比如系统有64K的外扩MEMORY,低32K我用作保存CODE,并让单片机在这32K之中读取程序运行,高32K我作为用户数据的保存处,完全可以。只是此时本来完全独立的CODE和DATA空间,因为在硬件芯片上共用了一个MEMORY,所以他们之间就可能互相影响了,程序就能自己改写程序了。比如0x0020处是一个指令,我通过MOVX把0x0020处改写了,那么再利用MOVC把0x0020处读取出来,数据就和原来不一样了。


易混淆的症结在于,单片机存储空间是一个逻辑上的概念,是人为划分出来的两个相互独立的空间。而硬件电路上的MEMORY芯片则是现实中的概念,单片机的存储空间最终会落实在电路层面的芯片上,所以逻辑上的存储空间会因为物理上的电路连接而发生重叠。但是在逻辑层面上,这两个空间还是完全独立的。


附:各类存储空间名称的定义:


data:固定指前面0x00-0x7f的128个RAM,可以用a寄存器直接读写的,速度最快,生成的代码也最小。


idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mov ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG, 建议少用。但也有他的优点,具体用法属于中级问题,我不太会,所以这里不提。


推荐阅读

史海拾趣

Gaomi Xinghe Electronics公司的发展小趣事

背景:在21世纪初,Galaxy公司凭借其在电子产品领域的深厚积累,决定进一步拓展国际市场。通过详细的市场调研,公司发现欧洲市场潜力巨大,特别是对高质量电子产品的需求日益增长。

行动:于是,Galaxy在波兰Cracow成立了欧洲分公司,地处欧洲中部,这一地理位置使其能够很好地覆盖整个欧洲大陆,包括东部和西部的国家。该分公司不仅作为销售中心,还承担起返修件回收处理的重任,确保客户能够享受到无时区差别的销售和维修服务。

成果:这一战略部署显著提升了Galaxy在欧洲市场的知名度和竞争力,市场份额逐年攀升,为公司的全球化进程奠定了坚实基础。

东晶(ECEC)公司的发展小趣事

为了满足市场需求和降低成本,东晶电子不断进行产能扩张和自动化升级。公司引进了国际先进的生产设备和技术,提高了生产效率和产品质量。同时,公司还加大了对自动化设备的投入,减少了人力成本,提高了生产效率。这些措施不仅提升了公司的竞争力,也为公司的长远发展奠定了基础。

Bombardier Inc公司的发展小趣事

庞巴迪公司的起源可以追溯到蒙特利尔的一家机械厂,该公司在第一次世界大战期间开始涉足军工制造,为英国组装H级潜艇。随着战争的结束,庞巴迪逐渐将业务转向了航空领域。1923年,公司开始设计并生产水上飞机,这些飞机被装备于1924年成立的加拿大皇家空军。这一时期,庞巴迪在航空电子设备的设计和制造上取得了显著的进步,为其后续的航空业务发展奠定了坚实的基础。

CNC Tech公司的发展小趣事

为了进一步扩大市场份额和影响力,CNC Tech公司积极实施全球化战略。公司通过参加国际展会、设立海外分支机构等方式,加强与全球客户的交流与合作。同时,CNC Tech还积极引进国际先进的技术和管理经验,不断提升自身的竞争力。在全球化战略的推动下,CNC Tech的产品和服务逐渐打入国际市场,赢得了全球客户的认可和信赖。

Fujisoku Corporation公司的发展小趣事

随着全球化进程的加速,“未来电子”意识到单一市场已无法满足公司的长远发展需求。于是,公司制定了全球化战略,通过设立海外研发中心、生产基地和销售网络,积极拓展国际市场。在欧洲、北美和亚洲等地,“未来电子”的产品和服务得到了广泛认可,市场份额逐年攀升。这一战略不仅提升了公司的国际影响力,还为公司的持续增长提供了强劲动力。

FEIG ELECTRONIC公司的发展小趣事

FEIG ELECTRONIC成立于1978年,作为德国射频识别(RFID)系统的先驱,公司从一开始就专注于RFID技术的研发与制造。在创立初期,FEIG凭借其独特的技术视角和对市场需求的敏锐洞察,成功开发了一系列RFID系统,为物流、零售等行业提供了有效的解决方案。通过不断的技术创新和市场拓展,FEIG逐渐在RFID领域崭露头角。

问答坊 | AI 解惑

微电子今年工作这么好找?

去公司的话本科大约4k左右,硕士平均7K左右。华为最低6.5k但说长期发展工资可能涨的快,其他国内小点的公司在7.5k,外企一般在8.5k以上,像marvell,NVIDIA,AMD都是高薪,工资基本都贴近10k,据说NVIDIA最高,学微电子的进入这样的公司待遇不错, ...…

查看全部问答>

程序调试问题

嵌入式CE系统,怎么用EVC++4.0连接调试应用程序,有哪些方式?望做过这方面的指教指教!…

查看全部问答>

寄存器的访问

  各位高手帮帮忙啊,我现在在调试SEC(加密引擎)驱动,发现个问题,当我bootrom起来用d 命令去访问加密引擎的寄存器时(d 0xf0040000)是可以访问的(在syslib.c)里面已经映射好了,但是一运行我的应用程序,虽然我应用程序什么都没做 ...…

查看全部问答>

μC/OSⅡ与ARM开发嵌入式系统问题

在基于ARM的嵌入式系统开发过程中,可以有多中操作系统,如μC/OSⅡ,Linux,WinCE等,在Linux开发的书籍中,经常看到介绍BootLoader的,在μC/OSⅡ开发的书籍中,没有介绍BootLoader的,是不是开发基于μC/OSⅡ的嵌入式开发不需要BootLoader的引导 ...…

查看全部问答>

多点温度测量系统设计

随着社会的进步和工业技术的发展,人们越来越重视温度因素,许多产品对温度范围要求严格,而目前市场上普遍存在的温度检测仪器大都是单点测量,同时有温度信息传递不及时、精度不够的缺点,不利于工业控制者根据温度变化及时做出决定。在这样的形式 ...…

查看全部问答>

工作现状-求前辈指点

我 [ 本帖最后由 sdljt007 于 2011-11-17 17:02 编辑 ]…

查看全部问答>

launchPad 串行显示图片的问题

最近玩12864串行程序,在做图片时,将并行口程序的图片数组复制过来,出现了如图的错误,认为串口和并口不一样的传输方式,在显示图片是有什么不同...求大神发一个串行图片的程序。。…

查看全部问答>

有谁做过LC谐振放大器这道题啊,电源模块是怎么设计的

本帖最后由 paulhyde 于 2014-9-15 03:45 编辑 3.6V我们组原先是用的LM317/337搭的的电源,但是接上本题所需要的晶体管放大电路就带不动载了,3.6V最高输出只有2.2V,求有经验的一起分享下  …

查看全部问答>

如何连接三个实验箱

怎么将三个实验箱连接起来呢?TMS320F2812,我要做一个实验,利用DSP片上的SCI模块,研究多级串行通信,实现三个实验箱之间的DSP的通信实现三个直流电机的轮流转动…

查看全部问答>

毕业设计,无厘头。

我的毕业设计是基于CC2530的无线网络节点设计,没有一点思路,不知如何下手。求各路高手指点迷津,尔等你不胜感激。帮帮忙啊各位,帮我理个思路,从哪开始。…

查看全部问答>