Open WUSY1991 opened 3 years ago
赞同
有较好的办法区分当前芯片的SCB_VTOR是否有效吗? 不然针对M0只能删除这部分代码。
VTOR 目前一般不会是0,或者做一次读写操作确认
@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
判断MSP是否合法。
这里的思路应该是没问题的,但判断应该改进得更严谨些。
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