Error[e46]: Undefined external “?V1” referred in ?printf ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V2” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V3” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V4” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V5” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V6” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error[e46]: Undefined external “?V7” referred in ?smallwr ( D:\IAR\Embedded Workbench 8.0\8051\LIB\CLIB\cl-pli-blxd-1e16x01.r51 )
Error while running Linker

原因

IAR 中8051版8.20之前创建的项目,移植到8.30之后得到错误。
官方解释原文:
The error happens since the new cstartup file in version 8.30 has been changed to optimize the usage of the virtual register area.
机翻:
由于更改了版本8.30中的新cstartup文件以优化虚拟寄存器区域的使用,因此发生了错误。

解决方法

修改 Number of virtual 为8

在左侧Workspace下的GenericApp右键–>Options。
image.png

修改 chipcon_cstartup.s51 文件

用记事本打开 ZStack-CC2530-2.5.1a\Projects\zstack\ZMain\TI2530DB下的chipcon_cstartup.s51文件。

  1. 在原文件末尾删除 “END”
  2. 把以下代码复制到最后面

image.png
;————————————————————————————————;
; Virtual registers ;
; ================= ;
; Below is some segment needed for the IAR ICC C/EC++ compiler ;
; ;
; BREG : A segment for 8 bit registers for use by the compiler. ;
; ?B0 is the first register. ;
; VREG : Segment that holds up to 32 virtual registers for ;
; use by the compiler. ?V0 is the first register. ;
; PSP : Segment containing the PDATA stack pointer (?PSP) ;
; XSP : Segment containing the XDATA stack pointer (?XSP) ;
; ;
;————————————————————————————————;
;————————————————————————————————;

  1. PROGRAM VIRTUAL_REGISTERS<br /> PUBLIC ?B0<br /> PUBLIC ?V0<br /> PUBLIC ?V1<br /> PUBLIC ?V2<br /> PUBLIC ?V3<br /> PUBLIC ?V4<br /> PUBLIC ?V5<br /> PUBLIC ?V6<br /> PUBLIC ?V7<br /> PUBLIC ?V8<br /> PUBLIC ?V9<br /> PUBLIC ?V10<br /> PUBLIC ?V11<br /> PUBLIC ?V12<br /> PUBLIC ?V13<br /> PUBLIC ?V14<br /> PUBLIC ?V15<br /> PUBLIC ?V16<br /> PUBLIC ?V17<br /> PUBLIC ?V18<br /> PUBLIC ?V19<br /> PUBLIC ?V20<br /> PUBLIC ?V21<br /> PUBLIC ?V22<br /> PUBLIC ?V23<br /> PUBLIC ?V24<br /> PUBLIC ?V25<br /> PUBLIC ?V26<br /> PUBLIC ?V27<br /> PUBLIC ?V28<br /> PUBLIC ?V29<br /> PUBLIC ?V30<br /> PUBLIC ?V31<br /> PUBLIC ?PSP<br /> PUBLIC ?XSP<br /> RSEG BREG:BIT:NOROOT<br />?B0:<br /> DS 8
  2. RSEG VREG:DATA:NOROOT<br />?V0:<br /> DS 1<br />?V1:<br /> DS 1<br />?V2:<br /> DS 1<br />?V3:<br /> DS 1<br />?V4:<br /> DS 1<br />?V5:<br /> DS 1<br />?V6:<br /> DS 1<br />?V7:<br /> DS 1
  3. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V7<br />?V8:<br /> DS 1
  4. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V8<br />?V9:<br /> DS 1
  5. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V9<br />?V10:<br /> DS 1
  6. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V10<br />?V11:<br /> DS 1
  7. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V11<br />?V12:<br /> DS 1
  8. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V12<br />?V13:<br /> DS 1
  9. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V13<br />?V14:<br /> DS 1
  10. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V14<br />?V15:<br /> DS 1
  11. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V15<br />?V16:<br /> DS 1
  12. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V16<br />?V17:<br /> DS 1
  13. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V17<br />?V18:<br /> DS 1
  14. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V18<br />?V19:<br /> DS 1
  15. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V19<br />?V20:<br /> DS 1
  16. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V20<br />?V21:<br /> DS 1
  17. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V21<br />?V22:<br /> DS 1
  18. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V22<br />?V23:<br /> DS 1
  19. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V23<br />?V24:<br /> DS 1
  20. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V24<br />?V25:<br /> DS 1
  21. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V25<br />?V26:<br /> DS 1
  22. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V26<br />?V27:<br /> DS 1
  23. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V27<br />?V28:<br /> DS 1
  24. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V28<br />?V29:<br /> DS 1
  25. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V29<br />?V30:<br /> DS 1
  26. RSEG VREG:DATA:NOROOT<br /> REQUIRE ?V30<br />?V31:<br /> DS 1
  27. RSEG PSP:DATA:NOROOT<br /> EXTERN ?RESET_PSP<br /> REQUIRE ?RESET_PSP<br />?PSP:<br /> DS 1
  28. RSEG XSP:DATA:NOROOT<br /> EXTERN ?RESET_XSP<br /> REQUIRE ?RESET_XSP<br />?XSP:<br /> DS 2
  29. ENDMOD ; VIRTUAL_REGISTERS
  30. END