c语言编程笔录

首页 >   > 笔记大全

笔记大全

怎么分析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函数承担了非常重要的作用。