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

blackfin 533 и прерывания

..Добрый вечер уважаемые - детский вопрос.

Если у меня BF533 и НЕвложенные прерывания , то пока работает обработчик какого-либо прерывания, другие в этот момент сработавшие - пропадают? Или срабатывают позже?

Спасибо.

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


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

Должны сработать позже, сразу после выхода из предыдущего.

На то и статусный бит который нужно сбрасывать в обработчике.

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


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

..Добрый вечер уважаемые - детский вопрос.

Если у меня BF533 и НЕвложенные прерывания , то пока работает обработчик какого-либо прерывания, другие в этот момент сработавшие - пропадают? Или срабатывают позже?

Спасибо.

Что значит "НЕвложенные"?

 

Когда возникает прерывание, если оно разрешено, то в СЕС взводится соответствующий бит в регистре IPEND. Если в регистре IMASK соответствующий бит маскирует этот источник, то запрос (pending) на прерывание так и будет "висеть" в регистре IPEND. Пока маска не будет снята. Надо иметь в виду, что СЕС у фина приоритетный вытесняющий, т.е. если возникает event (прерывание, отмапленное на этот уровень) с более высоким приоритетом, нежели обрабатываемое, то это обрабатываемое будет прервано точно так же, как будто это обычная программа (не обработчик).

 

Если имеется в виду то, что прерывания отмаплены на один и тот же уровень в CEC, то тогда нового прерывания не возникнет, но его флаг будет установлен. По выходу из обработчика будет переход на обработчик ожидающего прерывания. Флаги прерываний (в отличие от флагов IPEND) должны сбрасываться пользовательской программой.

 

Вообще, не очень понятна суть вопроса. В документации эти моменты освещены достаточно подробно и однозначно.

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


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

..я для себя открыл кроме:

EX_INTERRUPT_HANDLER () ещё и

EX_REENTRANT_HANDLER() - обработчик, и стал бояться что если у меня все обработчики как в первом случае , то есть шанс потерять прерывания, иначе я не понимаю зачем нужен второй тип обработчика.

 

цитата с просторов:

EX_INTERRUPT_HANDLER. В качестве параметра макроса указан текстовый идентификатор, который и будет именем созданной подпрограммы обработчика. Можно также использовать макрос EX_REENTRANT_HANDLER, который в отличие от первого позволяет вложенность прерываний (макрос EX_REENTRANT_HANDLER сразу разрешает внутри себя прерывания, что позволяет выполниться прерываниям с более высоким приоритетом). Подробнее про обработчики прерывания и про вложенность прерываний....

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


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

Что значит "НЕвложенные"?
Я сразу подумал что имеются ввиду nested interrupts.

Я всегда считал что вложенные прерывания в блекфине по-умолчанию запрещены, что при входе в прерывание все прерывания автоматически запрещаются.

Тут похоже не все однозначно.

Compiler and Library manual в разделе Defining an ISR страница 1-366 написано:

By default, ISRs generated by the compiler are not re-entrant; they disable

the interrupt system on entry, and re-enable it on exit. You may also

define ISRs for interrupts that are re-entrant, and which re-enable the

interrupt system soon after entering the ISR.

Насколько я понимаю тут написано что компилятор при входе в прерывание сует инструкцию запрета прерываний.

Соответственно вложенных прерываний возникать не будет. Но наверно это справедливо только если пишите на С под VDSP. Для GCC может быть по другому.

 

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

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


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

Я всегда считал что вложенные прерывания в блекфине по-умолчанию запрещены, что при входе в прерывание все прерывания автоматически запрещаются.

Тут похоже не все однозначно.

Compiler and Library manual в разделе Defining an ISR страница 1-366 написано:

Насколько я понимаю тут написано что компилятор при входе в прерывание сует инструкцию запрета прерываний.

Соответственно вложенных прерываний возникать не будет. Но наверно это справедливо только если пишите на С под VDSP. Для GCC может быть по другому.

Посмотрел HRM на проц. Однозначно указано, что при активизации прерывания взводится IPEND[4], что блокирует все прерывания. Если хочется их разрешить, то надо явно пихнуть регистр RETI в стек: [--SP] = RETI;, это сбрасывает IPEND[4]. Посмотрел кодогенерацию у ADI GCC, этой инструкции там нет. Значит, точно так же, надо явно это делать. Правда, какие средства для этого предусмотрены с уровня С/C++, не ясно. Кроме инлайн ассемблера ничо в голову не приходит.

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


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

не парься - все твои прерывания нужно просто распределить по приоритету

в этом случае если исполняется низкоприоритетное прерывание,

то при приходе высокоприоритетного - выполнение отложиться,

пока высокоприоритетное не будет выполнено

а по поводу вложенных - видимо идет речь о том же самом прерывании

то есть пока ты это прерывания не исполнишь - внутрь него снова не зайдешь.

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


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

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

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

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

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

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

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

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

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

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