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

 
 
> Запрет прерываний при вызове функций, и их разрешение
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

Сообщений в этой теме
- 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   Цитата(SasaVitebsk @ May 29 2006, 22:47) ...   May 30 2006, 18:21
|- - SasaVitebsk   Что ещё настораживает, что записи у меня не было...   May 31 2006, 09:30
- - arttab   Не все просто с разрерением прерываний в прерывани...   May 30 2006, 06:50


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

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 01:45
Рейтинг@Mail.ru


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