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.
程序之前再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()函数
果然是这个问题。 换成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
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
你好!
我在一个程序中使用了多个中断服务函数,
__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,请问该如何操作?