|
|
  |
STM32F407 + прерывание + время реакции, Меняется время реакции на внешнее событие |
|
|
|
Jul 27 2015, 08:04
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
Цитата(Timmy @ Jul 27 2015, 10:30)  Если вам надо обеспечить постоянное время реакции на фронт входного сигнала, то следует защёлкнуть этот фронт в capture unit, и привязать выходные сигналы к защёлкнутому времени таким образом, чтобы процессор всегда успевал среагировать. Правда, время реакции получится по-максимуму, зато стабильно. Ну, собственно, мой обработчик IRQ это и делает, только без использования capture unit. По наступлении события таймер сбрасываем, а потом, следя за его изменением, пишем в выходной порт данные из ОЗУ. Время между началом события и первым выходным импульсом = 10,5 мкс. За это время я успеваю многое пересчитать и даже запустить АЦП. Во всяком случае две трети времени от этих 10,5 мкс занимает цикл ожидания.
|
|
|
|
|
Jul 27 2015, 08:08
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(ШСА @ Jul 27 2015, 11:04)  Ну, собственно, мой обработчик IRQ это и делает, только без использования capture unit. По наступлении события таймер сбрасываем, а потом, следя за его изменением, пишем в выходной порт данные из ОЗУ. Время между началом события и первым выходным импульсом = 10,5 мкс. За это время я успеваю многое пересчитать и даже запустить АЦП. Во всяком случае две трети времени от этих 10,5 мкс занимает цикл ожидания. А нельзя ли по событию сделать DMA для сброса таймера и запуск обработки прерывания для вычислений? У DMA джиттер поменьше должен быть.
|
|
|
|
|
Jul 27 2015, 08:18
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
[quote name='Golikov A.' date='Jul 27 2015, 10:49' post='1354043'] Вроде это как раз гарантия создания повторного прерывания  Вложенные прерывания у вас исключает NVIC, а вот очищенный в конце флаг может вызвать прерывание повторно из-за конвейеров, Это для меня новость. NVIC не будет вызывать прерывания, пока я в обработчике не сброшу флаг своего вектора. А я это делаю в конце. Как может быть вложенный вызов? Опять же ускоритель флешь, если вы попадаете не на 16 на 32 битные команды то ему больше 4 команд не выбрать, а частота выборки команд у него в почти 8 раз меньше, так что скакнув прерыванием в не закишированную область, да еще и попав на 32 битную команду, у вас все здорово притормозится, Так прерывание, как непредсказуемое событие, в принципе не может быть закэшировано. Так что конвейер должен быть перезагружен. Потому у STM32F4 время реакции = 6-12 тактов. Вернее должно быть, а вот у меня бывает более 34-х!
|
|
|
|
|
Jul 27 2015, 08:29
|
Частый гость
 
Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205

