Hi there,
I got a problem with IDMA1 throughput, in my project critical section of code - transmitting of ping-pong buffers from L2 to L1. (C6678evm)
Code:
....
#define DOUBLE_BUFFER_L1_LEN 4096
.......
time[0]=CSL_tscRead();
RUR_IDMA1_memcpy((Uint8*)&buf_L1_A[0][0], (Uint8*)(buf_L2_B[0][0], DOUBLE_BUFFER_L1_LEN, coreID);
time[1]=CSL_tscRead();RUR_IDMA1_wait();
time[2]=CSL_tscRead();
time[2]-time[0] = 1230 cycles
time[1]-time[0] = ~100 cycles
so, average speed about 0.30 byte/sec, but it should be 4096/16 = 256 cycles + overheads = ~400 cycles
other definitions
#pragma DATA_ALIGN(buf_L1_A, 32);#pragma DATA_SECTION(buf_L1_A, "L1mem");unsigned char buf_L1_A[1][DOUBLE_BUFFER_L1_LEN*2];#pragma DATA_ALIGN(buf_L2_B, 32);#pragma DATA_SECTION(buf_L2_B, "L2mem");unsigned char buf_L2_B[2][DOUBLE_BUFFER_L1_LEN*2];
PS: data allingment does'nt influence on the result
#pragma CODE_SECTION(RUR_IDMA1_memcpy, "fast_code");void RUR_IDMA1_memcpy(Uint8 *dst, Uint8 *src, Uint16 len, Uint16 coreID){ CSL_IDMA_IDMA1CONFIG idmaChan1Config; idmaChan1Config.source = (Uint32*)src; idmaChan1Config.destn = (Uint32*)dst; idmaChan1Config.intEnable = 1; idmaChan1Config.priority = IDMA_PRI_0; idmaChan1Config.count = len; CSL_IDMA_chan1TransferData (&idmaChan1Config, 0);}#pragma CODE_SECTION(RUR_IDMA1_wait, "fast_code");void RUR_IDMA1_wait(void){ CSL_IDMA_chan1Wait();}
......
SYSBIOS cfg:
Program.sectMap["fast_code"] = "L2SRAM";
Program.sectMap["L1mem"] = new Program.SectionSpec();Program.sectMap["L1mem"].loadSegment = "L1DSRAM";Program.sectMap["L2mem"] = new Program.SectionSpec();Program.sectMap["L2mem"].loadSegment = "L2SRAM";Program.sectMap["L3mem"] = new Program.SectionSpec();Program.sectMap["L3mem"].loadSegment = "MSMCSRAM";
1. Does anybody know what the problem?
Ivan