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

    物联沃分享整理
    物联沃-IOTWORD物联网 » FreeRTOS基础:任务挂起与任务删除的详解

    发表回复