Сколько времени долго тратить в прерывании?

Рива
Пн, 06 февраля 2017 г. 13:22
Относительно новое для STM32 и попытка написать мастер -программу DMX512 для мини -клона Baite Maple и мне интересно, как долго оставаться в таймере сравнить прерывание.
Мой тестовый код с использованием таймера & DMA TX, кажется, работает, как и ожидалось, но простой код Loop ()
(GPIO_TOGGLE_BIT (PIN_MAP [LED_BUILTIN].gpio_device, pin_map [led_builtin].gpio_bit);), кажется, иногда перестает работать, хотя код таймера/DMA все еще работает нормально в фоновом режиме. Кроме того.
Время, когда я нахожусь в ISR, около 185US.

С другой стороны, я заметил, что задержкамикросекунд (DMX_MAB); В таймере ISR со значением Zero DMX_MAB будет блокировать плату, а Windows сообщит об ошибке устройства USB.

Racemaniac
Пн, 06 февраля 2017 г. 13:31
Мне тоже иногда интересно, что мне интересно :)

Если вы думаете, что проблема остается в вашем ISR слишком долго, почему бы не попробовать просто установить флаг в вашем ISR, чтобы в следующий раз, когда ваша функция цикла займет, это предпринимает так долгое действие? Если ваше время должно быть очень точным (или ваш петлей очень медленный), это должно решить его :).

Я также пытаюсь использовать мой цикл для подготовки данных, которые тогда ISR может отправить (через DMA или что -то еще), когда пришло время :). Это, конечно, все еще требует, чтобы ваш цикл был достаточно быстрым, но предотвращает дорогостоящий процесс подготовки данных :).

Рива
Пн, 06 февраля 2017 г. 14:10
Я не убежден, что время в ISR является проблемой, так как код ISR все еще функционирует правильно после того, как светодиодный останавливает мигание.
Как уже упоминалось, код петли - это просто простая переключатель, и в настоящее время ничего не должно иметь проблем с временем.

Я хочу отправлять вселенную данных каждые 40 мс, но критическая/сложная часть - это перерыв, а отметка после перерыва (mAb), которые делают их на выводе, настроенном для UART, я должен переключиться обратно в цифровой режим, иначе цифровая писатель Работайте, а затем снова переключите штифт в режим UART. Другой вариант может заключаться в том, чтобы сделать это по тому, чтобы Arduino Way, когда скорость передачи бод UART переворачивается между 250 кбит / с и произвольную скорость передачи, что вызвало время разрыва 175US при отправке одного нулевого байта. Проблема с этим в том, что время MAB оказывается дольше, чем я надеялся примерно на 8-10US.

Может быть, другой вопрос должен быть, какие таймеры используются для того, что в ядре STM32. Может быть, таймер 2 используется для какой -то другой цели, и это каким -то образом влияет на код цикла.

Ахулл
Пн, 06 февраля 2017 г. 14:43
Как долго долго тратить в прерывание? На этот вопрос нет абсолютного ответа, единственный совет - это как можно меньше времени в ISR.

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

Если вы находитесь в очень плотной петле, и время крайне критическое, тогда даже нескольких дополнительных программных циклов в ISR может быть достаточно, чтобы выбрать время вашего времени.

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

Это общее правило верно, независимо от архитектуры процессора.

Стивестронг
Пн, 06 февраля 2017 г. 15:58
Кроме того, то, чего на самом деле следует избегать, - это иметь вложенные прерывания, запрошенные тем же источником прерывания.

victor_pv
Пн, 06 февраля 2017 г., 17:30
Я со Стивом. Лучше всего установить флаг и вернуть, или если это невозможно, в начале ISR отключите прерывания, по крайней мере, тот, который вы обслуживаете, а затем включите его снова на выходе.

Рива
Вт. 07 февраля 2017 г. 13:40
Я не очень далеко с этим, поэтому прикрепил тестовый код, чтобы другие попытались посмотреть, ведет ли он одинаково на других MCU, и, надеюсь, указать, куда я иду не так.

