近期在使用 S32K144 的 ARM CM4F 内核的片子做项目,开发 IDE 使用的是 NXP 官方的 S32DS,其开发模式和 MDK 类似,但是可配置性更灵活一些,
但是 IDE 也为我们做了大量的工作,启动文件/连接脚本这些都给我们提供了,所以当我们在线调试时,会直接跳转到 main()函数,下面我们来看
一下 IDE 都为我们做了那些工作:
一.分析一下启动文件
1, 启动文件在新建工程后的 Project_se"ngs 目录下
(1) 定义了.section .isr_vector, "a"段,这个段即中断向量表;
(2) .align 2 表示下面的代码要 4 自己解对齐,并将符号__isr_vector 声明为全局变量,以便连接脚本调用,值为 0x0000 0000
(3) 接下来就是中断向量表的排布了,前连个比较特别,一个是 SP,一个是复位向量,这和 ARM 内核的特性有关,不多说;
(4) 这个向量表的大小是多少呢,256 个向量,每个占 4 字节,即 0x400;
2, 定义了一个段.section .FlashConfig, "a"
(1)这个段是关于 +ash 配置参数的,仅仅定义了 4 个数值,后面会用来配置 +ash
3, 接下来,就该 text 段了
(1) 首先表明 text 段的组织方式,使用 thumb 指令
4, 接下来,就是真正的代码段了,即复位函数,同时把该函数的名字/或是地址声明为全局变量,也是为了在连接脚本中使用
5, 分析一下,复位函数:
(1) 关闭全局中断,这是必须的,因为刚开始你什么都没配置;并清除了通用寄存器
(2) 如果定义了 START_FROM_FLASH,就要初始化 ECC RAM
这个宏定义在哪里定义呢,我没有仔细查看,应该是根据我们工程配置来定义的,可能是根据我们的连接脚本的选择是 FLASH/
RAM 的方式来定义该变量,因为我在.cproject 文件中找到了该宏的定义,暂时不深究,我们分析一下这个代码段做了什么:
A, 为什么我从 +ash 启动就需要初始化 RAM 呢,这个 RAM 是片内的 RAM,还需要我初始化吗,查了些资料没有好的解释,暂时
先不管了,反正就是为了在你使用内部 RAM 前的一个初始化操作,保障你后面的使用;
B.获取 RAM 的起始/结束地址,分别放入寄存器 r1/r2,这连个地址的定义在连接脚本中
具体的值我们在对应工程生成的 map 文件中可以找到
上面的 BLE 指令时根据前面的执行结果来决定跳转的,如果前面的结果为假就调转,否则就跳过 BLE 指令,继续顺序执行下面的