当前文档版本为 v0.5.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

程序启动

程序的启动流程与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   |    +------+
                      +--------------+