TI中文支持网
TI专业的中文技术问题搜集分享网站

关于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();

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

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

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

Young Hu:

您好!

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

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

程序之前再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();

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

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

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

he code:

回复 Eric Ma:

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

程序之前再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();

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

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

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

he code:

回复 Eric Ma:

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

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

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

程序之前再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();

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

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

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

Eric Ma:

回复 he code:

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

程序之前再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();

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

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

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

Yi Tian1:

回复 Eric Ma:

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

程序之前再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();

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

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

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

Eric Ma:

回复 Yi Tian1:

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

Eric

程序之前再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();

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

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

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

Yi Tian1:

回复 Eric Ma:

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中运行?

谢谢!

程序之前再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();

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

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

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

Yi Tian1:

回复 Eric Ma:

Eric,

您讲的很详细,谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 关于delay_us()函数复制到RAM的问题
分享到: 更多 (0)