最新UCOSIII 3.06.00 内核浮点运算开启问题解决,分享

2019-07-20 14:01发布

发帖比较少,想想不能总提问不分享。抽点时间,分享一下刚遇到的问题,由于本人喜欢尝鲜,什么都要玩玩新的,今天 想把项目上的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。^_^,  ,,,,,,    也许经过时间检验的才是真正可靠的。




0条回答

一周热门 更多>