一.启动代码生成
在 PM+的 Tool 菜单下点击“ Compiler Options”,会出现下图对话框:
由上图可知,编译器默认使用了启动例程,其目标文件是“ s0l.rel”,同时也使用了库文件“ cl0x.lib/cl0.lib/cl0f.lib”。 s0l.rel 通过链接用户程序和相关库文件,最终生成下载模块文件。
用记事本打开“ ..\src\cc78k0\bat”目录下的 mkstup.bat 文件,可看到如下一行代码:
ra78k0 -i..\src -ng -nga -np -o..\lib\s0l -c%1 ..\src\cstart.asm
二.启动代码构成
由此可知,目标文件 s0l.rel 是由源汇编文件 cstart.asm 编译生成的。 cstart.asm 即为启动例程的汇编源代码,其内容构成如下图 所示:
三.启动代码分析
3.1 初始化设置
@@VECT00 CSEG AT 0
DW _@cstart //①复位向量设置。 _@cstart 是代表启动例程起始地址的标号。
@@LCODE CSEG
_@cstart:
SEL RB0 //②设置第 0 组 bank 为当前工作寄存器。
MOVW SP,#_@STBEG ;SP <- stack begin address //③设置堆栈指针。复位后,SP 指针内容不确定,需初始
//化,放在内部高速 RAM 区域中。
CALL !_hdwinit //硬件初始化函数调用。
3.2 ROMization 处理
在 C 源程序中定义的外部变量、静态变量和 sreg 变量的初始值都放置在 ROM 中。然而,放置于ROM 中的变量值是不可以更改的。
因此,要将放置于 ROM 中的初始值复制到 RAM 中。这个过程被称为ROM 化,程序写入 ROM 时,可以使用 MCU 进行操作。而没有初值的外部变量和 sreg 变量无需复制,直接将对应 RAM 清零即可。
3.3 启动主函数 main()
CALL !_main ;main();