Jump to content

    
Realking

STM32H7, SDRAM и кэш

Recommended Posts

Есть плата с STM32h743 и SDRAM IS42S83200J.

Если я включаю MPU с разрешением кэша:

    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER4;
    MPU_InitStruct.BaseAddress = 0xC0000000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
    MPU_InitStruct.SubRegionDisable = 0;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    HAL_MPU_ConfigRegion(&MPU_InitStruct);

складывается ощущение, что перестает работать refresh (при тестировании памяти - ошибка данных)

С отключенным кэшированием все гуд, но тогда вылетает unaligned fault.

Всю башку сломал, не пойму в чем проблема.

Может у кого была такая проблема, или кто подскажет в каком направлении двигаться.

Заранее, спасибо.

Share this post


Link to post
Share on other sites
20 hours ago, Realking said:

складывается ощущение, что перестает работать refresh (при тестировании памяти - ошибка данных)

 

__Мои__ предположения:

 

1) Нет контакта со стробом чтения или других контактов (проверить качество контактов MPU, DRAM и на предмет К.З.)

2) Неисправная память или не подходит по времянкам

 

Quote

Есть плата с STM32h743 и SDRAM IS42S83200J.

 

3) Ошибка в соединении DRAM и MPU.  Плата своя или фирменная?

 

 

20 hours ago, Realking said:

С отключенным кэшированием все гуд, но тогда вылетает unaligned fault.

 

4) Что-то не так с выравниванием данных в программе (short д.б. выравнены на 2 байта, long - на 4, long long - на 8).

 

Без текста программы тестилки - гадание на кофейной гуще.

Edited by __inline__

Share this post


Link to post
Share on other sites
59 минут назад, __inline__ сказал:

4) Что-то не так с выравниванием данных в программе (short д.б. выравнены на 2 байта, long - на 4, long long - на 8).

И какой именно компилятор использует для работы с обычными переменными short и long на Cortex-M инструкции, требующие выравнивания - можете назвать о каком именно компиляторе речь?

"Обычные переменные" - это значит не требующие например эксклюзивного доступа.

Share this post


Link to post
Share on other sites
12 minutes ago, jcxz said:

И какой именно компилятор использует для работы с обычными переменными short и long на Cortex-M инструкции, требующие выравнивания - можете назвать о каком именно компиляторе речь?

"Обычные переменные" - это значит не требующие например эксклюзивного доступа.

 

Компилятор здесь не причём.  Я говорил о случае, когда идёт  чтение short по адресу не кратному 2 или long по адресу не кратному 4.

 Хотя бы вот такой пример:

 

short a=*(short*)(0xC0000001);
int b=*(int*)(0xC0000007);

   

Надеюсь, не надо пояснять, к чему приведут такие обращения к памяти? :clapping:

Мы не знаем как автор топика обращается к данным, а это значит, что имею право предположить что выше :biggrin:

 

Quote

MPU_InitStruct.BaseAddress = 0xC0000000;

 

Edited by __inline__

Share this post


Link to post
Share on other sites
16 минут назад, __inline__ сказал:

Компилятор здесь не причём.  Я говорил о случае, когда идёт  чтение short по адресу не кратному 2 или long по адресу не кратному 4.

Причём, потому что unaligned fault могут вызывать только определённые инструкции Cortex-M3/4/7. И (насколько мне известно) обычно компиляторы не используют такие инструкции для доступа к обычным переменным short/int/long.

Цитата

 Хотя бы вот такой пример:


short a=*(short*)(0xC0000001);
int b=*(int*)(0xC0000007);

Надеюсь, не надо пояснять, к чему приведут такие обращения к памяти? :clapping:

К чему? Просветите. :umnik2:

 

PS: Конечно для Cortex-M можно преднамеренно включить обязательный выровненный доступ ко всем переменным (соответствующим битом в регистрах конфигурации ядра). Но думаю здесь не тот случай. :unknw:

Share this post


Link to post
Share on other sites
12 minutes ago, __inline__ said:

Надеюсь, не надо пояснять, к чему приведут такие обращения к памяти?

Начиная с Cortex-M3, это всё успешно будет считано с памяти. Чуть медленне, чем выровненные, но считано)

Cortex-M0 всегда вывилится в HardFault.

Share this post


Link to post
Share on other sites
22 hours ago, jcxz said:

К чему? Просветите.

 

У меня на BlackFin и STM32 были исключения из-за невыровненной памяти.  А вот в C6745 просто читался мусор, пока не заиспольовал _mem(), _mem8().  Тоесть компилятор почему-то подставляет инструкции, не учитывающие доступ по невыровненным адресам.

 

