移植 μC/OS-III 到 STM32

1、前言

今天忽然想着从micrium官网下载μC/OS-III做一个移植,发现官网变了个样子,于是写下这篇博文,记录一下,如何从官网下载例程并移植到STM32。

需要的知识储备:掌握MDK的基本使用,用过uC/OS(会创建任务即可)。

本案例从micrium下载μC/OS-III 例程,移植到STM32F407平台,其他同类型平台也是一样的。

2、下载μC/OS-III 例程

首先到micrium官网下载例程,因为使用μC/OS-III 源码移植太费事了,直接找官方移植好的拿过来用会简单很多。

www.micrium.com,过去是进入这个网站的,一段时间没看,不知道改了啥,进去后自动跳转 https://www.silabs.com/developers/micrium

进入官网之后,注册账号,登录(注意,这里注册账号需要邮箱,且无法使用QQ邮箱,可以注册个谷歌邮箱,注册过程可以手机下载网易邮箱大师进行注册,过程自行百度,无需外网即可完成),下载过程可以参考 UCOSIII从官网(2021)下载

下载后解压,得到下面的文件夹。

在这里插入图片描述

3、Examples文件夹

Examples文件夹,包含官方评估板的相关文件,我们需要复制其中一部分文件。

3.1 APP文件夹

找一个裸机工程,例如点灯程序,在工程文件夹中创建一个APP文件夹,然后将下面的文件复制过去。

在这里插入图片描述

3.2 BSP文件夹

创建User/BSP文件夹,将下面的文件复制过去。
在这里插入图片描述

4、Software文件夹

此文件夹有三个子文件夹,全部拷贝到咱们的工程文件夹下面,后面再对IDE区别部分进行删除。

在这里插入图片描述
简单描述下这部分的相关文件的内容,其实网上以及各个开发板供应商都有许多完整教程,讲得非常详细,在这里我只是为了加深印象特意写一遍。

4.1、uC-CPU

这是和 CPU 紧密相关的文件,在 ARM-Cortex-M4文件夹下,存在 cpu_c.c等 一些对不同编译器移植相关的文件,有 GNU、IAR、RealView,里面都有一些很重要的文件,目前我们使用的开发环境是 MDK5(keil 5),所以我们选择 RealView 文件夹,其他编译器的文件夹可以删除。

在这里插入图片描述

4.2、uC-LIB

Micrium 公司提供的官方库,诸如字符串操作、内存操作等接口,可用可不用。一般能用于代替标准库中的一些函数,使得在嵌入式中应用更加方便安全。
在这里插入图片描述

4.3、μC/OS-III

这个文件夹的文件是最重要的文件,存放着μC/OS的源码与硬件接口软件。

μC/OS-III/Ports 文件夹下的文件,就是μC/OS与硬件的接口软件,官方已经修改好了的,不需要改动。
Source 文件夹下的则是源码。

在这里插入图片描述

5、添加文件与头文件路径

将刚才复制过来的文件,分别建立组别,并将其中的.c文件和.s、.asm文件加入,.h文件可加可不加。

然后将刚才的各个文件夹添加头文件路径,略过不表。

此时可以编译下,将错误暴露出来,同时也为了使用MDK编辑时跳转。

6、文件修改

6.1 启动文件修改

首先修改启动文件“startup_stm32f40_41xxx.s”,不同芯片名称略有不同,自行匹配。

将 PendSV_Handler 和 SysTick_Handler 分 别 改 为 OS_CPU_PendSVHandler 和OS_CPU_SysTickHandler,共3处,因为 μC/OS 官方已经给我们处理好对应的中断函数,不需要我们自己处理与系统相关的中断了,同时我们还需要将 stm32f10x_it.c 文件中的 PendSV_Handler和 SysTick_Handler 函数注释掉(当然不注释掉也没问题的)。

启动FPU,如果不需要可以跳过,但是建议移植时将此处修改好,在后面的配置中将其关闭即可。

代码如下:

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

插入位置及效果如下:
在这里插入图片描述

在芯片头文件stm32f4xx.h中将启用 FPU 的宏定义 __FPU_PRESENT 配置为 1(默认是启用的)。

最后,在MDK中配置使用微库,并勾选使用浮点数即可。

