|
STM32H7+SDRAM пара вопросов, перетасовал выводы на ШД и ША... |
|
|
|
Aug 16 2017, 10:10
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Приветствую всех! Возник не совсем "нормальный" вопрос. В процессе упаковки STM32H743 и SDRAM на двухслойку (только не говорите, что так низзя - это для экспериментов  ). Получилось весьма неплохо с этим справиться, если перетасовать младший байт ША и всю ШД. По идее проблем это не должно доставить (учитывая то, в каких режимах FMC работает с SDRAM). Но, как-то запамятовал, что есть байтовый доступ  . Короче теперь память может работать только словами по 16бит. Собственно вопрос в том, как будет обработан байтовый доступ CPU к кэшируемой области SDRAM? С чтением понятно, все будет нормально (об этом в Reference manual есть информация), а вот с записью? Я так понимаю кэш по любому будет сбрасывать содержимое в SDRAM словами?
|
|
|
|
|
 |
Ответов
|
Aug 16 2017, 11:05
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Aug 16 2017, 14:00)  Там вроде на шине есть сигналы (или сигнал), название их точно не помню. Которые говорят что доступ идёт только к байту (старшему или младшему) из слова. Да, NBL_0, NBL_1 (со стороны STM32), и я их даже развел, но толку от них нет, т.к. на ШД переставлены сигналы между младшим и старшим байтами (профтыкал я этот момент однако). В мануале написано, что при чтении NBL_x не используются - вычитывается сразу слово, лишнее не используется. Про запись ничего не сказано, думаю здесь кэш-память спасет... Проверил на плате с STM32F7 - отключил NBL_x (сконфигурировал как GPIO выдающий все время "0"). Работает все как будто ничего и не менялось. По идее в H7 должно также работать.
Сообщение отредактировал Шаманъ - Aug 16 2017, 11:06
|
|
|
|
|
Aug 16 2017, 12:12
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Aug 16 2017, 14:05)  Про запись ничего не сказано, думаю здесь кэш-память спасет... Вот для записи они как раз и нужны. А как кеш тут может спасти? Думаете, что при записи (при отсутствии данного адреса в кеше), контроллер выполнит чтение-запись вместо просто записи с этими сигналами? Сильно сомневаюсь в этом. Для проверки запишите что-нить в слово по данному адресу, сбросьте кеш, запишите байт туда-же, опять сбросьте кеш, прочитайте, сравните. Цитата(Шаманъ @ Aug 16 2017, 13:10)  Но, как-то запамятовал, что есть байтовый доступ  . Кроме байтового есть ещё и невыровненный доступ (если Вы конечно его используете в ПО). Для него тоже эти сигналы должны использоваться.
|
|
|
|
|
Aug 16 2017, 15:02
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Aug 16 2017, 15:12)  А как кеш тут может спасти? Думаете, что при записи (при отсутствии данного адреса в кеше), контроллер выполнит чтение-запись вместо просто записи с этими сигналами? Сильно сомневаюсь в этом. У меня параметры кэширования выставлены WBWA - последнее обозначает Write Allocate, т.е. при записи произойдет выделение и заполнение (=чтение) линии кэша (32байта). Соответственно кэш-контроллер с памятью общаются только словами (точнее блоками по 8 32битных слов). Попробовал записал 0xEEEEFFFF по адресу 0x7000_0000, потом байт по адресу 0х7000_0000, потом слово по адресу 0х7000_0001 (невыровненный доступ, у меня такой доступ не используется, но проверить было интересно  ), потом сбросил кэш - результат все записалось в точности как и должно было быть  .
На всякий случай проверил с промежуточным сбросом и инвалидацией кеша. Работает как и ожидалось:
Дальше интересней - отключил кэш и проверил это дело без кэша - байтовый доступ на запись просто проигнорирован, а вот невыровненный доступ как ни странно прошел нормально:
|
|
|
|
|
Aug 16 2017, 15:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Aug 16 2017, 18:02)  У меня параметры кэширования выставлены WBWA - последнее обозначает Write Allocate, т.е. при записи произойдет выделение и заполнение (=чтение) линии кэша (32байта). Соответственно кэш-контроллер с памятью общаются только словами (точнее блоками по 8 32битных слов). А как же эффективность? Это-ж при случайном произвольном доступе будет каждый раз вместо записи 1го байта по шине сначала производиться 16 операций чтения, потом ещё 1 запись! Цитата(Шаманъ @ Aug 16 2017, 18:02)  Попробовал записал 0xEEEEFFFF по адресу 0x7000_0000, потом байт по адресу 0х7000_0000, потом слово по адресу 0х7000_0001 (невыровненный доступ, у меня такой доступ не используется, но проверить было интересно  ), потом сбросил кэш - результат все записалось в точности как и должно было быть  . Ну - это не корректная проверка, так как перед записью байта не было сброса кеша: байт просто обновит предыдущие записанные данные, находящиеся ещё во write buffer-е. Цитата(Шаманъ @ Aug 16 2017, 18:02)  На всякий случай проверил с промежуточным сбросом и инвалидацией кеша. Работает как и ожидалось: Хм... видимо сигналы эти (NBL_0, NBL_1) опциональны и можно и без них пожертвовав производительностью произвольной записи. Цитата(Шаманъ @ Aug 16 2017, 18:02)  Дальше интересней - отключил кэш и проверил это дело без кэша - байтовый доступ на запись просто проигнорирован, а вот невыровненный доступ как ни странно прошел нормально: А это странно. Как такое может быть? Если кеш реально выключен, то откуда взялись данные из немодифицируемых байтов? Опять-же - Вы выключили кеш, а выключили-ли write buffer? Возможно в этом и причина успешных тестов: сбрасываете кеш, а содержимое write buffer остаётся, объединяется со значением из предыдущей записи слова, и как будто всё ок. Хотя на самом деле... PS: Да и выбор такого шаблона для тестов некорректен - у Вас при записи байта на неиспользуемых этим байтом линиях будут например все '1' и в результате эти единицы перепишутся поверх старых, а Вы и не заметите. Тестить надо имхо на случайном паттерне, да ещё в несколько итераций со сменой паттерна. И не один адрес писать, а писать сразу массив, заведомо превосходящий размер кеша. Например: 1. Заполнить регион ОЗУ (больше размера кеша) 16-битными записями случайного паттерна. 2. В этот же регион записать побайтовый случайный паттерн (с шагом == 2 - например только все младшие или только старшие байты). 3. Верифицировать. 4. Повторить пп.1-3 с несколькими другими случайными паттернами.
|
|
|
|
|
Aug 16 2017, 18:29
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Aug 16 2017, 18:20)  А как же эффективность? Это-ж при случайном произвольном доступе будет каждый раз вместо записи 1го байта по шине сначала производиться 16 операций чтения, потом ещё 1 запись! У меня нет в программе случайного байтового доступа. Пишется все довольно большими блоками (минимум по 400байт). В таком режиме это вполне нормальная стратегия работы кэша, по крайней мере работает быстрее WT режима, т.к. данные в SDRAM сбрасываются/читаются блоками. Т.е. если бы "не поехало", то можно было бы переделать на выровненный доступ. Цитата Хм... видимо сигналы эти (NBL_0, NBL_1) опциональны То, что они опциональны это очевидно - тот же куб позволяет выбрать режим FMC с SDRAM без них. Весь вопрос был в байтовом доступе в такой конфигурации. Цитата А это странно. Как такое может быть? А как ядро разруливает невыровненный доступ? Почитал ARM v7 Architecture Manual, как-то не особо прояснилось - судя по псевдокоду идет серия байтовый транзакций на шине, но вопрос как себя ведет шина в обсуждаемой ситуации неясен. То, что наблюдается выглядит несколько иначе. Цитата Если кеш реально выключен, то откуда взялись данные из немодифицируемых байтов? В смысле? Там все ок за исключением записи байта - ее просто нет, как и ожидалось, и невыровненного доступа - он на удивление сработал... Цитата Опять-же - Вы выключили кеш, а выключили-ли write buffer?  О каком write buffer речь? FMC не буферизирует запись в SDRAM. В варианте с выключенным кэшем оставлен исходный режим работы процессора после сброса. Цитата PS: Да и выбор такого шаблона для тестов некорректен - у Вас при записи байта на неиспользуемых этим байтом линиях будут например все '1' и в результате эти единицы перепишутся поверх старых, а Вы и не заметите. А Вы внимательно посмотрите какие значения используются  Как раз все единицы и должны переписаться. Но то лирика. Задачей теста было удостовериться, что байтовый доступ работает с кэшем, и не работает без него - как и ожидалось. Невыровненного доступа к SDRAM у меня нет (его вообще у меня нет). В реальности здоровая программа, которая использует почти всю SDRAM вполне нормально работает при включенном кэше и такой конфигурации памяти, что не может не радовать, ибо платы уже в производстве.
|
|
|
|
|
Aug 16 2017, 19:06
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Шаманъ @ Aug 16 2017, 21:29)  О каком write buffer речь? FMC не буферизирует запись в SDRAM. В варианте с выключенным кэшем оставлен исходный режим работы процессора после сброса. Я не знаю как обстоит дело в данном МК, но допускаю наличие небольшого write buffer-а либо в ядре либо где-то на межшинных гейтах. Вы выполнили запись 0xFFFFEEEE, оно лежит в этом wb, в контроллер EMC не поступает. Потом пишете байт, он заменяет мл. 0xFF в wb. Слово продолжает лежать в wb. Пишете полуслово в байты 1,2, они заменяются новыми в wb. Записи в EMC всё нет. Делаете сброс кеша. И вот тут только реально происходит запись полного слова. Естественно, что это будет только одна транзакция из 2-х 16-битных записей на шине. И содержимое памяти будет правильным. Т.е. - write buffer аналогичный тому, что в Cortex-M4. Или вы всё-таки между записями данных делали DSB/DMB? Из описания этого не следует. Цитата(Шаманъ @ Aug 16 2017, 21:29)  байтовый доступ работает с кэшем, и не работает без него - как и ожидалось. Невыровненного доступа к SDRAM у меня нет (его вообще у меня нет). В реальности здоровая программа, которая использует почти всю SDRAM вполне нормально работает при включенном кэше и такой конфигурации памяти, что не может не радовать, ибо платы уже в производстве. Иногда так бывает. А потом когда немного изменишь алгоритм и вдруг начинает глючить совершенно неожиданно в неожиданных местах. И потом думаешь "а как оно вообще работало?" PS: А байтовый DMA в эту область работает нормально? Если конечно он есть в ПО...
|
|
|
|
Сообщений в этой теме
Шаманъ STM32H7+SDRAM пара вопросов Aug 16 2017, 10:10 skripach Биты ШД можно менять только впределах байта. Aug 16 2017, 23:41 Шаманъ Цитата(jcxz @ Aug 16 2017, 22:06) Я не зн... Aug 17 2017, 07:23 skripach Цитата(Шаманъ @ Aug 17 2017, 10:23) Если ... Aug 17 2017, 19:21  Шаманъ Цитата(skripach @ Aug 17 2017, 22:21) А к... Aug 18 2017, 13:13 dachny немного не в тему... а где автор добыл STM32H743??... Aug 17 2017, 07:32 Шаманъ Цитата(dachny @ Aug 17 2017, 10:32) а где... Aug 17 2017, 09:43 Шаманъ Приветствую всех!
Сваял я девайс с STM32H743.... Sep 21 2017, 22:34 uriy Скажите на каких частотах у вас стабильно работает... Sep 22 2017, 04:50 Шаманъ Цитата(uriy @ Sep 22 2017, 07:50) Скажите... Sep 22 2017, 07:18  golf2109 Цитата(Шаманъ @ Sep 22 2017, 09:18) Сейча... Sep 23 2017, 02:22 Axel Цитата(uriy @ Sep 22 2017, 07:50) Скажите... Sep 22 2017, 08:17  Шаманъ Цитата(Axel @ Sep 22 2017, 11:17) Ну очен... Sep 22 2017, 08:50   Axel Цитата(Шаманъ @ Sep 22 2017, 11:50) На 12... Sep 23 2017, 05:51    Шаманъ Цитата(Axel @ Sep 23 2017, 08:51) А какие... Sep 23 2017, 06:53 Шаманъ Покопался в DMA2D еще - лажа короче полная.
Итак... Sep 23 2017, 10:07 Шаманъ Проведенное в предыдущем посту исследование навело... Sep 23 2017, 12:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|