个人理解是
startup_xxx.s中
Reset_Handler -> LoopCopyDataInit -> LoopFillZerobss -> entry
然后 components.c中
entry(void) -> rtthread_startup() -> …rtt初始化程序 -> rt_application_init() -> rt_thread_create(“main”, main_thread_entry,…)创建main线程 ->
进入thread.c 中
rt_thread_startup(rt_thread_t thread)放进调度器
然后回到components.c中 的 rtthread_startup(void)
然后执行一些剩下的初始化后进入RTT调度程序rt_system_scheduler_start()
到这一步之后就不是很清楚了
然后问题是
Q1:我上面描述的RTT在STM32中的启动程序正确么
Q2: 我在RTT Studio IDE中添加了范例包,例如dynmem_sample.c,但是我找调用层次没有,只有一句MSH_CMD_EXPORT(dynmem_sample, dynmem sample)使用了int dynmem_sample(void),那么这个demo的线程是在什么时候注册的呢?
RT-Thread的初始化顺序
上电执行汇编函数 复位中断 Reset_Handler
复位中断函数中,拷贝bss段,清除bss段然后跳转到 entry 函数
entry函数中,调用rtthread_startup该函数首先调用rt_hw_board_init函数,进行硬件的初始化,最后初始化 INIT_BOARD_EXPORT(fn)宏包裹的函数。
然后创建 main_thread_entry,也就是main线程。
main线程中调用组件初始化函数。````
组件顺序如下: INIT_PREV_EXPORT(fn)
INIT_DEVICE_EXPORT(fn)
INIT_COMPONENT_EXPORT(fn)
INIT_ENV_EXPORT(fn)
INIT_APP_EXPORT(fn)
然后调用main函数。
注:同优先级自动初始化宏包裹的函数初始化顺序不确定。
好的,谢谢大佬。
Q2应该是我之前想错了,没注意到这个是宏展开拼接完之后的,我把预编译的过程和正常函数调用的过程混在一起了