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