FreeRTOS 初步

在单片机下,之前进行的都是裸机编程。大多数实现函数都存放在主循环 while(1)内。但是,在随着功能愈加繁多,整体逻辑愈加复杂。主循环过于冗余维护成本高昂。这样,操作系统就被引入进来。
在嵌入式开发有很多种实时操作系统,其中开源的 FreeRTOS 是使用较多的一款实时操作系统。当引入了操作系统,我们就不再需要在主循环内插入繁多的函数逻辑,将每个函数分开来,由 FreeRTOS 进行调度可以提高效率。

任务

在 FreeRTOS 中,我们将每个自己编写的函数都看作是一个无限循环而且不能返回的子程序,称作任务。每一个任务都是独立存在的,FreeRTOS 通过时间片轮转调度的方式在极短的时间区间内轮询执行每一个任务,这样它们看起来就好像同时进行。

替换文件使 ARMComplier 6 能够编译 FreeRTOS

在 Keil 下,如果使用的 ArmComplier 6 编译带有 FreeRTOS 的项目会有近百条报错,而解决方法就是通过文件替换的方式让 Keil 可以成功编译。
对于 STM32F103C8T6 ,我们只需要将 C:\Users\用户名\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.6\Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\ARM_CM3 内的内容粘贴替换掉 C:\Users\storm\STM32Cube\Repository\STM32Cube_FW_F1_V1.8.6\Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\ARM_CM3 的内容即可。

CuteMX 添加并配置 FreeRTOS

如图,打开一个已经配置好的 STM32CuteMX 工程选择 Pinout & Configuration > Middleware and Software Packs > FREERTOS 在 Interface 中选择 CMSIS_V1 即可。
同时,还需要在 SYS > Timebace Source 把 Systick 改成没有用过的 TIM 定时器,否则生成代码时会有如下警告。

创建任务

回到原来的 FREERTOS 配置界面,点击 Tasks and Queues 选项卡进入任务列表,点击 Add 创建任务。
跳出来的选项卡暂时只需要关注 Task Name、Entry Function\Code Generation Option 这三个选项。

  • Task Name:
    任务名为任务定义一个 ThreadID 这个变量将存储创建后任务的唯一 ID ,所有的操作都需要这个 ID。
  • Entry Function
    空函数名,在这里定义生成的函数名,作为我们以后要编写的函数名。
  • Code Generation Option
    代码生成选项,一般使用 As weak ,将生成的函数弱定义。方便我们之后再重新实现代码而不需要管原来自动生成的函数。

主函数

当这些配置好后可以生成代码进入 Keil 实现函数。
int main() 中调用了如下函数。

1
2
  MX_FREERTOS_Init();
  osKernelStart();
  • MX_FREERTOS_Init()
    初始化 FREERTOS 使得 FREERTOS 开始调用。
  • osKernelStart()
    在这里启动内核,在 osKernelStart() 被调用之后主函数后面代码就不再被调用。

任务函数

当我们使用 As weak 生成参数后,在 main.c 中会生成相应带 __weak 编译参数的弱定义初始函数。比如这个 odd 任务生成的函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
__weak void odd(void const * argument)
{
  /* USER CODE BEGIN odd */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END odd */
}

我们可以重新定义这个函数,这次我们在工程文件中创建一个新的 c 文件用于存放重定义的函数。
在 Project 选项卡中,在 Core 文件夹右键选择 Add Existing Files to Group 在这里勾选已经存在或者新建的 .c 文件。

比如在这里添加上:

1
2
3
4
5
6
void odd(void const * argument)
{
  while(1)
  {
  }
}

函数内部可以自己编写,注意添加头文件。
而且需要需要在一个死循环中编写逻辑。

参考资料

基于STM32的FreeRTOS实时操作系统1

萌ICP备20241614号