KEIL RTX调试窗口显示异常临时解决

近日,在把KEIL的ARM CMSIS组件从5.1.0升级到5.3.0后,发现原来的RTX RTOS窗口不能正常显示RTX的运行状态了,提示
KEIL RTX调试窗口显示异常临时解决_第1张图片
意思是找不到寄存器xPSR。

打开提示的RTX5.scvd文件,可以发现 keil 使用此寄存器判断当前CPU使用的stack pointer

        
        <calc cond="(TCB[i].state == 2) && (__Running == 0)">
          
          ipsr = __GetRegVal("XPSR") & 0x01FF;
          psp  = (v8m_ns == 0) ? (__GetRegVal("PSP")) : (__GetRegVal("PSP_NS"));
          psp  = (psp == 0) ? (TCB[i].sp) : (psp);

          sp = ((ipsr != 0) && (ipsr < 16)) ? (TCB[i].sp) : (psp);
        calc>

        
        <calc cond="(TCB[i].state == 2) && (__Running == 1)">
          sp = TCB[i].sp;
        calc>

        
        <calc cond="TCB[i].state != 2">
          sp = TCB[i].sp;
        calc>

这里出错的原因是找不到xPSR寄存器导致的命令执行失败
KEIL RTX调试窗口显示异常临时解决_第2张图片
解决方法是直接使用PSP这个寄存器指向的SP,这也是之前的官方做法,可以在github上看到(https://github.com/ARM-software/CMSIS_5/commit/0322fb4f70b3ce0896ecd98bae3e2d0c1428c474)

        <calc cond="(TCB[i].state == 2) && (__Running == 0)">
          
          psp  = (v8m_ns == 0) ? (__GetRegVal("PSP")) : (__GetRegVal("PSP_NS"));
          psp  = (psp == 0) ? (TCB[i].sp) : (psp);

          sp = ((ipsr != 0) && (ipsr < 16)) ? (TCB[i].sp) : (psp);
        calc>

缺陷是在上下文切换的时候就没法看到正确的堆栈信息了,以上。

你可能感兴趣的:(嵌入式开发,KEIL,ARM,STM32F0,RTX)