发帖比较少,想想不能总提问不分享。抽点时间,分享一下刚遇到的问题,由于本人喜欢尝鲜,什么都要玩玩新的,今天 想把项目上的UCOSIII 内核更新到最新版 的(我做好备份的,这个必须 的),但发现只要开启浮点数功能另一个系统就不跑了。调试发现程序停在下面代码里:
void OSInitHook (void)
{
#if (OS_CPU_ARM_FP_EN > 0u)
CPU_INT32U reg_val;
#endif
/* 8-byte align the ISR stack. */
OS_CPU_ExceptStkBase = (CPU_STK *)(OSCfg_ISRStkBasePtr + OSCfg_ISRStkSize);
OS_CPU_ExceptStkBase = (CPU_STK *)((CPU_STK)(OS_CPU_ExceptStkBase) & 0xFFFFFFF8);
#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
}
下面是笔记 :
官方移植的UCOSIII 3.06 版本有一个问题:
当开启浮点运算后,系统启动后不跑。程序一直停在某个地方(可调试查看,在系统内核的某个while()中),
网上查资料说是官方提供的μCOS-III移植工程中对于浮点寄存器的入栈和出栈处理是错误的,
网上资料: http://www.stmcu.org/module/forum/thread-598225-1-1.html
问题涉及到OSTaskStkInit()和OS_CPU_PendSVHandler() 两个函数。它们在os_cpu_c.c 和 os_cpu_a.asm 两个文件中
考虑到3.04.05版本的没有这种问题,于是把3.04.05中的函数拷贝过来,但还是不好使,于是把3.04.04版本的这两个文件
直接拷贝过来,运行,居然好了。
奇怪的是,当再次使用原来的两个文件编译下载运行,居然也可以跑了!!!! 我没有看错,的确启动了。我再想为什么 刚才没有好,现在好了了???,于是我再次 Rebuild All ,
问题又再次复现了。刚才好使用可能是使用的上次的.o文件,
于是,我再次把文件换成3.04.05版本的两个, 再次Rebuild All, 程序正常启动。
这让我想到前一段时间把FATFS 更新到最新 ff13, 在一块板上正常,换了一块板居然不行(这好像与文件 系统没有半毛关系),我也想不到啊,我把文件系统直接退回到ff11b版本(中间试过12b,12c版本),都好使用了。我了个去。。。。。。新版本看起来功能更多,更强大,但实际我们感觉得到吗,基本上感觉 不到,但还有可能带来一些新的问题。一定要谨慎。
最近在研究UCOS II。。最新版2.92.12。^_^, ,,,,,, 也许经过时间检验的才是真正可靠的。 |