Перейти к содержанию
    

2 minutes ago, GenaSPB said:

О... неработающая с data cache программа - известная проблема. Особенно при наличия обмена по DMA
Зачем Вам нужен MPU?

DMA не юзаю

А зачем? В начале писал, чтобы невыровненный доступ был разрешен.

И не задавайте вопросы зачем.. Много причин для этого есть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Realking сказал:

с ним тоже не работает.. и пишут что для SDRAM его надо отключать

Кто пишет?

Если речь про MPU_RASR.B, то у меня в проекте для STM32F429 с SDRAM этот бит установлен для всех регионов SDRAM. И работает прекрасно. И DMA он тож не мешает.

И вообще:

    //            s
    //            i   t                 s
    //            z   e           a  x  r
    //base        e   x  c  b  s  p  n  d
    T(0xD0000000, 23, 0, 1, 1, 1, 3, 1, 0),    //SDRAM_regionB (данные)
    T(0xD0000000, 18, 0, 1, 1, 0, 7, 0, 0)     //SDRAM_regionA (код)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, jcxz said:

Кто пишет?

Если речь про MPU_RASR.B, то у меня в проекте для STM32F429 с SDRAM этот бит установлен для всех регионов SDRAM. И работает прекрасно. И DMA он тож не мешает.

И вообще:


    //            s
    //            i   t                 s
    //            z   e           a  x  r
    //base        e   x  c  b  s  p  n  d
    T(0xD0000000, 23, 0, 1, 1, 1, 3, 1, 0),    //SDRAM_regionB (данные)
    T(0xD0000000, 18, 0, 1, 1, 0, 7, 0, 0)     //SDRAM_regionA (код)

 

Возможно у Cortex-M4 это и работает, но тут походу другой случай

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Realking said:

Много причин для этого есть

Мне не понадобился. Слышал про необходимость, связаную с FMC

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, GenaSPB сказал:

О... неработающая с data cache программа - известная проблема. Особенно при наличия обмена по DMA

Расскажите пожалуйста про data cache + DMA подробнее. А то кому эта проблема известна, а кому не известна.

 

Лично я больше месяца времени убила в происках причины, отчего у меня DAC через DMA не работает. Оказалось, "двойная ошибка": первая та, что data cache был включен, а вторая та, что RAM начинался с адреса 0x20000. А всё потому, что Examples такие - в них и функция SCB_EnableDCache() вызывается, и адрес RAM в проекте таков. А работал тот пример только благодаря тому, что массив чисел, которые DMA гнал на DAC, был объявлен как const, а потому располагался в ROM, и поэтому работе DMA ни data cache не мешал, ни адрес ROM. И кто только такие примеры сочиняет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 минут назад, Xenia сказал:

Расскажите пожалуйста про data cache + DMA подробнее. А то кому эта проблема известна, а кому не известна.

Думаю, @GenaSPB имеет ввиду обыкновенное обеспечение когерентности данных при работе с DMA. Вот тут уже затрагивали этот вопрос немного.

Осталось понять, что Геннадий имеет ввиду под

Цитата

О... неработающая с data cache программа - известная проблема. Особенно при наличия обмена по DMA

ведь при наличии только лишь CPU как единственного мастера на шине проблем с когерентностью данных не должно быть, вроде как...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да разумеется я об этом и говорил. Связано с тем что в h7 dma ничего про кеш не знает. Перед запуском на чтение из ацп в память для соответствующей области выполнить invalidate или clean invalidate по смыслу. Перед передачей clean или его модификацию clean invalidate.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, GenaSPB сказал:

Да разумеется я об этом и говорил. Связано с тем что в h7 dma ничего про кеш не знает.

А вы-то об этом как узнали? :) Я догадалась, что DMA всегда пишет в реальную память, не взирпая на кэш, только после того, как этот кэш отключила.

 

P.S. А кстати, много ли мы теряем, отключая D-cache? Ясно, что отключать кэш инструкций I-cache жалко, т.к. flash читается медленно с делэями. А насколько быстрее читается D-cache по сравнению с оперативкой? Ответ на этот вопрос для меня актуален, поскольку эффект от кэширования ROM хорошо заметен, а эффект от отключение D-cache остался мной незамеченным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, GenaSPB сказал:

