RT-Thread 2 - 启动流程
RT-Thread 官网有这样一张图,详细讲解了OS启动流程。
1. 在MDK环境下,上电复位后进入复位中断,并调用 __main 函数;
2. RT-Thread重定义了 $Sub$$main 函数,因此复位中断先跳转到 $Sub$$main 函数;
3. $Sub$$main 函数调用 rtthread_startup() 函数,完成OS启动流程。并在 rt_application_init() 函数中创建 main 线程 void main_thread_entry(void *parameter);
4. rtthread_startup() 函数最后启动调度器,OS随后进入已经创建的 main 线程(void main_thread_entry(void *parameter));
5. main 线程完成 OS组件初始化之后,跳转至 $Super$$main() 函数,正式执行用户定义的 main 函数。因此 main 函数是以一个线程的形式在运行。
注:有关 $Super$$和$Sub$$ 的用法和参考 Arm Compiler for Embedded Reference Guide。
1 /* the system main thread */ 2 void main_thread_entry(void *parameter) 3 { 4 extern int main(void); 5 extern int $Super$$main(void); 6 7 #ifdef RT_USING_COMPONENTS_INIT 8 /* RT-Thread components initialization */ 9 rt_components_init(); 10 #endif 11 /* invoke system main function */ 12 #if defined(__CC_ARM) || defined(__CLANG_ARM) 13 $Super$$main(); /* for ARMCC. */ 14 #elif defined(__ICCARM__) || defined(__GNUC__) 15 main(); 16 #endif 17 }