реклама на сайте
подробности

 
 
> STM32F407 + прерывание + время реакции, Меняется время реакции на внешнее событие
ШСА
сообщение Jul 26 2015, 19:07
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Дорогие коллеги!
Сталкивался ли кто нибудь с такой тонкой и непонятной мне проблемой - значительным изменением времени входа в обработчик прерывания по внешнему событию в зависимости от команд, выполняемых в этот момент в основной программе?
Конкретная ситуация: В микроконтроллере STM32F407 в main-е крутится некая большая программа. Когда наступает внешнее событие, а именно - отрицательный фронт на EXTI_Line1, вызывается обработчик прерывания void EXTI1_IRQHandler(void). В нём обнуляется таймер TIM6, тактируемый частотой 84 МГц, и начинается вывод информации в виде набора импульсов, привязанных к значениям TIM6. Когда вывод закончен - выходим из обработчика (TIM6 оставляем молотить впустую).
Замечено следующее: Время от момента внешнего события до появления первого импульса на выходе нестабильно и меняется (по осциллографу) более чем на 0,2 мкс при тактировании ядра 168 МГц. Иными словами, время вызова обработчика может увеличиваться (или уменьшаться) аж на 34 такта! Причём меняется оно в зависимости от кода, выполняемого в данный момент в main-е. Самое большое изменение этого времени (в сторону уменьшения) происходит при выполнении (в main-е) цикла очистки области памяти:
for(i = 0; i < 60768; i++) *j++ = Сonst;

А согласно описанию на Cortex-3 время вызова обработчика прерывания составляет от 6 до 11 тактов ядра. И уж никак не должно зависеть от содержания прерываемой программы (DMA не используется)! wacko.gif

В чём причина этого явления и как с ним бороться?
Буду признателен за любые идеи или информацию.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jul 27 2015, 07:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата
Флаги очищаются в конце обработчика, так что вложенные прерывания исключены.

Вроде это как раз гарантия создания повторного прерыванияsm.gif Вложенные прерывания у вас исключает NVIC, а вот очищенный в конце флаг может вызвать прерывание повторно из-за конвейеров, нужны будут барьеры на выходе.

Опять же ускоритель флешь, если вы попадаете не на 16 на 32 битные команды то ему больше 4 команд не выбрать, а частота выборки команд у него в почти 8 раз меньше, так что скакнув прерыванием в не закишированную область, да еще и попав на 32 битную команду, у вас все здорово притормозится, а в след раз вы можете попасть уже в область выбранную и сохраненную в ускорителе, а потом вы ее можете почистить и так по кругу, так что у вас там есть где набрать нестабильность ИМХО...

Цитата
ремя входа в прерывание можно сократить, если использовать FIQ, а не IRQ, но его на большинстве кортексов нет.

Я могу ошибаться, но вроде как в кортексах уже NVIC, и потому деления на быстрое и медленное уже нет ни в большинстве, а во всех кортексах...
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 08:18
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



[quote name='Golikov A.' date='Jul 27 2015, 10:49' post='1354043']
Вроде это как раз гарантия создания повторного прерыванияsm.gif Вложенные прерывания у вас исключает NVIC, а вот очищенный в конце флаг может вызвать прерывание повторно из-за конвейеров,

Это для меня новость. NVIC не будет вызывать прерывания, пока я в обработчике не сброшу флаг своего вектора. А я это делаю в конце. Как может быть вложенный вызов?

Опять же ускоритель флешь, если вы попадаете не на 16 на 32 битные команды то ему больше 4 команд не выбрать, а частота выборки команд у него в почти 8 раз меньше, так что скакнув прерыванием в не закишированную область, да еще и попав на 32 битную команду, у вас все здорово притормозится,

Так прерывание, как непредсказуемое событие, в принципе не может быть закэшировано. Так что конвейер должен быть перезагружен. Потому у STM32F4 время реакции = 6-12 тактов. Вернее должно быть, а вот у меня бывает более 34-х!
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 27 2015, 08:29
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ШСА @ Jul 27 2015, 11:18) *
Так прерывание, как непредсказуемое событие, в принципе не может быть закэшировано.