Связано с тем что в h7 dma ничего про кеш не знает.

Интересно сказано, а есть какие-то ДМА, которые "знают" про кэш? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, mantech сказал:

Интересно сказано, а есть какие-то ДМА, которые "знают" про кэш? 

Ну если есть полностью кэш-когерентные системы, значит... есть:yu:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Arlleex сказал:

Ну если есть полностью кэш-когерентные системы, значит... есть

Вот это мне и интересно, сколь АРМов не видел, все так же, как тут, может ДСПшки какие...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, mantech сказал:

Вот это мне и интересно, сколь АРМов не видел, все так же, как тут, может ДСПшки какие...

В ARM-ах тоже не видел... Думаю в каких-нибудь CPU для персоналок такое есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я книжки читал.... про процессоры. Виртуалку на базе v86 режима в 386м. Когда-то давно во времна qemm и himem.sys. dpmi. Картинки рассматривал. Да, в x86 это все обеспечивается аппаратурой.

Эти все механизмы - кеш и страничная трансляция адресов - в arm  переехали почти без модификаций. Но лучше изучать до появления проблем. 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

Ну если есть полностью кэш-когерентные системы, значит... есть:yu:

Есть, но это создаёт массу проблем с масштабированием системы. Для поддержания когерентности у тех же процов архитектуры IA-32 (в народе -- x86) есть специальная шина для обмена инфой между процами; а обмениваться должны все процы со всеми, поэтому есть предел числа процов, выше которого проблематично подняться технически. А есть и противоположная крайность -- где когерентности нормальной нет даже в рамках одного проца (проц записал команду самому себе для последующего выполнения -- но сам об этом не узнает, если принудительно не очистить кэш команд и очередь предвыборки). Ну и полно промежуточных вариантов с разной степенью удобства для программиста и для железа. Например, в IBMовских мэйнфреймах (хоть Системы 360, появившейся ещё в 1964-м, что у её современных потомоков, выпускаемых вот прям сейчас) проц видит собственные записи в память (за исключением некоторых ограничений, но вполне разумных), однако не видит записи со стороны других процов и канальной подсистемы (грубо говоря, DMA), поэтому там нужно соблюдать определённые правила при написании многопоточных программ (потенциально работающих одновременно на нескольких процах) и при вводе-выводе, но зато можно строить компы с сотнями и тысячами процов -- и всё будет работать. ARMы в этом смысле находятся где-то между совсем "некогерентными" архитектурами и означенными мэйнфреймами: кое-что обеспечивается, но бОльшая часть заботы о когерентности лежит на программисте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, Xenia said:

А вы-то об этом как узнали? :) Я догадалась, что DMA всегда пишет в реальную память, не взирпая на кэш, только после того, как этот кэш отключила.

 

P.S. А кстати, много ли мы теряем, отключая D-cache? Ясно, что отключать кэш инструкций I-cache жалко, т.к. flash читается медленно с делэями. А насколько быстрее читается D-cache по сравнению с оперативкой? Ответ на этот вопрос для меня актуален, поскольку эффект от кэширования ROM хорошо заметен, а эффект от отключение D-cache остался мной незамеченным.

Если кэшируется содержимое внутренней SRAM, то мало что теряем (а DTCM, как правило, и вовсе никогда не кэшируется, ибо работает со скоростью кэша -- но к ней DMA часто не имеет доступа). А вот если кэшируется внешняя память, особенно какая-нибудь там DDR2+, то кэши очень большой выигрыш дают (из-за большой латентности такой памяти).

Кстати говоря, если включить MPU, то можно выделить под ту область, с которой DMA работает, отдельный блок с точки зрения MPU, и при этом назначить ему атрибут "некэшируемый". Тогда, понятно дело, проц не будет соответствующую область памяти кэшировать, а вот остальную -- будет, что представляется наилучшим решением (нет потерь скорости для работы с большей частью памяти и нет проблем с той областью, где надо взаимодействовать с DMA).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...