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