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

 
 
 
Reply to this topicStart new topic
> ?INTERRUPT_ENTER_SP - ЧТО ЭТО?, ?INTERRUPT_ENTER_SP - ЧТО ЭТО???
MihailS
сообщение Feb 20 2009, 08:12
Сообщение #1


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

Группа: Свой
Сообщений: 124
Регистрация: 28-01-08
Из: Красноярск
Пользователь №: 34 493



Пишу программу на С для ADuC831. В коде программы при входе в функцию обработки прерывания обнаруживаю
LCALL ?INTERRUPT_ENTER_SP
В коде пресутствует эта функция, она долго и мучительно сохраняет чего-то в стек.
Подскажите знающие люди, где на неё информацию достать (откуда взялась, зачем так а не так работает)?
Мне она очень мешает, поскольку очень сильно увеличивает время обработки подпрограммы.
Мне нужно как-то это время сократить.
Заранее благодарен!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 20 2009, 11:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(MihailS @ Feb 20 2009, 11:12) *
В коде программы при входе в функцию обработки прерывания обнаруживаю LCALL ?INTERRUPT_ENTER_SP
Функция сохраняет контекст прерывания. Описание её Вы вряд ли найдёте. Для ускорения работы обработчика прерывания - уже Вам отвечал: исключить из него все вызовы программ и функций...
Ещё совет - для МК51 использовать транслятор от Keil - остальные трансляторы для этих МК - ему проигрывают.

Вдогонку... Не применяю указанный Вами транслятор для разработки программ для МК51. Но в этом МК предусмотрена такая "фишка" как переключение банков регистров, специально для уменьшения времени сохранения/восстановления контекста при обработке прерывания. В Кeil это переключение банков регистров можно активировать ключевым словом "using". Возможно, что и в IAR для МК51 есть что-то подобное...
Go to the top of the page
 
+Quote Post
MihailS
сообщение Feb 27 2009, 04:29
Сообщение #3


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

Группа: Свой
Сообщений: 124
Регистрация: 28-01-08
Из: Красноярск
Пользователь №: 34 493



"Контекст прерывания" - что вы имеете ввиду? Значения рабочих регистров что-ли. Поясните пожалуйста.

Keil использовать не буду - я уже документации по IAR начитался и читаю дальше, а всё бросать как-то не хочется (даже если вы и правы).

Встречал в документации про переключение банков регистров, но поскольку не владею термином "контекст прерывания", не могу понять ваш совет. МОжно пожалуйста объяснить подробрее.

Далее.

Исходник на функцию сохранения регистров в стек есть в IAR, смотрел, много думал...
Вообщем включил оптимизацию - он выкинул вызов этой функции, просто push 9 регистров, и всё в этой часте программы заработало.
НО! В другой части он выкинул немаловажный кусок и программе пришёл конец...
Подскажите чем компилятор руководствуется вызывать или не вызывать функцию сохранения регистров в стек?
Может есть способ как-то на него влиять.
Пока буду пробовать разобраться с переключением банков регистров.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 27 2009, 08:10
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Наверняка Ваш немаловажный кусок, который компилятор оптимизировал (причём совершенно правильно), был написан неверно.
Вернее не сам кусок кода с ошибкой, а переменные, которые использовались в этой части программы были не волатильными.
Вы про volatile вообще слышали? Если нет, то поищите по форуму - для Вас это будет решением.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MihailS
сообщение Mar 3 2009, 16:18
Сообщение #5


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

Группа: Свой
Сообщений: 124
Регистрация: 28-01-08
Из: Красноярск
Пользователь №: 34 493



1. Кусок удалял он по пока неизвестной мне причине. Может он посчитал его бессмысленным:
....
Flag = 1;
while(Flag)
{
}
....

Переменная Flag изменяет своё значение в подпрограмме.

А причём тут volatile? Я как понимаю используется с переменными связанными с переферией...


2. По поводу ускорения работы обработки прерывания спасибо Палычу.
Действительно при прочтении документации на IAR я что-то читал про переключения банки регистров. Заглянул в док. чёрным - по белому:
переключение банков регистров при входе в подпрограмму обработки прерывания используется для ускорения его обработки. Добавил нужную строчку в код - и всё поехало!!!

Всётаки считаю использование функции оптимизации опасным, да и зачем - писать надо грамотно и всё будет ОК.
Go to the top of the page
 
+Quote Post
777777
сообщение Mar 3 2009, 16:50
Сообщение #6


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

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(MihailS @ Mar 3 2009, 19:18) *
А причём тут volatile? Я как понимаю используется с переменными связанными с переферией...

volatile указывает компилятору, что переменная может измениться "сама по себе" (на самом деле - в прерывании, но транслируя этот участок компилятор об этом не знает) - в приведенном фрагменте она, с точки зрения компилятора, измениться не может - ее ведь в цикле никто не меняет. С периферией она связана косвенно - порты также могут измениться сами по себе (уже в прямом смысле), поэтому они тоже volatile.
Цитата(MihailS @ Mar 3 2009, 19:18) *
Всётаки считаю использование функции оптимизации опасным, да и зачем - писать надо грамотно и всё будет ОК.

Что такое "функция оптимизации"?
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Mar 3 2009, 16:56
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Цитата
писать надо грамотно и всё будет ОК.

Вот-вот. Когда оптимизатор что-то важное удаляет - это четкий сигнал, что вы пишете неграмотно.
Т.е. не объясняете как следует компилятору свои действия.
И скорее всего вы вообще не обращаете внимания на варнинги. Угадал?


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:05
Рейтинг@Mail.ru


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