最近做了F28075在线升级的代码,之前一直用的OK的,然后这几天更新了一版软件之后,用在线升级烧写进去,发现运行不了。因为我的flash API函数都是放置在flash A的,默认不擦除编程这个扇区。升级过程中也确实没有操作FlashA,而前后2个版本的软件也没有对分配到Flash A的代码做更改,只是更改了分配到其它扇区的代码和一些变量。
以下是前后2个版本的C代码汇编出来的片段,这些C代码都是汇编到flash A的,且都是一样的,但汇编出来就是不一样。
第一版的代码片段:
0811b7: 0204 MOVB ACC, #4
0811b8: 1E28 MOVL @0x28, ACC
249 stUpdataCanTxObj.ui32MsgLen = 8;
0811b9: 0208 MOVB ACC, #8
0811ba: 1E2A MOVL @0x2a, ACC
251 stUpdataCanRxObj.ui32MsgID.all = 0x00004012;
0811bb: 8F004012 MOVL XAR4, #0x004012
0811bd: A800 MOVL @0x0, XAR4
252 stUpdataCanRxObj.ui32MsgIDMask = 0x0000C0FF;// 0为不关心。全局接收
0811be: 8F00C0FF MOVL XAR4, #0x00c0ff
0811c0: A802 MOVL @0x2, XAR4
253 stUpdataCanRxObj.ui32Flags = MSG_OBJ_NO_FLAGS|MSG_OBJ_EXTENDED_ID|MSG_OBJ_STATUS_MASK|CAN_REG_WORD_MASK;
0811c1: 8F00FFFF MOVL XAR4, #0x00ffff
0811c3: A804 MOVL @0x4, XAR4
254 stUpdataCanRxObj.ui32MsgLen = 8;
0811c4: 1E06 MOVL @0x6, ACC
255 CanRxObjCfg(CANA_BASE, 2, &stUpdataCanRxObj);//邮箱2配置为接收邮箱
0811c5: D502 MOVB XAR5, #0x2
0811c6: 8F048000 MOVL XAR4, #0x048000
0811c8: A8A9 MOVL @ACC, XAR4
0811c9: 8F00DB40 MOVL XAR4, #0x00db40
0811cb: 76481252 LCR CanRxObjCfg
257 HWREGH(CANA_BASE + CAN_O_CTL) = HWREGH(CANA_BASE + CAN_O_CTL) & ~CAN_CTL_INIT;
0811cd: 8F048000 MOVL XAR4, #0x048000
0811cf: CCC4FFFE AND AL, *+XAR4[0], #0xfffe
0811d1: 96C4 MOV *+XAR4[0], AL
258 }
0811d2: FE86 SUBB SP, #6
0811d3: 0006 LRETR 268 {
CANBitRateSet():
0811d4: FE0E ADDB SP, #14
0811d5: 1E42 MOVL *-SP[2], ACC
275 ui32DesiredRatio = u32SourceClock / (u32BitRate*1000);
0811d6: 8F0003E8 MOVL XAR4, #0x0003e8
0811d8: A8AC MOVL @XT, XAR4
0811d9: 56650054 IMPYXUL P, XT, *-SP[20]
第二版的代码片段:
0811b7: 0204 MOVB ACC, #4
0811b8: 1E28 MOVL @0x28, ACC
249 stUpdataCanTxObj.ui32MsgLen = 8;
0811b9: 0208 MOVB ACC, #8
0811ba: 1E2A MOVL @0x2a, ACC
251 stUpdataCanRxObj.ui32MsgID.all = 0x00004012;
0811bb: 8F004012 MOVL XAR4, #0x004012
0811bd: 761F036D MOVW DP, #0x36d
0811bf: A824 MOVL @0x24, XAR4
252 stUpdataCanRxObj.ui32MsgIDMask = 0x0000C0FF;// 0为不关心。全局接收
0811c0: 8F00C0FF MOVL XAR4, #0x00c0ff
0811c2: A826 MOVL @0x26, XAR4
253 stUpdataCanRxObj.ui32Flags = MSG_OBJ_NO_FLAGS|MSG_OBJ_EXTENDED_ID|MSG_OBJ_STATUS_MASK|CAN_REG_WORD_MASK;
0811c3: 8F00FFFF MOVL XAR4, #0x00ffff
0811c5: A828 MOVL @0x28, XAR4
254 stUpdataCanRxObj.ui32MsgLen = 8;
0811c6: 1E2A MOVL @0x2a, ACC
255 CanRxObjCfg(CANA_BASE, 2, &stUpdataCanRxObj);//邮箱2配置为接收邮箱
0811c7: D502 MOVB XAR5, #0x2
0811c8: 8F048000 MOVL XAR4, #0x048000
0811ca: A8A9 MOVL @ACC, XAR4
0811cb: 8F00DB64 MOVL XAR4, #0x00db64
0811cd: 76481254 LCR CanRxObjCfg
257 HWREGH(CANA_BASE + CAN_O_CTL) = HWREGH(CANA_BASE + CAN_O_CTL) & ~CAN_CTL_INIT;
0811cf: 8F048000 MOVL XAR4, #0x048000
0811d1: CCC4FFFE AND AL, *+XAR4[0], #0xfffe
0811d3: 96C4 MOV *+XAR4[0], AL
258 }
0811d4: FE86 SUBB SP, #6
0811d5: 0006 LRETR 268 {
CANBitRateSet():
0811d6: FE0E ADDB SP, #14
0811d7: 1E42 MOVL *-SP[2], ACC
275 ui32DesiredRatio = u32SourceClock / (u32BitRate*1000);
0811d8: 8F0003E8 MOVL XAR4, #0x0003e8
0811da: A8AC MOVL @XT, XAR4
0811db: 56650054 IMPYXUL P, XT, *-SP[20]
对比以上2段发现就是第2版C代码汇编出来之后多了一条红色的"761F036D MOVW DP, #0x36d"。查了一下这种数据页加载数据的,(e2e.ti.com/…/data-blocking-in-the-c2000-mcu-compiler-explained),说可以在CCS工程编译选项中关闭数据页加载优化选项。在编译选项中找到DISABLE_DP_LOAD_OPT,勾选之后,上面这个C代码片段汇编出来的机器代码是一样的了,但是很多变量的地址变成一样的。下面是map文件里看到的变量地址:
1 0000da01 _Debug_addr11 0000da01 _Debug_addr21 0000da01 _Debug_addr31 0000da01 _Debug_addr4
4个不同的变量全分配到0xda01这个RAM地址了,前面没勾选DISABLE_DP_LOAD_OPT时,生成的map文件里的变量地址都是对的,不会一样。这个out文件用XDS200仿真器烧写进芯片也都不能跑了。
Green Deng:
回复 工业测控:
感谢反馈!