ARM Cortex-M底层技术
启动代码原理
启动代码的使用
在启动代码中调用函数
在_main之前调用, 参数不能超过4个(因为R0-R3, 第5个参数会被压栈, 由于堆栈尚未初始化, 程序会跑飞).
什么样的函数适合放在启动代码启动或者执行? 与放在main()函数有何区别?
问题的关键是在_main之前执行还是之后执行.
- FPU(浮点协处理器单元)初始化
- 片外SRAM/SDRAM初始化
- 看门狗的开关 / 低压检测的初始化等
- 时间敏感性任务 / 操作等
.c 预处理 .i 汇编 .s 编译 .o 链接 .exe
编译器内核原理及其应用
不同部分
- 出现错误可看是汇编器、编译器、链接器哪个出错,确定出错位置
map文件
分散加载的简单介绍
map文件基本结构
-
Code段:表示程序代码部分,就是你编写的各种if-else/switch-case/for/函数……等代码
-
RO-data段:程序定义的所有常量以及const类型数据
-
RW-data段:已经初始化的所有静态变量
-
ZI-data段:未初始化的静态变量
-
RO段:指Code以及RO-data的统称
-
占用空间汇总
RW+ZI数据段最终运行时会占用片内SRAM或外扩的RAM存储器,而Code+RO-data+RW-data数据最终会产生对片内Flash的占用或外扩程序存储区的占用。 -
在分散加载前, 即_main()之前无法使用全局变量.
分散加载的根本目的
- 把RO-DATA数据段、RW数据段从片内数据存储区(一般是片内flash)搬到片内程序运行区(一般是片内SRAM)。
- 在片内程序运行区(一般是片内SRAM)内分配ZI数据段并初始化为0
- 初始化堆栈
- 对于有些指定要加载到程序运行区的RO数据段,把他们加载到程序运行区。
分散加载的基本结构
- 加载域、运行域、输入节
LR_ROM1 0x0000 0x10000 { ; Load region
ER_ROM1 0x000 0x1000{ ; execute region
}
RW_RAM1 0x20000 0x1000{ ;RWdata
}
}