一 程序映像

程序映像指的是程序存储器,对于大多数芯片来讲,一般为flash,flash中不仅存储了用户的程序代码还有其它多种软件部分:

  • 向量表
  • 复位处理/启动代码
  • C启动代码
  • 应用代码
  • C运行时库函数
  • 其它数据

1 向量表

ARM Cortex-M处理器的向量表中包含每个异常和中断的起始地址,而对于Cortex-M0和Cortex-M0+处理器复位后,向量表定义在存储器空间的起始位置(地址为0x00000000),向量表的第一个字节还定义了主栈指针的初始值,向量表是和设备相关的(取决于所支持的异常),向量表一般是定义在启动代码中。

2 复位处理/启动代码

复位处理是可选的,若没有复位处理,则会直接执行C启动代码。复位处理中的代码在处理器从复位中退出时会立刻执行,有些情况下其中还会存在一些硬件初始化代码。对于使用CMSIS-CORE(Cortex-M处理器用的软件架构)的工程,复位处理执行SystemInit()函数,其会在跳转到C启动代码前设置时钟和PLL。
启动代码一般由微控制器厂商提供,有时还会在工具链软件中,其可能是C代码或汇编代码。

3 C启动代码

若使用C/C++或其他高级语言编程,处理器需要执行一些程序代码以设置程序执行环境(如设置全局变量以及SRAM中的初始值),对于加载时未初始化的数据存储器中的变量,需要将他们初始化为0.若应用需要使用malloc()等C函数,C启动代码还需要初始化堆存储的数据变量,初始化后,C启动代码会跳转到main程序开头。
C启动代码会被工具链自动生成,因此是和工具链相关的,如果是完全用汇编编写的程序,则可能会不存在启动代码。对于ARM编译器,C启动代码的标号为__main,而GNU C编译器生成的启动代码标号一般为_start.

4 应用代码

应用代码一般是从main()开始的,其中包括用以执行所需任务的应用程序代码生成的指令,除了指令序列外,还有其它类型的数据:

  • 变量初始值:函数或子例程中的局部变量需要被初始化,在程序执行期间会设置这些初始值。
  • 程序代码中的常量,应用代码中的常量数据有多种:数据值、地址或外设寄存器以及常量字符串等。这些数据一般被称为文本数据,且在程序映像中会以多个名为文本池的形式分组出现。
  • 有些应用可能还包含查找表、图形映像数据(如位图)等其他常量数据。

5 C库代码

在使用某些C/C++函数时,C库代码会被连接器插入程序映像中。另外,在进行浮点运算和除法等数据处理任务时可能也会包含C库代码。Cortex-M0和Cortex-M0+处理器不支持除法指令,除法运算一般由C库中的除法函数执行。
为了应对不同用途,有些开发工具会提供各种版本的C库。例如,对于Keil MDK或ARM Development Studio 5(DS-5),可以选择使用名为Microlib的特殊版本的C库。Microlib面向微控制器应用,并且体积非常小,但是无法提供标准C库的所有特性。对于不需要很高的数据处理能力且存储器需求非常紧张的应用,Microlib是降低代码大小的好方法。
对于不同的应用,C库代码可能不会出现在简单的C应用(无C库函数调用)或纯汇编语言工程中。

向量表必须放在存储器映像的开头处,程序映像的其他部分就有没有什么限制了。有些情况下,若程序存储器中各部分的布局有特殊的要求,则可以利用连接器脚本控制程序映像的生成。

6 其他数据

程序映像中还包含其它数据,例如全局变量和静态变量的初始值。

二 SRAM中的数据

处理器中的SRAM包含:

  • 数据空间
  • 栈空间
  • 堆空间

1 数据空间

存储在RAM的末端,通常包含全局和静态变量。局部变量可以存储在处理器的寄存器中,或者放在栈中以减少RAM的使用,未使用函数中的局部变量不会占空存储器空间。

2 栈空间

栈空间,包括临时数据存储空间(一般的栈PUSH和POP操作)、局部变量的存储空间、函数调用时的参数传递、以及异常流程中的寄存器保存等。
Thumb指令集在处理器数据访问时非常高效,其使用栈指针(SP)相关的寻址模式,并且在很小的指令开销下就可以访问栈存储中的这些数据。

3 堆空间

堆存储是可选的,用于C函数中存储器空间的动态分配,如 alloc()或malloc()和其他使用这个功能的函数。为了保证这些函数能够正确分配存储空间,C启动代码需要初始化堆存储及其控制变量。

4 RAM空间分布

对于RAM处理器,还可以将程序代码赋值到内存中并从这里开始执行,但是对于多数微控制器应用,程序一般从Flash等非易失性存储器中开始执行。
将这些数据放到SRAM中的方法有很多种,一般是和工具链相关的。对于不具备OS的简单应用SRAM中存储器分布情况如下图。

对于有嵌入式OS的微控制器系统,每个任务的栈都是独立的。许多OS都允许软件开发人员定义每个任务/线程所需的栈大小,有些OS可能会将RAM分分割成多个部分,并将每个部分分配给一个任务,其中都包含各自的数据、栈和堆。

具有RTOS的多数系统都会使用下图左侧的数据布局,这里的全局和静态变量以及堆存储都是共用的。

三 微控制器启动流程