Неправда. Если между двумя прерываниями процессор крутится в маленьком цикле (как у вас при очистке памяти), то он может не успеть выбросить из кэша код обработчика прерывания. Тогда вход в обработчик прерывания будет быстрее. Кстати, это легко проверить: на выходе из прерывания нужно сбрасывать кэш, есть для этого соответствующий регистр.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 08:40
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(scifi @ Jul 27 2015, 11:29) *
Неправда. Если между двумя прерываниями процессор крутится в маленьком цикле (как у вас при очистке памяти), то он может не успеть выбросить из кэша код обработчика прерывания. Тогда вход в обработчик прерывания будет быстрее. Кстати, это легко проверить: на выходе из прерывания нужно сбрасывать кэш, есть для этого соответствующий регистр.


Интересная мысль!!! А ведь у меня при очистке памяти время реакции именно уменьшается!
Чтобы мне не копаться, подскажите, как очистить кэш (желательно на языке СИ).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 28 2015, 02:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Выключите сохранение контекста FPU при стэкинге (и резервирование места для него): FPCCR = 0;

Цитата(ШСА @ Jul 27 2015, 14:40) *
Интересная мысль!!! А ведь у меня при очистке памяти время реакции именно уменьшается!
Чтобы мне не копаться, подскажите, как очистить кэш (желательно на языке СИ).

Зачем его чистить? Перенесите ISR в ОЗУ как уже советовали. Причём начало его выровняйте на адрес, кратный размеру строки выборки команд CPU
(вроде STM407 выбирает команды строками по 128байт). И таблицу векторов - тоже в ОЗУ. Лучше - в CCM.

Но самое правильное решение - конечно использовать DMA, выставив ему приоритет доступа к шине выше чем CPU.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 28 2015, 10:09
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(jcxz @ Jul 28 2015, 05:43) *
Выключите сохранение контекста FPU при стэкинге (и резервирование места для него): FPCCR = 0;

Зачем его чистить? Перенесите ISR в ОЗУ как уже советовали. Причём начало его выровняйте на адрес, кратный размеру строки выборки команд CPU
(вроде STM407 выбирает команды строками по 128байт). И таблицу векторов - тоже в ОЗУ. Лучше - в CCM.

Но самое правильное решение - конечно использовать DMA, выставив ему приоритет доступа к шине выше чем CPU.


Вы меня своим заявлением слегка контузили.
Я не знаю что такое контекст FPU и стэкинг. Аппаратный FPU (Floating Point Unit) у меня включён, и выключать его нельзя. Это всё, что я знаю про FPU.
Использовать DMA - что я выиграю, и главное - сколько? Ведь фаза выходного импульса плавает аж на 34 такта!
Перенести ISR в ОЗУ мне кажется здравой идеей, сейчас я продумываю как её осуществить, чтобы себе не сильно напортить.

Ребята! Давайте договоримся - если у кого есть идея, излагайте в таком порядке:
1. Гипотеза, объясняющая природу этого явления, а именно - каким образом фоновая программа может влиять на время реакции на внешнее событие, да ещё в таких масштабах;
2. Способ или механизм исключения или компенсации этих задержек;
3. Конкретные рекомендации;
В противном случае я вынужден по вашим рекомендациям гадать, в чём же заключается идея. А это плохо потому, что я не настолько глубоко знаю STM32F4, чтобы по намёку понять всё, что имелось в виду.
Кстати, если есть примеры как оформить ISR в ОЗУ, а тем более таблицу векторов в CCM, дайте ссылочку, чтобы мне поменьше пришлось наступать на грабли.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jul 28 2015, 11:33
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ШСА @ Jul 28 2015, 13:09) *
Ребята! Давайте договоримся - если у кого есть идея, излагайте в таком порядке:
1. Гипотеза, объясняющая природу этого явления...

А вы так и не попробовали дергать ногой в прерывании? Гипотеза в том, что у таймера есть предделитель и счетчик, которые (оба или один из них - вам читать в руководстве) могут перегружаться сразу, а могут, только, когда досчитают до конца. У вас как?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 28 2015, 12:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(ViKo @ Jul 28 2015, 14:33) *
А вы так и не попробовали...

