У меня есть проект, работающий на средневековой плате STM32H753 с кучей во внешней памяти, с freeRTOS, смоделированным на демонстрациях куба STM32.
В данный момент MPU и кеш не включены. (насколько я могу судить, их функции закомментированы)
это работает в функции main (), где a и b находятся во внутренней памяти.
int* aptr;
int* bptr;
int main()
{
// MPU_Config();
// CPU_CACHE_Enable();
int a[100]; int b[100];
memcpy(a, b, 3);
aptr = a;
bptr = b;
...
однако, когда поток freeRTOS создает переменные в куче, memcpy не работает с некоторыми значениями длины.
static void mymemcpy(char* dst, char* src, int len)
{
for (int i = 0; i < len; i++)
{
dst[i] = src[i];
}
}
void StartThread(void* arg)
{
int a[100]; int b[100];
for (int i = 0; i < 10; i++)
{
memcpy(aptr, bptr, i); //works, using same mem as main
}
for (int i = 0; i < 10; i++)
{
mymemcpy(a, b, i); //works, using external ram mem, but with mymemcpy
}
memcpy(a, b, 4); //works, seems not a overrun issue
for (int i = 0; i < 10; i++)
{
memcpy(a, b, i); //jumps to random memory when i == 3, probably an undefined handler
}
while(1);
}
Это первый раз, когда я имел дело с кеширующим микро и внешним овером.
Это проблема с кешем, бараном или библиотекой? Как мне это исправить?
Примечание: мне все равно, что массивы неинициализированы. Я счастлив копировать мусор.