(一)rtthread主线程启动流程
- 声明
- 1.启动分析
- 2.源码分析
声明
本文主要为个人学习笔记内容总结,有来自网络及其他,如有雷同,请告知。
1.启动分析
基于:rt-thread-v5.0.1
先执行:汇编代码startup_stm32f429xx.s开始运行,主要调用SystemInit和 __main
; Reset handler
Reset_Handler PROCEXPORT Reset_Handler [WEAK]IMPORT SystemInitIMPORT __mainLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP
2.源码分析
路径:rt-thread-v5.0.1\src\components.c
#ifdef __ARMCC_VERSION
extern int $Super$$main(void);
/* re-define main function */
int $Sub$$main(void)
{rtthread_startup();return 0;
}
#elif defined(__ICCARM__)
/* __low_level_init will auto called by IAR cstartup */
extern void __iar_data_init3(void);
int __low_level_init(void)
{// call IAR table copy function.__iar_data_init3();rtthread_startup();return 0;
}
#elif defined(__GNUC__)
/* Add -eentry to arm-none-eabi-gcc argument */
int entry(void)
{rtthread_startup();return 0;
}
#endif
int rtthread_startup(void)
{rt_hw_interrupt_disable();/* board level initialization* NOTE: please initialize heap inside board initialization.*/rt_hw_board_init();/* show RT-Thread version */rt_show_version();/* timer system initialization */rt_system_timer_init();/* scheduler system initialization */rt_system_scheduler_init();#ifdef RT_USING_SIGNALS/* signal system initialization */rt_system_signal_init();
#endif /* RT_USING_SIGNALS *//* create init_thread */rt_application_init();/* timer thread initialization */rt_system_timer_thread_init();/* idle thread initialization */rt_thread_idle_init();#ifdef RT_USING_SMPrt_hw_spin_lock(&_cpus_lock);
#endif /* RT_USING_SMP *//* start scheduler */rt_system_scheduler_start();/* never reach here */return 0;
}
路径:rt-thread-v5.0.1\src\components.c
void rt_application_init(void)
{rt_thread_t tid;#ifdef RT_USING_HEAPtid = rt_thread_create("main", main_thread_entry, RT_NULL,RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);RT_ASSERT(tid != RT_NULL);
#elsert_err_t result;tid = &main_thread;result = rt_thread_init(tid, "main", main_thread_entry, RT_NULL,main_thread_stack, sizeof(main_thread_stack), RT_MAIN_THREAD_PRIORITY, 20);RT_ASSERT(result == RT_EOK);/* if not define RT_USING_HEAP, using to eliminate the warning */(void)result;
#endif /* RT_USING_HEAP */rt_thread_startup(tid);
}
路径:rt-thread-v5.0.1\src\components.c
void main_thread_entry(void *parameter)
{extern int main(void);#ifdef RT_USING_COMPONENTS_INIT/* RT-Thread components initialization */rt_components_init();
#endif /* RT_USING_COMPONENTS_INIT */#ifdef RT_USING_SMPrt_hw_secondary_cpu_up();
#endif /* RT_USING_SMP *//* invoke system main function */
#ifdef __ARMCC_VERSION{extern int $Super$$main(void);$Super$$main(); /* for ARMCC. */}
#elif defined(__ICCARM__) || defined(__GNUC__) || defined(__TASKING__) || defined(__TI_COMPILER_VERSION__)main();
#endif
}
#include <stdio.h>
#include <rtthread.h>int main(void)
{return 0;
}