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

 
 
> Понижение приоритета прерывания "на лету"?, Выход из прерывания без выхода из него.
KnightIgor
сообщение Feb 23 2011, 14:08
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Добрый день!

Предположим, имеется прерывание высокого приоритета. ISR (процедура обработки прерывания), обслужив быстренько себя (например, установив/сбросив флаги), должна затем запустить некоторый процесс. Запуск процесса предполагает каждый раз некую инициализацию, которая длится долго (например, расчеты). Таким образом, если вызвать процедуру запуска процесса непосредственно из ISR, то это будет блокировать всю систему. Конечно, можно установить в ISR лишь некий флажок, проанализировать его в синхронном цикле программы и оттуда запустить процесс. Идея, однако, в том, чтобы еще внутри ISR как бы сделать вид, что ISR завершена, и спокойно вызвать процедуру:

Код
void xxx_IRQn(void) {

// быстрое и короткое действие самообслуживания
..
// понижение "приоритета" до уровня основной программы
..
// вызов длительного действия, которое может быть прервано другими ISR
  InitSomeProcess();

// выход из ISR
..
}

Для тех, кто имел дело с 51-ми процессорами, там был такой трюк: в ISR можно вызвать (call) инструкцию RETI, что приводило к "переводу" системы на уровень приоритета основной программы, после чего выполнять действия, которые могли уже быть прерваны иными ISR:

Код
void  xxx_Vector(void)   interrupt INTERRUPT_XXXX

// быстрое и короткое действие самообслуживания
..
// понижение "приоритета" до уровня основной программы
  call _RETI

// вызов длительного действия, которое может быть прервано другими ISR
  InitSomeProcess();

// выход из ISR
_RETI: RETI
}


Предполагаю, что где-то надо покрутиться с NVIC. Но не соображу пока, как.

P.S. Извините, если разжевываю вопрос как для "чайников": зачастую читаю тут вопросы и не могу врубиться, а что же спрашивают и куда хотят. Кому все сразу понятно, читайте через строку wink.gif.

TIA
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Feb 23 2011, 17:35
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(KnightIgor @ Feb 23 2011, 16:08) *
Предположим, имеется прерывание высокого приоритета. ISR (процедура обработки прерывания), обслужив быстренько себя (например, установив/сбросив флаги), должна затем запустить некоторый процесс...


Это типичная схема вытеснения в RTOS. Работает идеально на всех современных архитектурах.

Оформляете свой процесс в виде задачи и ставите в его начале ожидание семафора.
В процедуре прерывания если нужно запустить процесс происходит восстановление не в контекст прерванной задачи, а в контекст задачи процесса, а именно в то место в ядре RTOS где задача вашего процесса остановилась в ожидания семафора.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Feb 23 2011, 20:57
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(AlexandrY @ Feb 23 2011, 18:35) *
Это типичная схема вытеснения в RTOS. Работает идеально на всех современных архитектурах.

Оформляете свой процесс в виде задачи и ставите в его начале ожидание семафора.
В процедуре прерывания если нужно запустить процесс происходит восстановление не в контекст прерванной задачи, а в контекст задачи процесса, а именно в то место в ядре RTOS где задача вашего процесса остановилась в ожидания семафора.

А если я не использую RTOS? Меня механизм как таковой интересует.
Go to the top of the page
 
+Quote Post
Aaron
сообщение Feb 24 2011, 07:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Цитата(KnightIgor @ Feb 23 2011, 23:57) *
А если я не использую RTOS? Меня механизм как таковой интересует.

я использую protothreads - как раз "готовый механизм без использования RTOS" sm.gif http://www.sics.se/~adam/pt/
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- KnightIgor   Понижение приоритета прерывания "на лету"?   Feb 23 2011, 14:08
- - _dem   А зачем так извращаться ? В конце концов, если та...   Feb 23 2011, 14:11
- - scifi   По-моему, описанное достигается очень просто: для ...   Feb 23 2011, 14:14
- - GetSmart   Для этих целей существуют софтовые прерывания. Им ...   Feb 23 2011, 14:24
|- - KnightIgor   Цитата(GetSmart @ Feb 23 2011, 15:24) Для...   Feb 23 2011, 14:58
- - GetSmart   В кортексах минимум 240 прерываний IRQ. обычно пер...   Feb 23 2011, 15:06
|- - scifi   Цитата(GetSmart @ Feb 23 2011, 18:06) В к...   Feb 23 2011, 15:45
- - GetSmart   Да ладно. Я читал о контроллере прерываний ядра Ко...   Feb 23 2011, 16:03
|- - scifi   Цитата(GetSmart @ Feb 23 2011, 19:03) Мож...   Feb 23 2011, 16:44
|- - KnightIgor   Цитата(GetSmart @ Feb 23 2011, 17:03) Да ...   Feb 24 2011, 09:42
|- - scifi   Цитата(KnightIgor @ Feb 24 2011, 12:42) О...   Feb 24 2011, 09:50
- - GetSmart   KnightIgor, с нечётными адресами всё так и должно ...   Feb 24 2011, 11:27
|- - KnightIgor   Цитата(GetSmart @ Feb 24 2011, 12:27) Kni...   Feb 24 2011, 11:38
- - GetSmart   Небольшое продолжение темы. Регистр NVIC->STIR ...   Jul 4 2013, 12:33


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:13
Рейтинг@Mail.ru


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