基于STM32F767的UCOSIII移植学习

(一)移植前的准备

1.HAL库基本工程模板

新建一个工程模块,其中包含LED驱动和串口驱动程序即可,用于验证UCOS-III系统能够正常工作。

2.UCOS-III源码准备

去Micrium官网下载最新的UCOSIII源码,下载地址:Micrium官网下载地址,没有注册过的用户需要注册一下,我自己注册的过程都是泪。由于我选择的是正点原子F7的开发板,所以在官网上选择合适源码时就选择F7的。具体版本选择下图中19年2月6号的版本:在这里插入图片描述
下载完成之后发现,发现源码文件夹中东西很多大部分都是和网络移植相关的,目前我们只移植最新版本的UCOSIII,所以这些文件夹都不需要去看。进入源码目录下的uCOS-III文件夹,发现里面只有针对IAR的编译器的文件,难道MDK就凉凉了吗?凡是先不要慌,虽然编译器不同,但是实现的功能就是相同的,并不会影响到移植后操作系统的运行。

UCOSIII的移植

(一)源码文件的摘选

1.在准备好的工程文件夹下新建一个UCOS-III目录,用于存放和UCOSIII相关的所有代码。在UCOS-III目录下新建如下目录,用于UCOS源码的分类。在这里插入图片描述
(1)将源码目录Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-CPU下的文件全部拷贝到我们创建的uC-CPU目录下,为了减少文件夹的个数,我把ARM-Cortex-M\ARMv7-M目录下和ARM-Cortex-M\ARMv7-M\ARM目录下的文件都移到了自己创建的uC-CPU目录下了。这里我要说明下一下IAR和ARM目录下的文件,除了汇编文件有些不同以外,头文件内容都是相同的,这边选择ARM目录下的汇编文件还是IAR目录下的汇编文件都行,因为我们都是要修改成MDK支持的形式的。
(2)将源码目录Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uC-LIB文件夹下的文件全部拷贝到自己创建的uC-LIB目录下,这边我直接把Micrium\Software\uC-LIB\Ports\ARM-Cortex-M4\RealView目录下的文件和其他文件放在了一个文件夹下,具体如下图所示:在这里插入图片描述
由于我们使用的是MDK编译,所以这边选择的是RealView目录下的汇编文件,具体什么原因的话,网上有很多解释,我就不复制他们的解释了。
(3)将Micrium_STM32F746G-DISCO_Crypto\Micrium\Software\uCOS-III目录下的文件全部拷贝到自己创建uCOS-III目录下。点开Ports的目录,发现最后只有一个IAR文件下,这边我们先不用关注,只需将文件都拷贝过来,具体内容如下图所示:在这里插入图片描述
在这里插入图片描述
(4)将源码例程目录Micrium_STM32F746G-DISCO_Crypto\ST\STM32F746G_Disco\Crypto下的部分文件和OS3下的部分文件拷贝到自己创建的UCOS-CONFIG文件夹下。具体文件如下图所示:在这里插入图片描述
在源码例程文件中,发现很多都是网络相关的移植代码,所以没有拷贝过来。但是有一个clk_cfg.h很明显不是和网络相关的,为什么不移植过来呢?从名字上看就是和时钟相关的,难道说不需要时钟配置吗?时钟当然是需要配置的,但是裸机工程中时钟已经配置OK了,这边和时钟相关的文件也就不需要了,后面操作系统的时钟需要自己通过HAL库配置,这边就不详细说明了。
(5)将Micrium_STM32F746G-DISCO_Crypto\ST\BSP\STM32F746G_Disco目录下的bsp_cpu.c文件拷贝到自己创建的UCOS-BSP目录下,并且新建一个bsp_cpu.h头文件(用于包含操作系统的头文件)。其他文件都不需要拷贝,大多是和芯片外设相关的初始化。

(二)文件添加

(1)打开MDK工程,将拷贝的文件添加至工程当中,具体内容如下图所示:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以及头文件路径添加,如下图所示:在这里插入图片描述
上述文件都添加完成之后,点击编译,提示下图错误:在这里插入图片描述
出现unknown opcode什么的错误,而且出现在os_cpu_a.asm文件中,那就打开这个汇编文件看一下,是什么问题,发现PUBLIC关键字都没有标蓝,那肯定是由于这个关键字不是MDK的关键字,所以讲PUBLIC修改为MDK所用的关键字EXPORT,具体EXPORT这个关键字怎么来的,我是查看了其他版本的UCOS在STM32的移植,看到用的是这个关键字,就直接抄过来了。还有错误与FPU相关,如下图所示:

#ifdef __ARMVFP__
    EXPORT  OS_CPU_FP_Reg_Push
    EXPORT  OS_CPU_FP_Reg_Pop
#endif

查看了正点原子的移植手册,发现上面说到

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

在startup_stm32f767xx.s中就如下图所示:在这里插入图片描述
修改完这些,接下去就解决… error: A1163E: Unknown opcode ARMVFP , expecting opcode or Macro 这个错误。将原先的判断语句修改为如下语句:

	IF {
   FPU} != "SoftVFP"
    EXPORT  OS_CPU_FP_Reg_Push
    EXPORT  OS_CPU_FP_Reg_Pop
	ENDIF
	IF {
   FPU} != "SoftVFP"
OS_CPU_FP_Reg_Push
    MRS     R1, PSP                                             ; PSP is process stack pointer
    CBZ     R1, OS_CPU_FP_nosave                                ; Skip FP register save the first time

    VSTMDB  R0!, {
   S16-S31}
    LDR     R1, =OSTCBCurPtr
    LDR     R2, [R1]
    STR     R0, [R2]
OS_CPU_FP_nosave
    BX      LR
	ENDIF
	IF {
   FPU} != "SoftVFP"
OS_CPU_FP_Reg_Pop
    VLDMIA  R0!, {
   S16-S31}
    LDR     R1, =OSTCBHighRdyPtr
    LDR     R2, [R1]
    STR     R0, [R2]
    BX      LR
	ENDIF

修改完成之后,再次编译,依旧存在 error: A1163E: Unknown opcode RSEG , expecting opcode or Macro 的错误,这主要是由于编译器关键字的问题,所以这里直接借鉴其他其他版本在MDK上的移植。具体修改代码如下:

    PRESERVE8
    THUMB

    AREA CODE, CODE, READONLY

再次编译,发现这个汇编文件中还有一个警告: warning: A1581W: Added 2 bytes of padding at address 0x112,这是提示地址没对齐,那就在末尾添加一个对齐指令,具体代码如下:

OS_CPU_PendSVHandler
    CPSID   I                                                   ; Cortex-M7 errata notice. See Note #5
    MOV32   R2, OS_KA_BASEPRI_Boundary                          ; Set BASEPRI priority level required for exception preemption
    LDR     R1, [R2]
    MSR     BASEPRI
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值