Сообщение от 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 тактов, то имеет смысл переписать прерывания на асме.