RT-Thread工程代码框架分析——(1)启动流程
前言
學的東西多了難免有些記不住,通過博客形式記錄下來雖然耗費些時間,但總算是留下了一些東西,回頭想起來也有跡可循不用完全依賴記憶,順便也許能對一些同仁提供些許幫助。
本文章主要記錄RT-Thread系統的一些簡述。
這里還是要為RT-Thread打call,畢竟是我們的國產開源操作系統,支持國產,希望在眾多開發者維護下會越來越好。
我用的開發板是正點原子的潘多拉STM32L4開發板,是原子和RT-Thread聯合打造的,原子的資料中有兩套源碼,一套是原子給的HAL庫使用例程,另一套是用RT-Thread上的相關外設使用例程。下面我的一些源碼展示來自RT-Thread外設使用例程,注意與RT-Thread的最新源碼會有一定出入。
學習RT-Thread系統主要的獲取資料和信息的通道當然還是官網:RT-Thread 官網
同時還提供了社區:RT-Thread 開源社區
官網有一篇文檔《RT-Thread編程指南》非常適合初次接觸RT-Thread的同學閱讀。
內核源碼下載:官網下載 (官網給了多個方式提供下載,非常貼心)
github 地址
RT-Thread API參考手冊
啟動流程
RT-Thread的啟動流程有點特殊,在xxx.s啟動文件之后沒有直接到用戶的main函數,而是利用MDK的特殊符號$ Super $ $ and $ Sub $ $ 在用戶的main函數前還插入了一段程序用于一些硬件初始化以及系統初始化。
components.c文件中:
關于SuperSuperSuper$ and SubSubSub$的用法,見ARM官網描述
SuperSuperSuper$foo
Identifies the original unpatched function foo(). Use this to call the original function directly.
SubSubSub$foo
Identifies the new function that is called instead of the original function foo(). Use this to add processing before or after the original function.
對這兩個符號有興趣可參考這位大佬的博客進一步了解:$ Super$ $ and $Sub $ $的用法
針對這個符號我也另起了一篇$ Super$ $ and $Sub $ $的用法
注意:$ Super $ $ and $ Sub $ $要成對使用,且只在MDK中使用。
主要看rtthread_startup()函數:
int rtthread_startup(void) {rt_hw_interrupt_disable();/* 板級硬件初始化 使用的硬件初始化,包括串口初始化,系統時鐘配置等 HAL庫的HAL_Init()也在這里* NOTE: please initialize heap inside board initialization.*/rt_hw_board_init();/* 顯示 RT-Thread 的版本號 */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/* create init_thread */rt_application_init();//這里面很有意思,把main函數當成一個進程來運行了/* timer thread initialization */rt_system_timer_thread_init();/* 創建空閑任務 */rt_thread_idle_init();#ifdef RT_USING_SMPrt_hw_spin_lock(&_cpus_lock); #endif /*RT_USING_SMP*//* 開啟調度器 */rt_system_scheduler_start();/* never reach here */return 0; }官方的啟動流程圖:
其中有一個應用初始化的函數里面創建了一個main進程,這里面的處理很有意思,main進程里把main函數當成一個進程的一部分代碼去運行了(相當于main()函數變成了一個進程,這跟我們用ucos,freeRTOS的思路不太一樣)。
真正的main函數就比較簡單了。
int main(void) {unsigned int count = 1;/* set LED pin mode to output */rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);while (count > 0){/* led on */rt_pin_write(LED_PIN, PIN_LOW);rt_kprintf("led on, count: %d\n", count);rt_thread_mdelay(500);/* led off */rt_pin_write(LED_PIN, PIN_HIGH);rt_kprintf("led off\n");rt_thread_mdelay(500);count++;}return 0; }總結
以上是生活随笔為你收集整理的RT-Thread工程代码框架分析——(1)启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32开启定时器就立即进Update
- 下一篇: RT-Thread pin设备驱动代码结