我们都知道芯片在运行应用程序指令之前,首先会对芯片做一些
硬件和系统的初始化,如堆栈指针、RAM空间、变量初始化等,这部分代码被称为启动代码。启动代码通常在芯片上电后立即执行,对 于MCAL架构来讲就是要在MCU驱动模块初始化之前完成,启动代 码要求完成芯片特殊的初始化功能,这些工作不属于任何MCAL驱动 模块,下面列出了MCAL规范对启动代码完成功能的建议。
(1)启动代码应完成中断向量表的初始化。
(2)启动代码应完成堆栈的初始化。
(3)如芯片支持Context Save操作,启动代码应完成用于Context Save操作的存储器空间。
(4)启动代码应确保MCU内部看门狗处于关闭状态,内部看门 狗的初始化应由MCAL Watchdog驱动部件完成。
(5)如MCU支持数据/代码缓存,必须在启动代码中完成初始 化。
(6)启动代码应完成MCU内部存储器相关的初始化功能,如内 存保护等。
(7)如使用外部存储器,存储器应在启动代码中初始化。
(8)启动代码应完成MCU默认时钟配置的初始化。
(9)如芯片支持,启动代码应使能特殊功能寄存器的保护机 制。
(10)启动代码应初始化必要的一次只写寄存器(Write Once Register)。
(11)启动代码应初始化RAM空间,以保证正确执行MCU驱 动。以上就是MCAL规范对于启动代码的功能建议,需要注意的是启 动代码依赖于ECU的功能及MCU的性能。接下来,具体看一下本章 使用的S32K144样例工程中启动代码都做了哪些事情。
1.初始化内核通用寄存器
mov r0,#0 mov r1,#0 mov r2,#0 mov r3,#0 mov r4,#0 mov r5,#0 mov r6,#0 mov r7,#0
2.初始化中断向量表的基地址
3.初始化用户堆栈
4.关闭Watchdog
5.系统初始化
6.RAM初始化
7.跳转至Main函数