STM32F767上移植 uCOS- II

一、准备工作

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_OS2\Micrium\Software。如下图所示:在这里插入图片描述
复制结果如下图所示:
在这里插入图片描述
然后在UCOSII文件夹中再新建两个文件夹:uCOS-BSP 和uCOS-CONFIG。结果如下图所示:
在这里插入图片描述

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

1、向 uCOS-BSP 中添加文件

复制 Micrium官方移植好的工程中的相关文件到 uCOS-BSP 文件夹下, 官方文件路径为:Micrium\Examples\ST\STM32746G-EVAL2\os2\bsp\include中的bsp.h文件; Micrium\Examples\ST\STM32746G-EVAL2\os2\bsp\source中的bsp.c和cpu_bsp.c文件。结果如下图所示:
在这里插入图片描述

2、向 uCOS-CONFIG 中添加文件

复制 Micrium 官方移植好的工程中的相关文件到uCOS-CONFIG 文件夹下,官方文件路径为:Micrium\Examples\ST\STM32746G-EVAL2\os2中文件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 <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdarg.h>
#include "ucos_ii.h"
#include "os_cpu.h"
#include "os_cfg.h"
#include <stm32f7xx.h>
#endif

3、向 uC-CPU 中添加文件

将目录Micrium_STM3240G-EVAL_OS2\Micrium\Software\uC-CPU\ARM-Cortex-M4下的文件夹RealView复制到目录uC-CPU\ARM-Cortex-M4下,结果如下图所示:
在这里插入图片描述

4、向 uC-LIB 中添加文件

将目录Micrium_STM3240G-EVAL_OS2\Micrium\Software\uC-LIB\Ports\ARM-Cortex-M4下的文件夹RealView复制到目录uC-LIB\Ports\ARM-Cortex-M4下,结果如下图所示:

在这里插入图片描述

5、向 uCOS-II 中添加文件

将目录Micrium_STM3240G-EVAL_OS2\Micrium\Software\uCOS-II\Ports\ARM-Cortex-M4\Generic下的文件夹RealView复制到目录uCOS-II\Ports\ARM-Cortex-M\ARMv7-M下,结果如下图所示:
在这里插入图片描述

四、向工程中添加分组

在我们已经准备好了所需要的文件后,我们还需要将这些文件添加到工程中去,添加结果如下图所示:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
添加相应的头文件路径,结果如下图所示:
在这里插入图片描述

五、修改文件

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

bsp.c 是 Micrium 公司编写的一些底层驱动函数,这里我们只需要其中的一个函数:BSP_CPU_ClkFreq(), 其他的就可以删除掉了,最终的 bsp.c 文件如下:

#define BSP_MODULE
#include <bsp.h>
#include <stm32f7xx_hal.h>
/*********************************************************************************
* 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 <cpu.h>
				#include <cpu_core.h>
				#include <lib_def.h>
				/*******************************************************************************
				* 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 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、开启FPU

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

6、修改os_cpu_c.c文件

在上一步修改完成之后编译文件,显示如下错误:
在这里插入图片描述于是将函数OS_CPU_FP_Reg_Push屏蔽掉,如图所示:
在这里插入图片描述得到如下编译结果:
在这里插入图片描述
到这里移植就完成了!

由于本人水平有限,如有错误之处,欢迎批评指正!希望能与各位大神多多交流,共同进步!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值