Вопросы по С/С++ (СИ)
Мне думается, что, cli() и sei() внутри ISR - лишнее.
- Реклама
Вот, вот! Существуют разные мнения на сей счет. Остановка прерывания внутри прерывания. Типа того "а вдруг бы чего не вышло не того". Ко мне давно подкрадывался этот вопрос. И, все таки я так же считаю cli() и sei() внутри ISR - лишними. К тому же где то находил убедительные разъяснения по этому поводу.
Я называю это "Копипастинг кусает за пятки".
Я называю это "Копипастинг кусает за пятки".
cli() внутри ISR, вероятнее всего лишнее, а вот sei() может быть оправдано.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3765069#p3765069"]а вот sei() может быть оправдано.[/uquote]А можно узнать, как тогда вы попадаете в прерывание, если они у вас были запрещены? 
любознательность - это очень похвально!VladislavS писал(а):А можно узнать, как тогда вы попадаете в прерывание, если они у вас были запрещены?
в обработчик прерывания я попадаю уже при запрещенных прерываниях, хотя до момента установки флага запроса прерывания они были разрешены
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
такое может понадобиться, если есть необходимость, чтобы другое прерывание (более важное) могло прервать ход выполняемого прерывания.ARV писал(а):а вот sei() может быть оправдано.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Частный случай;С внешнего прерывания считаем (инкрементируем) импульсы. Далее, через определенный период тиков, установленных в таймере-компараторе, подаем их на цифровой дисплей, обнуляем инкремент. Сначала я тренировался на чипе MAX7219, но и с 74HC595 так же считаю необходимым подружиться. А в ISR(TIM0_COMPA_vect){ /* необходимо добавить немного if-ов для усреднения значений */}. Ну и какое из прерываний кого хочет перебороть? Да вроде бы всё мирно должно быть.
Код: Выделить всё
ISR(INT0_vect)//External Interrupt
{
ips++;//На порт PB2 подаем импульсы _П_П_П_П_П_
};
ISR(TIM0_COMPA_vect)//прерывание по совпадению
{
MAX7219_display_number(ips);//выводим на дисплей цифры
ips=0;
};- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3765088#p3765088"]в обработчик прерывания я попадаю уже при запрещенных прерываниях, хотя до момента установки флага запроса прерывания они были разрешены[/uquote]Уже начал забывать это как страшный сон 
-->приоритет прерываний AVR. Пока для меня этот вопрос не столь актуален. Если что, подкуюсь теорией и Гугли. 
Внутри ISR() прерывания запрещены и так, так что cli() не нужен. Равно как и sei() в конце - после выхода из обработчика прерывания и без этого включатся.
А вот если нужно неблокирующее прерывание (так, чтобы другие были разрешены), есть ISR_NOBLOCK:
avr-libc обо всём позаботится.
А вот если нужно неблокирующее прерывание (так, чтобы другие были разрешены), есть ISR_NOBLOCK:
Код: Выделить всё
ISR(TIM0_COMPA_vect, ISR_NOBLOCK)ISR_NOBLOCK не совсем то же самое, что и sei() внутри обработчика. все дело в моменте разрешения прерываний: макрос делает это сразу после входа, а самодобавленный sei() - когда надо программисту.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Разрешение прерываний внутри прерывания наверное только в древних МК. Нормальный МК должен иметь контроллер прерываний поддерживающий вложенные прерывания и иметь возможность назначать приоритет вложенности. Тогда все действия производятся аппаратно и можно выбрать какие прерывания могут прервать выполняемые на данный момент, а какие будут ожидать своей очереди. Это позволит точно быть уверенным в работе устройства.
например, любой из семейства MCS51, включая древность типа КР1816ВЕ31Мурик писал(а):Нормальный МК должен иметь контроллер прерываний поддерживающий вложенные прерывания и иметь возможность назначать приоритет вложенности
функционально разрешение прерываний внутри прерывания решает все ничуть не хуже, чем аппаратный контроллер, разве что на нескоько тактов дольше это длится.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
С ними не работал. Даташит или другую документацию где есть описание контроллера прерываний по быстрому найти не удалось. Так что не могу не подтвердить и не опровергнуть.ARV писал(а):например, любой из семейства MCS51, включая древность типа КР1816ВЕ31
Я не конкретизировал модель МК. У многих имеется подобный контроллер прерываний. Он точно есть в МК с ядром ARM (контроллер встроен в ядро).
У PIC (10, 12, 16) и AVR (тини, меги) вложенные прерывания не поддерживаются.
Во первых, при неправильно расчете прерывания могут выполнятся рекурсивно, что приведет к сбоям. Во вторых, разрешаются все прерывания, а если нужно разрешить только некоторые? Причем не программно выставляя флаги прерываний, а аппаратно выставляя приоритеты вложенности прерываний.ARV писал(а):функционально разрешение прерываний внутри прерывания решает все ничуть не хуже
это потому что очень древние МКМурик писал(а):Даташит или другую документацию где есть описание контроллера прерываний по быстрому найти не удалось
2 уровня приоритетов, независимые маски.Мурик писал(а):только в древних МК
если аппаратный контроллер не примет прерывание "при неправильном расчете, сбоев, разумеется не будетМурик писал(а):прерывания могут выполнятся рекурсивно, что приведет к сбоям
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Предположим имеются 8 источников прерываний (в реальном проекте их может быть гораздо больше).
Если же нет поддержки вложенных приоритетов прерываний и разрешать другие прерывания при входе в прерывание, может произойти более низкоприоритетное, которое не должно обрабатываться пока выполняется код высокроприоритетного. Контроль придется осуществлять программно, из-за чего усложнится код, увеличится время перехода в высокопроиоритетное прерывание и если произойдет низкоприоритетное, нужно будет думать как вернутся назад в вывокоприоритетное, а после его обработки перейти в низкоприоритетное. Когда таких прерываний десяток другой, разрулить будет не просто.
- 1 - внешнее прерывание, по которому нужно все отключить. Задержка недопустима, иначе электроника потеряет "белый дымок" и это в лучшем случае.
- 2 - внешнее прерывание которое нужно обработать с минимальной задержкой.
- 3 - прерывание от USART. Задержка не должна превышать времени поступления нового байта.
- 4 - прерывание от USB. Некоторая задержка допустима, но она приведет к снижению скрости обмена.
- 5 - прерывание от DMA. Некоторая задержка допустима.
- 6 - внешнее прерывание. Допустима задержка 1 мс.
- 7 - прерывание от таймера. Задержка допустима.
- 8 - прерывание от встроенного RTC. Допустима задержка до 1 секунды.
Если же нет поддержки вложенных приоритетов прерываний и разрешать другие прерывания при входе в прерывание, может произойти более низкоприоритетное, которое не должно обрабатываться пока выполняется код высокроприоритетного. Контроль придется осуществлять программно, из-за чего усложнится код, увеличится время перехода в высокопроиоритетное прерывание и если произойдет низкоприоритетное, нужно будет думать как вернутся назад в вывокоприоритетное, а после его обработки перейти в низкоприоритетное. Когда таких прерываний десяток другой, разрулить будет не просто.
ну, а кто тебе мешает в обработчике высокоприоритетного прерывания не ставить разрешение прерываний? не ставь - и оно не прервется.
ставь только в низкоприоритетном - и пусть оно прерывается другим прерыванием.
ставь только в низкоприоритетном - и пусть оно прерывается другим прерыванием.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 3386
- Зарегистрирован: Пн окт 11, 2010 19:00:08
А если больше одного приоритета? Выше пример с 8 уровнями приоритетов и это не придел. Может быть больше.
"Может быть" не равно "обязательно потребуется". Изобилие хорошо, но не самоцель. Случаи, когда это изобилие действительно необходимо, пожалуй, единичны, а когда оно вообще не востребовано, имхо, подавляющи.
Все это неоднократно было сказано во множестве тем: 80% потребителей необходимы только 20% предлагаемых продавцом возможностей.
Все это неоднократно было сказано во множестве тем: 80% потребителей необходимы только 20% предлагаемых продавцом возможностей.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


