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

 
 
> Быстрое прерывание на AVR GCC
vladimir_orl
сообщение Jan 23 2014, 08:14
Сообщение #1


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

Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591



Здравствуйте. Использую связку STK500 + mega128 + AStudio6 в качестве даталоггера.
По прерыванию 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;
    }
}


Но 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




Т.е. время реакции на прерывание увеличивается.

Подскажите, есть ли какие опции у AVR GCC, позволяющие отключать эту обёртку. А то уже думаю этот ISR в отдельном asm файле сделать. Но обработчик хоть и небольшой, придётся повозиться, да и перепроверять заново надо будет. Отказаться от ISR тоже не выходить, т.к. там в основном цикле while тоже кода много. Кто-нибудь сталкивался с таким?

P.S. Кусок конечно у листинга, а не касок. Вроде текст перечитывал...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 17:38
Рейтинг@Mail.ru


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