AVI-crak 0 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба On 11/2/2022 at 9:30 PM, Reystlin said: Организовал в итоге работу SPI через DMA Отрезал нули - получилось красиво и компактно. Но изначальный полный длинный вариант нужно где-то сохранить, и использовать для копирования. Первоначально примеры были только на передачу, а сейчас ещё и чтение. Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма. _VAL2FLD(DMA_SxCR_PL, 1)| /// priority level 0-3 Управление ногой перенести в прерывание дма на чтение, оно срабатывает самым последним. Если хочется чтоб всё было красиво - реализуй все прерывания ошибок: от дма, от spi. В нормальном режиме они даже срабатывать не будут, но явно спасут от зависаний. Есно нужна функция разгребания всех возможных ошибок, отдельная функция!!!!. Отладка подобных функций достаточно прикольное занятие, я использовал для этих целей напильник. Принудительно вносил помехи в линии передачи данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба 9 минут назад, AVI-crak сказал: Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма... Количество восклицательных знаков никак не отменяет то, что Вы что-то нафантазировали с приоритетами Зачем разные? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба On 11/3/2022 at 12:22 AM, Arlleex said: Зачем разные? Пока в проекте используется всего два дма - проблем особых нету. Но если задействовать три и более - начинаются проблемы. Даже при использовании программной функции копирования могут быть проблемы, потому как ядро имеет приоритет выше дма. Приоритеты для дма работают весьма прикольно, они создают очередь для триггеров обмена, в данном случае от spi. На режим память-память - приоритеты ставить бесполезно. Если в проекте используется несколько периферийных узлов с одним регистром на чтение/запись - не обязательно строить лесенку из приоритетов, достаточно обеспечить разницу в пределах каждого узла. Чего произойдет при преждевременной записи раньше чтения данных от spi - потеря данных, и взведённый флаг ошибки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба Во-первых, с точки зрения распределения периферии - для SPI3 DMA один. Запросы (потоки) обслуживаются последовательно, параллельно они не могут быть обслужены. А во-вторых, регистр DR в SPI это не абы какая ячейка ОЗУ, это ячейка FIFO типа. Причем на чтение и запись внутри периферии это два разных регистра. А в-третьих, между взведением TXE и RXNE в SPI проходит таки огромное время (с точки зрения тактов CPU/DMA). 19 минут назад, AVI-crak сказал: ...могут быть проблемы, потому как ядро имеет приоритет выше дма. Мы все еще о STM32F4 топикстартера гооворим? Тогда тоже мимо - одновременные доступы к шинам в STM32 распределены по карусельному типу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба On 11/3/2022 at 12:56 AM, Arlleex said: параллельно они не могут быть обслужены Могут, в случае занятости системной шины данных на то самое "таки огромное время". Хотя точнее будет не параллельно, а одновременно, в момент освобождения системной шины данных, а там как повезёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба Мне кажется, Вы не владеете вопросом =( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба On 11/3/2022 at 12:56 AM, Arlleex said: одновременные доступы к шинам в STM32 распределены по карусельному типу Верно, кто раньше встал - того и тапки. Но есть тонкости, арбитраж шины происходит по приоритетам. Ядро может "выключить" поток дма, а дма уже нет. Более того, дма память-память в случае выигрыша - будет молотить до конца, остальные каналы будут в ожидании. Если в этот момент ядро обратится к памяти - сработает очередь. Просто для возникновения подобных условий нужно ооочень сильно постараться, ну прям совсем сильно. В простом коде подобные события огромная редкость, а если использовать хал - исчезающая редкость. Однако полностью исключать данный вариант сбоя - глупо. Тем-более что цена не высока, всего одна запись _VAL2FLD(DMA_SxCR_PL, 1) On 11/3/2022 at 1:18 AM, Arlleex said: Мне кажется, Вы не владеете вопросом =( Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 2 ноября, 2022 Опубликовано 2 ноября, 2022 · Жалоба 1 час назад, AVI-crak сказал: Более того, дма память-память в случае выигрыша - будет молотить до конца, остальные каналы будут в ожидании... Нет, не до конца. При одновременных запросах к одному AHB-слейву право на транзакцию передается карусельно. Поэтому никаких бесконечных ожиданий не будет, будут псевдопараллельные транзакции CPU и DMA. И нет никаих приоритетов доступа между CPU и DMA в STM32. Принцип, как я уже сказал - карусельный, а не "тапочный". Цитата Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще. Только когда DMA уже выиграл доступ к AHB, поле приоритета PL в настройках потока определяет, чей запрос (какого потока в DMA) будет обслужен первым. Для небуферизованной периферии это может быть важно. Если уж совсем корректно, то нужно обеспечить, чтобы при конкуррентном обслуживании Rx/Tx-событий SPI DMA-контроллер обработал сначала Rx. Поэтому важно, чтобы уровень приоритета был не просто разным, как Вы выразились, а приоритет Rx-канала был выше (логически), чем Tx. При одинаковых записанных числах в PL для Rx/Tx-каналов SPI это условие будет соблюдаться архитектурно (см. описание DMA). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться