【STM32之FreeRTOS(二)】任务的创建与删除
文章目录
- 【STM32之FreeRTOS(二)】任务的创建与删除
- 一、什么是任务?
- 二、任务创建与删除相关函数
- 1.任务创建与删除相关函数
- 2.任务动态创建与静态创建的区别
- 3.xTaskCreate 函数原型
- 4.vTaskDelete 函数原型
- 三、实操(同时控制两个LED)
- 1.创建任务
- 2.配置LED引脚,生成代码
- 3.编写函数业务逻辑代码
- 4.效果展示
- 5.任务删除(略)
一、什么是任务?
**任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。 **
**比如: 玩游戏、陪女朋友,都可以视为任务 Windows 系统中的 MarkText 、谷歌浏览器、记事本,都是任务。 **
任务通常都含有 while(1) 死循环。
二、任务创建与删除相关函数
1.任务创建与删除相关函数
函数名称 | 函数作用 |
---|---|
xTaskCreate() | 动态方式创建任务 |
xTaskCreateStatic() | 静态方式创建任务 |
vTaskDelete() | 删除任务 |
2.任务动态创建与静态创建的区别
动态创建任务的堆栈由系统分配,而静态创建任务的堆栈由用户自己传递。 通常情况下使用动态方式创建任务。
3.xTaskCreate 函数原型
- pvTaskCode:指向任务函数的指针,任务必须实现为永不返回(即连续循环)
- pcName:任务的名字,主要是用来调试,默认情况下最大长度是16
- pvParameters:指定的任务栈的大小
- uxPriority:任务优先级,数值越大,优先级越大
- pxCreatedTask:用于返回已创建任务的句柄可以被引用
返回值 | 描述 |
---|---|
pdPASS | 任务创建成功 |
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY | 任务创建失败 |
4.vTaskDelete 函数原型
只需将待删除的任务句柄传入该函数,即可将该任务删除。
当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。
void vTaskDelete(TaskHandle_t xTaskToDelete);
三、实操(同时控制两个LED)
1.创建任务
复制一份之前的工程模板(muban_freertos),打开它的CubeMX,再进行下面的操作
创建第一个LED任务,配置如下:
- Task Name(函数名字):taskLED1
- Priority(优先级):osPriorityNormal
- Stack Size(栈的大小,默认128):128
- Entry Function(函数指针):StartTaskLED1 (可以注意一下格式)
- Code Generation Option(生成代码的方式,默认Default):Default
- Parameter(函数的参数,一般不需要):NULL
- Allocation(任务创建的方式,动态):Dynamic
创建第二个LED任务,类似第一个
2.配置LED引脚,生成代码
将PB8、PB9设置成输出模式,然后生成代码即可
打开工程可以看到,两个LED任务已经创建成功
看到的任务创建函数不一样,是因为FreeRTOS帮我们封装好了一层
点击编译后,可以对该函数进行定义跳转,此时就能看到任务创建函数的原型
3.编写函数业务逻辑代码
在freertos.c下进行函数业务逻辑的编写
/* USER CODE END Header_StartTaskLED1 */
void StartTaskLED1(void const * argument)
{/* USER CODE BEGIN StartTaskLED1 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);osDelay(500); //ms}/* USER CODE END StartTaskLED1 */
}/* USER CODE END Header_StartTaskLED2 */
void StartTaskLED2(void const * argument)
{/* USER CODE BEGIN StartTaskLED2 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);osDelay(1000);}/* USER CODE END StartTaskLED2 */
}
4.效果展示
编译后烧录即可
蓝灯0.5s翻转一次,黄灯1s翻转一次