说明:
- 以下介绍示例的MCU地址空间如下:
ROM空间为:0x0000 0000 – 0x0000 8000
RAM空间为:0x2000 0000 – 0x2000 2000
- 堆栈(SP)生长方向为 递减;
- 小端模式
- Cortex-M0内核
正文:
一、MCU上电后,硬件设计保证,自动从地址0x00开始取数据
初始化文件中代码设置 如下:
第一个数据用于初始化SP指针,其次为复位中断向量
生成结果请看:ROM中数据如下左,对应汇编指令如下右:
上电后,运行指令前状态:
二、在地址Reset_Handler / 0x0000 0194处存放着“复位中断处理函数”
代码设计:
汇编指令为:
其中rom地址0x0000 01B0处,存放着 函数__main的地址0x0000 00C0
运行后,跳转至__main函数,开始运行:
三、在__main中,主要做两个函数:
0x000000C0 F000F802 BL.W __scatterload (0x000000C8)
0x000000C4 F000F830 BL.W __rt_entry (0x00000128)
此部分网上也有不错的介绍文章,
__main函数的作用: (https://blog.csdn.net/wheat_in_winner/article/details/53583462)
1.完成全局/静态变量的初始化工作
2.初始化堆栈
3.库函数的初始化
4.程序的跳转,进入main()函数。
MDK __main()代码执行过程分析 (https://blog.csdn.net/wangfoquan/article/details/7650988)
__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。
__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。
此处汇编指令过长,不细展开:
查看.map文件数据:
汇编指令:
细究应该还有image结构的内容,(在MDK的help文档中有相关内容)
四、 进入C语言的世界 main()