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的存储器映射:
相关推荐: