STM32
直播中

叹久

9年用户 865经验值
擅长:可编程逻辑 光电显示 接口/总线/驱动
私信 关注
[问答]

如何在STM32F767上移植uCOS- II?

如何在STM32F767上移植uCOS- II?

回帖(1)

李泽明

2021-11-29 15:09:01
一、准备工作

1、 uCOS- II源码下载

uCOS- II的源码可以在Micrium 官网上下载,所以我们可以直接下载移植好的工程来用。下载地址为:
https://www.micrium.com/downloadcenter/download-results/?searchterm=mi-stmicroelectronics-stm32f7xx&supported=true
由于在Micrium 官网上的基于STM32F7的 uCOS- II的源码没有MDK版本的,因此我们需要下载如下图所示的两个版本的 uCOS- II的源码。










2、移植目标

开发板: STM32F76IGT6
编译软件:MDK5
移植版本: uCOS- II V2.92.12
二、建工程

具体建HAL库模板工程的步骤这里不再详细叙述。这里我直接采用已经建好的HAL库函数模板进行移植。
1、建立相应文件夹

我们在工程目录下新建 UCOSII 文件夹,如下图所示:





然后将我们下载的 Micrium 官方移植工程中的 uC-CPU、 uC-LIB 和 uCOS-II 这三个文件夹复制到刚刚新建的UCOSII文件夹中。官方文件路径为: Micrium_STM32746G-EVAL2_OS2MicriumSoftware。如下图所示:




复制结果如下图所示:





然后在UCOSII文件夹中再新建两个文件夹:uCOS-BSP 和uCOS-CONFIG。结果如下图所示:





三、向建好的文件夹中添加文件

1、向 uCOS-BSP 中添加文件

复制 Micrium官方移植好的工程中的相关文件到 uCOS-BSP 文件夹下, 官方文件路径为:MicriumExamplesSTSTM32746G-EVAL2os2bspinclude中的bsp.h文件; MicriumExamplesSTSTM32746G-EVAL2os2bspsource中的bsp.c和cpu_bsp.c文件。结果如下图所示:





2、向 uCOS-CONFIG 中添加文件

复制 Micrium 官方移植好的工程中的相关文件到uCOS-CONFIG 文件夹下,官方文件路径为:MicriumExamplesSTSTM32746G-EVAL2os2中文件app_cfg.h、app_hooks.c、cpu_cfg.h、lib_cfg.h和os_cfg.h。结果如下图所示:





除了上图中的文件之外,uCOS-CONFIG 文件夹下还需要新建一个“includes.h”的头文件。includes.h文件的内容如下:
#ifndef __INCLUDES_H__#define __INCLUDES_H__#include #include #include #include #include #include "ucos_ii.h"#include "os_cpu.h"#include "os_cfg.h"#include #endif 3、向 uC-CPU 中添加文件

将目录Micrium_STM3240G-EVAL_OS2MicriumSoftwareuC-CPUARM-Cortex-M4下的文件夹RealView复制到目录uC-CPUARM-Cortex-M4下,结果如下图所示:





4、向 uC-LIB 中添加文件

将目录Micrium_STM3240G-EVAL_OS2MicriumSoftwareuC-LIBPortsARM-Cortex-M4下的文件夹RealView复制到目录uC-LIBPortsARM-Cortex-M4下,结果如下图所示:





5、向 uCOS-II 中添加文件

将目录Micrium_STM3240G-EVAL_OS2MicriumSoftwareuCOS-IIPortsARM-Cortex-M4Generic下的文件夹RealView复制到目录uCOS-IIPortsARM-Cortex-MARMv7-M下,结果如下图所示:





四、向工程中添加分组

在我们已经准备好了所需要的文件后,我们还需要将这些文件添加到工程中去,添加结果如下图所示:

















添加相应的头文件路径,结果如下图所示:





五、修改文件

1、修改 bsp.c 和 bsp.h 文件

