[第一讲]DSP28335将Flash中的代码拷贝到RAM中运行
背景:
近期需要使用28335完成一个简单的逆变器设计,由于开关频率为81kHz,每个开关周期只有12.34us,担心在每个开关期间无法完成相应的计算工作,因此想到了将代码烧写时放在Flash中,初始化时拷贝到RAM中运行的办法,经实测,代码运行速度提升20%~250%不等.
那就开始吧,关于28335的工程模板部分,过于简单,相关的文章也够多,在此省略。
方式一(适用于较大的工程): 将部分函数拷贝到RAM中运行
众所周知,28335拥有512KB的Flash与68KB的RAM,庞大的工程往往无法实现所有代码都放在RAM中运行,因此,将部分对运算速度非常敏感的函数放在RAM中运行,往往是常用的方法。
首先需要在CMD文件中划分空间,划分出用来存放函数的Flash区域和运行函数的RAM区域,见下列 /* User Define areas below: */之后的部分。
实际上该段落写在SECTIONS的任意位置都可以。
SECTIONS
{/* Allocate program areas: */.cinit : > FLASHA PAGE = 0.pinit : > FLASHA, PAGE = 0.text : > FLASHA PAGE = 0codestart : > BEGIN PAGE = 0
#ifdef __TI_COMPILER_VERSION__#if __TI_COMPILER_VERSION__ >= 15009000.TI.ramfunc : {} LOAD = FLASHG,RUN = RAML2,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),LOAD_SIZE(_RamfuncsLoadSize),PAGE = 0#elseramfuncs : LOAD = FLASHG,RUN = RAML2,LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),LOAD_SIZE(_RamfuncsLoadSize),PAGE = 0#endif
#endif/* User Define areas below: */Myspace : LOAD = FLASHH,RUN = RAML3,LOAD_START(_MyspaceLoadStart),LOAD_END(_MyspaceLoadEnd),RUN_START(_MyspaceRunStart),LOAD_SIZE(_MyspaceLoadSize),PAGE = 0/* User Define areas above: */csmpasswds : > CSM_PWL PAGE = 0csm_rsvd : > CSM_RSVD PAGE = 0
从图中可以看出,划分的区域叫作Myspace,存储的区域为FLASHH,初始化后运行的区域为RAML3。
其中的_MyspaceLoadStart等地址划分不用管,CCS会自动生成相应的地址区域,名称可以任意,注意格式即可。
下面来看看CMD文件的前段内容:
MEMORY
{
PAGE 0: /* Program Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */ ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */ FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */ FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */ RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */PAGE 1 : /* Data Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation *//* Registers remain on PAGE1 */BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
}
图中PAGE0划分了存储程序的区域,PAGE1划分了存储数据的区域,因为28335是哈佛结构,因此数据和程序的总线地址并不会重叠,例如FLASHB是数据存储区域,但其地址处于FLASHA与FLASHC之间。
划分好了地址,下一步需要对定义的函数进行搬运,在主程序中添加以下代码:
extern Uint16 MyspaceLoadStart;
extern Uint16 MyspaceLoadEnd;
extern Uint16 MyspaceRunStart;//define user Functions
void beep();
#pragma CODE_SECTION(beep,"Myspace")
声明了CMD文件中拥有的地址,并为定义的函数beep()划分了相应的存储运行空间,也就是上面定义的Myspace。
随后,在主函数中加入MemCopy()与InitFlash()函数,后者确保了函数烧写在了Flash中,并且Flash可以正常工作。前者则是将Flash中的介于MyspaceLoadStart, MyspaceLoadEnd之间的代码搬运到RAM中进行初始化。
void main()
{InitSysCtrl();MemCopy(&MyspaceLoadStart, &MyspaceLoadEnd, &MyspaceRunStart);InitFlash();Gpio_init();while(1){//SRAM中程序运行速度是flash中的两倍beep();}
}
随后对beep()函数进行定义,为了尽可能公平公正的展示代码的运行速度,函数中包含了浮点加减乘除运算与三角运算,同时还有一些对寄存器的操作语句,随后与Flash中运行的代码进行对比,检验代码运行速度的变化。
void beep()
{float a; float b=2.843;a=sin(b);a=b*3.14;a=b+3.25;a=b/0.98;b=a*b;GpioDataRegs.GPCSET.bit.GPIO64=1;GpioDataRegs.GPCCLEAR.bit.GPIO64=1;GpioDataRegs.GPCDAT.bit.GPIO64=1;GpioDataRegs.GPCTOGGLE.bit.GPIO64=1;
}
下面开始速度测试部分:
将代码运行使用的时钟周期(1/150M)写在代码后,可以看到此时的速度如下,总用时484时钟周期,RAM运行总时间约为3.2us。
void beep()
{float a; //1float b=2.843; //2a=sin(b); //151a=b*3.14; //6a=b+3.25; //4a=b/0.98; //259b=a*b; //4GpioDataRegs.GPCSET.bit.GPIO64=1; //4GpioDataRegs.GPCCLEAR.bit.GPIO64=1; //1GpioDataRegs.GPCDAT.bit.GPIO64=1; //1GpioDataRegs.GPCTOGGLE.bit.GPIO64=1; //4GpioDataRegs.GPCTOGGLE.bit.GPIO64=1; //1
}
再看FLASH中的运行速度:
void beep()
{float a; //6float b=2.843; //6a=sin(b); //185a=b*3.14; //19a=b+3.25; //13a=b/0.98; //361b=a*b; //13GpioDataRegs.GPCSET.bit.GPIO64=1; //7GpioDataRegs.GPCCLEAR.bit.GPIO64=1; //1GpioDataRegs.GPCDAT.bit.GPIO64=1; //6GpioDataRegs.GPCTOGGLE.bit.GPIO64=1; //1
}
FLASH中运行总时间约为3.7us。
使用内部FLASH缺点是访问FLASH需要等待状态,这使得程序的运行变慢。在大多数应用中,这不是一个问题。其他一些应用中可能会为了获得最高的运行速度要求无等待状态。内部RAM存储器具有零等待状态,它是易失性存储器。所以,引导的初始化代码段不可以存储在此存储器中。
实际上,虽然将代码写进了RAM中,但代码中的数据与代码内调用的函数可能还在FLASH中存储,无法做到全局的零等待状态,因此,在代码量较小的情况下,可以将全部代码拷贝到RAM中运行,也即引出了方式二。
方式二(适用于较小的工程): 将所有程序拷贝到RAM中运行
这种方式需要编写汇编程序来完成代码从Flash到RAM的复制。该汇编代码在复位向量后调用c_int00之前执行。这保证了在c_int00调用mian()之前完成复制。
编译器生成的包含代码和数据的多个部分,称为段。
下表列出了各种汇编段代表的含义,包括初始化了的和没被初始化的段,初始化的部分是由所有的代码,常量和初始化表组成的。
段名 | 内容 | 限制 |
---|---|---|
.cinit | 显式初始化的全局变量和静态变量表 | 代码 |
.const | 显式初始化的全局和静态的const变量和字符串常量 | 不超过64K长度 |
.econst | 长调用的常量 | 数据中的任何地方 |
.pinit | 全局对象的构造函数表 | 代码 |
.switch | switch语句产生的表 | 代码或者数据 |
.text | 可执行代码和常数 | 代码 |
没初始化的段是由未初始化的变量,堆栈和malloc产生的内存。下表列出了由编译器产生的没初始化段。
段名 | 内容 | 限制 |
---|---|---|
.bss | 全局和静态变量 | 不超过64K长度 |
.ebss | 长调用的全局或静态变量 | 数据中的任何地方 |
.stack | 堆栈空间 | 不超过64K长度 |
.sysmem | malloc函数产生的内存 | 不超过64K长度 |
.esysmem | far_malloc函数产生的内存 | 数据中的任何地方 |
当编译器生成的这些段,连接器会从各个源文件中取出这些段,并结合它们来创建一个输出文件。连接器命令文件(.cmd)就是用来告诉连接器去哪里找这些段的。初始化段必须分配到非易失性存储器,如flash/ ROM,当电源被撤除时,程序不会消失。未初始化的段可以被分配到RAM中,因为它们是在代码执行期间被初始化的。
而用户写好程序后,各种变量与函数已经被安排到了各种段名下,此时只需要将相应的段名安排到FLASH中,并在初始化时全部拷贝到RAM中即可。
为了实现以上功能,需要重写以下文件,大家直接复制代码粘贴在相应文件中即可:
Source目录下的:
DSP2833x_usDelay.asm
.def _DSP28x_usDelay.text.global __DSP28x_usDelay
_DSP28x_usDelay:SUB ACC,#1BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0LRETR
DSP28xxx_CodeStartBranch.asm
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0.ref copy_sections.global code_start***********************************************************************
* Function: codestart section
*
* Description: Branch to code starting point
***********************************************************************.sect "codestart"code_start:.if WD_DISABLE == 1LB wd_disable ;Branch to watchdog disable code.elseLB copy_sections ;Branch to copy_sections .endif;end codestart section***********************************************************************
* Function: wd_disable
*
* Description: Disables the watchdog timer
***********************************************************************.if WD_DISABLE == 1.sect "wddisable"
wd_disable:SETC OBJMODE ;Set OBJMODE for 28x object codeEALLOW ;Enable EALLOW protected register accessMOVZ DP, #7029h>>6 ;Set data page for WDCR registerMOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WDEDIS ;Disable EALLOW protected register accessLB copy_sections ;Branch to copy_sections .endif;end wd_disable.end
CMD目录下的:
DSP2833x_nonBIOS_flash.cmd(也可能叫dsp28335.cmd)
MEMORY
{
PAGE 0: /* Program Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */RAM_L0L1L2L3: origin = 0x008000, length = 0x004000 /* on-chip RAM */OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */ZONE6 : origin = 0x100000, length = 0x100000 /* XINTF zone 6 */ ZONE7A : origin = 0x200000, length = 0x00FC00 /* XINTF zone 7 - program space */FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */BEGIN_FLASH : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for "boot to Flash" bootloader mode. */CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */ADC_CAL : origin = 0x380080, length = 0x000009 /* Part of TI OTP */IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */ FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */PAGE 1 : /* Data Memory *//* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation *//* Registers remain on PAGE1 */RAMM0 : origin = 0x000000, length = 0x000400 /* on-chip RAM block M0 */BOOT_RSVD : origin = 0x000400, length = 0x000080 /* Part of M1, BOOT rom will use this for stack */RAMM1 : origin = 0x000480, length = 0x000380 /* on-chip RAM block M1 */RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L4 */RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L5 */RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L6 */RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L7 */ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
}/**************************************************************/
/* Link all user defined sections */
/**************************************************************/
SECTIONS
{/*** Code Security Password Locations ***/csmpasswds : > CSM_PWL PAGE = 0csm_rsvd : > CSM_RSVD PAGE = 0/*** User Defined Sections ***/codestart : > BEGIN_FLASH, PAGE = 0 /* Used by file CodeStartBranch.asm */wddisable : > FLASHA, PAGE = 0 copysections : > FLASHA, PAGE = 0/* Allocate IQ math areas: */IQmath : > FLASHC PAGE = 0 /* Math Code */IQmathTables : > IQTABLES, PAGE = 0, TYPE = NOLOAD IQmathTables2 : > IQTABLES2, PAGE = 0, TYPE = NOLOAD FPUmathTables : > FPUTABLES, PAGE = 0, TYPE = NOLOAD /* Allocate DMA-accessible RAM sections: */DMARAML4 : > RAML4, PAGE = 1DMARAML5 : > RAML5, PAGE = 1DMARAML6 : > RAML6, PAGE = 1DMARAML7 : > RAML7, PAGE = 1/* Allocate 0x400 of XINTF Zone 7 to storing data */ZONE7DATA : > ZONE7B, PAGE = 1/* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD /* .reset is a standard section used by the compiler. It contains the */
/* the address of the start of _c_int00 for C Code. /*
/* When using the boot ROM this section and the CPU vector */
/* table is not needed. Thus the default type is set here to */
/* DSECT */ .reset : > RESET, PAGE = 0, TYPE = DSECTvectors : > VECTORS PAGE = 0, TYPE = DSECT/*** Uninitialized Sections ***/.stack : > RAMM0 PAGE = 1.ebss : > RAMM1 PAGE = 1.esysmem : > RAMM1 PAGE = 1/*** Initialized Sections ***/ .cinit : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_cinit_loadstart),RUN_START(_cinit_runstart),SIZE(_cinit_size).const : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_const_loadstart),RUN_START(_const_runstart),SIZE(_const_size).econst : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_econst_loadstart),RUN_START(_econst_runstart),SIZE(_econst_size).pinit : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_pinit_loadstart),RUN_START(_pinit_runstart),SIZE(_pinit_size).switch : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_switch_loadstart),RUN_START(_switch_runstart),SIZE(_switch_size).text : LOAD = FLASHA, PAGE = 0 /* can be ROM */ RUN = RAM_L0L1L2L3, PAGE = 0 /* must be CSM secured RAM */LOAD_START(_text_loadstart),RUN_START(_text_runstart),SIZE(_text_size)
}
DSP2833x_Headers_nonBIOS.cmd
MEMORY
{PAGE 0: /* Program Memory */PAGE 1: /* Data Memory */DEV_EMU : origin = 0x000880, length = 0x000180 /* device emulation registers */FLASH_REGS : origin = 0x000A80, length = 0x000060 /* FLASH registers */CSM : origin = 0x000AE0, length = 0x000010 /* code security module registers */ADC_MIRROR : origin = 0x000B00, length = 0x000010 /* ADC Results register mirror */XINTF : origin = 0x000B20, length = 0x000020 /* external interface registers */CPU_TIMER0 : origin = 0x000C00, length = 0x000008 /* CPU Timer0 registers */CPU_TIMER1 : origin = 0x000C08, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/CPU_TIMER2 : origin = 0x000C10, length = 0x000008 /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/PIE_CTRL : origin = 0x000CE0, length = 0x000020 /* PIE control registers */PIE_VECT : origin = 0x000D00, length = 0x000100 /* PIE Vector Table */DMA : origin = 0x001000, length = 0x000200 /* DMA Rev 0 registers */MCBSPA : origin = 0x005000, length = 0x000040 /* McBSP-A registers */MCBSPB : origin = 0x005040, length = 0x000040 /* McBSP-B registers */ECANA : origin = 0x006000, length = 0x000040 /* eCAN-A control and status registers */ ECANA_LAM : origin = 0x006040, length = 0x000040 /* eCAN-A local acceptance masks */ECANA_MOTS : origin = 0x006080, length = 0x000040 /* eCAN-A message object time stamps */ECANA_MOTO : origin = 0x0060C0, length = 0x000040 /* eCAN-A object time-out registers */ECANA_MBOX : origin = 0x006100, length = 0x000100 /* eCAN-A mailboxes */ECANB : origin = 0x006200, length = 0x000040 /* eCAN-B control and status registers */ ECANB_LAM : origin = 0x006240, length = 0x000040 /* eCAN-B local acceptance masks */ECANB_MOTS : origin = 0x006280, length = 0x000040 /* eCAN-B message object time stamps */ECANB_MOTO : origin = 0x0062C0, length = 0x000040 /* eCAN-B object time-out registers */ECANB_MBOX : origin = 0x006300, length = 0x000100 /* eCAN-B mailboxes */EPWM1 : origin = 0x006800, length = 0x000022 /* Enhanced PWM 1 registers */EPWM2 : origin = 0x006840, length = 0x000022 /* Enhanced PWM 2 registers */EPWM3 : origin = 0x006880, length = 0x000022 /* Enhanced PWM 3 registers */EPWM4 : origin = 0x0068C0, length = 0x000022 /* Enhanced PWM 4 registers */EPWM5 : origin = 0x006900, length = 0x000022 /* Enhanced PWM 5 registers */EPWM6 : origin = 0x006940, length = 0x000022 /* Enhanced PWM 6 registers */ECAP1 : origin = 0x006A00, length = 0x000020 /* Enhanced Capture 1 registers */ECAP2 : origin = 0x006A20, length = 0x000020 /* Enhanced Capture 2 registers */ECAP3 : origin = 0x006A40, length = 0x000020 /* Enhanced Capture 3 registers */ECAP4 : origin = 0x006A60, length = 0x000020 /* Enhanced Capture 4 registers */ ECAP5 : origin = 0x006A80, length = 0x000020 /* Enhanced Capture 5 registers */ ECAP6 : origin = 0x006AA0, length = 0x000020 /* Enhanced Capture 6 registers */ EQEP1 : origin = 0x006B00, length = 0x000040 /* Enhanced QEP 1 registers */EQEP2 : origin = 0x006B40, length = 0x000040 /* Enhanced QEP 2 registers */ GPIOCTRL : origin = 0x006F80, length = 0x000040 /* GPIO control registers */GPIODAT : origin = 0x006FC0, length = 0x000020 /* GPIO data registers */GPIOINT : origin = 0x006FE0, length = 0x000020 /* GPIO interrupt/LPM registers */SYSTEM : origin = 0x007010, length = 0x000020 /* System control registers */SPIA : origin = 0x007040, length = 0x000010 /* SPI-A registers */SCIA : origin = 0x007050, length = 0x000010 /* SCI-A registers */XINTRUPT : origin = 0x007070, length = 0x000010 /* external interrupt registers */ADC : origin = 0x007100, length = 0x000020 /* ADC registers */SCIB : origin = 0x007750, length = 0x000010 /* SCI-B registers */SCIC : origin = 0x007770, length = 0x000010 /* SCI-C registers */I2CA : origin = 0x007900, length = 0x000040 /* I2C-A registers */CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations. */PARTID : origin = 0x3D7E80, length = 0x000001
}SECTIONS
{PieVectTableFile : > PIE_VECT, PAGE = 1/*** Peripheral Frame 0 Register Structures ***/DevEmuRegsFile : > DEV_EMU, PAGE = 1FlashRegsFile : > FLASH_REGS, PAGE = 1CsmRegsFile : > CSM, PAGE = 1AdcMirrorFile : > ADC_MIRROR, PAGE = 1 XintfRegsFile : > XINTF, PAGE = 1CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1 PieCtrlRegsFile : > PIE_CTRL, PAGE = 1 DmaRegsFile : > DMA, PAGE = 1 /*** Peripheral Frame 3 Register Structures ***/McbspaRegsFile : > MCBSPA, PAGE = 1McbspbRegsFile : > MCBSPB, PAGE = 1/*** Peripheral Frame 1 Register Structures ***/ECanaRegsFile : > ECANA, PAGE = 1ECanaLAMRegsFile : > ECANA_LAM PAGE = 1 ECanaMboxesFile : > ECANA_MBOX PAGE = 1ECanaMOTSRegsFile : > ECANA_MOTS PAGE = 1ECanaMOTORegsFile : > ECANA_MOTO PAGE = 1ECanbRegsFile : > ECANB, PAGE = 1ECanbLAMRegsFile : > ECANB_LAM PAGE = 1 ECanbMboxesFile : > ECANB_MBOX PAGE = 1ECanbMOTSRegsFile : > ECANB_MOTS PAGE = 1ECanbMOTORegsFile : > ECANB_MOTO PAGE = 1EPwm1RegsFile : > EPWM1 PAGE = 1 EPwm2RegsFile : > EPWM2 PAGE = 1 EPwm3RegsFile : > EPWM3 PAGE = 1 EPwm4RegsFile : > EPWM4 PAGE = 1 EPwm5RegsFile : > EPWM5 PAGE = 1 EPwm6RegsFile : > EPWM6 PAGE = 1ECap1RegsFile : > ECAP1 PAGE = 1 ECap2RegsFile : > ECAP2 PAGE = 1 ECap3RegsFile : > ECAP3 PAGE = 1 ECap4RegsFile : > ECAP4 PAGE = 1ECap5RegsFile : > ECAP5 PAGE = 1 ECap6RegsFile : > ECAP6 PAGE = 1EQep1RegsFile : > EQEP1 PAGE = 1 EQep2RegsFile : > EQEP2 PAGE = 1 GpioCtrlRegsFile : > GPIOCTRL PAGE = 1GpioDataRegsFile : > GPIODAT PAGE = 1GpioIntRegsFile : > GPIOINT PAGE = 1/*** Peripheral Frame 2 Register Structures ***/SysCtrlRegsFile : > SYSTEM, PAGE = 1SpiaRegsFile : > SPIA, PAGE = 1SciaRegsFile : > SCIA, PAGE = 1XIntruptRegsFile : > XINTRUPT, PAGE = 1AdcRegsFile : > ADC, PAGE = 1ScibRegsFile : > SCIB, PAGE = 1ScicRegsFile : > SCIC, PAGE = 1I2caRegsFile : > I2CA, PAGE = 1/*** Code Security Module Register Structures ***/CsmPwlFile : > CSM_PWL, PAGE = 1PartIdRegsFile : > PARTID, PAGE = 1
}
Source目录下添加这个:
DSP28xxx_SectionCopy_nonBIOS.asm
.ref _c_int00.global copy_sections.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_loadstart, _switch_runstart, _switch_size.global _text_loadstart, _text_runstart, _text_size***********************************************************************
* Function: copy_sections
*
* Description: Copies initialized sections from flash to ram
***********************************************************************.sect "copysections"copy_sections:MOVL XAR5,#_const_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_const_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_const_runstart ; Store Run Address in XAR7LCR copy ; Branch to CopyMOVL XAR5,#_econst_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_econst_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_econst_runstart ; Store Run Address in XAR7LCR copy ; Branch to CopyMOVL XAR5,#_pinit_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_pinit_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_pinit_runstart ; Store Run Address in XAR7LCR copy ; Branch to Copy MOVL XAR5,#_switch_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_switch_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_switch_runstart ; Store Run Address in XAR7LCR copy ; Branch to CopyMOVL XAR5,#_text_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_text_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_text_runstart ; Store Run Address in XAR7LCR copy ; Branch to CopyMOVL XAR5,#_cinit_size ; Store Section Size in XAR5MOVL ACC,@XAR5 ; Move Section Size to ACCMOVL XAR6,#_cinit_loadstart ; Store Load Starting Address in XAR6MOVL XAR7,#_cinit_runstart ; Store Run Address in XAR7LCR copy ; Branch to Copy LB _c_int00 ; Branch to start of boot.asm in RTS librarycopy: B return,EQ ; Return if ACC is Zero (No section to copy)RPT AL ; Copy Section From Load Address to|| PWRITE *XAR7, *XAR6++ ; Run Addressreturn:LRETR ; Return.end
之后进行速度测试部分:
void beep()
{float a; //1float b=2.843;//2a=sin(b); //65a=b*3.14; //6a=b+3.25; //4a=b/0.98; //235b=a*b; //4GpioDataRegs.GPCSET.bit.GPIO64=1;//2GpioDataRegs.GPCCLEAR.bit.GPIO64=1;//1GpioDataRegs.GPCDAT.bit.GPIO64=1;//1GpioDataRegs.GPCTOGGLE.bit.GPIO64=1;//1
}
全程序在RAM中运行,仅仅使用了2.41us,三角函数的部分有较大的速度提升。
备注:
1、使用memory allocation查看内存分配情况,与CMD文件对应。
2、程序的运行时间,使用RUN---CLOCK----ENABLE开启查看
右下角即为运行到某点使用的时钟周期数,可以使用reset重新计时。
[第一讲]DSP28335将Flash中的代码拷贝到RAM中运行相关推荐
- 将flash中的代码复制到RAM中运行的方法
在MCU的使用过程中,偶尔会遇到将flash中的代码复制到RAM中运行的情况,下面就来说一下具体的方法,以28335的flash初始化为例: 1,编写函数,该函数处于flash中,就是我们即将要复制的 ...
- VS中的代码拷贝到word中时,中文注释会出现乱码的解决办法
如题: 先右击->选择"粘贴选项"为"只保留文本": 虽然,能解决乱码的问题,但代码的不同颜色显示会丢失.
- java 在一个类中定义类_Java 中程序代码必须在一个类中定义,类使用( )关键字来定义。_学小易找答案...
[填空题]每一个 else 子句都必须和它前面的一个距离它最近的 子句相对应. [单选题]有关类的说法,正确的是( ) [单选题]在JAVA中,无论测试条件是什么,下列( )循环体 将至少执行一次. ...
- 输入‘git push origin master‘不弹出账号密码输入框?(把本地Git中的代码push到Github中)
注意: Github从 2021 年 8 月 13 日开始,在 GitHub.com 上对 Git 操作进行身份验证时,将不再接受帐户密码,改用tokens验证. 点此查看官网公告 ...
- TMS28335下载到片内Flash中并全部搬运到RAM中进行运行
目录 前言 一.将部分函数搬运到RAM运行. 二.将所有函数全部搬运到RAM中运行. 1.从RAM调试模式到Flash模式 2.从Flash模式到RAM调试模式 总结 文件上传 前言 本人最近调试好代 ...
- 怎样保持sublime text3中的代码copy到CSDN中之后的漂亮的高亮
使用csdn的Markdown编辑器中的代码块 正常Ctrl+C,Ctrl+V粘贴代码 在代码块开头的三个单引号后面加上代码的语言类型,如python 然后效果如下: ## for python le ...
- 操作系统中的零拷贝与java中的使用
下面是在Linux操作系统中将磁盘中的数据传输到网络设备上的示例图. 在图中可以看到数据先从磁盘上读取到用户空间而后再从用户空间写入到网络设备中,写入和读取一共经历四次拷贝,和四次状态的切换(用户到内 ...
- js 中 java 代码_在js中嵌套java代码
jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...
- 怎么在html中加代码,如何在HTML中使用代码块
您可能希望在级联样式表( CSS)中执行此操作.使用您想要的外观创建一些CSS,标记为< code>的内容应该采取那种外观.例如: code { background-color: gra ...
最新文章
- iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据
- 不懂管理,你拿什么赢别人!商业奇才10句话,老板奉为管理圣经
- SSM(springMVC-spring-mybatis)环境搭建-01-建立Maven-web项目
- linux c 进程间通信
- Nginx配置实例-反向代理实现浏览器请求Nginx跳转到服务器某页面
- 移动社交如何玩?网易云信携手崽崽和Uki打造更多新场景!
- Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了
- linux -- 命令大全
- python 执行js_Python爬虫之记录一次下载验证码的尝试
- Java数据持久层框架 MyBatis之API学习五(Mapper XML 文件)
- php7.1 mysql_安装最新LAMP环境 (CentOS7+PHP7.1.5+Mysql5.7)
- 数据结构笔记(二十八)-- 图的广度优先遍历
- Pandas常用函数diff和shift函数学习使用
- 推荐15个在线多媒体(图片、音频、视频)编辑器,互联网营销
- 计算机无法启动怎么重装系统,韩博士教你如何为系统崩溃无法开机的电脑重装系统...
- 网站域名如何解析到阿里云和腾讯云服务器?
- 想知道你和她在网易云喜欢的音乐的重合率?
- 程序员裸辞三个月,终于拿到大厂offer!网友:不应该!
- java锁的种类以及辨析(一):自旋锁
- asp.net mvc 5 identity 2.0 注册时密码强度验证
热门文章
- Python pandas 实现无缝衔接Bokeh
- 解决windows版本python下没有tkinter库问题
- Windows下安装python2与python3以及分别对应的virtualenv
- 【Paypal】即时付款通知IPN
- 在docker中启动服务报错:New main PID 558 does not belong to service
- 解锁Android性能优化的五大误区!面试必问
- ei指什么_SCI、EI 、SSCI 、CSSCI这些到底是指什么?
- 《概率论与数理统计》-第二章 随机变量及其分布-第一节 离散型随机变量及其分布-笔记
- CVPR 2020 Anti-UAV Workshop征稿啦,“反无人机”挑战赛等你来战!
- lol服务器维护还在对局中,英雄联盟提示对局仍在进行中进不去游戏怎么办