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

 
 
> Сохранение контекста в прерываниях, IAR
gladov
сообщение May 14 2008, 11:51
Сообщение #1


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

Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687



Да простят меня модераторы, если вопрос избитый, но всезнающий поиск вразумительного ответа мне не дал. А проблема, имхо, достаточно часто встречающаяся:

Имеем некоторое прерывание, которое должно автономно обработать некоторый блок данных и по окончании работы сообщить об этом основному софту. Например, рассмотрим отправку пакета по УАРТ.
Основную массу действий (а именно, выборку очередного байта из памяти и его отправку) прерывание делает своими силами, но, вот беда: когда оно закончит, оно должно вызвать некоторую функцию, которая должна просигнализировать основной программе о выполнении задания. Вариант с глобальной переменной отпадает сразу, т.к. ситуация гипотетическая и сигналом в данном случае может служить семафор или еще какие-либо средство РТОС. Естественно компилятор, видя в прерывании вызов внешней, неизвестной ему функции, далает сохранение кучи регистров в стек. Однако, если отправляемый пакет состоит из 1000 байтов, то 999 раз контекст сохранится зря и только последний раз, когда работа завершена, действительно необходимо слить регистры в стек и вызвать функцию - сигнал. Я хочу, чтобы контекст сохранялся только 1 раз из 1000, когда уже ясно, что необходим вызов внешней функции.

Пока единственное решение, приходящее мне в голову, это писать код прерывания на асме и сохранять регистры вручную не на входе в прерывание, а в ветке проверки условия окончания задания. Но что-то мне подсказывает, что этот вопрос можно решить директивами/ключевыми словами/intrinsic функциями/другими расширениями языка, не прибегая к полному написанию кода прерывания на асме. Только вот пока такой вариант в голову не приходит sad.gif

Подскажите, плз, кто и как избавляется от подобного оверхеда?

PS: Интересует решение для компилятора ИАР.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение May 14 2008, 18:10
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zltigo @ May 14 2008, 19:52) *
Естественно и в этом тоже - сначала неправильно глобально поставить задачу (1000 вызовов некой функции из одного прерывания!) а потом доблестно "c помощью ASM" и трюков ее решать sad.gif - к сожалению встречается очень часто sad.gif.


имхо автор всё очень внятно объяснил:

Цитата(gladov @ May 14 2008, 17:51) *
компилятор, видя в прерывании вызов внешней, неизвестной ему функции, далает сохранение кучи регистров в стек. Однако, если отправляемый пакет состоит из 1000 байтов, то 999 раз контекст сохранится зря и только последний раз, когда работа завершена, действительно необходимо слить регистры в стек и вызвать функцию - сигнал.


Вызов функции происходит не каждое прерывание, а сохранение контекста - каждое.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 14 2008, 19:56
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AHTOXA @ May 14 2008, 20:10) *
Вызов функции происходит не каждое прерывание, а сохранение контекста - каждое.

Это уже проблемы конкретного компилятора/платформы/оптимизации. Радикальное решение уже приводил - inline.

P.S.
Посмотрел, что творится на тестике c вызовом подпрограммы из обработчика пркрывания - честно говоря ужас sad.gif. При этом для того-же ARM генерится много более разумный код. Явные проблемы у AVR с соглашениями о вызове функций - чрезмерное количество регистров отдается в безраздельное использование вызываемой функции. В результате реальные функции, в том числе и обработчик прерывания, их все и близко не использует и при вызове действительно жуткая картина.

z.

Сообщение отредактировал zltigo - May 15 2008, 05:44


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Дон Амброзио
сообщение May 14 2008, 20:46
Сообщение #4


Местный
***

Группа: Участник*
Сообщений: 323
Регистрация: 11-02-08
Пользователь №: 34 947



Цитата(zltigo @ May 14 2008, 23:56) *
Это уже проблемы конкретного компилятора/платформы/оптимизации. Радикальное решение уже приводил - inline.

Проблема ещё в том, что нити бывают разные: с лёгким и тяжёлым контектстом... И сохранять весь контекст для облегчённой часто запусаемой нити крайне неэффективно. Тут надо подходить комплексно... И учитывать все аспекты проектируемой Вами RTOS

Сообщение отредактировал Дон Амброзио - May 14 2008, 20:49


--------------------
После устранения бага в программе она стала работать....хуже
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- gladov   Сохранение контекста в прерываниях   May 14 2008, 11:51
- - prottoss   Цитата(gladov @ May 14 2008, 19:51) Не по...   May 14 2008, 12:03
|- - gladov   ЦитатаНе понятно, для какой платформы вопрос. Дума...   May 14 2008, 12:56
|- - prottoss   Цитата(gladov @ May 14 2008, 20:56) Думал...   May 14 2008, 13:13
- - SasaVitebsk   Цитата(gladov @ May 14 2008, 15:51) Подск...   May 14 2008, 12:15
- - Палыч   Цитата(gladov @ May 14 2008, 14:51) Естес...   May 14 2008, 12:39
- - zltigo   Цитата(gladov @ May 14 2008, 13:51) Я хоч...   May 14 2008, 13:28
- - defunct   У AVR есть возможность отделить прерывание непреры...   May 14 2008, 13:35
|- - IgorKossak   Цитата(defunct @ May 14 2008, 16:35) У AV...   May 15 2008, 05:05
- - prottoss   Цитата(gladov @ May 14 2008, 19:51) Напри...   May 14 2008, 13:48
|- - zltigo   Цитата(prottoss @ May 14 2008, 15:48) Пох...   May 14 2008, 13:52
- - prottoss   может вот это поможет - комменты на русском. Драйв...   May 14 2008, 14:03
- - MrYuran   моё глубоко закоренелое ИМХО - не надо в прерывани...   May 15 2008, 05:42
- - zltigo   Цитата(MrYuran @ May 15 2008, 07:42) моё ...   May 15 2008, 05:53
- - Палыч   Цитата(zltigo @ May 15 2008, 08:53) Уточн...   May 15 2008, 06:36
- - zltigo   Цитата(Палыч @ May 15 2008, 08:36) Если.....   May 15 2008, 06:41
- - Rst7   Цитата(zltigo @ May 15 2008, 09:41) В дан...   May 15 2008, 16:46


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

 


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


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