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

Вдогонку... Не применяю указанный Вами транслятор для разработки программ для МК51. Но в этом МК предусмотрена такая "фишка" как переключение банков регистров, специально для уменьшения времени сохранения/восстановления контекста при обработке прерывания. В Кeil это переключение банков регистров можно активировать ключевым словом "using". Возможно, что и в IAR для МК51 есть что-то подобное...
MihailS
"Контекст прерывания" - что вы имеете ввиду? Значения рабочих регистров что-ли. Поясните пожалуйста.

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

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

Далее.

Исходник на функцию сохранения регистров в стек есть в IAR, смотрел, много думал...
Вообщем включил оптимизацию - он выкинул вызов этой функции, просто push 9 регистров, и всё в этой часте программы заработало.
НО! В другой части он выкинул немаловажный кусок и программе пришёл конец...
Подскажите чем компилятор руководствуется вызывать или не вызывать функцию сохранения регистров в стек?
Может есть способ как-то на него влиять.
Пока буду пробовать разобраться с переключением банков регистров.
demiurg_spb
Наверняка Ваш немаловажный кусок, который компилятор оптимизировал (причём совершенно правильно), был написан неверно.
Вернее не сам кусок кода с ошибкой, а переменные, которые использовались в этой части программы были не волатильными.
Вы про volatile вообще слышали? Если нет, то поищите по форуму - для Вас это будет решением.
MihailS
1. Кусок удалял он по пока неизвестной мне причине. Может он посчитал его бессмысленным:
....
Flag = 1;
while(Flag)
{
}
....

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

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


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

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

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

Что такое "функция оптимизации"?
DpInRock
Цитата
писать надо грамотно и всё будет ОК.

Вот-вот. Когда оптимизатор что-то важное удаляет - это четкий сигнал, что вы пишете неграмотно.
Т.е. не объясняете как следует компилятору свои действия.
И скорее всего вы вообще не обращаете внимания на варнинги. Угадал?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.