sfafa 发表于 2018-11-23 14:29
<blockquote class="quote"/> 请问具体实现方法? 如何重定位应用的指令?怎么检查指令正常?
如何自定义 应用程序的跳转,目前 是在codestart.asm 里面跳转 LB _c_int00 ,应该是程序入口,自己要怎么再定义一个自己boot的入口呢?
...
he yuanjie
说的这个是很重要的。
“覆盖整个代码区的做法应用到产品中是很危险的:不能应对操作中突然断电的情况。”
我理解你的意思,你的想法把Bootloader与APP做成一个项目。这样是可以实现的。至少我已经实现这个功能。
我先说明一下我的做法。
1、使用的Flash操作函数采用的是TI的官方API库。平台CCS5.0
2、Flash区域需要定义4个固定的区域。
请看我的CMD文件部分代码
FLASHD : origin = 0x3F0000, length = 0x003000 /* on-chip FLASH */
FLASHC : origin = 0x3F3000, length = 0x001000 /* on-chip FLASH */
FLASHB : origin = 0x3F4000, length = 0x001FD0 /* on-chip FLASH */
FLASHB_LINK : origin = 0x3F5FD0, length = 0x00002C /* 存放跳转APP的固定指令 */
FLASHB_INFO : origin = 0x3f5FFC, length = 0x000004 /*存放固件的信息,包括固件是否完整的信息*/
FLASHA_API : origin = 0x3F6000, length = 0x001800 /*存放部分Bootloader函数*/
FLASHA_CODE : origin = 0x3F7800, length = 0x000770 /*存放APP中调用的Bootloader入口函数*/
CSM_RSVD : origin = 0x3F7F80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
加粗部分很重要。
3、实现原理
C2000上电后,直接进入Bootloader函数,Bootloader函数检查固件是否完整,如果固件完整执行APP函数,正常启动系统,如果不完整执行Bootloader功能。
4、部分代码。
C2000上电后首先执行的是
BEGIN : origin = 0x3F7FF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */
中的代码,你可以看到在一个Asm文件中。
部分代码:
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
.ref _bootloader
.global code_start
***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************
.sect "codestart"
code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _bootloader ;Branch to start of boot.asm in RTS library
.endif
;end codestart section
***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************
.if WD_DISABLE == 1
.sect "BootFlash"
wd_disable:
SETC OBJMODE ;Set OBJMODE for 28x object code
EALLOW ;Enable EALLOW protected register access
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
EDIS ;Disable EALLOW protected register access
LB _bootloader ;Branch to start of boot.asm in RTS library
.endif
你看到bootloader这个函数没有,这个就是改变了C2000上电后的执行方向,
并不时直接向main()跳转了,而直接向bootloader跳转。
下面部分是我自己写的一个汇编文件
.global _BootProcess
.global _InitC
.ref _SysCtrlRegs
.ref _mProgramFlag
.ref _SCI_Init
.ref _Time0Init
.ref _fFlashProcess
.ref _CpuTimer0Regs
.ref _fInit28035
.ref _mReconnectTime
/*
APP函数中调用Bootloader程序的函数入口
*/
.sect "BootProcess"
_BootProcess:
MOV @SP, #0x0050
SPM #0
SETC OBJMODE
CLRC AMODE
SETC M0M1MAP
CLRC PAGE0
MOVW DP, #0x0
CLRC OVM
ASP
EALLOW
MOV @AL, #0xffff
MOV @AH, #0xffff
ADDB ACC, #1
SB 27, EQ
MOVL XAR7, #0x3fffff
CLRC TC
SB 15, UNC
MOVB AH, #0x0
PREAD @AL, *XAR7
ADDB XAR7, #1
SB 4, NTC
CLRC TC
PREAD @AH, *XAR7
ADDB XAR7, #1
MOVL @XAR6, ACC
RPT @AR1
|| PREAD *XAR6++, *XAR7
MOVL ACC, @XAR7
ADD ACC, @AR1
ADDB ACC, #1
MOVL @XAR7, ACC
PREAD @AL, *XAR7
SB 3, GEQ
NEG AL
SETC TC
MOVZ AR1, @AL
ADDB XAR7, #1
BANZ -20,AR1--
EDIS
MOV @AL, #0xffff
MOV @AH, #0xffff
ADDB ACC, #1
SB 14, EQ
MOVL XAR7, #0x3fffff
SB 6, UNC
ADDB XAR7, #1
MOVL *SP++, XAR7
MOVL @XAR7, ACC
LCR *XAR7
MOVL XAR7, *--SP
PREAD @AL, *XAR7
ADDB XAR7, #1
PREAD @AH, *XAR7
TEST ACC
SB -9, NEQ
LCR #_fInit28035
LCR #_Time0Init
LCR #_SCI_Init
MOVW DP,#_mProgramFlag
MOVW @_mProgramFlag,#0
EALLOW
MOVW DP,#_SysCtrlRegs+25
MOVW @_SysCtrlRegs+25,#0x0068
EDIS
BootContious:
LCR #_fFlashProcess
LB BootContious
NOP
NOP
NOP
LRETR
/*APP函数的入口地址*/
.sect "FlashForAPP"
.global _app_address
.ref _c_int00
_app_address:
LB #_c_int00 /*指向了main()的初始化部分*/
.end
代码有些乱,由于代码有加密,无法给你看到整个项目的布局。
希望这些对你有帮助。
还有一点,需要把bootloader中用到的cinit载入Bootloader函数的Flash区域。不然这些数据在擦除后,数据会丢失。
方法:
SECTIONS
[
Flash28_API:
[
-l Flash2802x_API_V200.lib(.econst)
-l Flash2802x_API_V200.lib(.text)
] LOAD = FLASHA_API
RUN = RamBoot,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
RESETAPP:
[
-l rts2800_ml.lib(.cinit)
-l rts2800_ml.lib(.text)
-l Flash28027_API.obj(.cinit) /*Bootloader中使用的常量以及初始化变量*/
] LOAD = FLASHA_API
PAGE = 0