Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/114: Рейтинг темы: голосов - 114, средняя оценка - 4.85
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
1

Изменение приоритетов прерываний в Atmega328p

02.01.2013, 14:46. Просмотров 21210. Ответов 55
Метки нет (Все метки)

Столкнулся с проблемой которая требует чтобы текущий обработчик прерывания отработал без прерывания своей работы более высокоприоритетным прерыванием.
Т.е. если в процессе обработки прерывания INT1, и частичного выполнения кода обработчика оного, внезапно произойдет прерывание INT0 (приоритет которого выше), то, насколько я знаю, обработчик INT1 будет прерван, запущен обработчик INT0, и только после выполнения кода оного, обработчик INT1 будет вызван для завершения вычислений.
Вызов cli() / sei() внутри текущего обработчика приводит к пропускам прерываний, а надо чтобы все прерывания обрабатывались без потерь после выполнения уже начатого. Иными словами нужен механизм, позволяющий задать нескольким (в моем случае 4) прерываниям либо равный приоритет, либо нечто, ставящее их в очередь в порядке появления.
Будьте добры, посоветуйте как решить данную задачу?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2013, 14:46
Ответы с готовыми решениями:

Изменение прерываний в AtMega48
Добрый день : Такой код в кратце ISR (INT0_vect) { z=0; PORTB = 0xFF; }ISR (INT1_vect)...

ATmega328P
Добрый день! Тщетно пытаюсь настроить UART в Proteus 7.0. #include <avr/io.h> #define F_CPU...

Уровни приоритетов, как правильно расставить?
В проекте, на F205, у меня задействованы: TIM2,3,4 CAN2TX, CAN2RX USORT2, USORT3, USORT6 в...

atmega328p и bootloader
Переделал boottooder, работающий с AvrProk, который был тут в уроках по avr под мегу 328. Создал...

Atmega328p + WT11i
Добрый день! Работаю над проектом по созданию устройств, общающихся между собой по Bluetooth. Встал...

