Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отключение прерываний в режиме пользователя
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
igorenja
Доброе время суток, господа форумчане!
Вчера возникла необходимость запустить на железке сторожевой таймер. Контроллер LPC2146. Так вот чтобы установить в счетный регистр сторожевого таймера заданное значение необходимо в определенный регистр записать подряд две константы. В моей железке подряд записать получается редко, т.к. с частотой 44кГц срабатывает прерывание. После того как прерывание срабатывает в момент когда первая константа была записана в геристр управления сторожевого таймера, железка сбрасывается. Следовательно на время записи констант нуно отключить прерывания. Посмотрел как отключить прерывания и обнаружил что функции __disable_irq() и __enable_irq() в user mode не работают.... На форуме у Keil`a нашёл тему про то как используют software interrupt для того чтобы отключать прерывания.... Ну что то мне это не очень нравится. Потому как железка моя воспроизводит звук и не хотелось бы создать фазовый шум частоты дискретизации из-за того что появилась необходимость юзать сторожевой таймер....
Короче говоря проблему эту я решил, но вот просто интересно нет ли другого способа отключить прерывания в user mode.
KRS
Так используйте SYSTEM mode.
В LPC21xx ARM7 - там вообще нет преимуществ user mode, раз нужно запрещать прерывания лучше его не использовать.
Student Pupkin
Цитата(igorenja @ Dec 6 2009, 16:53) *
нет ли другого способа отключить прерывания в user mode.

Ну вроде как и не должно быть - User непривелегированный режим и доступ в "управляющим полям" (I,F,T, Mode[4:0]) региcтра статуса запрещен.
Цитата(igorenja @ Dec 6 2009, 16:53) *
Короче говоря проблему эту я решил

А не могли поделиться как? smile.gif
igorenja
Цитата(Student Pupkin @ Dec 6 2009, 21:09) *
А не могли поделиться как? smile.gif


В основном цикле с определённой периодичностью поднимаю флаг, а в обработчике fiq проверяю если флаг поднят, сбрасываю таймер.
sergeeff
Цитата(igorenja @ Dec 6 2009, 19:15) *
В основном цикле с определённой периодичностью поднимаю флаг, а в обработчике fiq проверяю если флаг поднят, сбрасываю таймер.


Ну и что хорошего в таком подходе? На самом деле прерывания как были разрешены, так и остаются разрешены, т.е. время на их обработку все равно теряется, да еще и глобальный флаг его (время) "отъедает". И в чем идея сидения в "user mode"? Если, конечно, процессор без толку крутится в каком-нибудь while(1), то может и так сойдет.
igorenja
Цитата(sergeeff @ Dec 7 2009, 13:11) *
Ну и что хорошего в таком подходе? На самом деле прерывания как были разрешены, так и остаются разрешены, т.е. время на их обработку все равно теряется, да еще и глобальный флаг его (время) "отъедает". И в чем идея сидения в "user mode"? Если, конечно, процессор без толку крутится в каком-нибудь while(1), то может и так сойдет.

Для данной конкретной железки хорошего в данном подходе то, что фазовых шумов частоты дискретизации не добавляется. Если первый пост прочитаете, задача изначально была сбрасывать сторожевой таймер, а не прерывания отключать. Вопрос как отключить прерывания возник в последствие.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.