У меня тоже некоторый осадок остался по поводу "не пробовали". Тут уже несколько предложений было, которые можно было бы проверить, но, похоже, аффтар просто мотает на ус и ждёт, когда волшебник в голубом вертолёте привезёт готовое решение...
А если пробовали, но результат отрицательный, всё равно озвучьте - интересно ведь.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ШСА   STM32F407 + прерывание + время реакции   Jul 26 2015, 19:07
- - aaarrr   Цитата(ШСА @ Jul 26 2015, 22:07) ...никак...   Jul 26 2015, 19:29
|- - ШСА   Цитата(aaarrr @ Jul 26 2015, 22:29) В нек...   Jul 27 2015, 05:46
|- - Огурцов   а если умножить на 5 тактов ожидания, то получится...   Jul 27 2015, 05:53
- - ViKo   Может, нестабильную задержку создает перезапуск та...   Jul 27 2015, 03:03
|- - ШСА   Цитата(ViKo @ Jul 27 2015, 06:03) Может, ...   Jul 27 2015, 06:09
||- - Огурцов   Цитата(ШСА @ Jul 27 2015, 06:09) Не понял...   Jul 27 2015, 08:36
||- - ШСА   Цитата(Огурцов @ Jul 27 2015, 11:36) флеш...   Jul 27 2015, 09:02
|- - AHTOXA   Мне кажется, что самый здравый совет был вот этот:...   Jul 27 2015, 08:35
- - aaarrr   Попробуйте сделать следующее: 1. Внешнее прерывани...   Jul 27 2015, 06:27
|- - ШСА   Цитата(aaarrr @ Jul 27 2015, 09:27) Попро...   Jul 27 2015, 06:41
|- - scifi   Вот тут расписано про задержку на входе в обработч...   Jul 27 2015, 06:49
|- - ШСА   Цитата(scifi @ Jul 27 2015, 09:49) Вот ту...   Jul 27 2015, 07:12
- - aaarrr   Интересно сравнить результаты при работе из флеш и...   Jul 27 2015, 06:52
|- - scifi   Цитата(aaarrr @ Jul 27 2015, 09:52) 2. Пр...   Jul 27 2015, 07:00
|- - aaarrr   Цитата(scifi @ Jul 27 2015, 10:00) Можно ...   Jul 27 2015, 07:04
- - Timmy   Цитата(ШСА @ Jul 26 2015, 22:07) Дорогие ...   Jul 27 2015, 07:30
|- - ШСА   Цитата(Timmy @ Jul 27 2015, 10:30) Если в...   Jul 27 2015, 08:04
|- - scifi   Цитата(ШСА @ Jul 27 2015, 11:04) Ну, собс...   Jul 27 2015, 08:08
|- - ШСА   Цитата(scifi @ Jul 27 2015, 11:08) А нель...   Jul 27 2015, 08:31
|||- - scifi   Цитата(ШСА @ Jul 27 2015, 11:40) Интересн...   Jul 27 2015, 08:59
|||- - aaarrr   Цитата(jcxz @ Jul 28 2015, 05:43) Перенес...   Jul 28 2015, 06:37
|||- - scifi   Цитата(ШСА @ Jul 28 2015, 13:09) Ведь фаз...   Jul 28 2015, 10:37
||||- - ШСА   Цитата(scifi @ Jul 28 2015, 13:37) А это ...   Jul 28 2015, 12:17
|||- - jcxz   Цитата(ШСА @ Jul 28 2015, 16:09) Я не зна...   Jul 28 2015, 12:33
|||- - ШСА   Цитата(jcxz @ Jul 28 2015, 15:33) Имхо - ...   Jul 28 2015, 13:03
|||- - jcxz   Цитата(ШСА @ Jul 28 2015, 19:03) Интересн...   Jul 29 2015, 03:03
|||- - SasaVitebsk   Цитата(ШСА @ Jul 28 2015, 16:03) вывод до...   Jul 29 2015, 05:50
|||- - Сергей Борщ   Цитата(SasaVitebsk @ Jul 29 2015, 08:50) ...   Jul 29 2015, 07:38
|||- - jcxz   Цитата(Сергей Борщ @ Jul 29 2015, 13:38) ...   Jul 29 2015, 08:11
|||- - Tanya   Цитата(Сергей Борщ @ Jul 29 2015, 10:38) ...   Jul 29 2015, 08:33
|||- - ШСА   Цитата(Сергей Борщ @ Jul 29 2015, 10:38) ...   Jul 29 2015, 17:03
|||- - jcxz   Цитата(ШСА @ Jul 29 2015, 23:03) А вот с ...   Jul 30 2015, 05:09
|||- - ШСА   Наконец сегодня дошли руки проверить хоть какие-то...   Jul 30 2015, 17:13
|||- - jcxz   Цитата(ШСА @ Jul 30 2015, 23:13) Мораль: ...   Jul 31 2015, 02:35
|||- - SasaVitebsk   Цитата(ШСА @ Jul 30 2015, 20:13) Мораль: ...   Jul 31 2015, 04:46
|||- - ШСА   Цитата(SasaVitebsk @ Jul 31 2015, 07:46) ...   Jul 31 2015, 07:04
|||- - scifi   Цитата(ШСА @ Jul 31 2015, 10:04) А вот то...   Jul 31 2015, 08:05
|||- - jcxz   Цитата(scifi @ Jul 31 2015, 14:05) Возьми...   Jul 31 2015, 10:05
|||- - scifi   Цитата(jcxz @ Jul 31 2015, 13:05) Кстати ...   Jul 31 2015, 10:26
||- - LightElf   QUOTE (ШСА @ Jul 27 2015, 11:18) Так прер...   Jul 27 2015, 08:29
|- - zltigo   QUOTE (Golikov A. @ Jul 27 2015, 10:49) п...   Jul 28 2015, 09:17
- - Golikov A.   1. Можно отключить флэщ акселератор и тогда время ...   Jul 27 2015, 09:15
|- - ШСА   Цитата(Golikov A. @ Jul 27 2015, 12:15) 1...   Jul 27 2015, 09:52
- - Golikov A.   Справедливо...   Jul 28 2015, 09:49
- - Golikov A.   вы в какой среде пишите? Если в Keil, то для пере...   Jul 28 2015, 15:45
|- - ШСА   Цитата(Golikov A. @ Jul 28 2015, 18:45) в...   Jul 29 2015, 15:54
|- - jcxz   Цитата(ШСА @ Jul 29 2015, 21:54) В прерыв...   Jul 30 2015, 03:15
- - bugdesigner   А можно одно уточнение? У Вас таймер считает импул...   Jul 28 2015, 16:26
- - Golikov A.   любой проц можно поставить на жесткую времянку, то...   Jul 31 2015, 08:33
|- - ШСА   Цитата(Golikov A. @ Jul 31 2015, 11:33) А...   Jul 31 2015, 19:00
||- - aaarrr   Цитата(ШСА @ Jul 31 2015, 22:00) Значит, ...   Jul 31 2015, 19:11
||- - jcxz   Цитата(ШСА @ Aug 1 2015, 01:00) Но экспер...   Aug 1 2015, 06:10
||- - ШСА   Цитата(ШСА @ Jul 31 2015, 22:00) Но экспе...   Aug 2 2015, 18:05
||- - jcxz   Цитата(ШСА @ Aug 3 2015, 00:05) Чем больш...   Aug 3 2015, 03:58
||- - ШСА   Спасибо. Но ведь и здесь пока есть варианты, напри...   Aug 3 2015, 04:09
|- - ШСА   Цитата(Golikov A. @ Jul 31 2015, 11:33) л...   Aug 1 2015, 15:39
|- - aaarrr   Цитата(ШСА @ Aug 1 2015, 18:39) Четыре та...   Aug 1 2015, 16:56
|- - ШСА   Покажу, но уже не сегодня.   Aug 1 2015, 17:04
- - Golikov A.   набортная, на борту проца....   Jul 31 2015, 19:09
- - Golikov A.   ЦитатаНо эксперимент (критерий истины) показал, чт...   Jul 31 2015, 19:18
|- - ШСА   Цитата(Golikov A. @ Jul 31 2015, 22:18) о...   Aug 1 2015, 16:47
- - Golikov A.   ассемблер тут не причем, человека беспокоит не вре...   Aug 1 2015, 07:10
|- - jcxz   Цитата(Golikov A. @ Aug 1 2015, 13:10) ас...   Aug 1 2015, 18:44
- - Golikov A.   Взять порт Взять маску Если ноль прыгнуть Прыгнуть...   Aug 1 2015, 18:05
|- - aaarrr   Цитата(Golikov A. @ Aug 1 2015, 21:05) Ма...   Aug 1 2015, 18:14
||- - ViKo   Цитата(aaarrr @ Aug 1 2015, 21:14) Загруз...   Aug 2 2015, 07:42
||- - aaarrr   Цитата(ViKo @ Aug 2 2015, 10:42) Кейл пок...   Aug 2 2015, 08:30
|- - ШСА   Цитата(Golikov A. @ Aug 1 2015, 21:05) Вз...   Aug 1 2015, 18:29
- - Golikov A.   Не вижу возможности вам не верить), а почему загру...   Aug 1 2015, 18:28
|- - aaarrr   Цитата(Golikov A. @ Aug 1 2015, 21:28) Не...   Aug 1 2015, 18:50
|- - GetSmart   Цитата(aaarrr @ Aug 1 2015, 22:50) Одиноч...   Sep 10 2015, 23:41
- - Golikov A.   Ваша правда, другое дело пока лдр искал, нашел что...   Aug 1 2015, 19:16
|- - jcxz   Когда дело доходит до подсчёта тактов при работе с...   Aug 1 2015, 21:18
- - Golikov A.   Мы же не знаем куда у вас там подключены ножки, и ...   Aug 3 2015, 05:50
|- - ШСА   Цитата(Golikov A. @ Aug 3 2015, 08:50) Мы...   Aug 3 2015, 07:32
- - Golikov A.   если 4 биты порта в памяти рядом (в пределах байта...   Aug 3 2015, 07:36
|- - ШСА   Ну да, а как иначе? В STM32F4 нет никаких видеосре...   Aug 3 2015, 07:46
- - Golikov A.   Ну ДМА может гнать по кругу, и оно имеет прерывани...   Aug 3 2015, 07:55
|- - ШСА   Цитата(Golikov A. @ Aug 3 2015, 10:55) Де...   Aug 3 2015, 08:22
- - Golikov A.   ДМА запускается по таймеру, таймер запускается по ...   Aug 3 2015, 08:57
|- - ШСА   Отлично. Спасибо.   Aug 3 2015, 09:08
- - aaarrr   Цитата(GetSmart @ Sep 11 2015, 02:41) Под...   Sep 11 2015, 10:22
|- - GetSmart   Цитата(aaarrr @ Sep 11 2015, 14:22) Corte...   Sep 11 2015, 14:26
|- - aaarrr   Цитата(GetSmart @ Sep 11 2015, 17:26) Дру...   Sep 11 2015, 14:54
- - GetSmart   Время до сих пор не нашёл для полноценного тестиро...   Sep 21 2015, 12:25
|- - ШСА   Цитата(GetSmart @ Sep 21 2015, 15:25) Вре...   Sep 23 2015, 19:32
|- - GetSmart   Цитата(ШСА @ Sep 23 2015, 23:32) Тестиров...   Sep 23 2015, 19:39
- - GetSmart   Потестил на LPC4357 и LPC11U37/501. У обоих ядра M...   Oct 25 2015, 08:54
|- - GetSmart   Цитата(GetSmart @ Oct 25 2015, 12:54) У п...   Oct 26 2015, 11:57
- - GetSmart   Проверил ещё на LPC1227 (M0+ r0p0). Этого эффекта ...   Oct 29 2015, 19:20
- - GetSmart   Цитата(GetSmart @ Oct 29 2015, 23:20) Про...   Nov 5 2015, 17:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01645 секунд с 7
ELECTRONIX ©2004-2016