00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. 功能描述
- 03. 任務設計
- 04. 程式設計
- 05. 結果驗證
- 06. 附錄
- 07. 參考
01. 概述
FreeRTOS中創建和洗掉任務API函式的應用,
02. 功能描述
設計三個任務:start_task、task1_task和task2_task,這三個任務的功能分別如下:
start_task: 用來創建其它兩個任務,
task1_task: 當此任務運行5秒以后就會呼叫函式vTaskDelete()洗掉任務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洗掉任務2
vTaskDelete(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);//設定系統中斷優先級分組4
delay_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洗掉任務2
vTaskDelete(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. 結果驗證
任務1運行5秒中之后洗掉了任務2,任務2被洗掉之后就不會被運行,最后只剩下任務1運行了,
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》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/209690.html
標籤:java
上一篇:網路變壓器 5G時代 三大要求
