FreeRTOS基础:任务挂起与任务删除的详解
挂起任务和删除任务
PA0下拉输入,PE2,PE3,PE4上拉输入。
在hardware.c编写按键函数
#include "hardware.h"
void LED0_ON(){
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9, GPIO_PIN_RESET);
}
void LED1_ON(){
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10, GPIO_PIN_RESET);
}
void LED0_OFF(){
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_9, GPIO_PIN_SET);
}
void LED1_OFF(){
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10, GPIO_PIN_SET);
}
uint8_t key(){
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==1){
return 5;
}
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0){
return 2; }
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0){
return 3; }
}
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0){
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0){
return 4; }
}
}
在hardware.h声明按键函数
#ifndef HARDWARE_H
#define HARDWARE_H
#include "stm32f4xx.h" // Device header
void LED0_ON();
void LED1_ON();
void LED0_OFF();
void LED1_OFF();
uint8_t key();
#endif
在freertos.c引入hardware.h头文件,定义全局变量Key_Num,任务函数等等。
在MX_FREERTOS_Init()函数中创建两个任务LED_Test,Ket_Test。
编写函数功能LED_Test led闪烁
任务状态切换
FreeRTOS 系统中的每一个任务都有多种运行状态,具体如下:
任务挂起函数
vTaskSuspend()
挂起指定任务,被挂起的任务绝不会得到 CPU 的使用权
vTaskSuspendAll()
将所有的任务都挂起 任务恢复函数
vTaskResume()
vTaskResume()
xTaskResumeFromISR()
任务恢复就是让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。xTaskResumeFromISR() 专门用在中断服务程序中。无论通过调用一次或多次vTaskSuspend()函数而被挂起的任务,也只需调用一次恢复即可解挂 。
任务删除函数
vTaskDelete()用于删除任务。当一个任务可以删除另外一个任务,形参为要删除任 务创建时返回的任务句柄,如果是删除自身, 则形参为 NULL。
删除自己用vTaskDelete(句柄);//句柄可以是NULL
按键函数Key_Test(),完成按键WK_UP挂起led任务,KEY2删除按键任务,KEY1恢复LED任务,KEY0删除LED任务.
freertos.c代码
/* USER CODE BEGIN Header */
/**
File Name : freertos.c
Description : Code for freertos applications
@attention
*
Copyright (c) 2024 STMicroelectronics.
All rights reserved.
*
This software is licensed under terms that can be found in the LICENSE file
in the root directory of this software component.
If no LICENSE file comes with this software, it is provided AS-IS.
*
*/
/* USER CODE END Header */
/* Includes ——————————————————————*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"
/* Private includes ———————————————————-*/
/* USER CODE BEGIN Includes */
#include "hardware.h"
uint8_t key_Num = 0;
TaskHandle_t LED123;
TaskHandle_t KEY123;
void Key_Test(void *argument);
void LED_Test(void *argument);
/* USER CODE END Includes */
/* Private typedef ———————————————————–*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ————————————————————*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro ————————————————————-*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ———————————————————*/
/* USER CODE BEGIN Variables */
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
/* Private function prototypes ———————————————–*/
/* USER CODE BEGIN FunctionPrototypes */
/* USER CODE END FunctionPrototypes */
void StartDefaultTask(void *argument);
void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */
/**
@brief FreeRTOS initialization
@param None
@retval None
*/
void MX_FREERTOS_Init(void) {
/* USER CODE BEGIN Init /
* /* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX /
* /* add mutexes, … /
* /* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES /
* /* add semaphores, … /
* /* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS /
* /* start timers, add new ones, … /
* /* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES /
* /* add queues, … /
* /* USER CODE END RTOS_QUEUES */
/* Create the thread(s) /
* /* creation of defaultTask */
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* USER CODE BEGIN RTOS_THREADS /
* /* add threads, … */
xTaskCreate(LED_Test,"LED",254,NULL,osPriorityNormal,&LED123);
xTaskCreate(Key_Test,"KEY",254,NULL,osPriorityNone,&KEY123);
/* USER CODE END RTOS_THREADS */
/* USER CODE BEGIN RTOS_EVENTS /
* /* add events, … /
* /* USER CODE END RTOS_EVENTS */
}
/* USER CODE BEGIN Header_StartDefaultTask */
/**
@brief Function implementing the defaultTask thread.
@param argument: Not used
@retval None
*/
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask /
* /* Infinite loop /
for(;;)
{
osDelay(1);
}
* /* USER CODE END StartDefaultTask */
}
/* Private application code ————————————————–*/
/* USER CODE BEGIN Application */
void LED_Test(void *argument)
{
/* USER CODE BEGIN StartDefaultTask /
* /* Infinite loop /
for(;;)
{
LED0_ON();
LED1_OFF();
osDelay(500);
LED0_OFF();
LED1_ON();
osDelay(500);
}
* /* USER CODE END StartDefaultTask */
}
void Key_Test(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop /
for(;;)
{
key_Num = key();
if(key_Num==5){
//WK_UP
vTaskSuspend(LED123);//挂起任务
}else if(key_Num==2){
//KEY2** vTaskDelete(NULL);//删除自己
}else if(key_Num==3){
//KEY1** vTaskResume(LED123);//恢复任务
}else if(key_Num==4){
//KEY0
vTaskDelete(LED123);//删除任务
}
}
* /* USER CODE END StartDefaultTask */
}
/* USER CODE END Application */
实现效果
作者:life is fantastic377