挂起任务和删除任务
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 */
实现效果