我使用的是zlg提供的EasyARM2200开发板,我在测试Uart0相关程序(DebugInExram,RelOutChip)的时候,发现如果用UART0_SendNByte() 函数发送大量数据的时候,当发送几十个数据之后就会出现Data Abort的错误,如果数量很少(就几十个)的话,就不会出现问题。 后来把mem_b.scf中的IRAM 0x40000000改为IRAM +0,也就是紧接着ROM_EXEC的后面的话,这个问题就不存在了.
请问这是什么原因,如何解决呢?
void test() { uint8 t[200]; int i; for(i=0;i<200;i++) t='U';
UART0_SendNByte(t,200);//就会出现Data Abort的错误
}
uint8 UART0_SendNByte(uint8 *p, uint32 n) { uint8 err;
OSSemPend(UART0_SendSem, 0, &err); if(n > (QueueSize((void *)UART0_SendBuf)-QueueNData((void *)UART0_SendBuf))) { OSSemPost(UART0_SendSem); return FALSE; } while(n-- > 0) { QueueWrite((void *)UART0_SendBuf, *p); p++; } UART0_SendTriger();
OSSemPost(UART0_SendSem); return TRUE;
}
ROM_LOAD 0x80000000 { ROM_EXEC 0x80000000 { Startup.o (vectors, +First) * (+RO) }
IRAM 0x40000000 //修改为IRAM +0 { Startup.o (MyStacks) }
STACKS_BOTTOM +0 UNINIT { Startup.o (StackBottom) }
STACKS 0x40004000 UNINIT { Startup.o (Stacks) }
ERAM 0x80040000 { * (+RW,+ZI) }
HEAP +0 UNINIT { Startup.o (Heap) }
HEAP_BOTTOM 0x80080000 UNINIT { Startup.o (HeapTop) }
}
|