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.

关于delay_us()函数复制到RAM的问题

程序之前再RAM中调试的,后来要搬到FLAHS中来。

使用了F28035_CLA_C.CMD,发现在InitAdc()函数总是的跳至ILLEGAL_ISR。

因为在InitAdc中使用了  DELAY_US(ADC_usDELAY);  

查资料说要从FLASH中拷贝到RAM中来才能运行。

于是做了以下修改。

首先在DSP2803x_Examples.h文件中开始部分加入以下一条语句

#pragma CODE_SECTION(DSP28x_usDelay, "ramfuncs");

然后再main里面再加以下语句

memcpy((uint16_t *)&RamfuncsLoadStart,(uint16_t *)&RamfuncsRunStart, (unsigned long)&RamfuncsLoadSize);

InitFlash();

可是还是不行。不知道是哪里错了。

烦请帮忙解决一下。最好就是一条语句一条语句加在什么地方教一下。

因为是第一次使用这个芯片。

  • 您好!

    请参考ADC相关的例程。ADC_SOC等等的。

    搬迁是没有问题的,但是在这些例程中并没有搬迁的操作。。是在函数中声明了这个DSP28x_usDelay()函数

  • he code,

    memcpy 函数有问题,修改成下面语句

    memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);

    Eric

  • 果然是这个问题。 换成memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize); 看来这个是V126 flash实验的BUG。 另外V126还有一个BUG,就是在文件里面没有MemCopy这个文件。 还是说不需要这个文件也能运行啊?。 因为在做FLASH实验的时候没有将MEMCOPY关联进来,程序好像依然能正常运行。

  • memcpy(&Cla1funcsRunStart, &Cla1funcsLoadStart, (Uint32)&Cla1funcsLoadSize);
    memcpy(&Cla1mathTablesRunStart, &Cla1mathTablesLoadStart, (Uint32)&Cla1mathTablesLoadSize);

    那其他例程中,这两句会不会也有问题啊?麻烦核对一下。

    不过好像CLA调试下来好像没出意外。

  • he code,

    这的确实例程的一个bug,v127会修复这个问题。

    其实memcpy和memcopy是两个不同的函数。memcpy是编译器内嵌函数,编译器自动会编译这个函数,不需要这个源代码。

    而memcopy函数是ti自己写的,可以在最开始的版本的common文件夹找到这个源文件,后来新的版本就替换掉了,直接用内嵌函数memcpy。

    #include "DSP2803x_Device.h"

    void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)

     {    

    while(SourceAddr < SourceEndAddr)    

     {        *DestAddr++ = *SourceAddr++;     }    

                return;

    }

    Eric

  • 请问新版本使用MemCopy函数时需要包含哪个文件?

  • 新版本的是memcpy,不用包含什么文件,这是编译器内嵌函数。

    Eric

  • Eric 您好:

    1.

    我用memcpy函数时,若用下列语句声明:

    extern Uint16 RamfuncsLoadStart;
    extern Uint16 RamfuncsRunStart;
    extern Uint16 RamfuncsLoadSize;

    则会编译出错,

    若改为

    extern Uint16 RamfuncsLoadStart;
    extern Uint16 RamfuncsRunStart;
    Uint16 RamfuncsLoadSize;

    则可成功编译,请问原因是什么?RamfuncsLoadSize最初是在哪个文件中定义的?它的值是由什么决定的?

    2.

    请问程序在Flash中运行时,哪些函数必须要搬到RAM中?

    我知道的包括InitFlash(),dealy_us()和工程中用到的中断服务函数。

    一份参考资料中说“对于对时间要求严格的过程,需要拷贝到RAM 中运行,以达到最高速度”,是不是可以理解为除了InitFlash(),dealy_us()和中断服务函数,其他都可以在Flash中运行?

    谢谢!

  • Yi Tian,

    1, 我认为你的CMD文件中没有出现 RamfuncsLoadSize; ,因为这个变量的定义是在CMD文件中ramfunc中定义的,类似下面的语句。你在main中这么设置,只不过在main中定义了这个变量,但是没有跟cmd文件映射起来。

    LOAD_SIZE(_RamfuncsLoadSize),

    2,任何函数都可以复制到RAM中运行,像iniflash是必须得复制,因为任何对flash操作的代码只能在RAM中运行。delayUs是跑在RAM是因为RAM的运行时固定的150M,定时比较准,而如果放在Flash的话,不同的Flash配置代码运行的速度是不一样的,导致定时不准。其实中断服务函数也没有说必须得复制到RAM中,如果是无关紧要的,跑在RAM也没关系的,那就在Flash上跑也一样。所以只有对时间要求比较苛刻的代码才需要跑在RAM中,比如像数字电源,控制环路一般都是跑到60K,甚至100k, 这个时候就要求把控制环路的代码复制到RAM中运行,否则有可能跑不过来,如果代码比较长的话。而控制环路的代码一般是放在中断服务函数中的,所以就是复制中断服务函数。

    希望有帮助到你的理解。

    Eric

  • Eric,

    您讲的很详细,谢谢!

  • 你好!

           我在一个程序中使用了多个中断服务函数,

    __interrupt void epwm1_timer_isr(void);
    __interrupt void epwm2_timer_isr(void);
    __interrupt void epwm3_timer_isr(void);

         也使用了

       memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart, (unsigned long)&RamfuncsLoadSize);

       但是发现

    #pragma CODE_SECTION(epwm1_timer_isr, "ramfuncs");
    #pragma CODE_SECTION(epwm2_timer_isr, "ramfuncs");

     同时存在的时候,中断服务函数就不响应了,在函数中打断点,发现就执行不到哪里,不知道为什么。如果只把一个函数复制进入RAM就可以正常运行,但是我想把两个函数都复制进RAM,请问该如何操作?

  • 你好,请问你把#pragma CODE_SECTION(DSP28x_usDelay, "ramfuncs");这句话放在什么位置的,可以具体点吗?我这个程序一运行到DELAY_US这个函数时就跑飞了,试了很久都有问题,希望得到指导