STM32H7 + внешняя SDRAM - сбои memcpy с длиной 3 - границы слов, настройки кэша? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть проект, работающий на средневековой плате 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);
}

Это первый раз, когда я имел дело с кеширующим микро и внешним овером.

Это проблема с кешем, бараном или библиотекой? Как мне это исправить?

Примечание: мне все равно, что массивы неинициализированы. Я счастлив копировать мусор.

1 Ответ

0 голосов
/ 13 января 2019

Устройство, скорее всего, аварийно завершает работу, поскольку при чтении в инициализированную память могут не устанавливаться правильные биты ECC, а когда процессор обнаруживает это во время операции чтения, происходит сбой при ошибке двойного бита.

Сначала запишите в память, а затем прочитайте или настройте компоновщик обнулить инициализацию вашей области кучи ... это может потребовать ассемблерного кода для получения правильной последовательности, чтобы сначала включить оперативную память, иначе нулевая инициализация может завершиться неудачей

...