一、准备
开发板MCU型号:STM32F103VET
开发环境:TrueSTUDIO
辅助工具软件:STM32CubeMX
官方参考工程:Micrium_uC-Eval-STM32F107_uCOS-II.zip
下载链接:https://www.micrium.com/downloadcenter/download-results/?searchterm=mi-stm32f107&supported=true
二、创建一个裸机工程
1.使用STM32CubeMX创建一个基于HAL库的STM32裸机工程,同时配置3个GPIO控制LED灯。下面简单介绍下配置:
①时钟源选择(没有截图的部分默认):
②时钟配置,我使用的是8MHz的外部晶振,配置系统时钟是72MHz(没有截图的部分默认):
③GPIO配置,选择的引脚分别是GPIOB_5、GPIOB_1、GPIOB_0,设置为输出模式,默认输出都是高电平(没有截图的部分默认):
④工程配置,选择的开发环境是TrueSTUDIO(其它默认):
⑤导入使用STM32CubeMX生成的工程到TrueSTUDIO编译环境中,在main函数中添加测试代码确保工程没问题,我这里选择一个GPIO控制LED灯1s闪烁:
三、准备移植uCOSii系统
1.在编译环境中创建两个文件夹Bsp和Middle,注意创建的方式,如果创建的文件夹方式不对会导致无法识别路径:
2.拷贝官方工程中的三个ucos系统文件(uC-CPU、uC-LIB和uCOS-II)到自己的工程Middle文件夹中:
3.拷贝官方工程中BSP文件夹中的bsp.c和bsp.h文件到自己工程Bsp文件夹中:
4.拷贝官方工程uCOS-II文件夹中的配置文件(app_cfg.h、cpu_cfg.h、includes.h、lib_cfg.h和os_cfg.h)到自己的Inc文件夹中:
5.拷贝官方工程中uCOS-II文件夹中的app.c和app_hooks.c文件到自己的Src文件夹中:
6.删除ucos系统源码中的一些文件夹,只保留GNU文件夹,如果你使用的是MDK编译器只保留RealView文件夹:
7.删除后显示的结果:
8.在自己工程中添加相关ucos系统的源码路径:
9.将main.c文件中的下面两个函数定义放到app.c文件中:
10.在app.c的主函数中添加HAL_Init()函数:
11.删除main.c和main.h文件,把在使用#include "main.h"的地方改成#include "stm32f1xx_hal.h"。
12.编译工程,对报错的地方进行修改:
①修改bsp.h文件,只留下如下图所示内容:
②修改bsp.c文件,涉及到BSP的函数除了如下图所示的两个保留,并做修改,其它的都删掉;涉及到OS的不用删,限于篇幅这里就不再展示。
③修改includes.h文件,修改内容如下图所示:
④修改app.c文件,这里创建起始任务的函数可以换成OSTaskCreate()函数替代:
顺便提一下,下图标记的地方一定不要忽视,如果不关中断,任务会无法运行,开中断会在启动任务的时候自动打开。
修改起始任务:
当修改完以上内容后再次编译,基本已经不会报错了,但是需要修改的地方还没结束;
13.如下图所示,这里有几个关于系统的配置文件,我们要一一对其检查
①app_cfg.h文件:
只保留如下图所示内容:
②cpu_cfg.h文件:
做如下修改:
③lib_cfg.h文件:
根据自身硬件状况修改任务堆的大小,堆消耗的是内存资源,这里是27Kbyte:
④ os_cfg.h文件:
这里因人而异,我这两个功能都不使用。
14.下面修改最关键的内容:
①启动文件的标记处要设置成ucos系统的,注意书写不要错误,这是很多人会犯的错误:
②在stm32f1xx_it.c文件的SysTick_Handler()函数中添加ucos系统的中断函数OS_CPU_SysTickHandler(),这样做的目的是保证HAL_Delay()函数也能使用,在HAL_Init()函数中SysTick是被启动了的,设置的节拍是1ms:
再次编译没问题,移植工作基本结束,下面创建几个任务测试下移植是否成功。
15.创建多个任务
①任务优先级和任务栈的大小设置:
这里要注意系统配置文件中配置的当前系统支持的最低优先级和最大任务数量:
②定义任务的栈大小:
③下图所示的是从主函数到每个任务的创建:
下载到开发板可以看到三个灯不停的闪烁,因为我使用的是RGB灯,在闪烁的过程可以看到彩色灯光效果。至此ucos-ii系统的移植完成。
#endif