怎么分析RT Thread中的Submain函数
更新时间:2023-11-16分析RT Thread中的$Sub$$main函数
在RT-Thread中,$Sub$$main函数是整个系统的入口点,它的作用是初始化系统并启动操作系统的运行。下面我们将从以下四个方面对此函数进行详细的分析解释。
1. 功能与用途
$Sub$$main函数是一个汇编函数,在RT-Thread中是由Startup.s文件中的代码实现。$Sub$$main函数的主要功能是对硬件进行初始化,初始化各种外设,创建RTOS线程等,然后启动RTOS运行。它的代码如下:
ENTRY($Sub$$main) ldr r0,=Image$$RW_IRAM1$$ZI$$Limit ldr r1,=Image$$RW_IRAM1$$ZI$$Base sub r0, r0, r1 mov r2, sp bl rt_hw_stack_init bl rt_system_init bl rt_thread_startup END
其中,首先通过rt_hw_stack_init()函数初始化RTOS线程栈,然后调用rt_system_init()函数初始化RTOS系统,最后调用rt_thread_startup()函数启动RTOS运行。
2. 详细解释
下面我们分别解释一下rt_hw_stack_init()、rt_system_init()和rt_thread_startup()函数。
(1) rt_hw_stack_init()
这个函数用于RTOS线程栈的初始化,其代码如下:
void rt_hw_stack_init(void) { rt_size_t size; struct rt_thread *thread; struct rt_thread_info *thread_info; /* get init thread */ thread=rt_thread_self(); thread_info=thread->user_data; ... ... }
这个函数的作用是获取当前线程,并对线程的堆栈空间进行初始化。
(2) rt_system_init()
这个函数的作用是初始化RTOS系统,其代码如下:
rt_err_t rt_system_init(void) { rt_err_t result; ... ... }
可以看到这个函数的主要作用是调用各个板级驱动的初始化函数,将系统时钟配置为最终值,最后调用rt_components_board_init()函数,对设备进行初始化。在这个过程中还会对动态内存管理器进行初始化,主要用于管理RTOS线程栈的内存分配和释放。
(3) rt_thread_startup()
这个函数用于启动RTOS线程运行,其代码如下:
void rt_thread_startup(void) { RT_ASSERT(rt_list_isempty(&rt_thread_priority_table[0])); ... ... }
这个函数的作用是检查系统中是否存在空闲线程,如果存在,就将空闲线程的函数指针设置为idle_thread_entry函数,并在RTOS系统启动后,由IDLE线程运行。
3. 代码规范
在RT-Thread系统中,$Sub$$main函数实现了系统的启动,在其代码规范上需要遵守RT-Thread的代码规范。对于代码风格,需要遵循K&R风格,所有变量名和函数名都需要使用小写字母,用下划线分割单词。除了汇编代码以外,C语言代码需要使用tab键进行缩进。
4. 总结
$Sub$$main函数是RT-Thread系统的入口点,其主要作用是板级初始化,创建RTOS线程,启动RTOS系统。在RT-Thread系统中,$Sub$$main函数遵循C语言和汇编语言混合编程的规范,使用K&R代码风格。对于系统的启动,$Sub$$main函数承担了非常重要的作用。