有些微控制器会包含一个独立的ROM,其中存储一段BootLoader程序,该程序会在微控制器执行Flash存储器中的用户程序前启动。这个过程是可选的,如果没有这段代码那么硬件复位之后,微控制器从向量表的首地址处取出一个字大小的数据,该数据就是栈指针。然后开始执行复位向量。


当处理器被复位之后,首先从0x0000 0000地址处读取两个字,第一个字为栈顶指针,第二个字为复位向量,决定程序执行的起始地址(复位处理)。

Cortex-M软件结构相关推荐

  1. Keil MDK5软件包的组成、Cortex微控制器软件接口标准CMSIS,重点介绍CMSIS-CORE的组成和使用

    嵌入式系统的应用开发需要基于目标机-宿主机的交叉编译系统,在集成开发环境的支持下进行,应用程序通常采用高级编程语言C/C++进行编写.使用MDK开发工具进行STM32微控制器的应用开发需要安装软件包, ...

  2. i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核

    i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核 概述 i. MX6UltraLite作为i.MX6系列的扩展,一系列高性能.超高效的处理器 ...

  3. 20172328 2018-2019《Java软件结构与数据结构》第八周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第八周学习总结 概述 Generalization 本周学习了二叉树的另一种有序扩展?是什么呢?你猜对了!ヾ(◍°∇°◍) ...

  4. 模型web迁移延时太长,机器学习神器Cortex 能一键解决吗?

    2020-02-06 17:54 导语:各种改进,提高用户体验. 机器学习算法部署平台Cortex宣布推出 Cortex V0.13 . 据介绍,这次的Cortex v0.13支持了所有的主要机器学习 ...

  5. 【原创】gooogleman亲自参与设计的三星Cortex A8 S5pv210 之Sate210核心板硬件用户手册(作者:gooogleman)...

    作者:gooogleman                                 时间:2011.09 从2011年四月份开始筹划设计一款S5pv210方案至今,已经有五个多月,期间还做了一 ...

  6. iar升级芯片库_IAR 发布支持ARM Cortex系列的开发工具包

    2009年9月, 瑞典乌普萨拉,IAR Systems正式推出支持Cortex-M系列芯片的IAR Embedded Workbench.IAR Embedded Workbench for Cort ...

  7. 关于ARM Cortex系列产品

    ARM Cortex系列的三款产品全都集成了Thumb®-2 指令集,可满足各种不同的日益增长的市场需求.ARM Cortex系列的三款处理器: • ARM Cortex-A 系列:针对复杂操作系统以 ...

  8. 意法半导体STM32 ARM Cortex 32位微控制器

    STM32系列32位微控制器基于Arm® Cortex®-M处理器,旨在为MCU用户提供新的开发自由度.它包括一系列产品,集高性能.实时功能.数字信号处理.低功耗/低电压操作.连接性等特性于一身,同时 ...

  9. cortex M内核优先级设置

    Cortex M内核中 每个中断都有一个8位的优先级设置寄存器 这个8位的寄存器可以分为抢占优先级和子优先级两个部分(通过设置优先级组设置) 抢占优先级和子优先级有什么用? 举例说明: 有两个中断A. ...

  10. hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因

    凡是在Cortex M系列内核上写过程序的程序员, 没有不知道Hard Fault的. 大多数程序出现问题的表现就是进入Hard Fault. 但是进入Hard Fault的原因是甚么, 为了查明这个 ...

最新文章

  1. php7 定义变量,基于PHP7的PHP扩展开发之七(定义变量)
  2. java io字符输出流_【Java的IO流之文件字符输入输出流 25】
  3. 五一减肥狂掉肉饮食法
  4. Deep-Learning-YOLOV4实践:ScaledYOLOv4模型训练自己的数据集调试问题总结
  5. build.gradle里dependencies标签页的实现原理
  6. LInux下du, df, top, free, pstack, su, sudo, adduser, password命令
  7. android 温度传感器获取温度,Android 温度传感器返回当前的温度
  8. CentOS7.3系统Tomcat无法正常启动解决(8005端口不能启动)
  9. 技术人真的能做一辈子技术么?
  10. matlab 取点画图,Matlab plot画图学习---画点以及两点连线
  11. 解决WebStorme点击谷歌浏览器图标无反应问题
  12. 金庸武侠小说之我的见解
  13. html5淘宝注册界面设计,电商登陆注册页设计分析
  14. apk多开制作方法 试用ApkEditor 1.8 旗舰版轻松制作apk多开双开
  15. wndDL课程学习笔记
  16. mysql count忽略空_MySQL count 过滤空值,使其不将空数据计入条数
  17. 哈佛参考文献注释体系与学术规范
  18. 选择模板建站这六个问题要提前注意
  19. 如何使用JBookMaker制作Java电子书
  20. 番茄定时调光台灯触摸芯片-DLT8T10S-杰力科创

热门文章

  1. qemu rtl8139调试问题
  2. CCF201812 JAVA
  3. 交友相亲类软件是如何割你韭菜的
  4. 有损男人健康的6种生活方式 你中招了没
  5. 中国消费级喷墨打印机行业市场供需与战略研究报告
  6. 南宁陶粒之慢性病监测信息管理系统功能技术分享
  7. 系统集成藏文识别技术的SDK怎么使用
  8. 浙江省2009年高考文理科第二批院校平行志愿首轮投档分数线
  9. 从开源组件安全看SCA软件成分分析技术
  10. 多模态技术在淘宝主搜召回场景的探索