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

 
 
 
Reply to this topicStart new topic
> Обработчик прерывания, Как поправить Keil'овскую заготовку обработчика???
AndreyS
сообщение Feb 14 2008, 21:48
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день.

В кратце опишу систему:

проц - 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


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Feb 19 2008, 13:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Есть еще выход - использовать таймер 0 или 1. В этих таймерах флаг нельзя выставить аппаратно, а только сбросить, поэтому. что с контекстом ни делай. прерывания будут работать корректно.
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Feb 19 2008, 19:23
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Цитата(oran-be @ Feb 19 2008, 16:27) *
Есть еще выход - использовать таймер 0 или 1. В этих таймерах флаг нельзя выставить аппаратно, а только сбросить, поэтому. что с контекстом ни делай. прерывания будут работать корректно.



Спасибо за ответ.

В вашем случае мне прийдется отказаться от timer2 вообще. Так как порт P4 находится в области sfr 0xC8 и контрол регистр таймера 2 находится по этому же адресу sfr. sfr page timer 0 или 1 = 0. И у таймер 2 sfr page = 0. А это означает, что сохранять в прерывании будет опять таки контрол регистр таймера 2 и восстанавливать опять же его. Значит или об использовании таймер 2 прийдется забыть, или искать другой путь решения.

Я пока пошел по 2-му пути.

Еще раз спасибо за ответ.

Удач.

PS. А как все же использовать асм вставки?????? Я думал сначала что с помощью вставок в прерывании просто вытащ все из стека (что кеил запихнул) проманипулирую с флагом таймера, а затем перейду на страничку сфр 0x0F и запихаю в стек то что уже нужно (ну в принципе что кеил уложил).
но не получилось.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
repairDV
сообщение Feb 20 2008, 03:05
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 578
Регистрация: 7-11-06
Из: Хабаровск
Пользователь №: 22 044



http://electronix.ru/forum/index.php?s=&am...st&p=228195


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
tag
сообщение Feb 20 2008, 08:26
Сообщение #5


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

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(AndreyS @ Feb 15 2008, 00:48) *
Что-то #prgma asm не сработала. Написало вот: INTERRUPT.C(64): error C272: 'asm/endasm' requires src-control to be active. Хотя галочка SRC стоит на всех файлах. Читал описание и не допонял. Оно работает везде или только как тело функции????

Спасибо.


Для файла в котором есть asm-вставка надо сделать так:
1. Выставить Options for File "interrupt.c"->Properties->Generate Assembler SRC File
2. Выставить Options for File "interrupt.c"->Properties->Assemble SRC File
Go to the top of the page
 
+Quote Post
AndreyS
сообщение Feb 20 2008, 19:56
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день

Цитата(repairDV @ Feb 20 2008, 06:05) *



Огромное спасибо. Поиск рулит!! smile.gif


Цитата
Для файла в котором есть asm-вставка надо сделать так:
1. Выставить Options for File "interrupt.c"->Properties->Generate Assembler SRC File
2. Выставить Options for File "interrupt.c"->Properties->Assemble SRC File


Спасибо. Буду пробовать


А преамбулы входа/выхода в прерывание не доступня для редактирования (ну на примере xbanking.a51). А то мне уж понравилась гибкость в настройке расширения памяти .smile.gif Думаю что и это должно где-то быть доступным. Он ведь вставляет туда сохранение старшей части указателя.

Удачи.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd July 2025 - 15:23
Рейтинг@Mail.ru


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