程序的各段存在RAM还是ROM?

写在前面:

2018年前的最后一天班,临时总结一下程序在整个嵌入式芯片的运行过程与所涉及到的堆栈问题

  1. 从头说起

普通的嵌入式芯片分为处理器cortex-m4、闪存Flash、内存RAM。其中我们编译成机器码的bin文件是直接烧写进Flash,(后续想要做OTA空中升级的朋友们,只需要修改Flash里面的二进制文件就可以对之前的固件进行升级)。

程序开始启动

  1. 当系统上电后根据BOOT的引导配置选择启动方式,默认是Flash启动,这时系统开始把所有的代码段搬到RAM中去运行
  2. CPU就从内存中(RAM)获取数据和指令,根据相关指令来控制系统运行
  3. 数据存放位置:除了特定IO操作存到EEPROM里面,其他变量的使用全在RAM区,其中就有堆和栈。是由用户手动分配malloc,在整个程序运行期间都有效除非手动释放free。而在一个函数体内存在,例如main方法由系统自动创建,如果出现递归创建则很容易导致栈溢出,当系统执行完该函数功能后,栈空间数据也由系统自动销毁。

ROM和RAM数据比较
在这里插入图片描述

堆和栈的实际定义大小可查看,在.map文件中
在这里插入图片描述

总结

