嵌入式第六次作業(1)STM32基於FreeRTOS的多工程式
**
STM32基於FreeRTOS的多工程式
**
**
任務要求
**
在STM32下完成一個基於FreeRTOS的多工程式,執行3個週期性task。
task1,每間隔500ms閃爍(變化)一次LED;
task2,每間隔2000ms,向串列埠傳送一次指令資料“helloworld!";
task3,每間隔5000ms,從AHT20採集一次溫溼度資料(不考慮硬體情況,僅寫出整個多工框架模擬程式碼)。(由於缺少硬體,以後補充)
**
FreeRTOS移植
**
介紹
RTOS(Real Time Operating System 實時作業系統。
FreeRTOS是其中應用最為廣泛的一種,開源免費,原始碼和相應的官方書籍均可從官網 www.freertos.org 獲得。
使用FreeRTOS移植原始碼,建立多工進行程式設計可以使微控制器可實現功能更多,多工管理程式設計更加簡單。
這就是區別於裸機系統微控制器程式設計的一點。
應用
由於開發板是野火的指南者,所以配套的資料都由野火提供,我們只需要更改一下主函式部分完成自己的功能需求
首先我們找到目標工程檔案
注意:由於工程檔案路徑太長,我們需要把檔案重新拷貝,否則將打不開keil檔案
開啟後可以看到野火已經給我們寫好了工程,我們只需要修改主函式即可
此時在main.c主程式下去看,包含幾個部分如下:
1、硬體初始化;
2、建立任務。
主函式如下
#include "FreeRTOS.h"
#include "task.h"
#include "bsp_led.h"
#include "bsp_usart.h"
static TaskHandle_t AppTaskCreate_Handle = NULL;
static TaskHandle_t LED1_Task_Handle = NULL;
static TaskHandle_t hello_Task_Handle = NULL;
static void AppTaskCreate(void);
static void LED1_Task(void* pvParameters);
static void hello_Task(void* pvParameters);
static void BSP_Init(void);
int main(void)
{
BaseType_t xReturn = pdPASS;
BSP_Init();
printf("建立多工\r\n");
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
(const char* )"AppTaskCreate",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )1,
(TaskHandle_t* )&AppTaskCreate_Handle);
if(pdPASS == xReturn)
vTaskStartScheduler();
else
return -1;
while(1);
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
(const char* )"LED1_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED1_Task_Handle);
if(pdPASS == xReturn)
printf("LED1_Task\r\n");
xReturn = xTaskCreate((TaskFunction_t )hello_Task,
(const char* )"hello_Task",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )3,
(TaskHandle_t* )&hello_Task_Handle);
if(pdPASS == xReturn)
printf("hello_Task!\r\n");
if(pdPASS == xReturn)
printf("AHT_Task\r\n");
vTaskDelete(AppTaskCreate_Handle);
taskEXIT_CRITICAL();
}
static void LED1_Task(void* parameter)
{
while (1)
{
LED1_ON;
vTaskDelay(500);
printf("LED1_Task Running,LED1_ON\r\n");
LED1_OFF;
vTaskDelay(500);
printf("LED1_Task Running,LED1_OFF\r\n");
}
}
static void hello_Task(void* parameter)
{
while (1)
{
vTaskDelay(2000);
printf("hello World!\n");
}
}
static void BSP_Init(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_GPIO_Config();
USART_Config();
}
然後我們進行編譯下載
我使用的是野火的DAP線,所以設定Debug的時候需要注意
隨後就可以直接下載程式到開放板中
讓我們來看一下執行結果:
(1)開放板,LED正常閃亮(由於不能上傳視訊,所以看著有點彆扭)
bandicam 2020-12-04 13-13-51-673
**
視訊地址:
**
https://www.bilibili.com/video/BV11p4y1z7Nc
**
(2)模擬器我們可以看到多個任務程式在同時進行
**
**
總結
**
本文章的重點內容是FreeRTOS的移植和多工的實現。前面內容只是對整個內容的一些介紹,不想了解也沒什麼關係。只是可能在後面程式碼部分,看的不是很懂。不清楚每個部分具體是完成一些什麼操作。本過程初始化函式是必要的,一定不要忘記新增。特別是對串列埠的初始化,如果沒有初始化,程式可能不會報錯,但是,使用串列埠除錯助手進行資料接收就什麼也不會顯示。程式中的printf函式並不是指的C程式中的printf函式,而是串列埠中重新定義的函式,不要混淆了
相關文章
- FreeRtos於嵌入式環境的應用
- 高階語言程式設計第六次作業程式設計
- 高階語言程式設計第六次個人作業程式設計
- 嵌入式系統程式設計基礎第一二週作業程式設計
- 基於正則化的多工聯邦
- 基於DSP/BIOS和NDK的嵌入式網路作業系統設計方案iOS作業系統
- 嵌入式作業5
- 高階語言程式設計課程第六次個人作業程式設計
- 嵌入式作業6.2 ADC 程式設計程式設計
- 嵌入式作業1.2 執行示例程式
- 作業1:自我介紹+軟工5問軟工
- 基於工業資料的檢測分析
- 【嵌入式系統】STM32串列埠通訊的四種方法(基於RTOS)串列埠
- 基於vscode搭建freertos環境VSCode
- 談談作業系統的多程式作業系統
- 嵌入式作業5.1 定時器程式設計定時器程式設計
- 作業系統思考 第八章 多工作業系統
- Redox OS:基於Rust的作業系統Rust作業系統
- 基於微控制器的多工輪詢系統
- Google作業系統基於Chrome?!Go作業系統Chrome
- 嵌入式作業6.3 CAN 匯流排程式設計程式設計
- 軟工1作業筆記 20240420軟工筆記
- 基於事件驅動的Oracle作業排程事件Oracle
- Linux在工業與嵌入式的應用Linux
- 基於多工學習的智慧客服下文檢測方法
- 畢業設計——基於STM32的音樂播放器設計(一)播放器
- 基於工業領域的UWB定位系統原始碼原始碼
- 作業1
- 基於程式池的多程式伺服器通訊伺服器
- 基於深度多工學習的自然語言處理技術自然語言處理
- 作業系統(二)——程式的描述與控制(1)作業系統
- .NET多執行緒程式設計(1):多工和多執行緒 (轉)執行緒程式設計
- 【FreeRtos教程三】STM32 CubeMx——Message Queue(訊息佇列)佇列
- 基於5G工業智慧閘道器的數字化智慧工廠
- 基於Mesos的作業雲 Elastic-Job-Cloud 原始碼分析 —— 作業排程(一)ASTCloud原始碼
- 基於java jsp的某企業員工管理系統JavaJS
- 關於nchu的pta作業集1-3的總結
- 嵌入式作業系統--linux基礎(lv2_第六課)作業系統Linux