Показать сообщение отдельно
Непрочитано 21.08.2010, 11:08  
alex_312
Прохожий
 
Аватар для alex_312
 
Регистрация: 08.08.2010
Сообщений: 7
Сказал спасибо: 1
Сказали Спасибо 1 раз в 1 сообщении
alex_312 на пути к лучшему
По умолчанию Re: Как изменить адрес подпрограммы обработки прерывания?

Сообщение от Godzilla82 Посмотреть сообщение
У меня как раз такая задача, когда всё упирается в эти самые лишние 3-5 тактов. Нужно по адресу вектора прерывания поменять адрес перехода на нужную подпрограмму. Думаю, что это возможно сделать средствами СИ (пусть даже с ассемблерными вставками). Поэтому и спрашиваю.
Думаю все можно решить при помощи Си, и мне кажется, что лучше в WinAvr.

Вопрос со сменой адреса вектора прерывания решается так:
PHP код:
 ......
int *my_int_ptr;//указатель 

void my_int_1();//обьявление функции прерывания 1-й вариант
void my_int_2();//обьявление функции прерывания 1-й вариант

int main()
{

    
my_int_ptr = (int*)0;//присваиваем указателю значение 0

    
if(uslovie())
    {
        
my_int_ptr[2] = (int)my_int_1;//поменяли 2-й вектор
    
}
    else
    {
        
my_int_ptr[2] = (int)my_int_2;//поменяли 2-й вектор
    
}

.......................
    return 
0;
}

void my_int_1()
{
INT_PROLOG
    
.....
INT_EPILOG
}

void my_int_2()
{
INT_PROLOG
    
.....
INT_EPILOG

А WinAvr удобнее(наверное) тем, что там можно порытся в исходниках и надыбать макросы, которые определяют пролог и эпилог прерывания, ну чтоб самому не писать ассемблерные вставки для сохранения и восстановления регистров. Возможно надо будет самому сделать вызов cli();

P.S. Хотя, если вам так дороги 5 тактов, то имеет смысл переписать прерывания на асме.

Последний раз редактировалось alex_312; 21.08.2010 в 11:12.
alex_312 вне форума  
Сказали "Спасибо" alex_312
Godzilla82 (21.08.2010)