回帖 (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屏蔽掉,如图所示:
得到如下编译结果:
到这里移植就完成了!
由于本人水平有限,如有错误之处,欢迎批评指正!希望能与各位大神多多交流,共同进步!
一、准备工作
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屏蔽掉,如图所示:
得到如下编译结果:
到这里移植就完成了!
由于本人水平有限,如有错误之处,欢迎批评指正!希望能与各位大神多多交流,共同进步!
举报
更多回帖