Цитата(vladimir_orl @ Jan 23 2014, 10:14)

Использую связку в качестве даталоггера.
А что це такэ - даталоггер?
Цитата(vladimir_orl @ Jan 23 2014, 10:14)

По прерыванию INT2 читаются значения двух пинов. Вот такой простой код:
Не такой уж и простой - там ещё и сохранение прочитанных битов в байты, а потом сохранение байтов в массивы.
Цитата(vladimir_orl @ Jan 23 2014, 10:14)

Но AVR GCC как известно наворачивает сохранение и восстановление контекста при работе с подпрограммами, вот касок листинга:
Т.е. время реакции на прерывание увеличивается.
Цитата(vladimir_orl @ Jan 23 2014, 10:14)

Подскажите, есть ли какие опции у AVR GCC, позволяющие отключать эту обёртку.
GCC не наворачивает, а сохраняет используемые в прерывании регистры. Как без этого?
Цитата(vladimir_orl @ Jan 23 2014, 10:14)

А то уже думаю этот ISR в отдельном asm файле сделать.
Тоже можно, но не факт что намного быстрее получится.
Цитата(vladimir_orl @ Jan 23 2014, 10:14)

Отказаться от ISR тоже не выходить, т.к. там в основном цикле while тоже кода много. Кто-нибудь сталкивался с таким?
Все рано или поздно с таким сталкиваются...Думаю, что надо менять прерывание в сторону его упрощения:
1) сохранять в ISR (INT2_vect) только биты и увеличивать счётчик принятых битов.
2) Когда будет принят байт нужно его сохранить во временной переменной и установить флаг приёма байта.
3а) Далее по этому флагу в основной программе записать байт в массив.
3б) Если цикл основной программы может быть дольше чем время передачи байта, вызвать программное прерывание, в котором байт записывается в массив.
3в) Можно что-нибудь ещё придумать. Например не логировать ничего - вам действительно нужны эти байты? Может эту задачу и решать-то не надо?