期間幾個月時間關(guān)于 RT-Thread 的項目有好幾個,感覺最近 RT-Thread 越來越火,
在幾年前用過 RT-Thread,那個時候都還沒有RT-Thread Studio IDE,現(xiàn)在啥都有了。
RT-Thread官方資料也多,理論,示例,說明應(yīng)有盡有,自己重新學(xué)習(xí)一邊,做個記錄貼。
目錄
前言
1、RT-Thread 版本(以哪個版本開始學(xué)習(xí))
1.1 RT-Thread Nano
1.2 RT-Thread 標(biāo)準(zhǔn)版
1.3 RT-Thread Smart
2、RT-Thread 開發(fā)環(huán)境
2.1 開發(fā)板(自己畫的開發(fā)板)
2.2 開發(fā)工具
2.3 環(huán)境搭建
2.4 RT-Thread Studio For Vscode
3、第一個工程
3.1 根據(jù)自己環(huán)境新建工程
3.2 配合 CubeMX 配置使用
3.2.1 SConscript 文件修改
3.2.2 CubeMX 再次修改配置問題記錄
3.3 創(chuàng)建一個跑馬燈任務(wù)
————————————————
前言
作為一款國產(chǎn)的操作系統(tǒng),相對其他操作系統(tǒng),官網(wǎng)對大部分工程師來說友好到了極點 = =!
什么資料直接可以查看官網(wǎng)即可。所以有問題,先上官網(wǎng)!
1、RT-Thread 版本(以哪個版本開始學(xué)習(xí))
目前來說,RT-Thread 主要分為3個大版本,這個在文檔中心就有,這里列出來根據(jù)自己的情況簡單說明一下:
1.1 RT-Thread Nano
RT-Thread Nano 和 FreeRTOS 是比較類似的東西 ,一個內(nèi)核,Nano適用于一些 內(nèi)存 空間小的MCU, 就比如我現(xiàn)在常用的 STM32L051C8 ,只有8KB 的RAM 空間,在講解FreeRTOS 的時候使用 STM32L051C8 不止一次的提到內(nèi)存問題。
學(xué)習(xí)的話根據(jù)自己需要,建議還是從標(biāo)準(zhǔn)版本開始學(xué)習(xí),因為標(biāo)準(zhǔn)版本包含Nano的一切,還多出了很多組件,方便使用的軟件包等。
實際應(yīng)用的話,在一般普通的應(yīng)用項目上,Nano估計用起來還更多,內(nèi)存就是成本!
RT-Thread Nano 的資料可以查看官方文檔中心,記住一點就行,它是一個極簡版的硬實時內(nèi)核。
1.2 RT-Thread 標(biāo)準(zhǔn)版
RT-Thread 標(biāo)準(zhǔn)版本是包含 Nano 的,標(biāo)準(zhǔn)版帶帶有豐富的組件軟件包,這是它與 FreeRTOS 主要區(qū)別之一,在一些應(yīng)用,比如 MQTT,云端接入等使用上,RT-Thread 具備現(xiàn)成的軟件包,使用起來簡單方便。
學(xué)習(xí)的話建議從標(biāo)準(zhǔn)版 入手,雖然在某些情況下,豐富的組件,軟件包可能會讓初學(xué)者犯難,組件和軟件包到底是如何與硬件相互關(guān)聯(lián),但是只要確實去學(xué)習(xí)了解了以后,才會發(fā)現(xiàn)其便捷之處,同時了解了原理,也能夠針對自己的應(yīng)用對組件進行對應(yīng)的裁剪,增加,更加能夠滿足各種項目需求。
介紹還是去官網(wǎng)查看,簡介截取自官網(wǎng):
RT-Thread 與其他很多 RTOS 如 FreeRTOS、uC/OS 的主要區(qū)別之一是,它不僅僅是一個實時內(nèi)核,還具備豐富的中間層組件:
即便是選好了 RT-Thread 標(biāo)準(zhǔn)版 作為學(xué)習(xí)的版本,但是就標(biāo)準(zhǔn)版而言,也有很多版本:
具體版本的不同以及如何選擇可以參考官方說明。
1.3 RT-Thread Smart
RT-Thread Smart 幾年前是沒有的,最近出來的分之,是針對于帶 MMU 的芯片,就是以前可以跑 Linux 系統(tǒng)的芯片。
比如近兩年比較火的多家出了開發(fā)板的 STM32MP1 和 IMX6ULL 兩款系列芯片。出的開發(fā)板最初當(dāng)然都是以 Linux 系統(tǒng)為主,現(xiàn)在 RT-Thread 也能夠跑在這些芯片上了。
這個版本就不是本欄目的博文需要記錄的了,如果后期在寫完 嵌入式Linux 后,有機會也來做些記錄。
簡介截取自官網(wǎng):
RT-Thread Smart(簡稱 rt-smart)是基于 RT-Thread 操作系統(tǒng)衍生的新分支,面向帶 MMU,中高端應(yīng)用的芯片,例如 ARM Cortex-A 系列芯片,MIPS 芯片,帶 MMU 的 RISC-V 芯片等。rt-smart 在 RT-Thread 操作系統(tǒng)的基礎(chǔ)上啟用獨立、完整的進程方式,同時以混合微內(nèi)核模式執(zhí)行。
2、RT-Thread 開發(fā)環(huán)境
2.1 開發(fā)板(自己畫的開發(fā)板)
通過上面的介紹,我們將以標(biāo)準(zhǔn)版來進行 RT-Thread 的記錄。
板子使用的是自己以前畫的 STM32F103VGT6(ROM:1MB RAM:96KB):
2.2 開發(fā)工具
還記得以前學(xué)習(xí) RT-Thread 的時候,還沒有出 RT-Thread Studio IDE,整體的工程搭建 需要用到 ENV,SCons 等工具,不管是MDK,IRA,GCC工具鏈開發(fā),都得先用到 ENV 和Scons 工具,配置操作一遍, 對于初學(xué)者來說,很不友好,具體的這些詳細介紹可以在官網(wǎng)查詢:
最初的學(xué)習(xí)根據(jù)官方的文檔手冊視頻等內(nèi)容,自己倒是也用起來了,但是,一段時間沒用,命令還是忘得差不多了。
現(xiàn)在好了,RT-Thread 官方團隊推出了 RT-Thread Studio 。RT-Thread Studio把以前的這些開發(fā)工具集成好了,不用死記以前那些命令,界面圖形話的工程搭建相對以前更加的簡便和直觀。
作為國產(chǎn)的 IDE,界面操作那是相當(dāng)?shù)挠押茫?我們本系列的教程是以項目為目的,為了能夠使用 RT-Thread 完成一個完整項目的開發(fā),所以不會去花太多精力去折騰 工程架構(gòu)的搭建之類的 事情,所以使用 RT-Thread Studio 是完美的選擇。
2.3 環(huán)境搭建
根據(jù)上面介紹,我們定下使用 RT-Thread Studio 來作為本系列博文的開發(fā) IDE,安裝下載可直接在官方找到,根據(jù)手冊安裝走起來:
等待安裝完成,運行軟件需要登錄一下 RT-Thread 賬號:
根據(jù)官方文檔說明,第一步先安裝更新 SDK 包:
在我這臺電腦上,以前搭建過環(huán)境,我有點感覺 RT-Thread Studio 會自動識別電腦中的環(huán)境變量,以找到電腦上已經(jīng)存在的環(huán)境,比如上面的版本,和我使用的 GCC 工具鏈版本:
安裝好了SDK包,基本上就可以開始建立工程測試了。
再次說明, RT-Thread Studio 使用手冊,界面配置等操作,官方文檔,視頻,都有詳細的說明。 這里記錄的是自己使用中必須的步驟。
2.4 RT-Thread Studio For Vscode
(待更新… 先還是使用 IDE 熟練起來,再來 Vscode 里用插件玩玩,畢竟相對來說 還是 IDE 配置更簡單)
3、第一個工程
3.1 根據(jù)自己環(huán)境新建工程
在上面操作結(jié)束以后,我們直接來新建一個工程,新建工程之前:
再次說明一下本文說使用的環(huán)境:
- 使用 RT-Thread 標(biāo)準(zhǔn)版
- 自己畫的開發(fā)板,基于STM32F103VGT6
所以我們在 RT-Thread Studio 里面新建項目的界面做如下選擇:
點擊完成,等待工程自動生成,因為串口1是在新建工程的時候默認已經(jīng)配置好,然后直接編譯一下,燒錄:
通過串口助手連接上開發(fā)板,波特率默認的位115200:
可以看到 RT-Thread 已經(jīng)在板子上正常運行起來:
3.2 配合 CubeMX 配置使用
上面的通過終端看到的測試結(jié)果,也只用到了 串口 功能,至于萬年不變的開局跑馬燈,我們都沒有看到,那么如何真正的在硬件上能夠體現(xiàn)出來呢,在官方文檔也有對應(yīng)的介紹:
但是官方這部分的說明不是太多,我們這里還是需要測試說明下,測試結(jié)果前面還算順利,后面的操作也有一些小問題,需要注意?。?!
點擊工程目錄下面的 CubeMx Setting:
打開了以后注意,以前使用 CubeMx 該怎么設(shè)置就怎么設(shè)置,時鐘,串口(如果只使用打印串口,不用其他串口通訊這里可以不設(shè)置,工程中已經(jīng)做過打印串口初始化),IO口等,雖然開始我們在工程建立的時候已經(jīng)是能過時鐘,串口,但是打開了這個設(shè)置,就得重新全部設(shè)置一遍!
我們根據(jù)步驟,把基本的 時鐘,調(diào)試方式,串口,LED,按鍵 配置好進行初步的簡單測試。
在生產(chǎn)代碼前把 Code Generator 欄目勾選一下:
然后點擊生成工程。
工程生成后不需要打開,但是必須關(guān)閉 CubeMX,這樣才能在RT-Thread Studio 上正常進行下面的操作 !
生成工程以后,關(guān)閉CubeMX會提示cubemx.ioc 已經(jīng)被修改,是否要保存配置,點擊確定,如下圖:
分析一下使用了CubeMX生成代碼后的工程:
- 原來的hal_conf.h就被cubeMX新生成的替換掉
- RT-Thread Studio 會且只會使用CubeMX生成的 Inc 和 Src 文件夾下的內(nèi)容
- 主函數(shù) RT-Thread Studio 會在 CubeMX生成的 main 函數(shù)前用 _WEAK 聲明
- 時鐘初始化函數(shù),會使用 CubeMx 中的設(shè)置
一些基本的構(gòu)建現(xiàn)在版本的RT-Thread Studio 都會自動設(shè)置好,通過SConscript
。
工程可以直接編譯通過。
我們主函數(shù)是在 applications 下面的 main.c 文件中,所以使用CubeMX生成的配置,我們需要在applications 下面的 main.c 文件中包含對應(yīng)的頭文件,和函數(shù)main中調(diào)用初始化。
3.2.1 SConscript 文件修改
但是沒想到在這里遇到了一個問題:
仔細看了看,發(fā)現(xiàn)這是找不到這兩個初始化的實現(xiàn),看著工程架構(gòu)中確實沒有這兩個.c文件,研究了半天,還是找到方法,修改SConscript
文件,類似Makefile:
注意!修改完SConscript
之后,是需要同步 scons 配置才能生效的,操作如下:
同步 scons 以后 cubemx -> Src -> 下面多了對應(yīng)的 .c 文件,重新構(gòu)建能按照我們的設(shè)置編譯了!
額外說明:
上面我示例中我還是使用了MX_USART1_UART_Init();,其實這里并不需要,因為串口1 在工程 drivers 文件夾里的drv_usart.c 文件中已經(jīng)使用INIT_BOARD_EXPORT(rt_hw_usart_init); 初始化了,所以不需要再次初始化,這里如果再配置一次,也不會出現(xiàn)問題,但是最好是不需要。
通過 Makefile 可以直接看到我們 CubeMX 生成了多少 .c 文件:
我們在上面除了 RT-Thread Studio 默認給我們添加的,我們還添加了 GPIO 和 串口 的驅(qū)動文件,還有一個 it 是和中斷有關(guān)的,我們并沒有添加??!
那么是不是中斷就無法響應(yīng)了呢?
還有,如果不添加 CubeMX生成的 GPIO 和 串口 的驅(qū)動文件,不使用CubeMX中的初始化,是不是GPIO就不能用了呢?
這些問題暫時不做解釋,RT-Thread 內(nèi)核自己還有板級驅(qū)動, 因為這是后面文章需要介紹的 RT-Thread 內(nèi)核驅(qū)動的一些知識。
3.2.2 CubeMX 再次修改配置問題記錄
第一次我們?yōu)榱藴y試,配置比較簡單,所以初始化的外設(shè)也比較少,隨著我們學(xué)習(xí)的深入,需要添加的外設(shè)越來越多,我們需要使用 CubeMX setting 再次修改配置,那么一些問題也隨之而來,這里就做個記錄:
1、__WEAK int main(void) 前面的 __WEAK 需要手動添加,注意這兩個下橫線是兩個英文的下劃線。
2、新添加的外設(shè)文件,需要通過修改SConscript
文件添加,步驟就按照上面說明:
注意有個文件stm32f1xx_it.c是不建議加的,因為其中的一些中斷響應(yīng)函數(shù)在 RT-Thread 內(nèi)部有實現(xiàn)這里會沖突,除非自己完全能懂哪些需要哪些不需要。
(stm32f1xx_it.c這個文件在后面 RT-Thread 應(yīng)用篇 — 在STM32L051上使用 RT-Thread 系列博文中會使用到,里面說明了如何修改)
3.3 創(chuàng)建一個跑馬燈任務(wù)
完成上述配置,我們開始可以跑馬燈走起來了,既然用了 RTOS,那么當(dāng)然是通過創(chuàng)建 一個 LED 跑馬燈任務(wù)來完成我們的快速上手。
我們在程序中 靜態(tài)創(chuàng)建一個線程 led1_blink ,上電就啟動調(diào)度,開始運行;
動態(tài)創(chuàng)建一個線程 led2_blink, 需要通過命令啟動調(diào)度,程序源碼如下:
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-02-16 QZH first lesson for test
*/
#include
#include "main.h"
#include "usart.h"
#include "gpio.h"
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include
static struct rt_thread led1_thread; //led1線程
static char led1_thread_stack[256];
static rt_thread_t led2_thread = RT_NULL; //led2線程
static void led1_thread_entry(void *par){
while(1){
LED1_ON;
rt_thread_mdelay(1000);
LED1_OFF;
rt_thread_mdelay(1000);
}
}
static void led2_thread_entry(void *par){
while(1){
LED2_ON;
rt_thread_mdelay(500);
LED2_OFF;
rt_thread_mdelay(500);
}
}
int main(void)
{
MX_GPIO_Init();
MX_USART1_UART_Init();
int count = 1;
rt_err_t rst2;
rst2 = rt_thread_init(&led1_thread,
"led1_blink ",
led1_thread_entry,
RT_NULL,
&led1_thread_stack[0],
sizeof(led1_thread_stack),
RT_THREAD_PRIORITY_MAX -1,
50);
if(rst2 == RT_EOK){
rt_thread_startup(&led1_thread);
}
while (count++)
{
if(count < 11){
LOG_D("Hello RT-Thread!%d",count);
}
if(count >= 0XFFFFFF00) count = 0;
rt_thread_mdelay(1000);
}
return RT_EOK;
}
void led2_Blink(){
led2_thread = rt_thread_create("led2_blink",
led2_thread_entry,
RT_NULL,
256,
RT_THREAD_PRIORITY_MAX -1,
50);
/* 如果獲得線程控制塊,啟動這個線程 */
if (led2_thread != RT_NULL)
rt_thread_startup(led2_thread);
}
MSH_CMD_EXPORT(led2_Blink, Led2 sample);
上述代碼測試的結(jié)果如下:
-
RT-Thread
+關(guān)注
關(guān)注
31文章
1289瀏覽量
40124 -
CubeMx
+關(guān)注
關(guān)注
0文章
31瀏覽量
1340
發(fā)布評論請先 登錄
相關(guān)推薦
評論