- 打卡等级:以坛为家II
- 打卡总天数:435
- 最近打卡:2025-05-04 20:54:20
荣誉版主
- 积分
- 4275
|
发表于 2024-6-30 19:37:55
|
显示全部楼层
本帖最后由 CosyOS 于 2024-6-30 19:41 编辑
还有件事要通知你,当前我的测试结论:
任务切换现场保护时,如果入栈DR56,会导致 访问 xdata 出现异常,
即使内存模型为 XSmall 时,也是如此。
OS_PendSV_Handler{Prefix}:
PUSH DR28
PUSH DR24
PUSH DR20
PUSH DR16
PUSH DR12
PUSH DR8
PUSH DR4
PUSH DR0
PUSH DR56
PUSH PSW1
PUSH PSW
POP PSW
POP PSW1
POP DR56
POP DR0
POP DR4
POP DR8
POP DR12
POP DR16
POP DR20
POP DR24
POP DR28
RETI
如上,访问xdata就出问题了。
如果把:
PUSH DR56
POP DR56
改为:
PUSH DPH
PUSH DPL
POP DPL
POP DPH
就一切正常。
如果再增加入栈DPXL:
PUSH DPXL
PUSH DPH
PUSH DPL
POP DPL
POP DPH
POP DPXL
访问xdata仍然出问题。
如果调整为如下:
OS_PendSV_Handler{Prefix}:
PUSH DR28
PUSH DR24
PUSH DR20
PUSH DR16
PUSH DR12
PUSH DR8
PUSH DR4
PUSH DR0
PUSH DR56
PUSH PSW1
PUSH PSW
POP PSW
POP PSW1
POP DR0
MOV DPXL, R1
MOV DPH, R2
MOV DPL, R3
POP DR0
POP DR4
POP DR8
POP DR12
POP DR16
POP DR20
POP DR24
POP DR28
RETI
如果不写:MOV DPXL, R1
访问 xdata 就正常,否则,访问 xdata 异常。
结论就是这个 DPXL 只能读,不能写,一写就出问题,
所以,POP DR56、POP DPXL 等,都会导致访问xdata出问题。
而且我还做了判断,DPXL入栈前为1,出栈后仍为1,都没有问题的,就是不行。
究其根本原因,迄今为止未能找到。
|
|