CubeMX 中创建任务
首先在 freeRTOS 的配置页面中的 Configuration 下,选中 Tasks and Queues 标签页,存在一个已经创建的默认任务为 “defaultTask”,点击进入配置选项修改为如下图所示。
如果需要增加一个新任务,点击 Add,就可以创建一个新的任务。
在弹出的页面中,可以配置任务名称,优先级,栈大小,入口函数等。各个参数的具体功能 见下表:
| 选项 | 当前值 | 含义 & 注意事项 |
| Task Name | LED_Task | 任务名称字符串,调试器内核查看时显示,字符串名称,不影响变量名 |
| Priority | osPriorityLow | CMSIS-V2 优先级枚举CMSIS 优先级映射底层 FreeRTOS;数值越高优先级越高常用:osPriorityLow < osPriorityNormal < osPriorityHigh |
| Stack Size (Words) | 128 | 重点:任务栈大小,单位 Words(32 位 MCU:1Word=4 字节)128 Words = 512 字节;LED 简单循环任务够用,函数嵌套多、调用 printf、浮点运算时需要加大 |
| Entry Function | StartTask02 | 任务入口函数名,CubeMX 自动生成这个函数模板;任务死循环写在此函数内 函数原型固定:void StartTask02(void *argument) |
| Code Generation Option | Default | 任务函数代码生成方式 设置为 Default 则会产生一个普通的 任务函数 As weak:产生一个用__weak 修饰符修饰的任务函数; As external:产生一个外部引用的任务函数,用户需要自 己实现该函数; Default:产生一个默认格式的任务函数,用户需要在该函 数实现功能。 |
| Parameter | NULL | 创建任务时传递给入口函数的入参 argument,可以传递变量指针 |
| Allocation | Dynamic | 分配模式・Dynamic(动态):任务 TCB、栈内存从 FreeRTOS 堆 TOTAL_HEAP_SIZE 分配・Static(静态):使用全局数组,不占用堆内存,需要填写下方 Buffer/Control Block |
| Buffer Name | NULL | 仅静态分配有效:填写栈数组名称 |
| Control Block Name | NULL | 仅静态分配有效:填写任务控制块 TCB 结构体数组名称 |
设置完毕之后点击 OK,就可以看到列表中多出了自己创建的任务
生成代码
点击生成代码的时候,可以看到这里会弹出一个警示:
警告:
当使用RTOS(实时操作系统)时,强烈建议HAL时基源使用除了SysTick之外的时基源。HAL时基源可以在“Pinout & Configuration”标签页下的“SYS”部分进行更改。
为什么会有这个警告?
当RTOS运行时,它通常需要一个自己的独立时钟源(通常也称为“时基”或“系统节拍”)来进行任务调度、延时管理等。如果RTOS和HAL库都使用同一个SysTick作为时基源,可能会导致以下问题:
冲突和不稳定性: RTOS可能会修改SysTick的配置,或者其自身的节拍中断与HAL库对SysTick的使用发生冲突,导致RTOS或HAL库的时间功能出现异常,甚至系统崩溃。
为了确保RTOS和HAL库都能稳定、正确地运行,STM32CubeMX建议你将HAL库的时基源从默认的SysTick切换到微控制器上的其他通用定时器(如TIM6、TIM7等),让SysTick专门供RTOS使用。这样可以避免它们之间对SysTick的争用和冲突。
本章结束
下一章解释创建的freertos.c中代码含义