Slash 0 27 марта, 2009 Опубликовано 27 марта, 2009 · Жалоба Здравствуйте! Использую LPC2103, IAR 5.20, язык С. Есть функция: void Func (void) { DISABLE_INTERRUPT; /* некоторый код */ ENABLE_INTERRUPT; } Она может вызываться как из main(), так и из обработчика прерывания. Как описать разрешение/запрещение прерываний, чтобы в случае вызова из обработчика прерывания, при выходе прерывание не разрешалось? Я так понимаю, для этих целей нужно сохранять регистр CPSR, а потом его восстанавливать. Но у меня режим User (в основной программе). Что делать? Менять режим в cstartup на Supervisor? Или как-то по-другому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 27 марта, 2009 Опубликовано 27 марта, 2009 · Жалоба ... Или как-то по-другому? А почему DISABLE_INTERRUPT;/ENABLE_INTERRUPT; нельзя перед/после вызова делать когда нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Slash 0 27 марта, 2009 Опубликовано 27 марта, 2009 (изменено) · Жалоба Да, тоже вариант. Просто хотел сделать изящнее, да и код будет усеян DISABLE/ENABLE. Изменено 27 марта, 2009 пользователем Slash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 27 марта, 2009 Опубликовано 27 марта, 2009 · Жалоба Да, тоже вариант. Просто хотел сделать изящнее, да и код будет усеян DISABLE/ENABLE. Тогда вариант с define. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 28 марта, 2009 Опубликовано 28 марта, 2009 · Жалоба Я так понимаю, для этих целей нужно сохранять регистр CPSR, а потом его восстанавливать.Правильно понимаете.Но у меня режим User (в основной программе). Что делать? Менять режим в cstartup на Supervisor? Или как-то по-другому? Или так, или повесить функции разрешения/восстановления на swi - это медленее, но работает из любого режима. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Slash 0 29 марта, 2009 Опубликовано 29 марта, 2009 · Жалоба Спасибо! Пока остановлюсь на 1 варианте (осн. программа в Supervisor режиме), всегда не поздно будет уйти на второй вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 30 марта, 2009 Опубликовано 30 марта, 2009 (изменено) · Жалоба А чем плохо запрещать конкретные мешающие прерывания? Благо делать это можно в любом режиме :) Изменено 30 марта, 2009 пользователем esaulenka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Slash 0 30 марта, 2009 Опубликовано 30 марта, 2009 · Жалоба А чем плохо запрещать конкретные мешающие прерывания? Благо делать это можно в любом режиме :) При такой постановке задачи, как в 1 сообщении, можно получить разрешенные прерывания внутри обработчика прерывания, что плохо (когда не нужно :) ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 30 марта, 2009 Опубликовано 30 марта, 2009 · Жалоба Спасибо! Пока остановлюсь на 1 варианте (осн. программа в Supervisor режиме), всегда не поздно будет уйти на второй вариант. А почему не в System? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 30 марта, 2009 Опубликовано 30 марта, 2009 · Жалоба При такой постановке задачи, как в 1 сообщении, можно получить разрешенные прерывания внутри обработчика прерывания, что плохо (когда не нужно :) ) И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени? Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 30 марта, 2009 Опубликовано 30 марта, 2009 · Жалоба И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени? Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode. Если будете выключать прерывания в VICIntEnClr то можете потерять прерывание (имхо, по моим тестам). Если выключить все прерывания, то отложенные произойдут сразу по включению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Slash 0 31 марта, 2009 Опубликовано 31 марта, 2009 (изменено) · Жалоба А почему не в System? Просто посмотрел на других - коллега посоветовал и еще где-то увидел. Сейчас попробовал System, всё ок. И чего же плохого, если я буду записывать в VICIntEnable / VICintEnClr в произвольные моменты времени? Вложенных прерываний так получить не удастся (ибо бит в CPSR будет сброшен), и всё работает даже в user mode. Тоже может быть вариант, я пока не свободно владею всеми возможностями АРМа, делаю как увидел где-нибудь :) Изменено 31 марта, 2009 пользователем Slash Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 31 марта, 2009 Опубликовано 31 марта, 2009 · Жалоба делаю как увидел где-нибудь :) Тогда и будет работать "как-нибудь" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться