|
|
  |
Как запретить/разрешить прерывания?, В зависимости от режима процессора. LPC2103, IAR. |
|
|
|
Mar 27 2009, 22:21
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Здравствуйте! Использую LPC2103, IAR 5.20, язык С. Есть функция: Код void Func (void) { DISABLE_INTERRUPT;
/* некоторый код */ ENABLE_INTERRUPT; } Она может вызываться как из main(), так и из обработчика прерывания. Как описать разрешение/запрещение прерываний, чтобы в случае вызова из обработчика прерывания, при выходе прерывание не разрешалось? Я так понимаю, для этих целей нужно сохранять регистр CPSR, а потом его восстанавливать. Но у меня режим User (в основной программе). Что делать? Менять режим в cstartup на Supervisor? Или как-то по-другому?
|
|
|
|
|
Mar 28 2009, 09:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Slash @ Mar 28 2009, 00:21)  Я так понимаю, для этих целей нужно сохранять регистр CPSR, а потом его восстанавливать. Правильно понимаете. Цитата(Slash @ Mar 28 2009, 00:21)  Но у меня режим User (в основной программе). Что делать? Менять режим в cstartup на Supervisor? Или как-то по-другому? Или так, или повесить функции разрешения/восстановления на swi - это медленее, но работает из любого режима.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 30 2009, 09:49
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Цитата(esaulenka @ Mar 30 2009, 13:16)  А чем плохо запрещать конкретные мешающие прерывания? Благо делать это можно в любом режиме  При такой постановке задачи, как в 1 сообщении, можно получить разрешенные прерывания внутри обработчика прерывания, что плохо (когда не нужно  )
|
|
|
|
|
Mar 30 2009, 14:36
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Slash @ Mar 30 2009, 13:49)  При такой постановке задачи, как в 1 сообщении, можно получить разрешенные прерывания внутри обработчика прерывания, что плохо (когда не нужно  ) И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени? Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Mar 31 2009, 11:39
|
Местный
  
Группа: Участник
Сообщений: 202
Регистрация: 10-04-05
Из: Санкт-Петербург
Пользователь №: 4 011

|
Цитата(HARMHARM @ Mar 30 2009, 13:51)  А почему не в System? Просто посмотрел на других - коллега посоветовал и еще где-то увидел. Сейчас попробовал System, всё ок. Цитата(esaulenka @ Mar 30 2009, 18:36)  И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени?
Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode. Тоже может быть вариант, я пока не свободно владею всеми возможностями АРМа, делаю как увидел где-нибудь
Сообщение отредактировал Slash - Mar 31 2009, 11:42
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|