Пользуясь случаем, глянул в сорцы эмуля СЕГи, который когда-то адаптировал под C6745 и увидел, что использование инструкций через интринсики, дало увеличение производительности чуть-ли не в 2 раза в рендерере эмулятора: вместо 4-х побайтовых  обращений используется - ОДНА инструкция с невыровненным доступом, что очень сильно увеличивает скорость:

 

#define ALIGN_LONG 0 /* !!! unaligned word */

#if ALIGN_LONG

/* Or change the names if you depend on these from elsewhere.. */
#undef WRITE_LONG

static __inline__ void WRITE_LONG(void *address, uint32 data)
{
            *((uint8 *)address++) = data;
            *((uint8 *)address++) = data>> 8;
            *((uint8 *)address++) = data>>16;
            *((uint8 *)address  ) = data>>24;
            return;
}

#endif

#if ALIGN_LONG

/* Draw a single 8-pixel column */
#define DRAW_COLUMN(ATTR, LINE) \
    atex = atex_table[(ATTR >> 13) & 7]; \
    src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \
    WRITE_LONG(dst++, *src++ | atex); \
    WRITE_LONG(dst++, *src++ | atex); \
    ATTR >>= 16;  \
    atex = atex_table[(ATTR >> 13)/* & 7*/]; \
    src = (uint32 *)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \
    WRITE_LONG(dst++, *src++ | atex); \
    WRITE_LONG(dst++, *src++ | atex); \

#else

#define DRAW_COLUMN(ATTR, LINE) \
    atex = atex_table[(ATTR >> 13) & 7]; \
    src = (uint32*)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \
    _mem4(dst++) = (_mem4(src++) | atex); \
    _mem4(dst++) = (_mem4(src++) | atex); \
    ATTR >>= 16; \
    atex = atex_table[(ATTR >> 13) & 7]; \
    src = (uint32*)&bg_pattern_cache[(ATTR & 0x1FFF) << 6 | (LINE)]; \
    _mem4(dst++) = (_mem4(src++) | atex); \
    _mem4(dst++) = (_mem4(src++) | atex); \

#endif

#if ALIGN_LONG

/* Draw a single 16-pixel column */
#define DRAW_COLUMN_IM2(ATTR, LINE) \
    atex = atex_table[(ATTR >> 13) & 7]; \
    offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \
    if(ATTR & 0x1000) offs ^= 0x40; \
    src = (uint32 *)&bg_pattern_cache[offs]; \
    WRITE_LONG(dst++, *src++ | atex); \
    WRITE_LONG(dst++, *src++ | atex); \
    ATTR >>= 16; \
    atex = atex_table[(ATTR >> 13)/* & 7*/]; \
    offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \
    if(ATTR & 0x1000) offs ^= 0x40; \
    src = (uint32 *)&bg_pattern_cache[offs]; \
    WRITE_LONG(dst++, *src++ | atex); \
    WRITE_LONG(dst++, *src++ | atex); \

#else

#define DRAW_COLUMN_IM2(ATTR, LINE) \
    atex = atex_table[(ATTR >> 13) & 7]; \
    offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \
    if(ATTR & 0x1000) offs ^= 0x40; \
    src = (uint32*)&bg_pattern_cache[offs]; \
    _mem4(dst++) = (_mem4(src++) | atex); \
    _mem4(dst++) = (_mem4(src++) | atex); \
    ATTR >>= 16; \
    atex = atex_table[(ATTR >> 13) & 7]; \
    offs = (ATTR & 0x03FF) << 7 | (ATTR & 0x1800) << 6 | (LINE); \
    if(ATTR & 0x1000) offs ^= 0x40; \
    src = (uint32*)&bg_pattern_cache[offs]; \
    _mem4(dst++) = (_mem4(src++) | atex); \
    _mem4(dst++) = (_mem4(src++) | atex); \

#endif

 

Если же выравнивание никак не учитывать (не применять _mem*() или не делать побайтовое чтение)  , то эмулятор просто повисает и вылетает в data misaligned Exception :)

 

 

22 hours ago, haker_fox said:

Начиная с Cortex-M3, это всё успешно будет считано с памяти. Чуть медленне, чем выровненные, но считано)

Cortex-M0 всегда вывилится в HardFault.

 

Класс! :good3: Вполне исчерпывающий ответ!

Edited by __inline__

Share this post


