OS-III 是一个RTOS系统,移植相对来说并不是特别复杂。此外官方也做了主流芯片的例程。
本篇就不对OS做过多解释,讲解如何移植:
- 下载OS-III文件
- 准备STM32F429库工程
- 移植
注:移植是在STM32F429工程基础之上,详情请查看创建库工程。
1.OS-III文件结构
可以在官方网站micrium ST 专栏下载对应的工程文件
简单介绍OS-III的文件结构:
- 配置文件:通过定义配置文件中的
define
参数来裁剪OS-III的功能 - 用户应用文件,定义和声明任务
- 内核服务文件,这部分代码与CPU无关,可以不做任何修改移植
- 底层函数库,包括基本的算术运算,字符串操作等
- CPU移植文件,移植需要修改这部分代码
- CPU配置文件,主要是CPU的一些工作模式和服务函数
- 其他CPU相关文件
官方下载的Micrium_STM32F429II-SK_OS3
工程文件,其中包括两个文件夹:
-
Examples
: 提供IAR,Keil,STUDIO不同开发环境的工程实例,其中BSP
文件夹提供的是外设相关代码,OS
文件夹主要是上面提到的配置文件和用户应用文件 -
Software
: 其中包括uC-CPU
uC-LIB
uCOS-III
,分别是CPU配置文件相关,底层函数库,内核服务文件。其中每个文件夹又包含IAR
GNU
RealView
,这个是三个不同平台的编译链,我们只需要其中的RealView
总结一下,对应Software
文件夹,基本丢弃IAR
GNU
即可使用了。但对于Examples
我们选择适当的文件移植并修改,一个是BSP
板极相关,一个是OS
系统配置文件和用户文件。
2.OS-III文件移植
1.使用创建库工程中的Template工程为基础,将工程名字改为T-OS3
,并删除User
文件中的main.c
文件,添加如下目录:
其中每个文件来源:
- APP : 从
Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\OS3
下拷贝过来
- BSP : 从
Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\BSP
下拷贝过来,但是handler.c
文件是自己创建,具体原因后面会提到 - uC-CPU : 拷贝官方源文件并删除其中的
IAR
GNU
文件夹 - uC-LIB : 拷贝官方源文件并删除其中的
IAR
GNU
文件夹 - uCOS-III : 拷贝官方源文件并删除其中的
IAR
GNU
文件夹
2.打开 T-OS3
Keil工程,删除main.c
文件,同时创建如下文件目录:
通过
Manage Project Items
导入相应文件:其实只需要导入
.c
文件就可以,但是为了将来方便查看,也同时导入了.h
和.asm
文件。其中uCOS-III
文件太多,分了两部分,不分开也可以。
3.添加.h
路径:
到此,文件基本已经移植完成,但是编译无法通过,所以我们要做相应的修改。
3.OS-III文件修改
在官方提供的案例中,主要做了如下内容:
- 修改
STM32F429
的启动文件,最大的改动是从新定义了中断向量表。并将中断函数写在了用户应用层,并创建一个中断函数表,调用中断前,需要注册相应的中断函数。通过查询中断函数表处理相应的中断。具体内容请查看Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\BSP
文件夹下得bsp_int.c
- 将系统的时钟频率,锁相环等设置在板极层从新定义了
- 提供了
LED
外设例程 - 提供了浮点处理例程
- 提供如何创建任务
- 从新配置了外设时钟,需要注册打开和关闭,查看
bsp_periph.c
文件
要裁剪出一个简单干净的系统,我们需要如下步骤:
1.抛弃官方提供的启动文件,使用STM32
提供的启动文件,修改启动文件startup_stm32f429_439xx.s
中的PendSV_Handler
和SysTick_Handler
,变为OS_CPU_PendSVHandler
和OS_CPU_SysTickHandler
:
2.删除系统的时钟频率,锁相环等设置,即删除工程文件
bsp.c
文件中BSP_Init()
函数内容:3.删除和
LED
相关的内容,即删除bsp.c
文件中以BSP_LED_XX()
开头的所有函数和声明。4.添加浮点处理,在
startup_stm32f429_439xx.s
中添加如下代码:
IF {FPU} != "SoftVFP"
; Enable Floating Point Support at reset for FPU
LDR.W R0, =0xE000ED88 ; Load address of CPACR register
LDR R1, [R0] ; Read value at CPACR
ORR R1, R1, #(0xF <<20) ; Set bits 20-23 to enable CP10 and CP11 coprocessors
; Write back the modified CPACR value
STR R1, [R0] ; Wait for store to complete
DSB
; Disable automatic FP register content
; Disable lazy context switch
LDR.W R0, =0xE000EF34 ; Load address to FPCCR register
LDR R1, [R0]
AND R1, R1, #(0x3FFFFFFF) ; Clear the LSPEN and ASPEN bits
STR R1, [R0]
ISB ; Reset pipeline now the FPU is enabled
ENDIF
5.删除例程任务,将
app.c
文件内容修改如下,其他内容全部删除:6.删除官方中断,外设等内容,将
bsp.h
保留一下内容,其他全部删除:7.编译一下应该没有错误。如果有错误,找出相应的错误即可。移植过程中也可以编译,但是提示的错误会很多。所有需要很强的心理素质,才能处理好,哈哈哈。
8.添加中断处理函数,其实中断处理函数在
startup_stm32f429_439xx.s
中定义过了,我们只需要重定义就可以了,修改handler.c
文件,添加了中断重定向模板:9.最后给系统添加时间片轮回功能,因为我们在
app.c
文件中添加了如下代码:
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u /* Enable the Round-Robin scheduling */
OSSchedRoundRobinCfg((CPU_BOOLEAN )DEF_ENABLED,
(OS_TICK )0,
(OS_ERR *)&err );
#endif
所有在os_cfg.h
中将OS_CFG_SCHED_ROUND_ROBIN_EN
设置为1
即可:
os_cfg.h
文件主要是配置OS-III的功能,起到剪裁作用。