Jump to content

    
Sign in to follow this  
Алексей ВМ

STM32F4 как уменьшить время входа в обработчик прерывания

Recommended Posts

20 минут назад, Алексей ВМ сказал:

Нет, минимальный период таймера 50 нс, период клока на пине - 100 нс - это 10 МГц. STM32F4 вполне справляется. Затык с переинициализацией таймера на ходу.

Ну да, ну да.... :biggrin:

Задумайтесь немного: Вот пришло время DMA что-то отправить в GPIO чтобы изменить состояние пинов, а в этот момент CPU решил сохранить контекст FPU на стек, и стек оказался в той же памяти, из которой DMA выполняет пересылку в GPIO. Вопрос: сколько тактов будет ждать DMA освобождения шины при условии того что размер контекста FPU == 16 слов? А если сразу все 33 слова сохраняются? А если ещё целочисленный контекст туда-же - до кучи сохраняется? :dash2:

Share this post


Link to post
Share on other sites
5 minutes ago, Алексей ВМ said:

Платы уже вовсю клепают...

Текущую сборку останавливать, а на что успели спаять сделайте вторую плату и клейте ее сверху основной. Это нормально. Делать срочно новые правильные платы.

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

 

Share this post


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

Ну да, ну да.... :biggrin:

Задумайтесь немного: Вот пришло время DMA что-то отправить в GPIO чтобы изменить состояние пинов, а в этот момент CPU решил сохранить контекст FPU на стек, и стек оказался в той же памяти, из которой DMA выполняет пересылку в GPIO. Вопрос: сколько тактов будет ждать DMA освобождения шины при условии того что размер контекста FPU == 16 слов? А если сразу все 33 слова сохраняются? А если ещё целочисленный контекст туда-же - до кучи сохраняется? :dash2:

Перерыв в несколько десятков или даже сотен мкс не критичен, главное, чтобы он был не чаще одного раза в неск сотен мс. Потери данных, я понимаю, не произойдет?

 

8 minutes ago, Forger said:

Текущую сборку останавливать, а на что успели спаять сделайте вторую плату и клейте ее сверху основной. Это нормально. Делать срочно новые правильные платы.

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

  

Не вариант, заказчик за каждый цент удавится

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
6 минут назад, Алексей ВМ сказал:

Точность +- 10 нс для наименьшего периода 50 нс, меньше не нужна. По сути, это параллельная шина с 10 сигналами, один из которых клок.

А частота CPU какая? 180МГц? Если проц например решит выполнить команду VSTMDB Rx!, {S0-S31} то это убьёт вашу систему. Так как выполнять он её будет ~183нс заняв шину. И у него (проца) есть ещё много подобных чудесных команд.  :dash2:

Можно попробовать вынести DMA-буфер в отдельный регион памяти, для которого в матрице шин есть свой канал, не пересекающийся с другими. Но не знаю - поможет ли....

6 минут назад, Алексей ВМ сказал:

ШИМ, к сожалению, здесь не прокатит...

Прокатит. Если МК выбирать соответствующий задаче. У XMC4700 например 32 отдельных таймера с ШИМ-ами, которые могут работать синхронно, генеря сигналы с точностью до 1 клока своей тактовой частоты (144МГц). И без всяких завязок на работу шины.

Share this post


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

Прокатит. Если МК выбирать соответствующий задаче. У XMC4700 например 32 отдельных таймера с ШИМ-ами, которые могут работать синхронно, генеря сигналы с точностью до 1 клока своей тактовой частоты (144МГц). И без всяких завязок на работу шины. 

Частота  168 МГц .

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

 

Share this post


Link to post
Share on other sites
2 минуты назад, Алексей ВМ сказал:

Перерыв в несколько десятков или даже сотен мкс не критичен, главное, чтобы он был не чаще одного раза в неск сотен мс.

Хммм.... странное условие.... Если так, то может ещё не всё потеряно. Вынести в отдельный регион памяти DMA-буфер, добиться от компилятора отсутствия длинных команд сохранения/восстановления в/из памяти в циклическом коде (чтобы не было постоянных циклических попаданий работ DMA на эти команды). Может и будет работать.....

Share this post


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

Хммм.... странное условие.... Если так, то может ещё не всё потеряно. Вынести в отдельный регион памяти DMA-буфер, добиться от компилятора отсутствия длинных команд сохранения/восстановления в/из памяти в циклическом коде (чтобы не было постоянных циклических попаданий работ DMA на эти команды). Может и будет работать.....

Уже работает. Но заказчик решил изменить возможности, отсюда все эти пляски с бубном...

Share this post


