RT-Thread OS的启动流程
1、RT進入main之前,
SystemInit函數初始化時鐘。
2、main函數位于startup.c文件中。進行兩個工作
系統開始前,rt_hw_interrupt_disable關閉所有中斷。
之后使用rtthread_startup啟動RTThread
3、函數rtthread_startup()完成的工作:
1、調用函數rt_hw_board_init 完成板子初始化工作
2、顯示版本信息:rt_show_version
3、初始化系統滴答:rt_system_tick_init
4、系統內核對象初始化:rt_system_object_init
5、定時器初始化:rt_system_timer_init
6、系統堆棧初始化rt_system_heap_init
7、任務調度器初始化:rt_system_scheduler_init
8、rt_application_init //加入用戶自定義的任務
9、FINSH模塊初始化 ,
10、定時器線程初始化:rt_system_timer_thread_init
11、空閑任務初始化rt_thread_idle_init
12、開始任務調度,OS接管MCU:rt_system_scheduler_start
任務調度開始之后,OS就算是啟動好了。之后的東西都是在OS的管理下運行了。
4、在RTT示例工程中添加外設驅動的方法:
驅動頭文件加入board.h
RT-thread系統的main函數位于startup.c文件中。
/*** This function will startup RT-Thread RTOS.*/ void rtthread_startup(void) {/* init board */rt_hw_board_init();//NVIC_config, SysTick_config, serial_device register, set CONSOLE for output(rt_kprintf(...)) in board.c/* show version */rt_show_version(); //show the version of rtthread by serial device(set to be console-device in board.c) in kservice.c /* init tick */rt_system_tick_init(); //empty fucntion(since 1.1.0) in clock.c/* init kernel object */rt_system_object_init();//empty fucntion(since 0.3.0) in object.c/* init timer system */rt_system_timer_init(); //init rt_timer_list[0].next=rt_timer_list[0].prev=rt_timer_list[0](means rt_timer_list is empty) in timer.c rt_system_heap_init((void*)STM32_SRAM_BEGIN, (void*)STM32_SRAM_END);//init system heap in mem.c/* init scheduler system */rt_system_scheduler_init();//init the system scheduler, and init rt_thread_defunct(dead thread list) to be empty in scheduler.c/* init application */rt_application_init(); //init all defined thread in application.c//#ifdef RT_USING_FINSH //replace finsh_set_device() after the function of rt_components_init() in rt_init_thread_entry() of application.c/* init finsh *///finsh_system_init(); //INIT_COMPONENT_EXPORT(finsh_system_init) in shell.c, so it needn't finsh_system_init here//finsh_set_device( FINSH_DEVICE_NAME );//sets the input device of finsh shell(rt_device_open(dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM) in shell.c //#endif/* init timer thread */rt_system_timer_thread_init();//init system software timer thread(opened by #define RT_USING_TIMER_SOFT in rtconfig.h) in timer.c/* init idle thread */rt_thread_idle_init(); //init idle thread(cleanup all dead thread), then start to be ready in idle.c/* start scheduler */rt_system_scheduler_start(); //startup scheduler(first swith to the highest priority thread and enable interrupt )in scheduler.c/* never reach here */return ; } int main(void) {/* disable interrupt first *///enable interrupt(CPSIE I) when the first thread switch(rt_hw_context_switch_to) in lipcpu/cortex-m4/context_rvds.S rt_hw_interrupt_disable();/* startup RT-Thread RTOS */rtthread_startup();return 0; }?
總結
以上是生活随笔為你收集整理的RT-Thread OS的启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习工作机制通俗介绍
- 下一篇: C++ inline variable