Что происходит, так это то, что код запускает тонкую вывод сигнала разрыва, а затем 512 байтов последовательных данных (8n2 @ 250000 бод) каждые 40 мс, используя прерывания и DMA.
Весь код loop () делает это включает светодиод, но после случайного? количество времени, которое светодиод перестает мигать но перерыв & 512 байтов все еще передаются в порядке на Serial1 TX PIN, так что MCU не заблокировался полностью.
Я добавил в код ловушки, чтобы сигнализировать об ошибках при настройке ошибок канала DMA и передачи DMA, но ничто не появляется на последовательных (не идеально, что с последовательными вызовами в прерывании, но удаление их не помогает, не помогает.

Есть ли функция типа Freemem, такую ​​как на Arduino для STM32?

victor_pv
Вторник 07 февраля 2017 г. 14:18
Рива написал:Я не очень далеко с этим, поэтому прикрепил тестовый код, чтобы другие попытались посмотреть, ведет ли он одинаково на других MCU, и, надеюсь, указать, куда я иду не так.

Что происходит, так это то, что код запускает тонкую вывод сигнала разрыва, а затем 512 байтов последовательных данных (8n2 @ 250000 бод) каждые 40 мс, используя прерывания и DMA.
Весь код loop () делает это включает светодиод, но после случайного? количество времени, которое светодиод перестает мигать но перерыв & 512 байтов все еще передаются в порядке на Serial1 TX PIN, так что MCU не заблокировался полностью.
Я добавил в код ловушки, чтобы сигнализировать об ошибках при настройке ошибок канала DMA и передачи DMA, но ничто не появляется на последовательных (не идеально, что с последовательными вызовами в прерывании, но удаление их не помогает, не помогает.

Есть ли функция типа Freemem, такую ​​как на Arduino для STM32?

Mrburnette
Вт. 07 февраля 2017 г. 14:30
Рива написал: <...> Как долго оставаться в таймере, сравнить прерывание.

victor_pv
Вторник 07 февраля 2017 г. 15:05
Чтобы добавить в мой ответ раньше, ваш цикл зависит от задержки, чтобы считать 40 мс. Задержка зависит от Systick, и Systick использует прерывание для обновления количества времени, если прерывания Systick не будут обслуживаться, функция Delay () никогда не закончится, поэтому ваш цикл будет блокировать.

Я бы сказал, куда вы заставляете прерывание Systick, чтобы не быть обслуживаемым.
Если вы используете отладчик, проверьте переменную, которая удерживает MS. Не сама Systick, Systick является аппаратным счетчиком и будет продолжать подсчитать, только прерывания для него, которые должны увеличить переменную, могут не обслуживать.

РЕДАКТИРОВАТЬ: Просто прочитайте, это не относится к ARMV7-M, поэтому, вероятно, вообще не имеет значения Еще одна вещь, используйте атрибут прерывания в ваших ISRS, поэтому их код безопасен, иначе они могут изменить переменные, которые влияют на функцию, которая была прервана, когда они были вызваны.
https: // gcc.гну.org/onlinedocs/gcc-6.1. ... бут.HTML

Стивестронг
Вторник 07 февраля 2017 г. 15:28
@Riva, некоторые комментарии относительно вашего эскиза:

- Я не вижу, где вы инициализируете сериал, но это может быть сделано в рутине инициировать по умолчанию.
- Serial2 не используется, так зачем его инициализировать его в настройке? (не должно быть серийным?)
- Вы проверили, что передача 512 байтов при 250KBAUDS завершена наверняка в течение 40 мс?
- Timer2 ISR: действительно ли необходимо использовать PA9 один раз в качестве GPIO, а затем для Serial1? Есть ли какой -нибудь настоящий объем? Вы можете «моделировать» низкий период, отправив 0 (или другое значение) в качестве данных UART.
- setup_dma_transfer () можно вызвать один раз в настройке, которая должна включать setup_tube_config (). После этого используйте только dma_enable ()/disable (), где это необходимо.
- Конфигурация труб, после настройки, не требуется снова переписать в Timer2 ISR.

- DigitalWrite () в основном цикле может противоречить с PinMode ()/DigitalWrite (), вызванным в Timer2 ISR, если они оба получают доступ к одному GPIO (a?) Порт или задержка () может противоречить с задержкоймикросекундами () из ISR. Вот почему основные ласки.
В этом случае данные по -прежнему будут выходить через Serial1, потому что это управляется прерыванием.

Рива
Вторник 07 февраля 2017 г. 15:41
victor_pv написал: Я немного смущен ваш код. Вы настраиваете Serial2, но я не вижу, чтобы он использовался, затем Serial1 используется как для передачи DMA данных DMZ, так и от отладки информации, и в случае ошибки вы отправляете информацию отладки, прежде чем отключить DMA. Поскольку DMA все еще активен, я не знаю, что делает контроллер DMA, когда UART отправляет запрос DMA, но стоит прочитать в таблице данных, чтобы убедиться, что это не вызывает проблемы.

Рива
Вторник 07 февраля 2017 г. 16:03
Стивестронг написал: - Я не вижу, где вы инициализируете сериал, но это может быть сделано в рутине инициировать по умолчанию.
Я понял, что около часа назад это не сделано, но добавление его не помогает.
- Serial2 не используется, так зачем его инициализировать его в настройке? (не должно быть серийным?)
Код прокомментируется в Loop (). Я использовал перемычку для подключения TX1 к RX2 для быстрого тестирования.
- Вы проверили, что передача 512 байтов при 250KBAUDS завершена наверняка в течение 40 мс?
Да, он заканчивается < 30 мс, но для тестирования я иногда отправлял только около 10 байтов.
- Timer2 ISR: действительно ли необходимо использовать PA9 один раз в качестве GPIO, а затем для Serial1? Есть ли какой -нибудь настоящий объем? Вы можете «моделировать» низкий период, отправив 0 (или другое значение) в качестве данных UART.
Когда PIN -код настроен для USART DigitalWrite не изменит состояние PIN, поэтому необходимо переключить режим PIN -кода между цифровым вводом -выводом и USART Evert Time.
Я мог бы снизить скорость передачи передач и остановить количество битов и отправить ноль для моделирования периода разрыва, но таймер/DMA все еще работают нормально после того, как светодиодные остановки мигают.

- setup_dma_transfer () можно вызвать один раз в настройке, которая должна включать setup_tube_config (). После этого используйте только dma_enable ()/disable (), где это необходимо.
Я думаю, я попробовал это, но это не сработало. Я подумал, переключение вывода между цифровым вводом -выводом и USART означало, что все это необходимо снова настроить.
- Конфигурация труб, после настройки, не требуется снова переписать в Timer2 ISR.
Я просто установил адрес начала DMA и длину данных в таймере ISR, иначе он начинает читать неправильную память. Может быть, включение круглого буфера предотвратит необходимость этого?

- DigitalWrite () в основном цикле может противоречить с PinMode ()/DigitalWrite (), вызванным в Timer2 ISR, если они оба получают доступ к одному GPIO (a?) Порт или задержка () может противоречить с задержкоймикросекундами () из ISR. Вот почему основные ласки.
В этом случае данные по -прежнему будут выходить через Serial1, потому что это управляется прерыванием.
Этот звук разумный и проверенный, так как я мог бы отключить прерывания вокруг цифровой трансляции Loop, но, возможно, не идеальное решение, так как это повлияет на таймеры?

victor_pv
Вт, 07 февраля 2017 г., 17:06
Рива написал:Стивестронг написал: - Я не вижу, где вы инициализируете сериал, но это может быть сделано в рутине инициировать по умолчанию.
Я понял, что около часа назад это не сделано, но добавление его не помогает.
- Serial2 не используется, так зачем его инициализировать его в настройке? (не должно быть серийным?)
Код прокомментируется в Loop (). Я использовал перемычку для подключения TX1 к RX2 для быстрого тестирования.
- Вы проверили, что передача 512 байтов при 250KBAUDS завершена наверняка в течение 40 мс?
Да, он заканчивается < 30 мс, но для тестирования я иногда отправлял только около 10 байтов.
- Timer2 ISR: действительно ли необходимо использовать PA9 один раз в качестве GPIO, а затем для Serial1? Есть ли какой -нибудь настоящий объем? Вы можете «моделировать» низкий период, отправив 0 (или другое значение) в качестве данных UART.
Когда PIN -код настроен для USART DigitalWrite не изменит состояние PIN, поэтому необходимо переключить режим PIN -кода между цифровым вводом -выводом и USART Evert Time.
Я мог бы снизить скорость передачи передач и остановить количество битов и отправить ноль для моделирования периода разрыва, но таймер/DMA все еще работают нормально после того, как светодиодные остановки мигают.

- setup_dma_transfer () можно вызвать один раз в настройке, которая должна включать setup_tube_config (). После этого используйте только dma_enable ()/disable (), где это необходимо.
Я думаю, я попробовал это, но это не сработало. Я подумал, переключение вывода между цифровым вводом -выводом и USART означало, что все это необходимо снова настроить.
- Конфигурация труб, после настройки, не требуется снова переписать в Timer2 ISR.
Я просто установил адрес начала DMA и длину данных в таймере ISR, иначе он начинает читать неправильную память. Может быть, включение круглого буфера предотвратит необходимость этого?

- DigitalWrite () в основном цикле может противоречить с PinMode ()/DigitalWrite (), вызванным в Timer2 ISR, если они оба получают доступ к одному GPIO (a?) Порт или задержка () может противоречить с задержкоймикросекундами () из ISR. Вот почему основные ласки.
В этом случае данные по -прежнему будут выходить через Serial1, потому что это управляется прерыванием.
Этот звук разумный и проверенный, так как я мог бы отключить прерывания вокруг цифровой трансляции Loop, но, возможно, не идеальное решение, так как это повлияет на таймеры?

Рива
Ср. 08 февраля 2017 г. 7:42
Стивестронг написал: - DigitalWrite () в основном цикле может противоречить с PinMode ()/DigitalWrite (), вызванным в Timer2 ISR, если они оба получают доступ к одному GPIO (a?) Порт или задержка () может противоречить с задержкоймикросекундами () из ISR. Вот почему основные ласки.
В этом случае данные по -прежнему будут выходить через Serial1, потому что это управляется прерыванием.

Стивестронг
Ср. 08 февраля 2017 г. 9:15 утра
Я тоже так надеюсь.
Но, чтобы быть уверенным, для испытательных целей, я бы просто удалил все остальное, чем задержка -микросекунд () из ISR, чтобы увидеть, висит ли основной цикл или нет, из -за любого возможного конфликта между функциями задержки. Если нет, то добавьте необходимые функции один за другим в ISR и каждый раз проверяйте поведение.
Таким образом, вы могли бы выяснить, что именно вызывает неприятности.

Рива
Чт, 09 февраля 2017 г. 8:06 утра
Извините за задержку возвращения, но такие вещи, как работа, имеют тенденцию мешать. :(
В свободное время на работе я припаивал к другому клону байте и загрузил эскиз с большим количеством отладочных вещей и запускал его с логическим анализатором, и по какой -то причине он еще не ошибся, хотя тестовая установка не совсем такая же, как дома.
Когда я вернулся домой, я загрузил тот же эскиз на исходную плату и перестает работать (DMX Fine, светодиод останавливается мигание) после случайного количества времени, если он подключен к USB -порту ПК, но если я подключаю его к сокету питания, то это Пробежал всю ночь без проблем? Так что теперь я не знаю, была ли это испытательная установка, ПК или слепая удача, вызвав ошибки.

Я постараюсь получить время, чтобы проанализировать доску дома в выходные дни и посмотрю, не так ли.

С анализатором у меня теперь есть время, и общее время в Timer2 ISR составляет около 188us, хотя большая часть этого просто ждет времени сигнала перерыва, чтобы я мог уменьшить это за счет необходимости другого таймера.
По мере того, как Timer2 выходит, он устанавливает передачу DMA, и для отправки 512 байт DMX у меня требуется около 23 мс, поэтому с частотой кадров в 25 кадров в секунду у меня около 17 мс и даже для 30 кадров в секунду у меня было бы около 15 мс.

victor_pv
Чт, 09 февраля 2017 г., 17:13
Рива написал:Извините за задержку возвращения, но такие вещи, как работа, имеют тенденцию мешать. :(
В свободное время на работе я припаивал к другому клону байте и загрузил эскиз с большим количеством отладочных вещей и запускал его с логическим анализатором, и по какой -то причине он еще не ошибся, хотя тестовая установка не совсем такая же, как дома.
Когда я вернулся домой, я загрузил тот же эскиз на исходную плату и перестает работать (DMX Fine, светодиод останавливается мигание) после случайного количества времени, если он подключен к USB -порту ПК, но если я подключаю его к сокету питания, то это Пробежал всю ночь без проблем? Так что теперь я не знаю, была ли это испытательная установка, ПК или слепая удача, вызвав ошибки.

Я постараюсь получить время, чтобы проанализировать доску дома в выходные дни и посмотрю, не так ли.

С анализатором у меня теперь есть время, и общее время в Timer2 ISR составляет около 188us, хотя большая часть этого просто ждет времени сигнала перерыва, чтобы я мог уменьшить это за счет необходимости другого таймера.
По мере того, как Timer2 выходит, он устанавливает передачу DMA, и для отправки 512 байт DMX у меня требуется около 23 мс, поэтому с частотой кадров в 25 кадров в секунду у меня около 17 мс и даже для 30 кадров в секунду у меня было бы около 15 мс.

Рива
Солнце 12 февраля 2017 г. 9:32
victor_pv написал:Прокомментируйте все у вас есть вещи Serialusb, и попробуйте.
Я помню, что serialusb может заблокировать в течение периодов времени, если ничто на хосте не читает данные, возможно, это то, что происходит с вашим кодом.

Копирование чипа STM32