STM32CubeIDE使用说明_4 —— 运行µC/OS-III

一般而言,当软件功能比较简单时,前后台系统基本都能很好的实现想要的功能,当实现的功能越来越复杂时,就需要引入操作系统,一般称为RTOS,即嵌入式实时操作系统。嵌入式实时操作系统有很多,收费的或者开源的数不胜数,例如FreeRTOS、Vxworks、RT-Thread、µC/OS-III、µC/OS-Ⅱ等,国产的也有Huawei LiteOS、AliOS Things、都江堰操作系统、TencentOS Tiny等。
网上有很多基于Keil来移植µC/OS的教程,用此文章记录下在STM32CubeIDE下移植µC/OS的过程,用于分享和记录。
µC/OS-III从2009年开始发行,基于open-source Apache 2.0许可证进行开源,供任何人下载学习。官网地址:https://www.silabs.com/developers/micrium
官网上提供了大量针对不同处理器移植的例程,只需要注册即可下载(但是不知道为什么国内带.com后缀的邮箱无法注册),例程下载地址:https://weston-embedded.com/micrium-examples

这里还是以STM32F103C8T6处理器来作为说明,虽然目前这颗芯片的价格已经非常离谱。官网提供的例程里面只包含的部分芯片,但是不重要,只要找到内核相同的都可以使用。例如STM32F103C8T6 属于Arm Cortex-M3,那我们只需要下载例程里面相同内核的芯片STM32F107的例程就可以使用,将其解压后即可得到源文件。

参照前几节的文章,使用STM32CubeIDE生成一个STM32F103C8T6的工程,并在工程文件夹内新建一个RTOS文件夹用于存放uCOS-III相关文件。

将解压出来的源码文件夹中和下图红框所示同名的三个文件夹拷贝到新建的的RTOS文件夹中,并新建一个uC-Config文件夹来存放其他文件。

然后将下图所示绿框路径下的红框内的文件全部拷贝到刚刚新建的uC-Config文件夹内。

退后到上一级文件夹,将BSP文件夹的内容也拷贝到新建的uC-Config文件夹内。

在STM32CubeIDE工程中刷新一下就可以看到刚刚拷贝过来的文件。

将RTOS文件夹增加到Paths and symbols的源文件路径下。

不同编译器的汇编不一样,例程文件夹里面提供了三种主流编译器的汇编文件。不相关文件不参与编译,当然也可以直接删除。

将RTOS下的所有文件路径全部添加到Include paths中。

此时可以尝试编译一下,不出意外的会报大量的错误,主要原因为前文拷贝的bsp.c和bsp.h文件中有太多不相关的代码。首先,将bsp.h文件夹内无关内容全部删除,只保留下图所示内容。

bsp.c文件夹中有很多例程平台中的LED配置和操作的代码,全部删除。

去掉这些内容再次编译,此时只剩下下图所示获取CPU主频的部分报错。

重写该部分,包含 stm32f1xx_hal.h头文件,使用HAL库获取CPU主频,此时编译将不会再报错,编译通过。

然后参照例程文件夹里面App.c文件的内容,将UCOS的初始化,创建任务、启动等代码添加到主函数中。


并在启动任务中添加LED翻转用来表明系统在运行。

此时再尝试编译,编译器会报错,提示芯片RAM不够,毕竟STM32F103C8T6也就20K的RAM空间。

打开工程文件存放的目录,找到里面的debug文件夹的后缀为map的文件。

在map文件中搜索 Linker script and memory map 字段。往下拉到.bss开头的字段,这里描述的是占用的RAM大小,可以看到 lib_mem占用了一个相当大的RAM空间。

打开uC-Config文件夹下的lib_cfg.h文件,找到下图所示的代码, 并将27调整为5,减少UCOS内存方向程序占用的RAM空间。

此时编译正常通过,编译器内存区域窗口给出了当前占用的RAM和FLASH的大小和余量等信息。

如果将lib_cfg.h文件的27从5调整为10,可以看到RAM已经所剩无几。

当然,此时UCOS仍然是不能运行的,还需要再Systick的中断函数中增加OS_CPU_SysTickHandler函数,作为系统的“心脏”。

然后将下图所示文件中的所有的OS_CPU_PendSVHandler替换为PendSV_Handler,使用PendSV_Handler异常来进行任务切换。不同的人有不同的习惯,有些人喜欢修改芯片启动汇编文件中的PendSV_Handler字段内容为OS_CPU_PendSVHandler,也可以达到同样的效果。

同时注释或者删掉stm32f1xx_it.c文件中的PendSV_Handler函数,否则编译器报错函数多重定义

编译后下载,按照AppTaskStart中的任务,LED将会一秒翻转一次状态,表明UCOS已经再运行。按照惯例,可以定义一个浮点数来测试浮点运算,同时修改LED翻转时间为500ms让灯闪烁慢一点。

进入调试模式,可以在现场表达式窗口中,可以看到temp变量正在每500ms间隔增加0.01;

自此,可以更进一步体验UCOS的各种功能了。