|
|
楼主 |
发表于 2026-10-23 21:20:31
|
显示全部楼层
在新的移植优化过程中,发现原移植版本 "uCOS-II_STC8H_small+large" 存在 BUG 公示如下:
BUG代码:
void pendSV_ISR_Handler (void)
{
#pragma asm
PUSHALL
MOV A,?C_IBP
CPL A
INC A //补码
MOV R7,A //IBP数据深度
CLR C
MOV A,SP
SUBB A,#?STACK-1
MOV R6,A //SP深度
ADD A,R7
ADD A,#02H //额外两字节
CPL A
INC A //补码
ADD A,?C_XBP+01H
MOV R5,A //更新后的栈顶低字节
MOV A,?C_XBP
ADDC A,#0FFH
MOV R4,A //更新后的栈顶高字节
MOV DPL,OSTCBCur+01H
MOV DPH,OSTCBCur
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A //提前更新OSTCBStkPtr
MOV DPH,R4 //OSTCBStkPtr写入DPTR
MOV DPL,R5
MOV A,R6
MOVX @DPTR,A //保存SP深度
..........
修复补丁如下:
void pendSV_ISR_Handler (void){
#pragma asm
PUSHALL
MOV A,?C_IBP
CPL A
INC A //补码
MOV R7,A //IBP数据深度
CLR C
MOV A,SP
SUBB A,#?STACK-1
MOV R6,A //SP深度
ADD A,R7
ADD A,#02H //额外两字节
CPL A
INC A //补码
ADD A,?C_XBP+01H
MOV R5,A //更新后的栈顶低字节
MOV A,?C_XBP
ADDC A,#0FFH
MOV R4,A //更新后的栈顶高字节
MOV DPL,OSTCBCur+01H
MOV DPH,OSTCBCur
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A //提前更新OSTCBStkPtr
MOV DPH,R4 //OSTCBStkPtr写入DPTR
MOV DPL,R5
CLR EA ;需要添加这四行
MOV ?C_XBP,DPH
MOV ?C_XBP+1,DPL
SETB EA
MOV A,R6
MOVX @DPTR,A //保存SP深度
..................
以上BUG:为任务结束并准备保存上下文到模拟栈时没有及时向下更新C_XBP,有较低机率任务上下文被嵌套中断污染。
第二个可能的BUG, 前版选 TIM4中断 作为 pendSV 使用并不合适。(仅限于51, 251不在此限,因为251使用位寻址标志)
原因是 AUXINTIF|=0X04; 属于读修写写类型语句,AUXINTIF 的其它位也是中断志,随时可能由硬件置位,写操作有较小机率擦除正在置位的其它中断标志.
如果AUXINTIF中的其它中断标志在项目中没有被使用则不会有问题,如果使用了AUXINTIF中的其它中断标志则有丢失概率,虽然机率不高,但理论存在。
这里一并说明。
已经再使用 uCOS-II_STC8H_small+large 的务必自行修复补丁 + pendSV 源的合适性检查,或更换用新版.
另外寻找上次 “红蓝对抗” 测试的朋友,我见你测试的比较认真,有概率会使用 uCOS-II_STC8H_small+large , 请务必添加补丁+检查pendSV中断源合规,
话说回来,你那个“红蓝对抗”检查了那么多项,可这两真BUG是一个也没检出来哈,哈哈
|
|