F28027在FLASH中烧写程序的问题咨询

2019-03-24 09:16发布

请教各位:问题一:程序烧写到FLASH中,无在RAM中运行的程序1、 烧写CMD采用F28027.CMD2、 主程序中,在初始化系统后加入InitFlash()函数 InitFlash();//这个是初始化FLASH问题就是是不是只需这12步即可?问题二:程序烧写到FLASH中,有在RAM中运行的程序1烧写CMD采用F28027.CMD2MemCopy()1)这个在F28027.CMD自带(请看理解对不对)ramfuncs关键字的定义,在“F28027.CMD”文件中  ramfuncs            : LOAD = FLASHA,                         RUN = PRAML0,                         LOAD_START(_RamfuncsLoadStart),                         LOAD_END(_RamfuncsLoadEnd),/*                        LOAD_SIZE(_RamfuncsLoadSize),*/                         RUN_START(_RamfuncsRunStart),                         PAGE = 0这个的意思是定义一个叫“ramfuncs”的段,这个段从FLASHA中装载,在PRAML0运行。以及装载的地址,运行地址等。2)主文件或头文件声明extern voidMemCopy(Uint16*SourceAddr, Uint16*SourceEndAddr, Uint16*DestAddr);extern Uint16RamfuncsLoadStart;extern Uint16RamfuncsLoadEnd;externUint16RamfuncsRunStart;(3)主程序调用MemCopy()InitFlash()函数    MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);    InitFlash();4)定义需要在ram中运行的函数#pragma CODE_SECTION(EPwm2_timer_isr, "ramfuncs");//EPwm2_timer_isr放在ram中运行 问题如下:main()函数中,采用F28027.CMD#pragmaCODE_SECTION(EPwm1_timer_isr, "ramfuncs");#pragmaCODE_SECTION(EPwm2_timer_isr, "ramfuncs"); externvoid MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);externUint16 RamfuncsLoadStart;externUint16 RamfuncsLoadEnd;externUint16 RamfuncsRunStart; void main(void){         InitSysCtrl();         InitGpio();         InitSciaGpio();         InitCpuTimers();         DINT;         InitPieCtrl();         IER= 0x0000;         IFR= 0x0000;         InitPieVectTable();         MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);         InitFlash();}这样是不是就是将EPwm1_timer1/2放在ram中运行了?如果再增加一条#pragmaCODE_SECTION(xxxx,”ramfuncs”)预定义,是不是就是将xxx也放在ram中执行? 问题三:/*main.c*/#include "DSP28x_Project.h"//#pragma CODE_SECTION(EPwm1_timer_isr,"ramfuncs");//#pragma CODE_SECTION(EPwm2_timer_isr,"ramfuncs"); #ifdefTOFLASH  //是预编译,有TOFLASH定义就执行中间这个一段程序extern void MemCopy(Uint16 *SourceAddr, Uint16*SourceEndAddr, Uint16* DestAddr);extern Uint16 RamfuncsLoadStart;extern Uint16 RamfuncsLoadEnd;extern Uint16 RamfuncsRunStart;#endifvoid main(void){         InitSysCtrl();         InitGpio();         InitSciaGpio();         InitCpuTimers();         DINT;         InitPieCtrl();         IER =0x0000;         IFR =0x0000;         InitPieVectTable(); #ifdefTOFLASH  //是预编译,有TOFLASH定义就执行中间这个一段程序         MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd, &RamfuncsRunStart);         InitFlash();#endif         for (;;)         {                   GpioDataRegs.GPATOGGLE.bit.GPIO0= 1;                   GpioDataRegs.GPATOGGLE.bit.GPIO1= 1;                   DELAY_US(1000000L);         }} 问题点:这个TOFLASH在哪里定义,是不是就是指//#pragma CODE_SECTION(Epwm1_timer_isr, "ramfuncs");//#pragma CODE_SECTION(EPwm2_timer_isr, "ramfuncs");这个语句;如果没有注释掉就执行,如果注释掉就不执行?
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
PCBBOY1991
1楼-- · 2019-03-25 11:16


请问版主先生,#pragma这个定义是什么含义呢?难道没有这个定义把需要在RAM运行的程序和指定RAM空间联系起来,调用Memcopy就无法复制到RAM里边以及运行么?
dontium
2楼-- · 2019-03-25 14:09
本帖最后由 dontium 于 2016-2-18 11:04 编辑
PCBBOY1991 发表于 2016-2-18 10:00
请问版主先生,#pragma这个定义是什么含义呢?难道没有这个定义把需要在RAM运行的程序和指定RAM空间联系 ...

Pragma是指定位置用的,它与拷贝不拷贝不是一个问题。
Pragma directives tell the compiler how to treat a certain function, object, or section of code.

使用SECTION可以:

The CODE_SECTION pragma allocates space for the symbol in C, or the next symbol declared in C++, in
a section named section name.
The syntax of the pragma in C is:
#pragma CODE_SECTION (symbol , "section name ")
PCBBOY1991
3楼-- · 2019-03-25 16:26
 精彩回答 2  元偷偷看……
dontium
4楼-- · 2019-03-25 20:12
PCBBOY1991 发表于 2016-2-18 11:53
可能还是由于我对DSP的工作流程不太了解导致了很多的疑问产生。
#pragma是不是告诉编译器编译器的时候要 ...

你还是没有理解Pragma,它是编译控制的,和所跟的指令一起起作用。
象#pragma CODE_SECTION(),它指定存储位置,将代码放在所指定的地方,至于是否在RAM里运行,那是另一回事。
PCBBOY1991
5楼-- · 2019-03-25 23:24
dontium 发表于 2015-5-30 12:24
是在编译器的设置里定义的

版主,如果多个函数都需要在RAM中运行,#pragma肯定肯定也要有对应的语句吧?
但是Memcopy只有一个就可以了还是要一个函数对应一个Memcopy函数?

dontium
6楼-- · 2019-03-26 00:42
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章