DSP28335—CMD文件解读(映射关系) 联系客服

发布时间 : 星期三 文章DSP28335—CMD文件解读(映射关系)更新完毕开始阅读d13a59fb81eb6294dd88d0d233d4b14e85243e01

16. .endif

这个函数从the C/C++ Header Files and Peripheral Examples提供的CodeStartBranch.asm文件修改而来,只是第二个调用用copy_sections代替了_c_int00。这个调用仅仅在WD_DISABLE为0时执行。 上面的代码,WD_DISABLE 被设置为1。这使得wd_disable运行。wd_disable的代码如下:

1. *********************************************************************** 2. * Function: wd_disable 3. *

4. * Description: Disables the watchdog timer

5. *********************************************************************** 6. .if WD_DISABLE == 1 7. .sect \ 8. wd_disable:

9. SETC OBJMODE ;Set OBJMODE for 28x object code 10. EALLOW ;Enable EALLOW protected register access 11. MOVZ DP, #7029h>>6 ;Set data page for WDCR register 12. MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD 13. EDIS ;Disable EALLOW protected register access 14. LB copy_sections ;Branch to copy_sections 15. .endif

1. *********************************************************************** 2. * Function: wd_disable 3. *

4. * Description: Disables the watchdog timer

5. *********************************************************************** 6. .if WD_DISABLE == 1 7. .sect \ 8. wd_disable:

9. SETC OBJMODE ;Set OBJMODE for 28x object code 10. EALLOW ;Enable EALLOW protected register access 11. MOVZ DP, #7029h>>6 ;Set data page for WDCR register 12. MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD 13. EDIS ;Disable EALLOW protected register access 14. LB copy_sections ;Branch to copy_sections 15. .endif

这要求看门狗在copy_sections和c_int00函数运行期间被除能,否则,看门狗可能会在进入main()之前超时。这个函数也是从the C/C++ Header Files and Peripheral Examples提供的CodeStartBranch.asm文件修改而来,只是用copy_sections代替了_c_int00。

Copy_sections:

DSP28xxx_SectionCopy_nonBIOS.asm文件提供了copy_sections的代码,第一次运行到这里,看门狗是关闭的,段已经准备好被复制,段大小被存放在累加器,装载地址放在XAR6中,执行地址放在XAR7中,这个功能例子如下:

1. MOVL XAR5,#_text_size ; Store Section Size in XAR5 2. MOVL ACC,@XAR5 ; Move Section Size to ACC

3. MOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6 4. MOVL XAR7,#_text_runstart ; Store Run Address in XAR7 5. LCR copy ; Branch to Copy

1. MOVL XAR5,#_text_size ; Store Section Size in XAR5 2. MOVL ACC,@XAR5 ; Move Section Size to ACC

3. MOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6 4. MOVL XAR7,#_text_runstart ; Store Run Address in XAR7 5. LCR copy ; Branch to Copy

段的大小,装载开始标志,执行开始标志都由连接器产生,这是在内存分配 -链接器命令文件一节讨论。

在地址和段长度都被存放好之后,copy程序被调用来确定段是否被编译器产生,这由检测累加器是否为0来确定。

1. copy:

2. B return,EQ ; Return if ACC is Zero (No section to copy) 3.

4. RPT AL ; Copy Section From Load Address to 5. || PWRITE *XAR7, *XAR6++ ; Run Address 6. return:

7. LRETR ; Return 1. copy:

2. B return,EQ ; Return if ACC is Zero (No section to copy) 3.

4. RPT AL ; Copy Section From Load Address to

5. || PWRITE *XAR7, *XAR6++ ; Run Address 6. return:

7. LRETR ; Return

如果累加器为0,程序会返回到调用前的地址,如果累加器不为0,有段需要被复制。这用上面所示的PWRITE指令来实现,PWRITE复制XAR6指向的存储器的内容到XAR7指向的内容。在这里,就是复制装载代码的地址的内容到运行代码的地址。这样,一直到累加器为0,完成整个段的复制,当所有段都被复制完,程序就会跳到c_int00,如下:

1. LB _c_int00 ; Branch to start of boot.asm in RTS library 1. LB _c_int00 ; Branch to start of boot.asm in RTS library

到这里,C语言环境被建立,main()是可进去的。

完整的copy_sections程序请参见相关文件夹中的DSP28xxx_SectionCopy_nonBIOS.asm。

内存分配 - 连接命令文件(.cmd):

如第二节所述,连接命令文件(.cmd)是用来告诉连接器怎么分配编译器产生的段的。The C/C++ Header Files and Peripheral Examples提供了标准的连接命令文件(.cmd)。

相关代码文件中提供了三个链接器命令文件用于配置内存分配。

· F280xx_nonBIOS_flash.cmd · F281x_nonBIOS_flash.cmd · F2833x_nonBIOS_flash.cmd

每个文件一般都用相同的方法编写,只是在存储器方面有很小的一些差异(特殊设备)。连接命令文件(.cmd)的Memory部分是根据设备的内存空间来连接编译好的段的。详情参见具体控制器的数据手册。 下表展示TMS320F2808的存储器映射: