版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-. z.把DSP TMS320F28*的程序段从flash复制到ram中运行翻译自TI应用手册SPRAAU8摘要这个应用报告和相关的代码提供了一种把编译后的程序段从TMS320F28*的flash复制到ram的功能,这样可以提高代码的运行速度。这个解决方案在直接启动之后,进入c_int00 C语言代码运行之前实现此功能。本应用报告中所讨论的工程容和源代码可以从以下网址下载:-s.ti./sc/techlit/spraau8.zip1.引言:在许多应用中,代码的执行速度是至关重要的。例如在医疗,监控,电机控制等等一些对时间有严格要求的终端设备。许多应用使用TMS320F28* DSCs是因为它
2、的置flash储存器。置flash是TMS320F28*的一个优势,因为它使得设计者不需要外接flash来储存代码。使用部flash缺点是访问Flash需要等待状态,这使得程序的运行变慢。在大多数应用中,这不是一个问题。其他一些应用中可能会为了获得最高的运行速度要求无等待状态。部RAM存储器具有零等待状态,它是易失性存储器。所以,引导的初始化代码段不可以存储在此存储器中。现在提供的解决方案,使得设计者能够在运行时把被编译器初始化的代码段从flash复制到ram里,获得最大的运行速度。这使代码执行从多达15个等待状态的提升到0等待状态。另一种解决方案是只将*些函数从Flash复制到RAM。详见:
3、Running an Application from Internal Flash Memory on the TMS320F28* DSP(SPRA958)。这种方法应该使用在大多数使用C2000 DSC的应用上,其他要求严格的时序和连续的零等待状态的应用程序应采用这里提出的解决方案。编写汇编程序来完成代码从Flash到RAM的复制。该汇编代码在复位向量后调用c_int00之前执行。这保证了在c_int00调用mian之前完成复制。有一些工程比拟小,可以把所有初始化了的段都复制到ram。然而,其他一些工程的初始化了的段比所有的部ram还要大。这些工程可能不可以把所有的初始化了的段都复制到r
4、am,但是用这种方法复制其中一局部段。2.编译的代码段:编译器生成的包含代码和数据的多个局部,称为段。这下段被分为两个不同的组:初始化了的和没被初始化的,初始化的局部是由所有的代码,常量和初始化表组成的。下表列出了由编译器产生的初始化段。初始化段段名容限制.cinit显式初始化的全局变量和静态变量表代码.const显式初始化的全局和静态的const变量和字符串常量不超过64K长度.econst长调用的常量数据中的任何地方.pinit全局对象的构造函数表代码.switchswitch语句产生的表代码或者数据.te*t可执行代码和常数代码没初始化的段是由未初始化的变量,堆栈和malloc产生的存。
5、下表列出了由编译器产生的没初始化段。没初始化段段名容限制.bss全局和静态变量不超过64K长度.ebss长调用的全局或静态变量数据中的任何地方.stack堆栈空间不超过64K长度.sysmemmalloc函数产生的存不超过64K长度.esysmemfar_malloc函数产生的存数据中的任何地方一旦编译器生成的这些段,连接器会从各个源文件中取出这些段,并结合它们来创立一个输出文件。连接器命令文件 d就是用来告诉连接器去哪里找这些段的。初始化段必须分配到非易失性存储器,如flash/ ROM,当电源被撤除时,程序不会消失。未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。关于
6、更多编译段和连接的信息,请参见:TMS320C28* Assembly LanguageTools Users Guide (SPRU513) 和 the TMS320C28* Optimizing C/C+ piler Users Guide(SPRU514)。仪器TI提供了多个例子显示如何使用器命令文件分配编译段。其中一个就是Running an Application from Internal Flash Memory on the TMS320F28* DSP (SPRA958)。此应用文档提供的例子,演示了使用基于RAM和Flash的工程的器命令文件。3.软件:本应用文档相关的代码
7、文件,包括修改后的版本的CodeStartBranch.asm文件和非DSP/BIOS工程用的文件DSP28*_SectionCopy_nonBIOS.asm,由the C/C+ Header Files and Peripheral E*amples提供。每个TMS320F28*处理器都提供了现成的连接器命令文件。提供的例如工程演示了如何使用这些文件。本应用文档以TMS320F2808为例。该软件独立存放于F28*_Flash_to_Ram文件夹中。代码使用的来自the C/C+ Header Files and Peripheral E*amples的几个文件,经过了Code poser
8、Studio 3.3和F28*代码生成工具B3版本的测试。3.描述:一般的程序流程是这样子的:code_start-wd_disable-copy_sections-c_int00-mian。这个软件流程比标准的软件流程仅仅多了调用复制代码段函数。标准的软件流程:code_start-wd_disable-c_int00-mian。程序开场和关闭看门狗:code_start 和wd_disable 的运行代码由DSP28*_CodeStartBranch.asm文件提供。上电后,code_start正常执行,因为它被分配给Flash的引导地址的0*3F7FF6。详见:Running an Ap
9、plication from Internal Flash Memory on the TMS320F28* DSP(SPRA958)plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0 .ref copy_sections .global code_start * * Function: codestart
10、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 copy_sections ;Branch to copy_sections .endif WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0 .ref copy_sections .global code_start
11、* Function: codestart section* Description: Branch to code starting point* .sect codestartcode_start: .if WD_DISABLE = 1 LB wd_disable ;Branch to watchdog disable code .else LB copy_sections ;Branch to copy_sections .endif这个函数从the C/C+ Header Files and Peripheral E*amples提供的CodeStartBranch.asm文件修改而来
12、,只是第二个调用用copy_sections代替了_c_int00。这个调用仅仅在WD_DISABLE为0时执行。 上面的代码,WD_DISABLE 被设置为1。这使得wd_disable运行。wd_disable的代码如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o * * Function: wd_disable * * Description: Disables the watchdog timer * .
13、if WD_DISABLE = 1 .sect wddisable wd_disable: SETC OBJMODE ;Set OBJMODE for 28* object code EALLOW ;Enable EALLOW protected register access MOVZ DP, #7029h6 ;Set data page for WDCR register MOV 7029h, #0068h ;Set WDDIS bit in WDCR to disable WD EDIS ;Disable EALLOW protected register access LB copy_
14、sections ;Branch to copy_sections .endif * Function: wd_disable* Description: Disables the watchdog timer* .if WD_DISABLE = 1 .sect wddisablewd_disable: SETC OBJMODE ;Set OBJMODE for 28* object code EALLOW ;Enable EALLOW protected register access MOVZ DP, #7029h6 ;Set data page for WDCR register MOV
15、 7029h, #0068h ;Set WDDIS bit in WDCR to disable WD EDIS ;Disable EALLOW protected register access LB copy_sections ;Branch to copy_sections .endif这要求看门狗在copy_sections和c_int00函数运行期间被除能,否则,看门狗可能会在进入main之前超时。这个函数也是从the C/C+ Header Files and Peripheral E*amples提供的CodeStartBranch.asm文件修改而来,只是用copy_secti
16、ons代替了_c_int00。Copy_sections:DSP28*_SectionCopy_nonBIOS.asm文件提供了copy_sections的代码,第一次运行到这里,看门狗是关闭的,段已经准备好被复制,段大小被存放在累加器,装载地址放在*AR6中,执行地址放在*AR7中,这个功能例子如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o MOVL *AR5,#_te*t_size ; Store Sect
17、ion Size in *AR5 MOVL ACC,*AR5 ; Move Section Size to ACC MOVL *AR6,#_te*t_loadstart ; Store Load Starting Address in *AR6 MOVL *AR7,#_te*t_runstart ; Store Run Address in *AR7 LCR copy ; Branch to Copy MOVL *AR5,#_te*t_size ; Store Section Size in *AR5 MOVL ACC,*AR5 ; Move Section Size to ACC MOVL
18、*AR6,#_te*t_loadstart ; Store Load Starting Address in *AR6 MOVL *AR7,#_te*t_runstart ; Store Run Address in *AR7 LCR copy ; Branch to Copy段的大小,装载开场标志,执行开场标志都由连接器产生,这是在存分配 -器命令文件一节讨论。在地址和段长度都被存放好之后,copy程序被调用来确定段是否被编译器产生,这由检测累加器是否为0来确定。plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy
19、copy HYPERLINK l # o print print HYPERLINK l # o copy: B return,EQ ; Return if ACC is Zero (No section to copy) RPT AL ; Copy Section From Load Address to | PWRITE *AR7, *AR6+ ; Run Address return: LRETR ; Return copy: B return,EQ ; Return if ACC is Zero (No section to copy) RPT AL ; Copy Section Fr
20、om Load Address to | PWRITE *AR7, *AR6+ ; Run Addressreturn: LRETR ; Return如果累加器为0,程序会返回到调用前的地址,如果累加器不为0,有段需要被复制。这用上面所示的PWRITE指令来实现,PWRITE复制*AR6指向的存储器的容到*AR7指向的容。在这里,就是复制装载代码的地址的容到运行代码的地址。这样,一直到累加器为0,完成整个段的复制,当所有段都被复制完,程序就会跳到c_int00,如下:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy
21、 copy HYPERLINK l # o print print HYPERLINK l # o LB _c_int00 ; Branch to start of boot.asm in RTS library LB _c_int00 ; Branch to start of boot.asm in RTS library到这里,C语言环境被建立,main是可进去的。完整的copy_sections程序请参见相关文件夹中的DSP28*_SectionCopy_nonBIOS.asm。存分配 - 连接命令文件 d:如第二节所述,连接命令文件 d是用来告诉连接器怎么分配编译器产生的段的。The
22、C/C+ Header Files and Peripheral E*amples提供了标准的连接命令文件 d。相关代码文件中提供了三个器命令文件用于配置存分配。 F280*_nonBIOS_flash d F281*_nonBIOS_flash d F2833*_nonBIOS_flash d每个文件一般都用一样的方法编写,只是在存储器方面有很小的一些差异特殊设备。连接命令文件 d的Memory局部是根据设备的存空间来连接编译好的段的。详情参见具体控制器的数据手册。下表展示TMS320F2808的存储器映射:TMS320F28*系列控制器置RAM,可以被分配为一个单独的段,或者更多的段,因为
23、它是连续的存储器映射。如上图所示,F2808有映射到存储器空间的L0,L1和H0 SARAMs,允许生成一个大的存块,这个块可以被CMD文件的MEMORY局部如下定义:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o RAM_H0L0L1 : origin = 0*008000, length = 0*004000 /* on-chip RAM */ RAM_H0L0L1 : origin = 0*008000, le
24、ngth = 0*004000 /* on-chip RAM */其余的也可以定义在MEMORY局部,完整的存分配,请参见相关文件中的CMD文件。器命令文件的第二局部是SECTIONS。这是实际编译器把段连接到的存储区。所有DSP28*_CodeStartBranch.asm 和 DSP28*_SectionCopy_nonBIOS.asm的段都被装载到flash中运行,这局部如下所示分配:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPER
25、LINK l # o codestart : BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */ wddisable : FLASH_AB, PAGE = 0 /* Used by file CodeStartBranch.asm */ copysections : FLASH_AB, PAGE = 0 /* Used by file SectionCopy.asm */ codestart : BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */wddis
26、able : FLASH_AB, PAGE = 0 /* Used by file CodeStartBranch.asm */copysections : FLASH_AB, PAGE = 0 /* Used by file SectionCopy.asm */其他被初始化的段被下载到flash,但是在ram中运行。这是通过load和run指令来实现。下面展示一个例子:plain HYPERLINK l # o view plain view plain HYPERLINK l # o copy copy HYPERLINK l # o print print HYPERLINK l # o
27、 .te*t : LOAD = FLASH_AB, PAGE = 0 /* Load section to Flash */ RUN = RAM_H0L0L1,PAGE = 0 /* Run section from RAM */ LOAD_START(_te*t_loadstart), RUN_START(_te*t_runstart), SIZE(_te*t_size) .te*t : LOAD = FLASH_AB, PAGE = 0 /* Load section to Flash */ RUN = RAM_H0L0L1,PAGE = 0 /* Run section from RAM
28、 */ LOAD_START(_te*t_loadstart), RUN_START(_te*t_runstart), SIZE(_te*t_size)为了获得与一个段相关联的特定地址,如上所示,使用了LOAD_START, RUN_START, 和SIZE指令。这些指令的地址和大小在DSP28*_SectionCopy_nonBIOS.asm文件使用到,用以在复制过程中指向正确的地址。DSP28*_SectionCopy_nonBIOS.asm把这些值创立为全局变量,如以下图所示plain HYPERLINK l # o view plain view plain HYPERLINK l #
29、 o copy copy HYPERLINK l # o print print HYPERLINK l # o .global _cinit_loadstart, _cinit_runstart, _cinit_size .global _const_loadstart, _const_runstart, _const_size .global _econst_loadstart, _econst_runstart, _econst_size .global _pinit_loadstart, _pinit_runstart, _pinit_size .global _switch_load
30、start, _switch_runstart, _switch_size .global _te*t_loadstart, _te*t_runstart, _te*t_size .global _cinit_loadstart, _cinit_runstart, _cinit_size.global _const_loadstart, _const_runstart, _const_size.global _econst_loadstart, _econst_runstart, _econst_size.global _pinit_loadstart, _pinit_runstart, _p
31、init_size.global _switch_loadstart, _switch_runstart, _switch_size.global _te*t_loadstart, _te*t_runstart, _te*t_size测试例子:提供的例如在TMS320F2812,TMS320F2808,TMS320F28335eZdsp开发板上进展了测试。板子上LED的闪烁可以从视觉上证实程序是否正确运行。下面的程序是基于F2808eZdsp评估板设计和测试的。同样的,这种方法可以用于其他eZdsp开发板。Code poser Studio环境:1.使用USB线连接F2808eZdsp开发板到
32、PC,接上电源线给板子供电。2.翻开Code poser Studio,设置F2808 eZdsp 仿真器。3.翻开和编译E*ample_280*_Flash_to_RAM_nonBIOS.pjt。4.下载.out文件到芯片的flash中。5.调试程序debug。6.运行程序run。在eZdsp电路板上的LED应闪烁,表示程序正在运行。应用:现有的Flash应用程序可以很容易地通过移植相关代码文件来实现此功能。根本的移植步骤如下:1.用DSP28*_CodeStartBranch.asm替换CodeStartBranch.asm。2.在工程中添加DSP28*_SectionCopy_nonBI
33、OS.asm文件。3.用特殊生成的CMD文件代替现有的CMD文件。这个根本步骤不适用于一些特殊情况,比方用户自己定义的段,等应用例子:为了演示的应用程序集成的过程,在C280*,C2801*C / C +头文件和外设例如的E*ample_2808_Flash.pjt中使用以下步骤移植。1.下载安装C280*, C2801* C/C+ Header Files and Peripheral E*amples。2.如上所述连接板,翻开工程文件。3.删除工程中的DSP280*_CodeStartBranch.asm文件,在工程中添加DSP28*_CodeStartBranch.asm文件。4.在工程
34、中添加DSP28*_SectionCopy_nonBIOS.asm文件。5.删除工程中的cmd文件,在工程中添加F280*_nonBIOS_flash d文件。6.把DSP280*_usDelay.asm中的.sect ramfuncs改为.te*t,使DSP28*_usDelay在被分配在.test段中。7.删除DSP280*_SysCtrl.c文件中的#pragma CODE_SECTION(InitFlash, ramfuncs);。使得InitFlash( )函数被分配到.test而不是ramfuncs。8.删除E*ample_280*Flash.c文件中的#pragma CODE_SECTION(epwm1_timer_isr, ramfuncs);和#pragma CODE_SECTION(epwm2_timer_isr, ramfuncs);。使得中断效劳函数被分配到.test而不是ramfuncs。9.删除E*ample_280*Flash.c文件中的MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);和InitFlash(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026电热鼠标垫行业办公场景需求与人体工学设计报告
- 2026反向疫苗学技术在新型疫苗开发中的应用潜力分析
- 2026汽车智能座舱人机交互创新与供应链重构分析报告
- 2026电力电子器件在新能源发电系统中的可靠性测试报告
- 2026创新药license-out交易估值模型与国际化合作风险规避指南
- 2026量子计算商业化路径与投资回报评估报告
- 2026健身APP联动智能护具生态圈构建与盈利模式报告
- 2026聚合物材料技术革新及在电子行业应用的深度研究报告
- 2026跨境电商物流体系优化与成本控制专项研究报告
- 2026超高清视频内容制作成本与变现模式分析报告
- (2026年)支气管哮喘病人的护理课件
- 《食品理化检验技术》课程标准
- 中核集团校招面试题及答案(2026版)
- 中小学学生校服采购项目方案投标文件(技术方案)
- 小鹏定金购车合同范本
- 广州市财政投资信息化工程(建设类)方案编写指南
- 珍珠1024中文控台说明书
- 2025至2030全球及中国计算流体动力学仿真软件行业项目调研及市场前景预测评估报告
- 2024年合肥新站高新技术产业开发区招聘社区工作者40人笔试备考试题及参考答案详解1套
- 2025年国家基本公共卫生服务项目培训试题(附答案)
- DB61∕T 1880-2024 科技成果评估机构服务规范
评论
0/150
提交评论