搜索
bottom↓
回复: 2

keil中混合编程的UNDEFINED SYMBOL问题

[复制链接]

出0入0汤圆

发表于 2012-5-20 10:31:12 | 显示全部楼层 |阅读模式
刚学习ucosii,准备把它移植的51上参照书本上的写了与CPU相关的几个函数编译后遇到一个很是奇怪的问题。在OS_CPU_A.asm文件中
  1. ?PR?OSIntCtxSw?OS_CPU_A                  SEGMENT CODE
复制代码
  1.    PUBLIC OSIntCtxSw
复制代码
  1. RSEG ?PR?OSCtxSw?OS_CPU_A
  2. OSCtxSw:   
  3.         PUSHALL
  4.    
  5. OSIntCtxSw_in:
  6.    
  7.         ;获得堆栈长度和起址
  8.         MOV  A,SP
  9.         CLR  C
  10.         SUBB A,#OSStkStart
  11.         MOV  R5,A     ;获得堆栈长度        
  12.    
  13.         ;OSTCBCur ===> DPTR  获得当前TCB指针,详见C51.PDF第178页
  14.         MOV  R0,#LOW (OSTCBCur) ;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高8位数据+2低8位数据
  15.         INC  R0
  16.         MOV  DPH,@R0    ;全局变量OSTCBCur在IDATA中
  17.         INC  R0
  18.         MOV  DPL,@R0
  19.    
  20.         ;OSTCBCur->OSTCBStkPtr ===> DPTR  获得用户堆栈指针
  21.         INC  DPTR        ;指针占3字节。+0类型+1高8位数据+2低8位数据
  22.         MOVX A,@DPTR     ;.OSTCBStkPtr是void指针
  23.         MOV  R0,A
  24.         INC  DPTR
  25.         MOVX A,@DPTR
  26.         MOV  R1,A
  27.         MOV  DPH,R0
  28.         MOV  DPL,R1
  29.         
  30.         ;保存堆栈长度
  31.         MOV  A,R5
  32.         MOVX @DPTR,A
  33.    
  34.         MOV  R0,#OSStkStart  ;获得堆栈起址
  35. save_stack:
  36.    
  37.         INC  DPTR
  38.         INC  R0
  39.         MOV  A,@R0
  40.         MOVX @DPTR,A
  41.         DJNZ R5,save_stack
  42.         
  43.         ;保存仿真堆栈指针?C_XBP
  44.         INC  DPTR
  45.         MOV  A,?C_XBP    ;?C_XBP 仿真堆栈指针高8位
  46.         MOVX @DPTR,A
  47.         INC  DPTR
  48.         MOV  A,?C_XBP+1  ;?C_XBP 仿真堆栈指针低8位
  49.         MOVX @DPTR,A        
  50.    
  51.         ;调用用户程序
  52.         LCALL _?OSTaskSwHook
  53.         
  54.         ;OSTCBCur = OSTCBHighRdy
  55.         MOV  R0,#OSTCBCur
  56.         MOV  R1,#OSTCBHighRdy
  57.         MOV  A,@R1
  58.         MOV  @R0,A
  59.         INC  R0
  60.         INC  R1
  61.         MOV  A,@R1
  62.         MOV  @R0,A
  63.         INC  R0
  64.         INC  R1
  65.         MOV  A,@R1
  66.         MOV  @R0,A
  67.                
  68.         ;OSPrioCur = OSPrioHighRdy  使用这两个变量主要目的是为了使指针比较变为字节比较,以便节省时间。
  69.         MOV  R0,#OSPrioCur
  70.         MOV  R1,#OSPrioHighRdy
  71.         MOV  A,@R1
  72.         MOV  @R0,A
  73.         
  74.         LJMP OSCtxSw_in
复制代码
可是已编译就出现问题了..\..\uCOS-II\Ports\os_cpu_a.asm(34): error A45: UNDEFINED SYMBOL (PASS-2)
这个错误我的理解是OSIntCtxSw 模块没有定义,可是我程序中明明是有定义的啊?
在keil官网上下了个c和asm混合编程的例子其中汇编部分为
  1. NAME        A_FUNC

  2. ?PR?a_func?A_FUNC    SEGMENT CODE
  3.         EXTRN        CODE (c_func)
  4.         PUBLIC        a_func

  5.         RSEG  ?PR?a_func?A_FUNC
  6. a_func:
  7.         USING        0
  8.         LCALL         c_func
  9.         RET

  10.         END
复制代码
编译没有问题,一开始我就让为在段命名方面可能有问题于是我把上面的程序改了下
  1. NAME        A_FUNC

  2. ?PR?OSIntCtxSw?A_FUNC    SEGMENT CODE
  3.         EXTRN        CODE (c_func)
  4.         PUBLIC        OSIntCtxSw

  5.         RSEG  ?PR?OSIntCtxSw?A_FUNC
  6. a_func:
  7.         USING        0
  8.         LCALL         c_func
  9.         RET

  10.         END
复制代码
编译后果然同样的问题出现了
a_func.a51(5): error A45: UNDEFINED SYMBOL (PASS-2)
不知道这个错误到底是为什么,希望大侠帮忙,谢谢

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-5-20 13:57:07 | 显示全部楼层
终于找出答案了,原来使用RSEG命令后紧接着一行即:
  1.         RSEG ?PR?OSIntCtxSw?OS_CPU_A  
  2. OSIntCtxSw:
  3.                 USING 0
  4.                 LCALL OSTaskSwHook

  5.                 MOV  A, SP                                                                            /*去除多入栈的4字节                        */
  6.                 CLR  C
  7.                 SUBB A, #4
  8.                 MOV  SP, A

  9.                 MOV  A, SP                                                                           /*计算公栈长度                             */
  10.                 CLR  C
  11.                 SUBB A, #OSStkStart
  12.                 MOV  R7, A

  13.                 MOV  R0, #LOW(OSTCBCur)                                                   /* 获取当前任务控制块指针    */
  14.                 INC  R0
  15.                 MOV  DPH, @R0
  16.                 INC         R0
  17.                 MOV  DPL, @R0
  18.                
  19.                 INC  DPTR                                                                           /* 获取当前任务堆栈指针           */
  20.                 MOVX A, @DPTR
  21.                 MOV  R0, A
  22.                 INC  DPTR
  23.                 MOVX A, @DPTR
  24.                 MOV  R1, A
  25.                 MOV  DPH, R0
  26.                 MOV  DPL, R1

  27.         MOV   A, R7                                                                           /* 保存公栈长度               */
  28.                 MOVX @DPTR, A

  29.                 MOV  R0, #OSStkStart                                                   /*保存公栈到私栈              */
  30. Save_Stack_C:
  31.                 INC  DPTR
  32.                 INC  R0
  33.                 MOV  A, @R0
  34.                 MOVX @DPTR, A
  35.                 DJNZ R7, Save_Stack_C
  36.                
复制代码
要使用一个标号并且这个标号和这个函数的名称是一样的

出0入0汤圆

发表于 2012-5-23 00:18:01 | 显示全部楼层
顶一下!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 01:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表