bsp.c 是 Micrium 公司编写的一些底层驱动函数,这里我们只需要其中的一个函数:BSP_CPU_ClkFreq(), 其他的就可以删除掉了,最终的 bsp.c 文件如下:
#define BSP_MODULE#include #include /********************************************************************************** BSP_CPU_ClkFreq()** Description : Read CPU registers to determine the CPU clock frequency of the chip.** Argument(s) : none.** Return(s) : The CPU clock frequency, in Hz.** Caller(s) : Application.** Note(s) : none.*********************************************************************************/CPU_INT32U BSP_CPU_ClkFreq (void){CPU_INT32U hclk_freq;hclk_freq = HAL_RCC_GetHCLKFreq();return (hclk_freq);} bsp.h 就是对 bsp.c 文件中函数的声明,既然 bsp.c 文件都已经修改了,那么 bsp.h 同样也需要“瘦身”, 修改后的 bsp.h 文件如下:
                                #ifndef BSP_PRESENT                                #define BSP_PRESENT                                /**************************************************************************                                * EXTERNS                                **************************************************************************/                                #ifdef BSP_MODULE                                #define BSP_EXT                                #else                                #define BSP_EXT extern                                #endif                                /*******************************************************************************                                * INCLUDE FILES                                *********************************************************************************/                                #include                                 #include                                 #include                                 /*******************************************************************************                                * FUNCTION PROTOTYPES                                ********************************************************************************/                                CPU_INT32U BSP_CPU_ClkFreq(void);                                /********************************************************************************                                * MODULE END                                *********************************************************************************/                                #endif /* End of module include.*/ 2、修改 os_cpu_a.asm文件

UCOSII 任务切换是需要 PendSV 中断服务函数的, Micrium 官方移植工程中用汇编语言实现了 PendSV 中断服务函数,但是中断函数的名字被改了,这里我们需要将其改回来,打开os_cpu_a.asm 文件,将其中的所有 OS_CPU_PendSVHandler 改为 PendSV_Handler,改完后如下图所示(只展示了部分)。





3、修改 sys.h文件

将 sys.h 文 件 中 的 宏 SYSTEM_SUPPORT_OS 定 义 为 1 以 支 持 UCOS , 将SYSTEM_SUPPORT_OS 定义为 1 。如下图所示:





4、修改 startup_stm32f767xx.s 文件

Cortex-M7 内核有个 Lazy Stacking 的功能, 如果使用 FPU 功能的话就需要关闭这个功能,我们要在 startup_stm32f767xx.s 中关闭这个功能,添加如下代码到下图红框所示位置:
IF {FPU} != "SoftVFP"; Enable Floating Point Support at reset for FPULDR.W R0, =0xE000ED88 ; Load address of CPACR registerLDR R1, [R0] ; Read value at CPACRORR R1, R1, #(0xF <<20) ; Set bits 20-23 to enable CP10 and CP11 coprocessors; Write back the modified CPACR valueSTR R1, [R0] ; Wait for store to completeDSB; Disable automatic FP register content; Disable lazy context switchLDR.W R0, =0xE000EF34 ; Load address to FPCCR registerLDR R1, [R0]AND R1, R1, #(0x3FFFFFFF) ; Clear the LSPEN and ASPEN bitsSTR R1, [R0]ISB ; Reset pipeline now the FPU is enabledENDIF




5、开启FPU

因为 STM32F767 有浮点运算单元 FPU, 而且支持双精度浮点。 那么我们移植完 UCOS II以后就要测试一下是否支持双精度浮点运算, 因此要开启 FPU。将文件 stm32f767xx.h 中的宏__FPU_PRESENT 为 1 即打开 FPU, 如下图所示, 默认情况下 HAL 库是打开了 FPU 的。





6、修改os_cpu_c.c文件

在上一步修改完成之后编译文件,显示如下错误:




于是将函数OS_CPU_FP_Reg_Push屏蔽掉,如图所示:




得到如下编译结果:





到这里移植就完成了!
由于本人水平有限,如有错误之处,欢迎批评指正!希望能与各位大神多多交流,共同进步!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分