Part Number: TDA4VMXEVM
Tool/software: TI C/C++ Compiler
Hi~
Recently we found that func memcpy in C7x did not work properly,especially at the moment that C7x was receving IPC messages in a high frequency.
we produced a memcpy_test like this:
void memcoy_test()
{
int size, offset1, offset2;
int data1[DATA_LEN_TEST*2];
int data2[DATA_LEN_TEST*2];
for ( size = 1; size < DATA_LEN_TEST; size++) {
for ( offset1= 1; offset1< DATA_LEN_TEST; offset1++) {
for ( offset2= 1; offset2< DATA_LEN_TEST; offset2++) {
memset(data1, 0, sizeof(data1));
memset(data2, 0xa3, sizeof(data2));
// Hwi_disable()
memcpy(&data1[offset1], &data2[offset2], size);
// mymemcpy(&data1[offset1], &data2[offset2], size);
//Hwi_enable();
checkout(data1, data2, size, offset1, offset2);
}
}
}
}
especially at the moment that C7x was receving IPC messages in a high frequency, we sometimes got results likes this:.
data1 =>> | 0 0 0 0 0 ...0 | 0xa3 0xa3 0xa3 (copy from data2, length = size)... | 0xa3 0xa3(overflow, which was wrong)....| 0 0 0 0 .... |
data2 =>> | 0xa3 0xa3 0xa3 .......................................................................................................................................................................|
If we did Hwi_disable/Hwi_enable, func memcpy could work well, result:
data1 =>> | 0 0 0 0 0 ...0 | 0xa3 0xa3 0xa3 (copy from data2, length = size)... | 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 .... |
data2 =>> | 0xa3 0xa3 0xa3 .......................................................................................................................................................................|
Or, we used func mymemcpy, also work well.
int mymemcpy(void* dst, void* src, int size)
{
char *p, *q;
int k = 0;
p = (char*)dst;
q = (char*)src;
for (k=0; k<size; k++) {
p[k] = q[k];
}
return size;
}
So, wo doubted that memcpy do not work properly, while it enter/exit a Interrupt context..
We need promptly support to solve this problem, please reply as soon as possible.