55
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
02.01.2013, 15:24 2
Нашел частичный ответ:
Если началась обработка какого-нибудь прерывания, никакое другое не может быть вызвано, даже с большим приоритетом.
Но это не решает задачу выполнения обработчиков в порядке их появления, а не согласно векторам прерываний (приоритетам по дефолту).
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
02.01.2013, 16:05 3
Если началась обработка какого-нибудь прерывания, никакое другое не может быть вызвано, даже с большим приоритетом.
Это чушь. Достаточно в обработчиках прерываний вкл sei. По хорошему Вам нужно написать управляющую программу прерываниями - арбитр.
Который и будет решать , что и как обрабатывать , какие прерывания разрешать , какие ставить в очередь. Т.е. любое прерывание , сначало попадает к нему , затем уж в свой обработчик. А вот очена высоко приоритетные могут его и миновать.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
02.01.2013, 16:28 4
Можете привести пример арбитра, нет ли встроенных (готовых) механизмов аля "динамическая приоритезация"?
В рамках задачи речь идет о прерываниях INT0, INT1, PCINT0, PCINT2.
0
02.01.2013, 16:28
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
02.01.2013, 17:04 5
Это у меня на работе, примерчик то. И это целая история.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
02.01.2013, 18:02 6
Пошёл бы с другой стороны: в любом прерывании минимум движений и СРАЗУ выход, например установка флага. Дальше разруливать в обычном рабочем порядке. Мысля уже не прерываниями фирмы Атмел, а решаемой задачей и логикой работы изделия.
Иначе "стоя в гамаке"-стайл. Куулхацкерство через более или менее успешные попытки укусить себя за жо пятку => респект и уважуха полюбому, но...
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 00:31 7
Цитата Сообщение от YTYOUT
Это у меня на работе, примерчик то. И это целая история.
Можно было просто сказать "нет"...
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 00:36 8
Цитата Сообщение от _moysi
Пошёл бы с другой стороны: в любом прерывании минимум движений и СРАЗУ выход, например установка флага. Дальше разруливать в обычном рабочем порядке. Мысля уже не прерываниями фирмы Атмел, а решаемой задачей и логикой работы изделия.
Иначе "стоя в гамаке"-стайл. Куулхацкерство через более или менее успешные попытки укусить себя за жо пятку => респект и уважуха полюбому, но...
Благодарю за критику, но Ваш вариант давно опробован, но в силу высокочастотных событий, вызывающих прерывания сразу от нескольких источников этот вариант - херовый вариант...
Длительность вычислений более чем малая на фоне частоты конечных параметров, однако наложение событий в момент обработки несколько подсирает в задачу. Иначе говоря, результат вычислений одного параметра зависит от пары прерываний и связанных с ними вычислений. Не знаю даже как еще описать не вдаваясь в детали...
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
03.01.2013, 01:29 9
Цитата Сообщение от Momstir
Благодарю за критику, но Ваш вариант давно опробован, но в силу высокочастотных событий, вызывающих прерывания сразу от нескольких источников этот вариант - херовый вариант...
Длительность вычислений более чем малая на фоне частоты конечных параметров, однако наложение событий в момент обработки несколько подсирает в задачу. Иначе говоря, результат вычислений одного параметра зависит от пары прерываний и связанных с ними вычислений. Не знаю даже как еще описать не вдаваясь в детали...
Я не знаю может быть это бред. Если выполнять телодвижения не в обработчиках нужных вам прерываний, а скажем в обработчике прерывания по переполнению или по совпадению от таймера (с настройкой оного на более частое появление нежели другие), ловить флаги нужных вам прерываний и уже по этим флагам смотреть что делать дальше. Но здесь опять же может быть
Длительность вычислений более чем малая на фоне частоты конечных параметров, однако наложение событий в момент обработки несколько подсирает в задачу.
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
03.01.2013, 02:00 10
Цитата Сообщение от Momstir
надо чтобы все прерывания обрабатывались без потерь после выполнения уже начатого. Иными словами нужен механизм, позволяющий задать нескольким (в моем случае 4) прерываниям либо равный приоритет, либо нечто, ставящее их в очередь в порядке появления.
Здается мне, у вас очень длинные обработчики прерываний. Чтобы помочь вам, от вас нужны, по крайней мере, используемые прерывания, их обработчики и картинка в виде черного яшика с набором и параметрами входных воздействыий и выходных реакций, раз уж все так секретно и конкретизировать постановку задачи вы нке можете. Может статься, что при анализе выяснится необходимость замены контроллера на более мощный/быстродействующий, но ИМХО я высказал в первом предложении.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 02:27 11
Цитата Сообщение от stritsh
Я не знаю может быть это бред. Если выполнять телодвижения не в обработчиках нужных вам прерываний, а скажем в обработчике прерывания по переполнению или по совпадению от таймера (с настройкой оного на более частое появление нежели другие), ловить флаги нужных вам прерываний и уже по этим флагам смотреть что делать дальше. Но здесь опять же может быть
Это не бред.
Сейчас так и реализовано: в обработчиках производится фиксация времени прерывания и пара +- операций, остальные расчеты производятся последовательно для каждого датчика в отдельности с частотой отработки 100Гц (т.е. на каждое колесо частота обновления вычисляемого параметра = 25Гц). НО на расчет скорости оси (речь о приборе по обработке данных с датчиков АБС) влияют показания 2 датчиков одной оси.
Кроме того, при примерно одинаковой частоте следования событий, вызвавших прерывания ИНТ0 обрабатывает в очереди гараздо охотнее, чем РСИНТ2... А надо чтобы события обрабатывались в порядке возникновения, иначе говоря приоритеты у них одинаковые.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 02:34 12
Цитата Сообщение от STT
Здается мне, у вас очень длинные обработчики прерываний. Чтобы помочь вам, от вас нужны, по крайней мере, используемые прерывания, их обработчики и картинка в виде черного яшика с набором и параметрами входных воздействыий и выходных реакций, раз уж все так секретно и конкретизировать постановку задачи вы нке можете. Может статься, что при анализе выяснится необходимость замены контроллера на более мощный/быстродействующий, но ИМХО я высказал в первом предложении.
Текст прерывания (они все 4 - однотипные):
Код
ISR(INT0_vect)
{
uint32_t PRtime;
PR_State=!PR_State;
if (PR_State)
{
PRtime=micros();
PR_Interval=(PRtime-PR_Timing);
PR_Timing_=PR_Timing;
PR_Timing=PRtime;
if (PR_Interval>PA_Interval_Limit) PR_Interval=PA_Interval_Limit;
}
}
Далее производится циклический вызов одной из процедур расчета скорости оси, и ее код выглядит так:
Код
void CountSpeedPR()
{
// фиксация предыдущего значения скорости
PR_Speed_=PR_Speed;
// расчёт скорости правого ведомого колеса
PR_Speed=(PA_Ratio/PR_Interval);
// проверка достоверности показаний на низкой скорости
if (PR_Speed<LowSpeed) PR_Speed=0;
else if (PR_Speed<LowSpeed2) PR_Speed=I32shl((PR_Speed-LowSpeed),1);
// расчёт скорости ведомой оси
PA_Speed=I32shr((PL_Speed+PR_Speed),1);
// расчёт ускорения правого ведомого колеса
PR_Acceleration=(PR_Speed-PR_Speed_);
if (PR_Speed<LowSpeed) PR_Acceleration=0;
// расчёт ускорения ведомой оси
PA_Acceleration=I32shr((PL_Acceleration+PR_Acceleration),1);
// расчёт интервала ДСА
if (PA_Speed>0) PVSS_Interval=(VSS_Ratio/PA_Speed);
if (PVSS_Interval>62499) PVSS_Interval=62499;
}
Вызов процедур расчета (
// указатели на функции обработки скоростей колес
void (*StopControl[])()={StopControlPL,StopControlPR,StopControlAL,StopControlAR};
void (*CountSpeed[])()={CountSpeedPL,CountSpeedPR,CountSpeedAL,CountSpeedAR};
) выглядит примерно так (расположен в главном цикле):
Код
// расчёт скоростей
if ((IvimtMask&0x0100)==0x0100)
{
CountSpeed[CountIndex]();
++CountIndex;
CountIndex&=B00000011;
IvimtMask&=~0x0100;
}
Итого в процедурах расчета есть лишь 2 "тяжелые" матоперации-деления, в остальном же все ограничивается сложением/вычитанием либо побитовым смещением.
Буду рад свежим мыслям. :)
0
SOWushko
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 273
03.01.2013, 06:17 13
У AVR семейства MEGA просто не существует приоритетов прерываний. Если прерывания пришли одновременно или одно за другим, так что мы не успеваем их обрабатывать – вызываются первыми те, чей вектор имеет меньший адрес. (По сути в по порядковым номерам, это не приоритеты прерываний, хотя периодически их так обзывают). В итоге, если у вас могут случится два прерывания (пока вы находитесь в обработчике третьего), вы вообще никак не сможете определить что за чем пришло. Другими словами, если теоретически возможна ситуация, когда временные промежутки между тремя последовательными прерываниями менее 10-15 тактов процессора – Вы однозначно не сможете понять, кто за кем пришел. Нужно брать другой контроллер. Вы должны максимально сократить обработчик, а все остальные действия делать уже вне него. Общий диспетчер для всех 4-х прерываний это круто, но проблемы он не решит, если за время его работы может прийти пара новых прерываний.
Мне видится обработчик, в котором в некоторую переменную пишется текущее значение одного из таймеров и все. Даже флаги устанавливать не обязательно, если значение обновилось – значит оно новое, обрабатывайте. Можно и флаг установить, в зависимости от того хватает времени или нет… Итого, максимальная частота для ATmego328 – 20МГц, 10 тактов – 0,5мкс, если за это время может произойти более двух прерываний – значит контроллер не подходит для этой задачи. В противном случае – можно еще побороться.
Так же, определять, кто за кем пришел с точностью до такта на AVR можно используя прерывание «по захвату», но в данном чипе всего один канал…
0
stritsh
0 / 0 / 0
Регистрация: 28.12.2012
Сообщений: 161
03.01.2013, 10:06 14
Может кольцевой буфер спасет ситуацию?
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 13:16 15
Что будет содержать кольцо? Индекс/признак прерывания, который загоняется в текущий элемент массива, затем текущий инкрементируется и так далее? Если так, то теряется требуемая точность фиксации времени при большой частоте следования событий, особенно в случае одновременного срабатывания оных.
Судя по всему в рамках моего МК можно забыть об этой возможности и начинать ожидать доступный Ардуин на базе СТМ32 (ДУЕ пока довольно дорогой и не имеет ФПУ - уж если менять так менять :)).
0
swk
0 / 0 / 0
Регистрация: 22.10.2015
03.01.2013, 14:15 16
Цитата Сообщение от Momstir
Судя по всему в рамках моего МК можно забыть об этой возможности и начинать ожидать доступный Ардуин на базе СТМ32 (ДУЕ пока довольно дорогой и не имеет ФПУ - уж если менять так менять :)).
Если источников событий немного (2-3 шт), может оказаться проще отслеживать каждое своим простеньким контроллером. Обобщать потом уже готовые результаты.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 14:27 17
Цитата Сообщение от SWK
Цитата Сообщение от Momstir
Судя по всему в рамках моего МК можно забыть об этой возможности и начинать ожидать доступный Ардуин на базе СТМ32 (ДУЕ пока довольно дорогой и не имеет ФПУ - уж если менять так менять :)).
Если источников событий немного (2-3 шт), может оказаться проще отслеживать каждое своим простеньким контроллером. Обобщать потом уже готовые результаты.
Этот вариант требует куда большей интеграции, что вряд ли разумно в рамках задачи (чай не Буран в космос отправляю)...
Но это был бы самый лютый вариант решения - с этим даже не поспоришь...
0
stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
03.01.2013, 14:30 18
Momstir, уже и я задавал вопрос
Цитата Сообщение от STT
Чтобы помочь вам, от вас нужны, по крайней мере, используемые прерывания, их обработчики и картинка в виде черного яшика с набором и параметрами входных воздействыий и выходных реакций, .... Может статься, что при анализе выяснится необходимость замены контроллера на более мощный/быстродействующий
,и SOWushko подсчитал
Цитата Сообщение от SOWushko
максимальная частота для ATmego328 – 20МГц, 10 тактов – 0,5мкс, если за это время может произойти более двух прерываний – значит контроллер не подходит для этой задачи.
а вы так ничего не ответили. Перетирать тему, гадая на кофейной гуще, можно бесконечно. Одно дело, если все 4 прерывания типа INT0 или изменение состояния пина, совсем другое, если используются АЦП.
0
Momstir
0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 120
03.01.2013, 15:47 19
Частота следования событий (с запасом) - до 5КГц (в реале до 2.5-3КГц). Источников событий - 4.
Вычислений, производимых каждым из обработчиков буквально на мелочь (код указан выше), но моменты возникновений данных событий - абсолютно непредсказуемые, т.е. условно говоря даже все 4 события возможны почти одновременно (на столе в процессе отладки в качестве имитатора на парные ноги я пускал меиндр с одного и того же источника).
0
oordvork
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 9
05.01.2013, 10:57 20
Цитата Сообщение от Momstir
Цитата Сообщение от STT
Здается мне, у вас очень длинные обработчики прерываний.[...]
Текст прерывания (они все 4 - однотипные):
Код
ISR(INT0_vect)
{
uint32_t PRtime;
PR_State=!PR_State;
if (PR_State)
{
PRtime=micros();
PR_Interval=(PRtime-PR_Timing);
PR_Timing_=PR_Timing;
PR_Timing=PRtime;
if (PR_Interval>PA_Interval_Limit) PR_Interval=PA_Interval_Limit;
}
}
[bla-bla-bla]

Итого в процедурах расчета есть лишь 2 "тяжелые" матоперации-деления, в остальном же все ограничивается сложением/вычитанием либо побитовым смещением.
Буду рад свежим мыслям. :)
А вызов micros() в прерывании - это "легкая" операция?
0
05.01.2013, 10:57
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 10:57

Atmega328P. Шина I2c
Пытаюсь подключить к контроллеру Atmega328P датчик магнитного поля HMC5883l по шине I2c. Использую...

Atmega328p не работает PORTC???
Доброго всем времени суток! Не могу понять что за трабла такая, для теста подключил два...

Проблема с прерываниями на ATMega328P-PU
Код пишется в Atmel studyo. Плата Arduino UNO c ATMiko328P-PU. Заливаю hex файл через XToodir...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.