|
之前F429上UCOSIII用的版本一直是V3.04.04,H7的DEMO是V3.07.03版本,试着先走一波。以下4步:
1、新内核跟源内核相同的文件直接替换;
2、新内核中不再存在的文件,直接删除(如os_pend_multi.c);
3、新内核跟源内核文件名差不多的文件,直接删掉源文件,改成新文件名(如bsp.c->os_bsp.c);
4、因为直接用的H7的内核,所以startup_stm32f746xx_ucos.s这个文件没有移植;
完成以上4步,打开工程,将内核分组文件中不再存在的文件删掉,编译一下,根据提示修改几个简单的错误,(类似APP_TASK_START_STK_SIZE换成了APP_CFG_STARTUP_TASK_STK_SIZE,stm32f7xx_hal.h换成stm32f4xx_hal.h等等),编译下载,OK,运行正常。
新版本我重点关注的是浮点入栈出栈问题,这个硬汉已经在帖子中提到过http://www.armbbs.cn/forum.php?m ... ypeid%26typeid%3D27,新版本os_cpu_c.c针对浮点单元多了很多东西(没仔细研究,暂时认为他修复了以前的入栈出栈问题吧),OK,打开浮点单元,编译没错,下载后程序不执行,仿真发现卡在了OSInitHook函数里面,具体位置如下:
#if (OS_CPU_ARM_FP_EN > 0u)
reg_val = CPU_REG_FP_FPCCR; /* Check the floating point mode. */
if ((reg_val & CPU_REG_FPCCR_LAZY_STK) != CPU_REG_FPCCR_LAZY_STK) {
while (1u) { /* See Note (1). */
;
}
}
#endif
对比以前的版本是没有这个什么LAZY_STK东西的,单步从一开始执行,发现在startup_stm32f429xx.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_stm32f746xx_ucos.s文件中是没有这个操作的,于是将这段话屏蔽之后,再次编译下载后,程序正常运行。
程序中做了一个浮点运算,暂时没发现啥问题,以后有啥坑再慢慢踩吧。
|
|