|
刚学习ucosii,准备把它移植的51上参照书本上的写了与CPU相关的几个函数编译后遇到一个很是奇怪的问题。在OS_CPU_A.asm文件中- ?PR?OSIntCtxSw?OS_CPU_A SEGMENT CODE
复制代码- RSEG ?PR?OSCtxSw?OS_CPU_A
- OSCtxSw:
- PUSHALL
-
- OSIntCtxSw_in:
-
- ;获得堆栈长度和起址
- MOV A,SP
- CLR C
- SUBB A,#OSStkStart
- MOV R5,A ;获得堆栈长度
-
- ;OSTCBCur ===> DPTR 获得当前TCB指针,详见C51.PDF第178页
- MOV R0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
- INC R0
- MOV DPH,@R0 ;全局变量OSTCBCur在IDATA中
- INC R0
- MOV DPL,@R0
-
- ;OSTCBCur->OSTCBStkPtr ===> DPTR 获得用户堆栈指针
- INC DPTR ;指针占3字节。+0类型+1高8位数据+2低8位数据
- MOVX A,@DPTR ;.OSTCBStkPtr是void指针
- MOV R0,A
- INC DPTR
- MOVX A,@DPTR
- MOV R1,A
- MOV DPH,R0
- MOV DPL,R1
-
- ;保存堆栈长度
- MOV A,R5
- MOVX @DPTR,A
-
- MOV R0,#OSStkStart ;获得堆栈起址
- save_stack:
-
- INC DPTR
- INC R0
- MOV A,@R0
- MOVX @DPTR,A
- DJNZ R5,save_stack
-
- ;保存仿真堆栈指针?C_XBP
- INC DPTR
- MOV A,?C_XBP ;?C_XBP 仿真堆栈指针高8位
- MOVX @DPTR,A
- INC DPTR
- MOV A,?C_XBP+1 ;?C_XBP 仿真堆栈指针低8位
- MOVX @DPTR,A
-
- ;调用用户程序
- LCALL _?OSTaskSwHook
-
- ;OSTCBCur = OSTCBHighRdy
- MOV R0,#OSTCBCur
- MOV R1,#OSTCBHighRdy
- MOV A,@R1
- MOV @R0,A
- INC R0
- INC R1
- MOV A,@R1
- MOV @R0,A
- INC R0
- INC R1
- MOV A,@R1
- MOV @R0,A
-
- ;OSPrioCur = OSPrioHighRdy 使用这两个变量主要目的是为了使指针比较变为字节比较,以便节省时间。
- MOV R0,#OSPrioCur
- MOV R1,#OSPrioHighRdy
- MOV A,@R1
- MOV @R0,A
-
- LJMP OSCtxSw_in
复制代码 可是已编译就出现问题了..\..\uCOS-II\Ports\os_cpu_a.asm(34): error A45: UNDEFINED SYMBOL (PASS-2)
这个错误我的理解是OSIntCtxSw 模块没有定义,可是我程序中明明是有定义的啊?
在keil官网上下了个c和asm混合编程的例子其中汇编部分为- NAME A_FUNC
- ?PR?a_func?A_FUNC SEGMENT CODE
- EXTRN CODE (c_func)
- PUBLIC a_func
- RSEG ?PR?a_func?A_FUNC
- a_func:
- USING 0
- LCALL c_func
- RET
- END
复制代码 编译没有问题,一开始我就让为在段命名方面可能有问题于是我把上面的程序改了下- NAME A_FUNC
- ?PR?OSIntCtxSw?A_FUNC SEGMENT CODE
- EXTRN CODE (c_func)
- PUBLIC OSIntCtxSw
- RSEG ?PR?OSIntCtxSw?A_FUNC
- a_func:
- USING 0
- LCALL c_func
- RET
- END
复制代码 编译后果然同样的问题出现了
a_func.a51(5): error A45: UNDEFINED SYMBOL (PASS-2)
不知道这个错误到底是为什么,希望大侠帮忙,谢谢
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|