RT-Thread / rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS).
https://www.rt-thread.io
Apache License 2.0
10.34k stars 4.98k forks source link

M0没有SCB_VTOR 不能通过此寄存器恢复MSP #4728

Open WUSY1991 opened 3 years ago

WUSY1991 commented 3 years ago

rt_hw_context_switch_to 函数 应判断从SCB_VTOR读出来的值,为0不要去修改Msp,否则后面的代码会执行失败 (M0不是所有的core 都有SCB_VTOR的)

; restore MSP LDR r0, =SCB_VTOR LDR r0, [r0] LDR r0, [r0] MSR msp, r0

aozima commented 3 years ago

赞同

有较好的办法区分当前芯片的SCB_VTOR是否有效吗? 不然针对M0只能删除这部分代码。

WUSY1991 commented 3 years ago

VTOR 目前一般不会是0,或者做一次读写操作确认

aozima commented 3 years ago

@WUSY1991 我是这样考虑的

根据ARM的规定,SRAM地址在0x20000000~0x3FFFFFFF,所以MSP肯定是在这个范围内。 且栈地址要求8字节对齐。 因此可以得到判断条件掩码 0xE0000007,判断MSP是否合法。

0xE0000007 // 1110 0000 0000 0000 0000 0000 0000 0111
0x20000000 // 0010 0000 0000 0000 0000 0000 0000 0000
0x3FFFFFFF // 0011 1111 1111 1111 1111 1111 1111 1111

伪代码

if(( vtor_sp & 0xE0000007) != 0)
{
    goto restore_msp_end;
}
msp = vtor_sp;

restore_msp_end:
...

改好之后是这样,麻烦有条件帮实际验证下

    ; restore MSP. (0x20000000 <= MSP <= 0x3FFFFFFF), 8-byte aligned. 
    LDR     r0, =SCB_VTOR
    LDR     r0, [r0]
    LDR     r0, [r0]
    LDR     r1, =0xE0000007
    ANDS    r1, r1, r0
    CBNZ    r0, restore_msp_end
    MSR     msp, r0
restore_msp_end
aozima commented 1 year ago

判断MSP是否合法。

这里的思路应该是没问题的,但判断应该改进得更严谨些。