Link to post
Share on other sites
1 час назад, __inline__ сказал:

У меня на BlackFin и STM32 были исключения из-за невыровненной памяти.  А вот в C6745 просто читался мусор, пока не заиспольовал _mem(), _mem8().  Тоесть компилятор почему-то подставляет инструкции, не учитывающие доступ по невыровненным адресам.

Вопрос был про Cortex-M7. Какое отношение BalckFin, C6745 и какие-то СЕГИ имеют к Cortex-M7???  :unknw:

STM32 - это семейство микроконтроллеров, включающее в себя разные ядра, в том числе и не Cortex-M3/4/7. На каком именно ядре у вас были "исключения из-за невыровненной памяти"? и на какой инструкции?

Пожалуйста - приведите конкретный пример.

Share this post


Link to post
Share on other sites
36 minutes ago, jcxz said:

Вопрос был про Cortex-M7

 

Ага, по вашему STM32H743 это не Cortex-M7 ? :biggrin::lol2:  Тут вы и попались! :laugh3:

 

36 minutes ago, jcxz said:

Пожалуйста - приведите конкретный пример.

 

Не хочу... :tease:

Share this post


Link to post
Share on other sites
3 minutes ago, __inline__ said:

Тут вы и попались!

Простите, что вмешиваюсь в ваш диалог, но вы не дочитали до конца, там было

41 minutes ago, jcxz said:

Вопрос был про Cortex-M7. Какое отношение BalckFin, C6745 и какие-то СЕГИ имеют к Cortex-M7???

Какое отношение Blackfin, C6745 имеют к CM7?

Share this post


Link to post
Share on other sites
15 минут назад, __inline__ сказал:

Ага, по вашему STM32H743 это не Cortex-M7 ? :biggrin::lol2:  Тут вы и попались! :laugh3:

И? В чём "попался"? :wacko2:

Вы правильно прочитали мой пост? Поняли прочитанное?

 

Цитата

Не хочу... :tease:

Так значит всё это был пустой трёп?

Такой же как и трёп и наезды на "неработающий" аллокатор который типа "гумно"? Которые в результате оказались результатом багов в вашем собственном быдлокоде.

Или другие подобные же вопли про "г*вно" и "отстой". Которые очень часто звучат в ваших темах...

 

PS: У меня в последнее время большие сомнения в вашей адекватности.....  :unknw:

Share this post


Link to post
Share on other sites

Память нормально протестировалась

 

    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.Number = MPU_REGION_NUMBER0;
    MPU_InitStruct.BaseAddress = SDRAM_ADDR;
    MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;
    MPU_InitStruct.SubRegionDisable = 1;
    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
    HAL_MPU_ConfigRegion(&MPU_InitStruct);

 

поставил MPU_InitStruct.SubRegionDisable = 1;

вместо нуля

но unaligned fault так и не пропал...

пример в иснструкции где short ычитывается с невыравненного адреса (например 0xC0001203).

Но не понятно , почему с внутренней памятью все гуд

там то же считывание, только по адресу 0x24001203

 

 

 

 

 

Share this post


Link to post
Share on other sites
14 minutes ago, jcxz said:

Так значит всё это был пустой трёп?

Такой же как и трёп и наезды на "неработающий" аллокатор который типа "гумно"? Которые в результате оказались результатом багов в вашем собственном быдлокоде.

Или другие подобные же вопли про "г*вно" и "отстой". Которые очень часто звучат в ваших темах...

 

PS: У меня в последнее время большие сомнения в вашей адекватности.....

 

Вы наверное будете удивлены, что мне совершенно безразлично что вы там считаете о моей адекватности или её отсутствии. Слишком всё уныло обобщаете. Я даже не буду тратить своё время на дальнейшее разжёвывание. :dance:

 

В данном случае я просто стебусь и не более. В таком состоянии бесполезно меня взывать к ответам. Тем более данный форум -  ничем не обязывает.  Так что смиритесь с тем, что мои посты будут у вас вызывать раздражение.  Более того, вы можете внести в ЧС мой ник и более сообщений от меня не увидите.  Но вот так воспаляться по каждому моему посту - это уже похоже на ничем непрекрытое хейтерство )))) :lol2:

 

Найдите себе другого субъекта для битья. А ещё лучше - поберегите свои нервы и время! :bb:

 

 

Share this post


Link to post
Share on other sites
9 минут назад, Realking сказал:

Но не понятно , почему с внутренней памятью все гуд

Возможно проблема в настройках контроллера внешней памяти.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.