我最近在用TMS320F28335做一个实验,由于代码量较大,片上的34kSRAM显得过小,我的开发板上有一个外扩SRAM,大小为256k,可是我通过#pragma CODE_SECTION(func,"section name")函数把一个DMA中断函数复制到外扩的SRAM时,程序总是进入ILLEGAL_ISR中。
DMA中断函数中有FFT运算,在单步调试时发现是程序运行到math.h中的log()函数时就进入ILLEGAL_ISR中,而把这些函数放在片内运行时就不会进入ILLEGAL_ISR,网上关于CODE_SECTION的资料少之又少,大部分都是关于DATA_SECTION的,所以希望你们能给我提供一些帮助,谢谢!
1.主函数文件中的一些代码:
#pragma DATA_SECTION(ChannelsData,"DMARAML4");
#pragma DATA_SECTION(XW,"DMARAML5");
#pragma CODE_SECTION(dma_isr,"ZONE7A");
interrupt void dma_isr()
{
PieCtrlRegs.PIEACK.bit.ACK7=1;
int i=0;
for(i=0;i<ChannelSize;i++)
{
XW[i].real=((float)ChannelsData[0][i]-2300)/30;
XW[i].imag=0;
}
//
mcmpfft(XW, ChannelSize,-1);//程序运行到此行后,进入ILLEGAL_ISR
for(i=0;i<ChannelSize;i++)
{
y[i]=mabs(XW[i]);
//y[i]=sqrt((double)10.23);
}
asm(" ESTOP0");
}
2.cmd文件中的相关代码:
MEMORY
{
PAGE 0 :
。。。
ZONE7A : origin = 0x200000, length = 0x30000 /* XINTF zone 7 – program space */
。。。
}
Seven Han:
资料的话您可以看SPRA958文档有,相关的详细介绍把一些函数和常量搬到RAM中,这里可以下载http://www.ti.com/lit/an/spra958l/spra958l.pdf
另外controlsuite中flash_f28335例程也可参考。
我最近在用TMS320F28335做一个实验,由于代码量较大,片上的34kSRAM显得过小,我的开发板上有一个外扩SRAM,大小为256k,可是我通过#pragma CODE_SECTION(func,"section name")函数把一个DMA中断函数复制到外扩的SRAM时,程序总是进入ILLEGAL_ISR中。
DMA中断函数中有FFT运算,在单步调试时发现是程序运行到math.h中的log()函数时就进入ILLEGAL_ISR中,而把这些函数放在片内运行时就不会进入ILLEGAL_ISR,网上关于CODE_SECTION的资料少之又少,大部分都是关于DATA_SECTION的,所以希望你们能给我提供一些帮助,谢谢!
1.主函数文件中的一些代码:
#pragma DATA_SECTION(ChannelsData,"DMARAML4");
#pragma DATA_SECTION(XW,"DMARAML5");
#pragma CODE_SECTION(dma_isr,"ZONE7A");
interrupt void dma_isr()
{
PieCtrlRegs.PIEACK.bit.ACK7=1;
int i=0;
for(i=0;i<ChannelSize;i++)
{
XW[i].real=((float)ChannelsData[0][i]-2300)/30;
XW[i].imag=0;
}
//
mcmpfft(XW, ChannelSize,-1);//程序运行到此行后,进入ILLEGAL_ISR
for(i=0;i<ChannelSize;i++)
{
y[i]=mabs(XW[i]);
//y[i]=sqrt((double)10.23);
}
asm(" ESTOP0");
}
2.cmd文件中的相关代码:
MEMORY
{
PAGE 0 :
。。。
ZONE7A : origin = 0x200000, length = 0x30000 /* XINTF zone 7 – program space */
。。。
}
Chunxu Ye:
回复 Seven Han:
能帮我分析一下我的程序为什么会进入ILLEGAL_ISR()吗进入ILLEGAL_ISR()程序自动暂停后,我通过CCS可以看到dma_isr已经被复制到了外扩SRAM中,但是无法在SRAM中设置断点,程序运行之后会直接进入ILLEGAL_ISR();