引用 7 楼 great_bug 的回复:
Error L121
Improper Fixup
Summary? *** Error L121
? ? Improper Fixup
? ? Module: filename (module-name)
? ? Segment: segment-name
? ? Offset: address
Description? After evaluation of absolute fix-ups, an address is not accessible. The improper address along with the specific module name, partial segment, and segment address are displayed. The fix-up command is not processed. This error occurs when an instruction tries do make a memory access that is outside the scope of this instruction (for example MOVX @Ri outside of the PDATA page, or ACALL outside of the 2KB code memory block).
呵呵,这个Great_Bug回复我第三次提问了,在此感谢下!!
问题已经解决,谢谢大家:
1. 查看OS_CPU_A.LST文件,找到有出错提示的段和偏移地址:
0000 206 OSCtxSw:
004F 7800 F 280 MOV R0,#OSTCBCur
0051 7900 F 281 MOV R1,#OSTCBHighRdy
005D 7800 F 295 MOV R0,#OSPrioCur
005F 7900 F 296 MOV R1,#OSPrioHighRdy
复制代码
发现问题集中在OSTCBCur, OSTCBHighRdy, OSPrioCur, OSPrioHighRdy 四个变量上,查找他们的声明,可以发现:
EXTRN XDATA (OSTCBCur)
EXTRN XDATA (OSTCBHighRdy)
EXTRN XDATA (OSRunning)
EXTRN XDATA (OSPrioCur)
EXTRN XDATA (OSPrioHighRdy)
复制代码
原来问题是在变量上,(变量都在XDATA区,却用没用MOVX指令)我还一直以为问题出在OSCTXSW函数上,无语!!
2. 修改如下:
;OSTCBCur = OSTCBHighRdy,注意是三个字节
; 第一个字节
MOV DPTR, #OSTCBHighRdy
MOVX A,@DPTR
MOV DPTR, #OSTCBCur
MOVX @DPTR,A
; 第二个字节
MOV DPTR, #OSTCBHighRdy
INC DPTR
MOVX A,@DPTR
MOV DPTR, #OSTCBCur
INC DPTR
MOVX @DPTR,A
; 第三个字节
MOV DPTR, #OSTCBHighRdy
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV DPTR, #OSTCBCur
INC DPTR
INC DPTR
MOVX @DPTR,A
;OSPrioCur = OSPrioHighRdy 使用这两个变量主要目的是为了使指针比较变为字节比较,以便节 省时间。
MOV DPTR,#OSPrioHighRdy
MOVX A,@DPTR
MOV DPTR, #OSPrioCur
MOVX @DPTR,A
复制代码
3. 编译链接,再也没有出现错误,GOD, 谢天谢地!