Link to post
Share on other sites
8 минут назад, Алексей ВМ сказал:

Частота  168 МГц .

Учтите, что даже простое сохранение контекста на входе в ISR (и восстановление на выходе из него) займёт: 1/0.168*8 = 47.6 нс. Если это попадёт на время пересылки DMA по шине, то будет соответствующая задержка. FPU на вашем месте в этом проекте я вообще бы не использовал (компилил код для Cortex-M3).

 

PS: Ещё можно вообще класть CPU в сон на время работы DMA. Чтоб не мешал.

Share this post


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

Учтите, что даже простое сохранение контекста на входе в ISR (и восстановление на выходе из него) займёт: 1/0.168*8 = 47.6 нс. Если это попадёт на время пересылки DMA по шине, то будет соответствующая задержка. FPU на вашем месте в этом проекте я вообще бы не использовал (компилил код для Cortex-M3).

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

Edited by Алексей ВМ

Share this post


Link to post
Share on other sites
2 минуты назад, Алексей ВМ сказал:

Если удастся менять период таймера аппаратно, то задержки до 100 нс до входа в обработчик прерывания ни на что не влияют. За FPU благодарю, постараюсь избавиться от него.

Cortex-M можно заставить работать в таком режиме, чтобы сразу после выхода из ISR CPU сразу уходил в сон. И просыпался только при входе в другое прерывание. Тогда он не будет мешать работе DMA. Всю работу будет делать только в ISR-ах.

Share this post


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

Cortex-M можно заставить работать в таком режиме, чтобы сразу после выхода из ISR CPU сразу уходил в сон. И просыпался только при входе в другое прерывание. Тогда он не будет мешать работе DMA. Всю работу будет делать только в ISR-ах.

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

 

 

 

Немного не ясно с RCR:

 

Each time the REP_CNT related downcounter reaches zero, an update event is generated

 

Это какой-то особый update event, или он заведен на TIM1_UP?

 

Дальше по тексту упоминается repetition update event U_RC:

As REP_CNT is reloaded with REP value only at
the repetition update event U_RC, any write to the TIMx_RCR register is not taken in
account until the next repetition update event.

 

но кроме этого отрывка нигде не находится поиском.

Edited by Алексей ВМ

Share this post


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

Ну да, ну да.... :biggrin:

Задумайтесь немного: Вот пришло время DMA что-то отправить в GPIO чтобы изменить состояние пинов, а в этот момент CPU решил сохранить контекст FPU на стек, и стек оказался в той же памяти, из которой DMA выполняет пересылку в GPIO. Вопрос: сколько тактов будет ждать DMA освобождения шины при условии того что размер контекста FPU == 16 слов? А если сразу все 33 слова сохраняются? А если ещё целочисленный контекст туда-же - до кучи сохраняется? :dash2:

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

Цитата

The BusMatrix manages the access arbitration between masters. The arbitration uses a
round-robin algorithm.

В пределе DMA способно отбирать у процессора каждый второй цикл шины.

Более того, DMA в режиме память->периферия может делать предварительное чтение данных из памяти и сохранять у себя. Тогда при поступлении запроса на DMA остаётся только провести цикл записи в периферийное устройство.

Вот только чтобы всё это правильно запрограммировать придётся добрую половину реф. мануала прочитать.

Share this post


Link to post
Share on other sites
Quote

A general purpose or an advanced timer (that's all of them except TIM6 and TIM7) can trigger a DMA transfer when the counter reaches the reload value (update event) and when the counter equals any of the compare values (capture/compare event).

Немного модифицированное предложение ув. SSerge

 

8 hours ago, SSerge said:

Но это всё не важно. Важно - это смотреть в будущее на один период дальше чем сейчас (и обязательно с оптимизмом!).

 

Регистры таймера ARR и RCR буферизованы и в них можно записать новые значения (для следующего периода) заблаговременно.

Загрузка новых значений из буферных регистров в рабочие регистры произойдёт по событию update event. Сразу после update event можно грузить новые данные.

Самое правильное это по update event запускать второй канал DMA, который за время текущего периода запишет в ARR и RCR данные для следующего. А потом по прерыванию от DMA готовить данные в буфере для следующих периодов.

Только DMA должно писать в регистры таймера не напрямую, а используя регистры TIMx->DCR и TIMx->DMAR.

 

Пины дергать не по update event, а по capture/compare event. Соответственно, update event возникает при окончании передачи всего пакета (68 импульсов), по нему производится DMA запись регистра ARR новым значение периода.

Два обработчика прерываний -  один старый для формирования буфера передачи, новый для изменения периода таймера.

Edited by Алексей ВМ

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.

Sign in to follow this