|
QUOTE (ШСА @ Jul 27 2015, 11:18)  Так прерывание, как непредсказуемое событие, в принципе не может быть закэшировано. Так что конвейер должен быть перезагружен. Потому у STM32F4 время реакции = 6-12 тактов. Вернее должно быть, а вот у меня бывает более 34-х! Выборка 1 команды из флеш-памяти занимает 6 тактов процессора (для частоты 168МГц). При выполнении линейного куска кода флеш-акселератор скрывает эту задержку (потому что считывает по 128 бит). Когда происходит прерывание, флеш-акселератор помочь ничем не может и вы попадаете на максимальную задержку. Для начала попробуйте перенести в ОЗУ таблицу векторов - получите экономию 5 тактов минимум.
Сообщение отредактировал LightElf - Jul 27 2015, 08:34
|
|
|
|
|
Jul 27 2015, 08:31
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
Цитата(scifi @ Jul 27 2015, 11:08)  А нельзя ли по событию сделать DMA для сброса таймера и запуск обработки прерывания для вычислений? У DMA джиттер поменьше должен быть. Интересная мысль насчёт DMA. Как-то не думал о таком варианте. Вообще я DMA как-то побаиваюсь, потому что процессор может "уснуть" неизвестно когда. Но впрочем, это мои фобии. А джиттер в реальности слишком велик (34 такта - не кот чихнул), и блохи от DMA здесь не играют роли. Ведь главное - понять необычность ситуации: фоновая программа влияет на скорость вызова обработчика. Ведь она не привязана к внешним событиям, чего-то там себе считает и считает. А у обработчика при этом плавает время реакции! Да плавает-то как - в три раза превышает допуск!
|
|
|
|
|
Jul 27 2015, 08:40
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
Цитата(scifi @ Jul 27 2015, 11:29)  Неправда. Если между двумя прерываниями процессор крутится в маленьком цикле (как у вас при очистке памяти), то он может не успеть выбросить из кэша код обработчика прерывания. Тогда вход в обработчик прерывания будет быстрее. Кстати, это легко проверить: на выходе из прерывания нужно сбрасывать кэш, есть для этого соответствующий регистр. Интересная мысль!!! А ведь у меня при очистке памяти время реакции именно уменьшается! Чтобы мне не копаться, подскажите, как очистить кэш (желательно на языке СИ).
|
|
|
|
|
Jul 27 2015, 09:02
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
Цитата(Огурцов @ Jul 27 2015, 11:36)  флеш и кэш выше правильное предложение - выполнять из озу, работать будет медленнее, но гораздо стабильнее а ну да, можно загнать тактовую на 24 мгц с нулевым ожиданием и посмотреть на результат 24 МГц можно попробовать, чтобы не переделывать программу. С единственной целью убедиться в исчезновении этого явления. Жаль только, что будет много паяльных работ, т.к. тактовая частота МК в моей системе имеет критическое значение.
|
|
|
|
|
Jul 27 2015, 09:15
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
1. Можно отключить флэщ акселератор и тогда время будет стабильное, медленное, но стабильное. 2. По поводу Цитата так что конвейер должен быть перезагружен. Потому у STM32F4 время реакции = 6-12 тактов. Там не только в конвейере дело, а еще в сохранении контекста Цитата Это для меня новость. NVIC не будет вызывать прерывания, пока я в обработчике не сброшу флаг своего вектора. А я это делаю в конце. Как может быть вложенный вызов? 3.1 НВИК не будет повторно вызывать прерывание даже если вы сбросите в начале и оно опять случиться, пока не выйдете из этого прерывания повторный вызов того же приоритета не проихойдет 3.2. А вот сбрасывая флаг в конце вы имеете шанс выйти из прерывания до того как флаг реально сброситься, там что-то с конвейерами и перестановкой команд, и выйдя из прерывания НВИК ловит не сброшенный флаг и повторно входит в прерывание. Так что вложенного вызова не будет, а вот повторный вполне может быть.
|
|
|
|
|
Jul 27 2015, 09:52
|
Местный
  
Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335

|
Цитата(Golikov A. @ Jul 27 2015, 12:15)  1. Можно отключить флэщ акселератор и тогда время будет стабильное, медленное, но стабильное.
2. По поводу Там не только в конвейере дело, а еще в сохранении контекста
3.1 НВИК не будет повторно вызывать прерывание даже если вы сбросите в начале и оно опять случиться, пока не выйдете из этого прерывания повторный вызов того же приоритета не проихойдет 3.2. А вот сбрасывая флаг в конце вы имеете шанс выйти из прерывания до того как флаг реально сброситься, там что-то с конвейерами и перестановкой команд, и выйдя из прерывания НВИК ловит не сброшенный флаг и повторно входит в прерывание. Так что вложенного вызова не будет, а вот повторный вполне может быть. Это важно, я это изучу. Спасибо.
|
|
|
|
|
Jul 28 2015, 02:43
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Выключите сохранение контекста FPU при стэкинге (и резервирование места для него): FPCCR = 0;Цитата(ШСА @ Jul 27 2015, 14:40)  Интересная мысль!!! А ведь у меня при очистке памяти время реакции именно уменьшается! Чтобы мне не копаться, подскажите, как очистить кэш (желательно на языке СИ). Зачем его чистить? Перенесите ISR в ОЗУ как уже советовали. Причём начало его выровняйте на адрес, кратный размеру строки выборки команд CPU (вроде STM407 выбирает команды строками по 128байт). И таблицу векторов - тоже в ОЗУ. Лучше - в CCM. Но самое правильное решение - конечно использовать DMA, выставив ему приоритет доступа к шине выше чем CPU.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|