在这里插入图片描述

6.2、bsp文件修改

bsp.c文件实际上是官方的评估板的相关文件,实际上完全可以自己重写一个即可,这里我将BSP_LED_XX相关函数全部删除,只留下BSP_Init和BSP_CPU_ClkFreq,以及两个时间测量相关的函数CPU_TS_xx,防止后面需要用到可以在这直接复制。其他宏定义基本上是寄存器的定义,删除不要(如果不确定的可以先留着,不影响移植)。

在bsp.h中包含“stm32f4xx.h”头文件,其他宏定义可以删除。

好了,到了这一步,可以重新编译一下了,当然,肯定有报错,因为app.c咱们没修改。报错之后,根据报错内容将app.c中的调用的一些函数,但是又被我刚才在bsp.c中删除了的函数,直接屏蔽即可。重新编译,没报错了,进入下一步。

6.3、app.c修改

上述步骤仅仅是保证没有报错,无法验证我们的 系统是否移植成功,还需要修改app.c。

直接贴图。

main函数改成这样:
在这里插入图片描述
其实和原来例程的没什么差别,只不过将几个函数去掉了,我把它们放到了启动任务里,让main函数的结构尽量简单些。

关中断那一行代码原来是调用的bsp里的函数,这里我去掉了,直接调用汇编函数关中断。

再看启动任务。上图:
在这里插入图片描述

更改1:就是将上面main函数里的几个函数调用复制到这里了,我们不使用系统的库,所以将其屏蔽,只需要CPU_Init();初始化CPU即可。

更改2:BSP_Tick_Init()函数下面几行初始化系统节拍的代码,实际上就是将bsp.c中的BSP_Tick_Init()函数拷贝过来,当然,直接调用BSP_Tick_Init()也是可以的,只不过为了使得bsp.c可以分离驱动和系统,直接写在这。

我把BSP_Init();放到了后面,主要是为了将用户代码放在一块,移植系统调试时可以将其放到前面去调试,防止系统没移植成功影响了硬件驱动。

最后,就是我们常见的创建用户任务了,用过uC/OS的应该都会,略过不写了。

6.4、配置系统

上述步骤只是让我们的系统可以跑多任务,但是在资源比较紧张的时候,我们并不需要实时系统的所有系统应用功能,例如我们可能只需要用到事件和信号量,而不需要使用队列,那么就可以通过配置相关的宏定义,打开或者关闭。

相关的配置在“os_cfg.h”、“cpu_cfg.h”、"os_cfg_app.h"这三个文件,每个宏都附带有相应的注释,英文差的同学下载个翻译软件。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在TriCore上移植μC/OS-III,首先需要了解两个方面:TriCore架构和μC/OS-III的特征。 TriCore是一种32位的嵌入式微处理器架构,设计用于实时处理任务,具有高性能和低功耗特点。它广泛应用于汽车电子和工业自动化等领域。 μC/OS-III是一款针对多任务实时操作系统(RTOS)的核心部分。它具有实时性好、可扩展性强和资源占用少等特征。 下面是在TriCore上移植μC/OS-III的基本步骤: 1. 理解μC/OS-III的核心机制和特点。熟悉任务管理、中断处理、内存管理等方面的原理和实现方法。 2. 根据TriCore的架构和μC/OS-III的需求,进行适配和修改。TriCore CPU和μC/OS-III之间的接口需重新实现。 3. 编写适配层代码。根据TriCore的中断控制器、内存管理单元和时钟等硬件特点,实现μC/OS-III所需的硬件抽象层。 4. 移植μC/OS-III的启动代码。根据TriCore的启动流程和μC/OS-III的初始化要求,编写启动代码,完成μC/OS-III的初始化过程。 5. 移植μC/OS-III的任务管理、中断处理和调度算法等功能。根据μC/OS-III的规范和TriCore的特点,将原有的代码进行修改和补充。 6. 进行系统测试和优化。测试系统的稳定性和实时性,并对性能进行优化。 注意,以上只是移植的基本步骤,具体的细节需要根据具体的TriCore芯片和μC/OS-III版本进行适配和实现。同时,移植过程中可能会遇到各种问题,需要进行调试和调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值