1. 程序入口地址(Entry Point)
Linker赋予entry point的值有4种,按顺序是:
1) linker option -e指定的值,语法是:-e global_symbol
2) 如果存在_c_int00 symbol(使用C55x C/C++ compiler),使用_c_int00的值
3) 如果存在_main symbol,使用_main的值
4) 默认值是0
如果是前3种情况,赋予entry point的symbol应是symbol table中的external symbol。
2. 运行支持库(rts.lib)
_c_int00在rts55.lib或rts55x.lib中定义。
所有的C/C++程序开始运行时,首先执行_c_int00的代码,其功能是:
1) 设置数据栈(SP)和系统栈(SSP)
2) 使用全局变量的初始化表中的值来初始化全局变量(in ROM Model)
3) 设置状态寄存器
4) 设置中断向量寄存器IVPH, IVPD
5) 调用main函数
根据全局变量在load时初始化还是在runtime时初始化,分为RAM Model或者ROM Model。
1) RAM Model,全局变量在load时初始化,loader直接使用Object File中的.cinit section来初始化Memory中的.bss section。在runtime时,在Memory中不存在.cinit section,boot不执行初始化动作
2) ROM Model,全局变量在runtime时初始化,在Memory有.cinit section,由boot初始化.bss section
3. 例子
以C5510为例,cmd文件设置如下:
------------------------------------------------------------
-stack 0x2000 /* 数据栈 0x2000 bytes */
-sysstack 0x1000 /* 系统栈 0x1000 bytes */
/* SPECIFY THE SYSTEM MEMORY MAP */
MEMORY
PAGE 0: /* ---- Unified Program/Data Address Space ----
*/
RAM (RWIX) : origin = 0x002000, length = 0x01e000 /* RAM, 56KB DARAM and 64KB SARAM 字节地址 */
ROM (RWIX) : origin = 0x020000, length = 0x020000 /* ROM, 128KB page of SARAM 字节地址 */
}
/* SPECIFY THE SECTIONS ALLOCATION INTO MEMORY */
SECTIONS
{
.text > ROM PAGE 0 /* Code */
.data > RAM PAGE 0 /* Initialized vars */
.bss > RAM PAGE 0 /* Global & static vars */
.stack > RAM PAGE 0 /* Primary system stack */
.sysstack > RAM PAGE 0 /* Secondary system stack */
.cinit > RAM PAGE 0 /* Auto-initialization tables */
......余下省略......
}
------------------------------------------------------------
查看第一段汇编代码,即c_int00,即entry point。
AMAR *(#02000h),XSP
MOV #2800h,SSP
设置数据栈(SP)和系统栈(SSP),使SP指向数据栈的栈顶,SSP指向系统栈的栈顶,察看Memory来确认,注意以下显示的是字地址 = 字节地址 / 2。
stack
0x001000
......
sysstack
0x002000 <-- SP
......
bss
0x002800 <-- SSP
接下来的代码,设置4个ST寄存器。
AND #F91Fh,mmap(@ST1_55)
OR #4100h,mmap(@ST1_55)
AND #FA00h,mmap(@ST2_55)
OR #8000h,mmap(@ST2_55)
BCLR ST3_SATA
BSET ST3_SMUL
随后,初始化所有的地址指针。
AMAR *(#02800h),XAR0
MOV XAR0,XAR1
MOV XAR0,XAR2
MOV XAR0,XAR3
MOV XAR0,XAR4
MOV XAR0,XAR5
MOV XAR0,XAR6
MOV XAR0,XAR7
MOV XAR0,XCDP
MOV XAR0,XDP