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