rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

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

Open WUSY1991 opened this issue 4 years ago • 4 comments

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

WUSY1991 avatar May 25 '21 04:05 WUSY1991

赞同

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

aozima avatar May 25 '21 07:05 aozima

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

WUSY1991 avatar May 25 '21 11:05 WUSY1991

@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 avatar Jun 09 '21 03:06 aozima

判断MSP是否合法。

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

aozima avatar Mar 24 '23 03:03 aozima