程序启动¶
程序的启动流程与C编译器有关,默认情况下程序的启动入口为__default_entry
,其定义在default_entry.o
中(void __default_entry();
)。但用户可以通过关键字__entry
自定义启动入口。
注意
default_entry.o文件编译器内置,使用IDE时会自动参与链接,如果用户使用命令行自行编译时需要手动指定。
__default_entry函数具有_Noreturn属性。
默认启动流程¶
默认情况下,用户定义main
函数,在用户角度,程序从main
开始运行,但在编译器角度则并非如此,其真实启动流程如下:
+---------------------+ +------------------+
| @entry address | | @__default_entry | +------+
| jmp __default_entry |--->| bss/data initial |--->| main |
+---------------------+ | jmp main | +------+
+------------------+
用户定义启动入口¶
用户只需要通过关键字__entry
指定启动入口即可。用户也可以在自己的入口函数中调用默认入口函数(默认入口函数中进行了bss
/data
段初始化)。
void __default_entry();
void entry() __entry
{
//user do something
__default_entry();
}
void main()
{
//do something
while(1){
//do something
}
}
以上程序的启动流程如下:
+----------------+ +---------------------+ +------------------+
| @entry address | | @entry | | @__default_entry | +------+
| jmp entry |--->| do something |--->| bss/data initial |--->| main |
+----------------+ | jmp __default_entry | | jmp main | +------+
+---------------------+ +------------------+
如果用户有特殊要求,想要屏蔽掉编译器生成的bss
/data
段初始化,则用户不应调用__default_entry
,如果希望程序直接进入main
,则在自定义入口中直接调用main
即可。
void main()
{
//do something
while(1){
//do something
}
}
void entry() __entry
{
//user do something
main();
}
以上程序的启动流程如下:
+----------------+ +--------------+
| @entry address | | @entry | +------+
| jmp entry |--->| do something |--->| main |
+----------------+ | jmp main | +------+
+--------------+