Добрый день.
В кратце опишу систему:
проц - SiLabs 8051f130 тип памяти - far MBYTE сидит на P4
Проблема в следующем. В программе использую XBANKING.a51 и соответствующую опцию use far memory. В связи с этим Keil в каждый обработчик добавляет асм строки по сохранению в стек значения ?C?XPAGE1SFR (адрес SFR=P4) и устанавливает в нее значение ?C?XPAGE1RST. Перед выходом из прерывания переменная ?C?XPAGE1SFR восстанавливается из стека. Это все хорошо - даже отлично. Но. Я использую timer2 и его контрол регистр TMR2CN с флагом прерывания TF2 сидит по адресу SFR 0xC8 на странице SFR = 0x00. При этом для MBYTE (как я уже сказал ранее) использую P4. Он находится по адресу SFR 0xC8, но на странице 0x0F. При вызове прерывания проц автоматически переходит на SFR страницу прерывания (если это таймер 2 то переключает SFRPAGE со страницы 0x0F на 0x00. А страницу 0x0F сохраняет) и соответственно Keilовские строки по сохранению в стек ?C?XPAGE1SFR сохраняют контрол регистр таймера 2. А на выходе из прерывния благополучно восстанавливают контрол регистр и соответственно возведенный флаг TF2. Происходит очень частый вызов прерывания timer 2. Прога в полном ауте.
Для исключения этой ситуации вижу два пути решения: 1) подкорректировать приамбулы входа/выхода в прерывание (Keilовские) 2) вырубить нафиг автоматический переход на страницу SFR в прерывании и в каждом прерывании вставлять свой переключатель.
Какиеесть еще пути решения данной проблемы????????
Второй путь в принципе даже лучше. Но тогда основной страницей SFR для всей проги должна стать 0x0F. Но мне просто интересно как в прогу вставить кусок асма??? Что-то #prgma asm не сработала. Написало вот: INTERRUPT.C(64): error C272: 'asm/endasm' requires src-control to be active. Хотя галочка SRC стоит на всех файлах. Читал описание и не допонял. Оно работает везде или только как тело функции????
Спасибо.
Сообщение отредактировал AndreyS - Feb 14 2008, 21:52
--------------------
Удачи.
|