日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】FreeRTOS任务挂起和恢复示例

發布時間:2024/4/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】FreeRTOS任务挂起和恢复示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 概述
    • 02. 功能描述
    • 03. 任務設計
    • 04. 程序設計
    • 05. 執行結果
    • 06. 附錄
    • 07. 參考

01. 概述

任務掛起和恢復,當某個任務要停止運行一段時間就可以將這個任務掛起,當要重新運行這個任務的話就恢復這個任務的運行。

02. 功能描述

設計三個任務:start_task、task1_task和task2_task,這三個任務的功能分別如下:

start_task: 用來創建其它兩個任務。

task1_task: 當此任務運行5秒以后就會調用函數vTaskSuspend()掛起任務task2_task,當此任務運行10秒以后就會調用函數vTaskResume()恢復任務task2_task該任務控制LED0的閃爍,并且周期性的輸出信息到串口中。

task2_task:普通的應用任務,此任務控制LED1的閃爍,并且周期性的輸出信息到串口中。

03. 任務設計

任務優先級,堆棧大小,任務句柄和任務函數

//任務優先級 #define START_TASK_PRIO 1 //任務堆棧大小 #define START_STK_SIZE 128 //任務句柄 TaskHandle_t StartTask_Handler; //任務函數 void start_task(void *pvParameters);//任務優先級 #define TASK1_TASK_PRIO 2 //任務堆棧大小 #define TASK1_STK_SIZE 50 //任務句柄 TaskHandle_t Task1Task_Handler; //任務函數 void task1_task(void *pvParameters);//任務優先級 #define TASK2_TASK_PRIO 3 //任務堆棧大小 #define TASK2_STK_SIZE 50 //任務句柄 TaskHandle_t Task2Task_Handler; //任務函數 void task2_task(void *pvParameters);

start_task函數

//開始任務任務函數 void start_task(void *pvParameters) {taskENTER_CRITICAL(); //進入臨界區//創建TASK1任務xTaskCreate((TaskFunction_t )task1_task, (const char* )"task1_task", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_TASK_PRIO, (TaskHandle_t* )&Task1Task_Handler); //創建TASK2任務xTaskCreate((TaskFunction_t )task2_task, (const char* )"task2_task", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_TASK_PRIO,(TaskHandle_t* )&Task2Task_Handler); vTaskDelete(StartTask_Handler); //刪除開始任務taskEXIT_CRITICAL(); //退出臨界區 }

task1_task函數

//任務1 void task1_task(void *pvParameters) {u8 task1_num = 0;while(1){task1_num++;LED0 = !LED0;printf("任務1已經運行%d次\r\n", task1_num);if (5 == task1_num){//任務1掛起任務2vTaskSuspend( Task2Task_Handler);printf("任務1掛起了任務2\r\n");}if(10 == task1_num){//任務1恢復任務2vTaskResume(Task2Task_Handler);printf("任務1恢復了任務2\r\n");}//延時1秒 1000個時鐘節拍vTaskDelay(1000);} }

task2_task函數

//任務2 void task2_task(void *pvParameters) {u8 task2_num = 0;while(1){task2_num++;LED1 = !LED1;printf("任務2已經執行了%d次\r\n", task2_num);//延時1秒 1000個時鐘節拍vTaskDelay(1000);} }

04. 程序設計

main.c文件

#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "FreeRTOS.h" #include "task.h"//任務優先級 #define START_TASK_PRIO 1 //任務堆棧大小 #define START_STK_SIZE 128 //任務句柄 TaskHandle_t StartTask_Handler; //任務函數 void start_task(void *pvParameters);//任務優先級 #define TASK1_TASK_PRIO 2 //任務堆棧大小 #define TASK1_STK_SIZE 50 //任務句柄 TaskHandle_t Task1Task_Handler; //任務函數 void task1_task(void *pvParameters);//任務優先級 #define TASK2_TASK_PRIO 3 //任務堆棧大小 #define TASK2_STK_SIZE 50 //任務句柄 TaskHandle_t Task2Task_Handler; //任務函數 void task2_task(void *pvParameters);//主函數 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4delay_init(168); //初始化延時函數uart_init(115200); //初始化串口LED_Init(); //初始化LED端口//創建開始任務xTaskCreate((TaskFunction_t )start_task, //任務函數(const char* )"start_task", //任務名稱(uint16_t )START_STK_SIZE, //任務堆棧大小(void* )NULL, //傳遞給任務函數的參數(UBaseType_t )START_TASK_PRIO, //任務優先級(TaskHandle_t* )&StartTask_Handler); //任務句柄 vTaskStartScheduler(); //開啟任務調度 }//開始任務任務函數 void start_task(void *pvParameters) {taskENTER_CRITICAL(); //進入臨界區//創建TASK1任務xTaskCreate((TaskFunction_t )task1_task, (const char* )"task1_task", (uint16_t )TASK1_STK_SIZE, (void* )NULL, (UBaseType_t )TASK1_TASK_PRIO, (TaskHandle_t* )&Task1Task_Handler); //創建TASK2任務xTaskCreate((TaskFunction_t )task2_task, (const char* )"task2_task", (uint16_t )TASK2_STK_SIZE, (void* )NULL,(UBaseType_t )TASK2_TASK_PRIO,(TaskHandle_t* )&Task2Task_Handler); vTaskDelete(StartTask_Handler); //刪除開始任務taskEXIT_CRITICAL(); //退出臨界區 }//任務1 void task1_task(void *pvParameters) {u8 task1_num = 0;while(1){task1_num++;LED0 = !LED0;printf("任務1已經運行%d次\r\n", task1_num);if (5 == task1_num){//任務1掛起任務2vTaskSuspend( Task2Task_Handler);printf("任務1掛起了任務2\r\n");}if(10 == task1_num){//任務1恢復任務2vTaskResume(Task2Task_Handler);printf("任務1恢復了任務2\r\n");}//延時1秒 1000個時鐘節拍vTaskDelay(1000);} }//任務2 void task2_task(void *pvParameters) {u8 task2_num = 0;while(1){task2_num++;LED1 = !LED1;printf("任務2已經執行了%d次\r\n", task2_num);//延時1秒 1000個時鐘節拍vTaskDelay(1000);} }

05. 執行結果

任務2已經執行了1次 任務1已經運行1次 任務2已經執行了2次 任務1已經運行2次 任務2已經執行了3次 任務1已經運行3次 任務2已經執行了4次 任務1已經運行4次 任務2已經執行了5次 任務1已經運行5次 任務1掛起了任務2 任務1已經運行6次 任務1已經運行7次 任務1已經運行8次 任務1已經運行9次 任務1已經運行10次 任務2已經執行了6次 任務2已經執行了7次 任務1已經運行11次 任務2已經執行了8次

06. 附錄

6.1 【STM32】STM32系列教程匯總

網址:【STM32】STM32系列教程匯總

07. 參考

《FreeRTOS Reference Manual》

《Using the FreeRTOS Real Time Kernel -A Practical Guide》

《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors,3rd Edition》

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【STM32】FreeRTOS任务挂起和恢复示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。