This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

编译警告问题



在编译的时候出现如下警告:creating output section "ramfuncs" without a SECTIONS specification,经查找发现“ramfuncs”段在“DSP281x_SysCtrl.c”中定义(#pragma CODE_SECTION(InitFlash, "ramfuncs")),CMD文件中没有给它分配空间。

我想问一下这个ramfuncs段是干什么用的,它映射的地址是多少?

非常感谢!

  • ranfuncs段主要放一些需要在RAM中执行的代码,如Flash的初始化化InitFlash等,这部分代码load在Flash中,但上电后需要将Flash中的代码考到RAM中,然后执行。因此需要定义RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart、RamfuncsLoadSize,具体的映射地址根据CMD文件中定义,可以参考TI的例程进行理解。

  • zijian,

    像Initflash这个函数是对Flash模块进行初始化,规定是不允许在Flash运行这个函数的,所以这个函数要运行时,必须先复制到RAM中。所以才会给出这个的ramfunc的概念,就是就是一些代码,烧写在flash中,但是运行前需要复制到RAM中,再调用这个函数。包括有些代码你需要执行速度快一点(Flash上代码执行速度比RAM慢多了),都可以用这中方法。

    所以具体用法是在CMD文件用这样的语法定义:

    ramfuncs            : LOAD = FLASHD,                         

                               RUN = RAML0,                         

                                LOAD_START(_RamfuncsLoadStart),                         

                                 LOAD_END(_RamfuncsLoadEnd),                         

                                RUN_START(_RamfuncsRunStart),                         

                                PAGE = 0

    这个语法的意思是,这个段中的代码是先加载到FlashD扇区的,但是运行时确实自动在RAML0中去找它的地址。也自动第一了这几个变量RamfuncsLoadStart等。

    所以你那些需要放在这个段的函数,就需要在那个函数之前加上这句话:

    (#pragma CODE_SECTION(函数名字, "ramfuncs"));

    函数定义……

    然后在main主函数中,系统初始化之后,要调用memcpy函数,把这个段中的代码复制到RAM中。然后之后你调用这个函数时,它就能够在RAM中执行了。

    附录 一下CMD的例子。

    Eric