下面是app和bootloader合并一个工程里的用于booloader和app跳转的汇编代码(Boot_Entry.asm):
在28035工程上编译通过且正常运行,移植到00157工程上编译报错
unresolved symbol _boot_main, first referenced in ./boot/src/Boot_Entry.obj
void boot_main(void)为bootloader的main函数在外部c文件定义,且在.h文件extern了;main(void)为app的main函数
实测把LCR _boot_main位置放到LCR _main 上一行,则编译通过,但这样会改变运行逻辑。
下面为Boot_Entry.asm代码,麻烦分析下,感谢!
.global _AppEntPoint, _App_Entry
.global _RstEntPoint, _Rst_Entry
_AppEntPoint LB _App_Entry
_RstEntPoint LB _Rst_Entry
.ref _c_int00
.global _boot_main
.bss _MdlAddr,0
.bss _uiFromApp,0
.global _uiFromApp,_MdlAddr
__stack: .usect ".stack",0
.sect "FlashBoot"
_Rst_Entry:
; INITIALIZE STACK POINTER.
MOV AL,#__stack ; set to beginning of stack space
MOV @SP,AL
SPM 0 ; set product shift to 0
; SET C28x MODES
SETC OBJMODE ; select C28x object mode
CLRC AMODE ; clear the addressing mode
.c28_amode ; 28x mode
SETC M0M1MAP ; set block M0 and M1 mode
; SETTING THESE STATUS BITS/REGISTER TO RESET VALUES
CLRC PAGE0 ; use stack addressing mode
MOVW DP,#0x0000
CLRC OVM ; turn off overflow mode
ASP ; ensure SP is aligned
SETC INTM
MOV AL,#0
MOVW DP,#_MdlAddr
MOV @_MdlAddr,AL
LB ContinueB
_App_Entry:
SETC INTM
MOV AL,#0FFH
ContinueB:
MOVW DP,#_uiFromApp
MOV @_uiFromApp,AL
LCR _boot_main
SETC INTM
justdie:
LB justdie
.global _main,_exit
.sect ".appvec"
_App_Entry_Point:
MOV AL,#__stack
MOV @SP,AL
LCR _main
_exit_entry LCR _exit
.end