RTT的學習集中在應用層,底層的代碼會在必要的時候涉及一下。
startup是RTT的啟動代碼,類似於ucos。
void rtthread_startup(void)
{
/* init board */
rt_hw_board_init();
/* show version */
rt_show_version();
/* init tick */
rt_system_tick_init();
/* init kernel object */
rt_system_object_init();
/* init timer system */
rt_system_timer_init();
/* init scheduler system */
rt_system_scheduler_init();
/* init all device */
rt_device_init_all();
/* init application */
rt_application_init();
/* init idle thread */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return ;
}
看了一下,rt_hw_board_init(); 和 rt_application_init(); 是我需要關注的代碼。
第一個為板級的初始化,第二個是各個線程的初始化。
#ifdef RT_USING_HEAP
#if STM32_EXT_SRAM
rt_system_heap_init((void*)STM32_EXT_SRAM_BEGIN, (void*)STM32_EXT_SRAM_END);
#else
#ifdef __CC_ARM
rt_system_heap_init((void*)&Image$$RW_IRAM1$$ZI$$Limit, (void*)STM32_SRAM_END);
#elif __ICCARM__
rt_system_heap_init(__segment_end("HEAP"), (void*)STM32_SRAM_END);
#else
/* init memory system */
rt_system_heap_init((void*)&__bss_end, (void*)STM32_SRAM_END);
#endif
#endif
#endif
這段代碼是有關運行時堆的初始化。分別對應外部RAM,MDK, IAR, GCC。那個MDK奇奇怪怪的寫法在另一篇博文中有敘述了,簡單來說就是用沒有初始化的RAM作為起始一直到結束。堆的話主要是動態線程的創建,內存分配要用。靜態線程什麼的其棧已知,故初始化RAM有。那個奇奇怪怪的符號是鏈接器特有的,用來獲知已用RAM的結尾地址。