日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

RT-Thread工程代码框架分析——(1)启动流程

發(fā)布時(shí)間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RT-Thread工程代码框架分析——(1)启动流程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

學(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。