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

 
 
7 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> STM32F407 + прерывание + время реакции, Меняется время реакции на внешнее событие
ШСА
сообщение Jul 27 2015, 08:04
Сообщение #16


Местный
***

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



Цитата(Timmy @ Jul 27 2015, 10:30) *
Если вам надо обеспечить постоянное время реакции на фронт входного сигнала, то следует защёлкнуть этот фронт в capture unit, и привязать выходные сигналы к защёлкнутому времени таким образом, чтобы процессор всегда успевал среагировать. Правда, время реакции получится по-максимуму, зато стабильно.


Ну, собственно, мой обработчик IRQ это и делает, только без использования capture unit. По наступлении события таймер сбрасываем, а потом, следя за его изменением, пишем в выходной порт данные из ОЗУ. Время между началом события и первым выходным импульсом = 10,5 мкс. За это время я успеваю многое пересчитать и даже запустить АЦП. Во всяком случае две трети времени от этих 10,5 мкс занимает цикл ожидания.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 27 2015, 08:08
Сообщение #17


Гуру
******

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



Цитата(ШСА @ Jul 27 2015, 11:04) *
Ну, собственно, мой обработчик IRQ это и делает, только без использования capture unit. По наступлении события таймер сбрасываем, а потом, следя за его изменением, пишем в выходной порт данные из ОЗУ. Время между началом события и первым выходным импульсом = 10,5 мкс. За это время я успеваю многое пересчитать и даже запустить АЦП. Во всяком случае две трети времени от этих 10,5 мкс занимает цикл ожидания.

А нельзя ли по событию сделать DMA для сброса таймера и запуск обработки прерывания для вычислений? У DMA джиттер поменьше должен быть.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 08:18
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #19


Гуру
******

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



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

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


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 08:31
Сообщение #21


Местный
***

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



Цитата(scifi @ Jul 27 2015, 11:08) *
А нельзя ли по событию сделать DMA для сброса таймера и запуск обработки прерывания для вычислений? У DMA джиттер поменьше должен быть.


Интересная мысль насчёт DMA. Как-то не думал о таком варианте. Вообще я DMA как-то побаиваюсь, потому что процессор может "уснуть" неизвестно когда. Но впрочем, это мои фобии. А джиттер в реальности слишком велик (34 такта - не кот чихнул), и блохи от DMA здесь не играют роли.
Ведь главное - понять необычность ситуации: фоновая программа влияет на скорость вызова обработчика. Ведь она не привязана к внешним событиям, чего-то там себе считает и считает. А у обработчика при этом плавает время реакции! Да плавает-то как - в три раза превышает допуск!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 27 2015, 08:35
Сообщение #22


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Мне кажется, что самый здравый совет был вот этот:
Цитата(ViKo @ Jul 27 2015, 08:03) *
Задайте в прерывании дергание ножкой порта, для проверки.

Сначала надо уточнить, где именно возникает задержка, а уже потом выяснять её причину.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Огурцов
сообщение Jul 27 2015, 08:36
Сообщение #23


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



Цитата(ШСА @ Jul 27 2015, 06:09) *
Не понял кто кого ждёт

флеш и кэш
выше правильное предложение - выполнять из озу, работать будет медленнее, но гораздо стабильнее
а ну да, можно загнать тактовую на 24 мгц с нулевым ожиданием и посмотреть на результат


Сообщение отредактировал Огурцов - Jul 27 2015, 08:38
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 08:40
Сообщение #24


Местный
***

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



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


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


Гуру
******

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



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

Я углядел нужные биты в регистре FLASH_ACR. А дальше сами читайте, там вроде бы понятно написано.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 09:02
Сообщение #26


Местный
***

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



Цитата(Огурцов @ Jul 27 2015, 11:36) *
флеш и кэш
выше правильное предложение - выполнять из озу, работать будет медленнее, но гораздо стабильнее
а ну да, можно загнать тактовую на 24 мгц с нулевым ожиданием и посмотреть на результат


24 МГц можно попробовать, чтобы не переделывать программу. С единственной целью убедиться в исчезновении этого явления. Жаль только, что будет много паяльных работ, т.к. тактовая частота МК в моей системе имеет критическое значение.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jul 27 2015, 09:15
Сообщение #27


Гуру
******

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



1. Можно отключить флэщ акселератор и тогда время будет стабильное, медленное, но стабильное.

2. По поводу
Цитата
так что конвейер должен быть перезагружен. Потому у STM32F4 время реакции = 6-12 тактов.
Там не только в конвейере дело, а еще в сохранении контекста

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

3.1 НВИК не будет повторно вызывать прерывание даже если вы сбросите в начале и оно опять случиться, пока не выйдете из этого прерывания повторный вызов того же приоритета не проихойдет
3.2. А вот сбрасывая флаг в конце вы имеете шанс выйти из прерывания до того как флаг реально сброситься, там что-то с конвейерами и перестановкой команд, и выйдя из прерывания НВИК ловит не сброшенный флаг и повторно входит в прерывание.
Так что вложенного вызова не будет, а вот повторный вполне может быть.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Jul 27 2015, 09:52
Сообщение #28


Местный
***

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



Цитата(Golikov A. @ Jul 27 2015, 12:15) *
1. Можно отключить флэщ акселератор и тогда время будет стабильное, медленное, но стабильное.

2. По поводу Там не только в конвейере дело, а еще в сохранении контекста


3.1 НВИК не будет повторно вызывать прерывание даже если вы сбросите в начале и оно опять случиться, пока не выйдете из этого прерывания повторный вызов того же приоритета не проихойдет
3.2. А вот сбрасывая флаг в конце вы имеете шанс выйти из прерывания до того как флаг реально сброситься, там что-то с конвейерами и перестановкой команд, и выйдя из прерывания НВИК ловит не сброшенный флаг и повторно входит в прерывание.
Так что вложенного вызова не будет, а вот повторный вполне может быть.


Это важно, я это изучу. Спасибо.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 28 2015, 02:43
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 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
aaarrr
сообщение Jul 28 2015, 06:37
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(jcxz @ Jul 28 2015, 05:43) *
Перенесите ISR в ОЗУ как уже советовали. Причём начало его выровняйте на адрес, кратный размеру строки выборки команд CPU
(вроде STM407 выбирает команды строками по 128байт).

Для ОЗУ выравнивать ничего не нужно - выборка строками по 128 бит идет только из флеш.
Go to the top of the page
 
+Quote Post

7 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:10
Рейтинг@Mail.ru


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