stm32 任务创建
STM32 freeRTOS 任务创建
一、freeRTOS 原生任务创建
1.任务初始化参数配置:
#define TASK1_PRIO 2 /* 任务优先级 */
#define TASK1_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 */
2.任务创建:
/* 创建任务1 */
xTaskCreate((TaskFunction_t )task1, /* 任务函数 */
(const char* )"task1", /* 任务名称 */
(uint16_t )TASK1_STK_SIZE, /* 任务堆栈大小 */
(void* )NULL, /* 传入给任务函数的参数 */
(UBaseType_t )TASK1_PRIO, /* 任务优先级*/
(TaskHandle_t* )&Task1Task_Handler); /* 任务句柄 */
3.任务执行函数创建:
void task1(void *pvParameters)
{
while (1)
{
vTaskDelay(1000);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
vTaskDelay(1000);
}
}
4.开启任务调度
vTaskStartScheduler();
建议:开始任务调度前先把所有任务初始化完成
二、stm32cubeMax 任务创建
注意:在代码块注释 begin 与 end 之间的代码,生成代码时不会被删除,其他区域的自己写的代码会被删除。
1.初始化任务调度(在main 里面执行)
osKernelInitialize();
2.任务参数初始化(下面封装在 rtos 初始化函数里面执行)
//任务块创建
osThreadId_t defaultTaskHandle;
//任务参数配置 名字、大小、优先级
const osThreadAttr_t defaultTask_attributes = {
.name = "defaultTask",
.stack_size = 128 * 4,
.priority = (osPriority_t) osPriorityNormal,
};
3.任务创建
//参数 (任务执行函数、任务参数、任务句柄)
defaultTaskHandle = osThreadNew(StartDefaultTask,
NULL,
&defaultTask_attributes)
4.任务函数创建
void StartDefaultTask(void *argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
//延时 1 秒
osDelay(1000);
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_5);
}
/* USER CODE END StartDefaultTask */
}
5.开启任务调度(在 mian 里面执行)
//直接执行函数
osKernelStart();
注意: 特别需要注意的是RTOS正常工作时 osKernelStart 是无限循环的,不停的在此处对各个任务进行调度,通常写在这后面的所有操作都不会被执行,如果执行那说明系统运行出错了。
三、freeRTOS 原生任务删除
//任务参数是 (任务句柄)
vTaskDelete(Task1Task_Handler); /* 删除任务*/