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 */

实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值