1. 什么是任务?
任务可以理解为进程/线程,创建一个任务,就会在内存开辟一个空间。
任务可以被认为是一组函数,它们在运行时相互协作以完成特定的目标。
在 FreeROTS 中,任务可以分配不同的优先级,并按照优先级进行调度。当一个任务没有工作可以做时,操作系统会将 CPU 时间分配给另一个优先级更高的任务,以确保系统的正常运行。
任务通常都含有 while(1) 死循环。
2. 任务创建与删除相关函数
任务创建与删除相关函数有如下三个:
函数名称 | 函数作用 |
xTaskCreate() | 动态方式创建任务 |
xTaskCreateStatic() | 静态方式创建任务 |
vTaskDelete() | 删除任务 |
任务动态创建与静态创建的区别:
动态创建任务的堆栈由系统分配,而静态创建任务的堆栈由用户自己传递。 通常情况下使用动态方式创建任务。
xTaskCreate 函数原型
1. pxTaskCode:指向任务函数的指针,任务必须实现为永不返回(即连续循环);
2. pcName:任务的名字,主要是用来调试,默认情况下最大长度是16;
3. pvParameters:指定的任务栈的大小;
4. uxPriority:任务优先级,数值越大,优先级越大;
5. pxCreatedTask:用于返回已创建任务的句柄可以被引用。
返回值 | 描述 |
pdPASS | 任务创建成功 |
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY | 任务创建失败 |
vTaskDelete 函数原型
void vTaskDelete(TaskHandle_t xTaskToDelete);
只需将待删除的任务句柄传入该函数,即可将该任务删除。
当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。
3. 创建两个任务进行点灯实操
使用CubeMX快速移植
将FreeRTOS移植到STM32F103C8T6,具体看我写过的文章FreeRTOS移植到STM32F103C8T6
1.增加两个任务
2.查看原理图,设置两个LED灯的引脚为输出引脚
3.导出代码后加入下面代码,编译烧录32单片机
打开freertos.c文件
void StartTaskLED1(void const * argument) { for(;;) { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8); osDelay(500); } } void StartTaskLED2(void const * argument) { for(;;) { HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); osDelay(1000); } }