Перейти к содержанию
    

вложенные прерывания - архитектура

Здравствуйте !

 

Подскажите пожалуйста, какие архитектуры поддерживают вложенные прерывания

 

В моем понимании только MIPS...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Cortex-A (GIC), Cortex-M (NVIC), RISC-V (PLIC) - все три проверено - поддерживают

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С таким уровнем смысла в вопросе ответ тоже будет вполне однозначный - вложенные прерывания поддерживаются в любой архитектуре.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Arlleex said:

С таким уровнем смысла в вопросе ответ тоже будет вполне однозначный - вложенные прерывания поддерживаются в любой архитектуре.

Хотите сказать что это чисто программный вопрос?, - обработать прерывание в прерывании???

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контроллеры прерываний в современной технике обычно поддерживают вложенность, на некоторых архитектурах требуются программные извращения (Cortex-A) для поддержки вложенности.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, GenaSPB said:

Контроллеры прерываний в современной технике обычно поддерживают вложенность, на некоторых архитектурах требуются программные извращения (Cortex-A) для поддержки вложенности.

 

А эти извращения где нужно проводить?, в каждом обработчике?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, addi II said:

в каждом обработчике?

Не обязательно, может быть общий wrapper.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а что такое wrapper?, это общий обработчик?, в нем нужно что-то делать с теневыми регистрами и со стеком на асме(тоесть сохранять контекст и далее востанавливать)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, addi II said:

это общий обработчик?

Да, общий обработчик.

 

37 minutes ago, addi II said:

в нем нужно что-то делать с теневыми регистрами и со стеком на асме(тоесть сохранять контекст и далее востанавливать)?

Совершенно верно - сохранять и восстанавливать контекст для каждого нового уровня вложенности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, а по какому адресу его располагать?

В моем случае векторной режим - есть базовый адрес 0x200 и далее относительно этого адреса идут аппаратные и программные прерывания

Грубо говоря каждый обработчик находиться в ОЗУ по определенному адресу и далее джампиться в область кода. Используется режим внешнего контроллера прерываний, так называемый EIC, в MIPS

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, addi II said:

по какому адресу его располагать?

Странный вопрос. По любому допустимому.

 

22 minutes ago, addi II said:

Грубо говоря каждый обработчик находиться в ОЗУ по определенному адресу и далее джампиться в область кода

Ну вот, а могут переходить в общую обертку, которая на основании данных из контроллера прерываний передаст управление нужному обработчику. Из плюсов - некоторая экономия памяти и единый обработчик, минус - проигрыш по производительности.

 

Но, как ранее уже замечали, вложенные прерывания следует вводить только если на 100% уверены в правильности этого подхода и хорошо знакомы с целевой архитектурой. В противном случае вероятность выстрелить себе в ногу очень высока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, теперь более или менее понятно, спасибо!

 

Тогда вопрос на засыпку)), а если будет использоваться FreeRTOS, как  привязать кон тексты прерываний(с общей оберткой wrapper - сохранения контекста прерывания) и задач?, или что-то еще?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ARM CortexM, ставящийся на микроконтроллеры STM32, работает в паре с контроллером вложенных прерываний NVIC, который самостоятельно разруливает поступающие прерывания в соответствии с  настройками приоритетов прерываний. Для программиста вложенности прерываний незаметны, однако программист может назначить приоритеты и определить возможности "вложиваний" одних в другие прерывания.

Если используете FreeRTOS, то тщательно прочитайте еёйный мануал, ибо там есть тонкости в вопросе прерываний при работе на ядре Кортекс. В частности, там есть специальные ф-ции API FreeRTOS с суффиксом _ISR, разрешенные для применения в прерываниях. И есть еще настраиваемый порог (забыл как точно называется, в последних версиях они изменили название) приоритета прерываний для использования API FreeRTOS в обработчиках прерываний. В двух словах: прерывания с приоритетом выше установленного порога не должны использовать функции API FreeRTOS.

Изменено пользователем Variant99

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, addi II said:

Тогда вопрос на засыпку)), а если будет использоваться FreeRTOS, как  привязать кон тексты прерываний(с общей оберткой wrapper - сохранения контекста прерывания) и задач?, или что-то еще?

Если будет использоваться FreeRTOS, рекомендую не морочить голову, а реализовать threaded irq - обработчик прерывания просто будит свой тред, в котором реализуется основная часть процедуры. Тут и вложенность и приоритеты автоматом получатся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

46 minutes ago, Variant99 said:

ARM CortexM, ставящийся на микроконтроллеры STM32, работает в паре с контроллером вложенных прерываний NVIC, который самостоятельно разруливает поступающие прерывания в соответствии с  настройками приоритетов прерываний. Для программиста вложенности прерываний незаметны, однако программист может назначить приоритеты и определить возможности "вложиваний" одних в другие прерывания.

Если используете FreeRTOS, то тщательно прочитайте еёйный мануал, ибо там есть тонкости в вопросе прерываний при работе на ядре Кортекс. В частности, там есть специальные ф-ции API FreeRTOS с суффиксом _ISR, разрешенные для применения в прерываниях. И есть еще настраиваемый порог (забыл как точно называется, в последних версиях они изменили название) приоритета прерываний для использования API FreeRTOS в обработчиках прерываний. В двух словах: прерывания с приоритетом выше установленного порога не должны использовать функции API FreeRTOS.

 

Спасибо, а portyield как раз не делает сохранения контекста прерывания ? У меня схожая риск архитектура - mips, и как то мне ответили на сайте фриртоса что именно для мипса вложенные надо как- то по особенному обрабатывать.  Я посмотрел из файлов для портирования подобного случая больше всего подходит для правки ISR_support.h так кау раз происходит сохранение контекста прерывания, - portSaveContext

39 minutes ago, aaarrr said:

Если будет использоваться FreeRTOS, рекомендую не морочить голову, а реализовать threaded irq - обработчик прерывания просто будит свой тред, в котором реализуется основная часть процедуры. Тут и вложенность и приоритеты автоматом получатся.

Угу, спасибо, приблизительно понял 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...