创建任务+LED闪烁
PF9和PF10分别是LED0和LED1,可以看出当PF9(LED0)和PF10(LED1)输出低电平发光二极管导通。
打开Cubemx配置好这里具体基本的配置就不写了,只写比较重点的PF9和PF10配置为默认为高电平,推挽输出,无上下拉。
找到地下的Middleware and Software Packs选择FREERTOS,interface选择CMSIS_V2然后就GENERATE CODE。
点灯需要用到HAL_GPIO_WritePin这个函数,可以控制输出高低电平。
创建好hardware.c和hareware.h
代码
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);
}
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();
#endif
在freertos.c引入hareware.h
在freertos.c创建LED_Test函数,实现LED闪烁
xTaskCreate()使用动态内存的方式创建一个任务。
-
ret = xTaskCreate((TaskFunction_t) master_task_main, /* 任务入口函数 */(1)
-
“MASTER”, /* 任务名字 */(2)
-
64*1024, /* 任务栈大小 */(3)
-
NULL, ,/* 任务入口函数参数 */(4)
-
TASK_PRIORITY_NORMAL, /* 任务的优先级 */(5)
-
&task_master_handler); /* 任务控制块指针 */(6)
创建任务就是软件运行时的一个while(1)的入口,一般阅读其他代码,找到这个函数,再跟踪到任务入口函数,学习基于freeRTOS系统的代码,首先就是找到main和这个接口。
(1):任务入口函数,即任务函数的名称,需要我们自己定义并且实现。
(2):任务名字,字符串形式,最大长度由
FreeRTOSConfig.h 中定义的 configMAX_TASK_NAME_LEN 宏指定,多余部分会被自动截掉,只是方便调试。
(3):任务堆栈大小,单位为字, 4 个字节,这个要注意,否则系统内存紧缺。
(4):任务入口函数形参,不用的时候配置为 0 或者NULL 即可。
(5) :任务的优先级,在 FreeRTOS 中,数值越大优先级越高,0
代表最低优先级。基于其SDK开发,可将自定义的所有业务功能task设为同一个优先级,按时间片轮询调度。
(6):任务控制块指针,使用动态内存的时候,任务创建函数
xTaskCreate()会返回一个指针指向任务控制块,也可以设为NULL,因为任务句柄后期可以不使用。
在cmsis_os2.c中下滑找到osPriorityNorma,普通优先级
用xTaskCreate函数创建LED任务参数分别是任务入口函数LEDTest,任务名字"LED",栈大小254,任务入口函数参数NULL,任务优先级,任务优先级osPriorityNorma,任务控制块指针NULL。
代码
/* 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"
#include "hardware.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
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);
xTaskCreate(LED_Test,"LED",254,NULL, osPriorityNormal,NULL);
* /* USER CODE BEGIN RTOS_THREADS /
* /* add threads, ... /
* /* 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 */
}
/* USER CODE END Application */
实现效果图片