По прерыванию INT2 читаются значения двух пинов. Вот такой простой код:
Код
ISR (INT2_vect)
{
m_master_byte |= (PINF & 0x01);
m_slave_byte |= (PINC & 0x01);
if (m_bit_counter <= 7)
{
++m_bit_counter;
if (m_bit_counter <= 7) {
m_master_byte <<= 1;
m_slave_byte <<= 1;
} else {
a_master_byte_array[m_byte_counter] = m_master_byte;
a_slave_byte_array[m_byte_counter] = m_slave_byte;
}
} else {
m_master_byte = 0;
m_slave_byte = 0;
m_bit_counter = 0;
++m_byte_counter;
}
}
{
m_master_byte |= (PINF & 0x01);
m_slave_byte |= (PINC & 0x01);
if (m_bit_counter <= 7)
{
++m_bit_counter;
if (m_bit_counter <= 7) {
m_master_byte <<= 1;
m_slave_byte <<= 1;
} else {
a_master_byte_array[m_byte_counter] = m_master_byte;
a_slave_byte_array[m_byte_counter] = m_slave_byte;
}
} else {
m_master_byte = 0;
m_slave_byte = 0;
m_bit_counter = 0;
++m_byte_counter;
}
}
Но AVR GCC как известно наворачивает сохранение и восстановление контекста при работе с подпрограммами, вот касок листинга:
Код
00000204 <__vector_3>:
204: 1f 92 push r1
206: 0f 92 push r0
208: 0f b6 in r0, 0x3f; 63
20a: 0f 92 push r0
20c: 11 24 eor r1, r1
20e: 0b b6 in r0, 0x3b; 59
210: 0f 92 push r0
212: 8f 93 push r24
214: 9f 93 push r25
216: ef 93 push r30
218: ff 93 push r31
... собственно сама работа ...
246: ff 91 pop r31
248: ef 91 pop r30
24a: 9f 91 pop r25
24c: 8f 91 pop r24
24e: 0f 90 pop r0
250: 0b be out 0x3b, r0; 59
252: 0f 90 pop r0
254: 0f be out 0x3f, r0; 63
256: 0f 90 pop r0
258: 1f 90 pop r1
25a: 18 95 reti
204: 1f 92 push r1
206: 0f 92 push r0
208: 0f b6 in r0, 0x3f; 63
20a: 0f 92 push r0
20c: 11 24 eor r1, r1
20e: 0b b6 in r0, 0x3b; 59
210: 0f 92 push r0
212: 8f 93 push r24
214: 9f 93 push r25
216: ef 93 push r30
218: ff 93 push r31
... собственно сама работа ...
246: ff 91 pop r31
248: ef 91 pop r30
24a: 9f 91 pop r25
24c: 8f 91 pop r24
24e: 0f 90 pop r0
250: 0b be out 0x3b, r0; 59
252: 0f 90 pop r0
254: 0f be out 0x3f, r0; 63
256: 0f 90 pop r0
258: 1f 90 pop r1
25a: 18 95 reti
Т.е. время реакции на прерывание увеличивается.
Подскажите, есть ли какие опции у AVR GCC, позволяющие отключать эту обёртку. А то уже думаю этот ISR в отдельном asm файле сделать. Но обработчик хоть и небольшой, придётся повозиться, да и перепроверять заново надо будет. Отказаться от ISR тоже не выходить, т.к. там в основном цикле while тоже кода много. Кто-нибудь сталкивался с таким?
P.S. Кусок конечно у листинга, а не касок. Вроде текст перечитывал...