RTT startup.c 代码学习
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的结尾地址。