реклама на сайте
подробности

 
 
> Запрет прерываний при вызове функций, и их разрешение
arttab
сообщение Mar 13 2006, 02:46
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



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


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alechin
сообщение Mar 20 2006, 15:39
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 158
Регистрация: 27-06-05
Из: Химки, Моск.обл.
Пользователь №: 6 334



Запретить прерывания именно для функции (не обработчика прерывания) можно через __monitor перед именем функции. Правда тогда inline для нее выполняться не будет.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Mar 27 2006, 09:34
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Alechin @ Mar 20 2006, 18:39) *
Запретить прерывания именно для функции (не обработчика прерывания) можно через __monitor перед именем функции. Правда тогда inline для нее выполняться не будет.

Разве?
А если перед определением функции написать:
Код
#pragma inline=forced
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 29 2006, 09:42
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Дабы не плодить новых тем ещё один аналогичный вопрос... smile.gif

У меня несколько мелких прерываний и одно большое. Я хотел бы в большом разрешить прерывания (т.е. вызов маленьких). Когда я такое делал на asm, то я просто контролировал переменные/регистры. В С, если я правильно понимаю, достаточно просто разрешить прерывание __en_int. Так как при вызове используемые сохраняются в стеке. Или я не прав?
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 29 2006, 15:43
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(SasaVitebsk @ May 29 2006, 12:42) *
Или я не прав?


Уже вижу что не прав. В зависимости от точки вызова появляются ошибки.
Поясню подробнее, т.к. никто не ответил.

Прога. В ней два прерывания от таймера, ну и там от RS232... Одно из прерываний от таймера выполняется очень часто (регенерация экрана) и её нельзя запрещать. Во втором прерывании от таймера (выполняется на много реже) используются подпрограммы.
Как сделать что-бы "регенерация" вызывалась в ходе другого прерывания? Иными словами как данное прерывание объявить так, чтобы оно ничего не портило?

Очччччень жду ответа!
Go to the top of the page
 
+Quote Post
Old1
сообщение May 29 2006, 18:58
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095



Цитата(SasaVitebsk @ May 29 2006, 18:43) *
Цитата(SasaVitebsk @ May 29 2006, 12:42) *

Или я не прав?


Уже вижу что не прав. В зависимости от точки вызова появляются ошибки.
Поясню подробнее, т.к. никто не ответил.

Прога. В ней два прерывания от таймера, ну и там от RS232... Одно из прерываний от таймера выполняется очень часто (регенерация экрана) и её нельзя запрещать. Во втором прерывании от таймера (выполняется на много реже) используются подпрограммы.
Как сделать что-бы "регенерация" вызывалась в ходе другого прерывания? Иными словами как данное прерывание объявить так, чтобы оно ничего не портило?

Очччччень жду ответа!

ИМХО чтобы первое прерывание (регенерация экрана) не портило второе (которое выполняется намного реже) в обработчике первого прерывания нужно сохранить в стек вспомогательные регистры. Автоматически компилятор это делает если в обработчике прерывания вызывается функция (и если компилятор ее не inlin-ит). Поэтому, если содержимое обработчика первого прерывания поместить в функцию и при входе в первое прерывание ее вызывать, то возможно портиться ничего не будет, хотя конечно прерывание обрабатываться будет существенно дольше. Это только мысли, в натуре не проверял...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 29 2006, 19:47
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Old1 @ May 29 2006, 21:58) *
ИМХО чтобы первое прерывание (регенерация экрана) не портило второе (которое выполняется намного реже) в обработчике первого прерывания нужно сохранить в стек вспомогательные регистры. Автоматически компилятор это делает если в обработчике прерывания вызывается функция (и если компилятор ее не inlin-ит). Поэтому, если содержимое обработчика первого прерывания поместить в функцию и при входе в первое прерывание ее вызывать, то возможно портиться ничего не будет, хотя конечно прерывание обрабатываться будет существенно дольше. Это только мысли, в натуре не проверял...


Я просмотрел листинг и увидел что компилятор сохраняет только 6 регистров в этом прерывании. А использует значительно больше. Вот из-за этого всё и происходит .... Варианты с запретом не прокатывают, - нельзя его запрещать.
Спасибо за совет с п/п. А может слово какое-нибудь есть "волшебное" типа "рекурсия" smile.gif чтобы компилятор всё необходимое сам сохранил?
На счёт быстродействия я пока не парюсь. Пока вроде хватает его. А в дальнейшем данное прерывание на asm напишу. Но хочу чтобы вариант на С тоже принципиально работал.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение May 30 2006, 18:21
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(SasaVitebsk @ May 29 2006, 22:47) *
Я просмотрел листинг и увидел что компилятор сохраняет только 6 регистров в этом прерывании. А использует значительно больше. Вот из-за этого всё и происходит .... Варианты с запретом не прокатывают, - нельзя его запрещать.


Причина найдена. Не хочу никого вводить в заблуждения своими постами, поэтому описываю происходящее.
1) Компилятор ПОЛНОСТЬЮ сохраняет все используемые регистры. Поэтому при правильном написании программы можно делать вложенные прерывания простой вставкой __enable_interrupt();.
2) Ошибка происходила из-за сравнения с константой, которая была объявлена в __eeprom. Данная ошибка в работе компилятора была уже где-то описана. Я даже скачал новую версию библиотеки, любезно предоставленную, по-моему Igor Kossak (В случае ошибки прошу меня извинить). По видимому просто скачать и заменить её в каталоге было не достаточно. Может её оттранслировать необходимо было? Чтобы она в объектном виде лежала. Буду разбираться, хотя сейчас так это не ко времени.
3) Всётаки С "убивает" или "притупляет" чуство камня. Объявил в ЕЕПРОМе и работаю себе.... Фигня что не эффективно всё это... smile.gif
Придётся перелопатить прогу на предмет переноса широкоиспользуемых констант из ЕЕПРОМ в ОЗУ.

Кстати IgorKossak, если Вы увидите этот пост поясните пожалуйста как использовать Ваш файл. Я думаю многим это поможет избежать моих ошибок.

Сообщение отредактировал SasaVitebsk - May 30 2006, 18:40
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- arttab   Запрет прерываний при вызове функций   Mar 13 2006, 02:46
- - dxp   Цитата(arttab @ Mar 13 2006, 08:46) В мое...   Mar 13 2006, 06:56
|- - IgorKossak   Цитата(dxp @ Mar 13 2006, 08:56) ... __en...   Mar 17 2006, 14:56
|- - dxp   Цитата(IgorKossak @ Mar 17 2006, 20:56) Ц...   Mar 20 2006, 09:03
- - arttab   Искузми, не указал. Да глобальное прерывание выклю...   Mar 13 2006, 08:10
|- - oleg111   Цитата(SasaVitebsk @ May 29 2006, 22:43) ...   May 29 2006, 16:57
|- - SasaVitebsk   Что ещё настораживает, что записи у меня не было...   May 31 2006, 09:30
- - arttab   Не все просто с разрерением прерываний в прерывани...   May 30 2006, 06:50


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 09:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016