uC/OS-III 移植 STM32F429

OS-III 是一个RTOS系统,移植相对来说并不是特别复杂。此外官方也做了主流芯片的例程。
本篇就不对OS做过多解释,讲解如何移植:

  • 下载OS-III文件
  • 准备STM32F429库工程
  • 移植

注:移植是在STM32F429工程基础之上,详情请查看创建库工程

1.OS-III文件结构

可以在官方网站micrium ST 专栏下载对应的工程文件

uC/OS-III 移植 STM32F429_第1张图片

简单介绍OS-III的文件结构:
uC/OS-III 移植 STM32F429_第2张图片

  1. 配置文件:通过定义配置文件中的define参数来裁剪OS-III的功能
  2. 用户应用文件,定义和声明任务
  3. 内核服务文件,这部分代码与CPU无关,可以不做任何修改移植
  4. 底层函数库,包括基本的算术运算,字符串操作等
  5. CPU移植文件,移植需要修改这部分代码
  6. CPU配置文件,主要是CPU的一些工作模式和服务函数
  7. 其他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文件,添加如下目录:

uC/OS-III 移植 STM32F429_第3张图片

其中每个文件来源:

  • APP : 从Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\OS3下拷贝过来
    uC/OS-III 移植 STM32F429_第4张图片
  • 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文件,同时创建如下文件目录:

uC/OS-III 移植 STM32F429_第5张图片

通过 Manage Project Items导入相应文件:
uC/OS-III 移植 STM32F429_第6张图片

uC/OS-III 移植 STM32F429_第7张图片

其实只需要导入 .c文件就可以,但是为了将来方便查看,也同时导入了 .h.asm文件。其中 uCOS-III文件太多,分了两部分,不分开也可以。

3.添加.h路径:

uC/OS-III 移植 STM32F429_第8张图片

到此,文件基本已经移植完成,但是编译无法通过,所以我们要做相应的修改。

3.OS-III文件修改

在官方提供的案例中,主要做了如下内容:

  1. 修改STM32F429的启动文件,最大的改动是从新定义了中断向量表。并将中断函数写在了用户应用层,并创建一个中断函数表,调用中断前,需要注册相应的中断函数。通过查询中断函数表处理相应的中断。具体内容请查看Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\BSP文件夹下得bsp_int.c
  2. 将系统的时钟频率,锁相环等设置在板极层从新定义了
  3. 提供了LED外设例程
  4. 提供了浮点处理例程
  5. 提供如何创建任务
  6. 从新配置了外设时钟,需要注册打开和关闭,查看bsp_periph.c文件

要裁剪出一个简单干净的系统,我们需要如下步骤:

1.抛弃官方提供的启动文件,使用STM32提供的启动文件,修改启动文件startup_stm32f429_439xx.s中的PendSV_HandlerSysTick_Handler,变为OS_CPU_PendSVHandlerOS_CPU_SysTickHandler:

uC/OS-III 移植 STM32F429_第9张图片

uC/OS-III 移植 STM32F429_第10张图片

2.删除系统的时钟频率,锁相环等设置,即删除工程文件 bsp.c文件中 BSP_Init()函数内容:
uC/OS-III 移植 STM32F429_第11张图片

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

uC/OS-III 移植 STM32F429_第12张图片

5.删除例程任务,将 app.c文件内容修改如下,其他内容全部删除:
uC/OS-III 移植 STM32F429_第13张图片

uC/OS-III 移植 STM32F429_第14张图片

6.删除官方中断,外设等内容,将 bsp.h保留一下内容,其他全部删除:
uC/OS-III 移植 STM32F429_第15张图片

7.编译一下应该没有错误。如果有错误,找出相应的错误即可。移植过程中也可以编译,但是提示的错误会很多。所有需要很强的心理素质,才能处理好,哈哈哈。
uC/OS-III 移植 STM32F429_第16张图片

8.添加中断处理函数,其实中断处理函数在 startup_stm32f429_439xx.s中定义过了,我们只需要重定义就可以了,修改 handler.c文件,添加了中断重定向模板:
uC/OS-III 移植 STM32F429_第17张图片

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即可:

uC/OS-III 移植 STM32F429_第18张图片

os_cfg.h文件主要是配置OS-III的功能,起到剪裁作用。

文件下载

T-OS3文件下载(基于库版本 v1.7.1,OS v3.04.04)

你可能感兴趣的:(uC/OS-III 移植 STM32F429)