内存大小直接体现该系统所能同时运行的任务数,而所有系统运行中产生的数据存放位置全都在RAM区。除了读写磁盘

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
主要内容: 一楼: 一. 简单原理介绍 二楼: 一. 复制代码, 建立并配置工程 二. 修改部分代码 三. 测试结果 (看不到图片的可以下载4楼的word文档, 移植成功的程序代码在6楼) 前段时间发了这个教程: http://www.armbbs.net/forum.php?mod=viewthread&tid=10423 把标题定为教程实在是我自夸了点, 其实应该算是我学习的总结吧, 写份文档, 自己以后忘了也有个参考, 又可以帮助和我卡在同一个问题的新手, 其实我也是新手, 新手教新手, 不知道会不会误导大家了... 一. 简单原理介绍 那个教程里面主要讲了一些简单的配置, 原理没有仔细介绍, 其实当时我也不太懂, 当时看重的是实际效果, 原理嘛, 在我们从SB到NB的过程会慢慢理解的, 现在稍微理解了一点, 在写这篇教程之前简单介绍一下之前的存储器的地址配置的问题吧, 也和等会移植的内容有关啦, 耐心看吧: TQ2440开发板算起来应该是有3个片外存储器吧, 一个是 nand flash, 一个是 nor flash, (这两个应该算是ROM了), 还有一个SDRAM (就是RAM啦, SDRAM是个什么东西, 还没学数电...不知道...) 首先,2440的程序代码是可以存放在SDRAM里面运行的.从汇编上讲, 就是程序指针(PC指针, 程序计数器, 各种称呼, 指向一下条要执行的程序代码 的一个寄存器)可以指到SDRAM的内存单元. 然后再说nor flash, 2440的程序也可以在nor flash里执行, 原因我不清楚. 从nor flash启动的时候, PC指向的0地址就是nor flash的首地址, 就是说nor flash 的首地址映射到内存的0地址, 对比一下SDRAM, SDRAM在2440是映射到0x3000 0000 地址 然后是nand flash, nand flash 也是映射到了 0地址, 为样就和nor flash有冲突了, 所以就有了从nor 启动和从nand启动的区别了, 然后我又想说, 其实nand本身是不能运行程序的(这里的意思是说, 因为nor flash本身为了容量大和本身的接口, 是不能向CPU不断的快速的输送指令的, 我的理解就是这样, 大家可以去参考nor 和 nand 的区别的资料), 既然我说nand不能运行程序, 那个地址映射有什么意义? 是这样的, 2440从nand启动的时候, 它内部的nand flash控制器会把前4k的代码复制到内部的缓存去执行, 而这些缓存就是对应地址的0单元开始. (其实这个直接去参考2440 datasheet 上的地址映射会比看我在这里瞎说的强...) 刚才说了从nand启动的时候是把前4k的代码复制到内部的缓存去执行的, nand flash的容量远远远远大于4K呀, 不充分利用就太浪费了...如果你的程序超过4K了怎么办? 很简单, 你在前4K的程序里, 利用什么for啊while之类的把剩下的代码复制到SDRAM里面去, 复制完了以后后再用一条汇编指令 ldr (用来跳转到绝对地址的, 类似C语言的goto, 但有点区别) 跳到SDRAM里面继续执行, (因为前4K的代码在内部缓存运行的时候对应的地址是从0-4K的, SDRAM是的地址是从0x30000000开始的, 你不跳, 就等着系统崩溃吧). 刚才说的这些工作你可以自己写代码, 也可以移植个boot loader来帮你做, 操作系统就是从boot loader开始的...这部分我没学, 不说了... 那么ldr指令是怎么跳转的? 在2440init.s里有这两句, ldr pc, =copy_proc_beg copy_proc_beg 类似C语言的 goto copy_proc_beg copy_proc_beg: 注意, 我说的是类似, 从汇编层面是讲, 是有很大的不同的, 我比较懒, 就不详细解释了 上面的ldr 的作用就是: 你的工程最后生成可执行的代码里面, copy_proc_beg 对应的地址(绝对地址, 就是说应该放在存储器的哪个位置), 会被复制到PC指针, 所以我们在nand启动的工程配置里, rom应该是这样的: srart(开始): 0x30000000 size(大小, 我这里是随便设置的): 0x800000 抱歉, 我之前的教程里的生成下载到nand的bin文件的那部分配置讲错了, 当时并不理解, 不过, 小于4K的程序还是可以用的了^_^ //////////////////////////////////////////////////////////////// 补充: 其实教程1那里的只有把ROM配置成从0x0开始才是可以正常运行的, 原因是用了KEIL给的启动代码, 有一句是这样的 IMPORT __main ; 相当于extern void main() LDR R0, =__main ; 跳到main函数的绝对地址去执行 如果rom 设置 0x3000 0000 开始的话, 教程1的代码里又没有进行搬移的工作, 跳到SDRAM里去, 没有代码, 程序就不能正常运行了 //////////////////////////////////////////////////////////////// 这样, 编译器生成以后, 标号copy_proc_beg对应的地址是0x3*******, 也就是在SDRAM里面, 然后你在运行前4k的程序的时候PC指针的内容是0x00000***, 完成之前说的代码从nand flash到SDRAM的搬移工作后, 用一条 ldr pc, =copy_proc_beg 指令, 把PC指针的内容改成0x3*******, 就跳转到SDRAM里面运行了 基本的原理讲到这里, 洗澡去, 等会再进入正题...顺便想一下有没有需要补充的... //////////////////////////////////////////////////////////////// 补充: 用JLINK在SDRAM调试的时候, ROM配置也是 srart(开始): 0x30000000 size(大小, 我这里是随便设置的): 0x800000 然后你按下调试键的时候, 代码由J-LINK帮你复制到SDRAM了, 然后再把PC指到0X30000000开始执行, 这J-LINK的这些工作是由一个初始化文件(教程1里配置的时候从keil的安装目录那边复制过来的文件)指导完成的. 如果你在调试的时候按了这个键 就把单片机给复位了, 然后PC指针指向的地址就是0, 如果你再点运行, 除非你的nand flash 或 nor flash里面有程序, 要不然是不会正常运行的, 即使有程序, 也不能正常调试, 你要把PC指针改回0x30000000才可以让2440继续跑你要调试的程序, (双击PC又边的数字 0x00000000就可以改他的值了) 关于nor flash的设置, 没什么好讲的了, 从0开始执行, 嗯, 就这样了 //////////////////////////////////////////////////////////////// 更正:经29楼网友指出,原文的这一段是错误的,ARM9是哈佛结构的,已经删了 “2440算是冯诺什么曼结构的计算机, 通俗的说, 2440的程序代码是可以放在RAM里面执行(我们的PC机也是这种类型的), 不同于51, 也许你会注意到, 51的程序是不能在内部的RAM里面执行的, 现在的51单片机的程序一般是存在片内的ROM里的, 传统的51的内部RAM顶多也就那么256个字节, 变量都存不了几个, 运行个鬼程序, 51单片机算是哈佛结构的.”
计算机程序设计-计算机程序设计综合练习 1、在信息技术条件下,保护个人信息采取的措施不当的是()。 A.接受不明的移动硬盘拷贝个人计算机资料 B.不在电脑上保存自己的信箱密码 C.不将计算机交给不明人员修理 D.不得随意将自己的计算机借给别人用 2、数字形式的媒体的主要特征是通过计算机网络将文本、图片等信息用()来表示。 A.二进制编码 B.八进制编码 C.十进制编码 D.十六进制编码 3、信息的基本特征之一()是指信息是事物运动的状态和存在方式,而运动、发展、变 化是宇宙的普遍规律。 A.普遍性 B.可传递性 C.可共享性 D.载体、方式可变性 4、关于计算机的主要特点,表述正确的是()。 A.运算速度快、运算精度高、应用范围广、能连续的、自动地运行工作 B.运算速度快、运算精度高、存储容量大、处理信息多 C.运算速度快、运算精度高、存储容量大、能连续的、自动地运行工作 D.运算速度快、运算精度高、应用范围广、能连续的、处理信息多 5、第三代计算机所采用的电子元器件是()。 A.电子管 B.晶体管 C.中小规模集成电路 D.大规模、超大规模集成电路 6、()公司一直在大型主机市场处于霸主地位。 A.IBM B.MICROSOFT C.惠普 D.索尼 7、()是以数据库技术为工具,实现一个部门的全面管理,以提高工作效率。 A.电子数据处理 B.人工智能 C.管理信息系统 D.决策支持系统 8、下列属于计算机辅助系统的是()。 A.ACD B.CAP C.CAN D.CAI 9、用计算机进行数据处理,从简单到复杂已经历了三个发展阶段,下列说法错误的是( )。 A.电子数据处理 B.智能数据收集 C.管理信息系统 D.决策支持系统 10、计算机工作原理是建立在()基础上的,逻辑代数是逻辑运算的理论依据。 A.数据运算 B.逻辑运算 C.物理运算 D.集合运算 11、ASCII码共有()种编码。 A.64 B.128 C.256 D.512 12、()是指各种进位计数制中允许选用基本数码的个数。 A.基数 B.权数 C.位数 D.进制 13、下列选项中,不属于系统软件的是()。 A.Linux B.Office C.DOS D.Oracle 14、下列不属于Office2003中组件的是()。 A.word B.SQLserver C.excel D.powerpoint 15、CPU是()的简称。 A.中央处理器 B.高速缓存 C.外存 D.缓存 16、下列关于硬盘的说法正确的是()。 A.是存储器,不是输入输出设备 B.既是存储器又是输入输出设备 C.是输入输出设备不是存储器 D.是存储器和输入设备不是输出设备 17、程序设计语言一般可分为三大类,下列选项中错误的是()。 A.机器语言 B.汇编语言 C.高级语言 D.低级语言 18、计算机操作系统都有对设备管理的功能,下列不属于其管理对象的是()。 A.内存 B.CPU C.鼠标键盘 D.打印机 19、解释程序相当于() A.口译 B.笔译 C.机器翻译 D.人工翻译 20、高速缓冲存储器又称()。 A.RAW B.Cache C.RAM D.ROM 21、微型计算机的主要性能指标不包括()。 A.运算速度 B.字长 C.显卡性能 D.主存容量 22、多媒体设备中,声音处理芯片基本功能不包括()。 A.采样和回放控制 B.将信号放大 C.处理MIDI指令 D.混响、合声 23、关于多媒体操作系统的功能,表述不正确的是()。 A.自动识别多媒体任务 B.多媒体数据转换和同步控制 C.图形用户界面管理 D.对多媒体设备的驱动和控制 24、下列属于非授权访问行为的是()。 A.避开系统访问机制,非正常使用网络资源 B.删除信息 C.窃取数据的使用权 D.传播病毒 25、操作系统安全第一级控制将用户分为三类,不包括()。 A.文件创建者 B.文件主合作者 C.文件修改者 D.其他用户 26、数据库系统而言,主要通过权限和授权来实现安全管理,其中insert权限表示() 。 A.允许插入新数据,但不允许修改已经存在的数据 B.允许创建和删除索引 C.允许修改数据,但不允许删除数据 D.允许创建新的关系 27、下列()病毒只是不停扩散,并不破坏计算机内的数据。 A.恶性病毒 B.良性病毒 C.中性病毒 D.单机病毒 28、预防计算机病毒传染,用户采取的措施不正确的是()。 A.尽量不使用外来存储设备,必须使用时要进行病毒检测 B.不要更新系统补丁和各种软件,以免出现漏洞,给病毒可乘之机 C.对重要的软件和数据定时备份,以便在发生病毒感染而遭到破坏时,可以恢复系统 D.使用网络下载的软件,应先确认其不带病毒,可用防病毒软件检查 29、下列()软件不能清除木马程序。 A.NortonAntiv
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值