基于STM32的RT-Thread-Nano移植
板子:STM32F103C8
移植系統:uc/OS-III
編譯工具:Keil&STM32CubeMX
燒錄工具:FlyMcu
實驗內容:利用多任務點亮PB0,PB1的LED燈
文章目錄
- 基于STM32的RT-Thread-Nano移植
- 〇、RT-Thread
- 1. 概述
- 2. 架構
- 3. 許可協議
- 4. 優勢
- 一、為STMCubeMX與Keil添加RT-Thread組件包
- 二、利用CubeMX+Keil實作移植
- 1. CubeMX配置
- 2. Keil配置
- 3. 編譯運行
- 三、總結
- 四、參考文章
- 五、源代碼
〇、RT-Thread
1. 概述
RT-Thread,全稱是 Real Time-Thread,顧名思義,它是一個嵌入式實時多執行緒作業系統,基本屬性之一是支持多任務,允許多個任務同時運行并不意味著處理器在同一時刻真地執行了多個任務,事實上,一個處理器核心在某一時刻只能運行一個任務,由于每次對一個任務的執行時間很短、任務與任務之間通過任務調度器進行非常快速地切換(調度器根據優先級決定此刻該執行的任務),給人造成多個任務在一個時刻同時運行的錯覺,在 RT-Thread 系統中,任務是通過執行緒實作的,RT-Thread 中的執行緒調度器也就是以上提到的任務調度器,
2. 架構
近年來,物聯網(Internet Of Things,IoT)概念廣為普及,物聯網市場發展迅猛,嵌入式設備的聯網已是大勢所趨,終端聯網使得軟體復雜性大幅增加,傳統的 RTOS 內核已經越來越難滿足市場的需求,在這種情況下,物聯網作業系統(IoT OS)的概念應運而生,**物聯網作業系統是指以作業系統內核(可以是 RTOS、Linux 等)為基礎,包括如檔案系統、圖形庫等較為完整的中間件組件,具備低功耗、安全、通信協議支持和云端連接能力的軟體平臺,**RT-Thread 就是一個 IoT OS,
RT-Thread 與其他很多 RTOS 如 FreeRTOS、uC/OS 的主要區別之一是,它不僅僅是一個實時內核,還具備豐富的中間層組件,如下圖所示,

3. 許可協議
RT-Thread 系統完全開源,3.1.0 及以前的版本遵循 GPL V2 + 開源許可協議,從 3.1.0 以后的版本遵循 Apache License 2.0 開源許可協議,可以免費在商業產品中使用,并且不需要公開私有代碼,
4. 優勢
相較于 Linux 作業系統,RT-Thread 體積小,成本低,功耗低、啟動快速,除此以外 RT-Thread 還具有實時性高、占用資源小等特點,非常適用于各種資源受限(如成本、功耗限制等)的場合,雖然 32 位 MCU 是它的主要運行平臺,實際上很多帶有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列級別 CPU 的應用處理器在特定應用場合也適合使用 RT-Thread,
一、為STMCubeMX與Keil添加RT-Thread組件包
官網有詳細講解和Demo,這里為了精簡文章篇幅不再多做解釋
獲取RT-Thread Nano軟體包
在keil專案上加入RT-Thread
二、利用CubeMX+Keil實作移植
1. CubeMX配置
引腳配置
設定PB0,PB1控制LED燈的亮滅


RT-Thread


框中選項都打鉤
2. Keil配置
根據PB0,PB1創建兩個LED燈任務,一個一個以100ms的頻率不斷閃爍,另一個以500ms的頻率不斷閃爍,
在Application/USER檔案夾下新建app_rt_thread.c檔案后添加以下代碼:
#include "rtthread.h"
#include "main.h"
#include "stdio.h"
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
struct rt_thread led2_thread;
rt_uint8_t rt_led2_thread_stack[128];
void led2_task_entry(void *parameter);
//初始化執行緒函式
void MX_RT_Thread_Init(void)
{
//初始化LED1執行緒
rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
rt_thread_init(&led1_thread,"led2",led2_task_entry,RT_NULL,&rt_led2_thread_stack[0],sizeof(rt_led2_thread_stack),3,20);
//開啟執行緒調度
rt_thread_startup(&led1_thread);
rt_thread_startup(&led1_thread);
}
//主任務
void MX_RT_Thread_Process(void)
{
printf("Hello RT_Thread!!!");
rt_thread_delay(2000);
}
//LED1任務
void led1_task_entry(void *parameter)
{
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0, GPIO_PIN_RESET);
rt_thread_delay(100);
HAL_GPIO_WritePin(GPIOB,GPI0_PIN_0, GPIO_PIN_SET);
rt_thread_delay(100);
}
}
void led1_task_entry(void *parameter)
{
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1, GPIO_PIN_RESET);
rt_thread_delay(500);
HAL_GPIO_WritePin(GPIOB,GPI0_PIN_1, GPIO_PIN_SET);
rt_thread_delay(500);
}
}
找到Middlewares/RT-Thread/RTOS/kernel檔案夾下的board.c檔案,修改串口USART2為USART1,

main.c
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
/* USER CODE END PTD */
3. 編譯運行

除了本文中單獨寫兩個執行緒的方法以為,還可以通過只寫一個子執行緒另一個任務在主執行緒運行的方法,
三、總結
通過RT-Thread學習了另一種嵌入式多任務系統,這個比UCOSIII的門檻更低,操作更加方便,
四、參考文章
Ch_champion: 基于 STM32CubeMX 添加 RT-Thread 作業系統組件(一)- 詳細介紹操作步驟
醉意丶千層夢: STM32F103C8基于RT-Thread實作簡單多任務
五、源代碼
https://github.com/Wattson1128/Embedded-System
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/396316.html
標籤:其他
下一篇:可編程并行通信介面8255A
