2013-07-16 4 views
5

Я разрабатываю приложение C с помощью atmega168a-pu и прерываний. Я использую следующие прерывания:Программирование AVR, обработка прерываний

ISR(TIMER0_COMPA_vect); 
ISR(TIMER0_COMPB_vect); 
ISR (TIMER2_COMPA_vect); 
ISR(SPI_STC_vect); 
ISR(TIMER1_COMPA_vect); 
ISR (PCINT1_vect); 

и мой код выглядит

int main(void){ 
///initialization etc. 
    sei(); 
    while(1){ 
    ///do some stuff and wait the interrupts 
    } 
return 0; 
} 

Я хочу, чтобы блокировать все другие прерывания, когда происходит прерывание и включить прерывания непосредственно перед выходом из функции прерывания.

Не могли бы вы объяснить это на фрагменте кода, как я могу это сделать?

EDIT: http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorder заявляет, что такое использование вызывает проблему передислокации.

function(){ 
    cli(); 
    .. 
    sei(); 
} 

ответ

2

Предыдущий ответ я отправил здесь был основан на оригинальный вопрос, не говоря уже о проблеме переупорядочения АРН-НКУ. Очевидно, что это так давно, что я работал с AVR, но был колокольный звон по поводу отключения прерываний

Пересмотренный ответ на вопрос

Защита прерывания от прерывания

Atmel пишет об обработке прерываний в базе данных:

При возникновении прерывания бит I-бит глобального прерывания очищается и все входы rrupts отключены. Пользовательское программное обеспечение может записывать логический код в I-бит, чтобы включить вложенные прерывания. Все включенные прерывания могут прерывать текущую процедуру прерывания. I-бит автоматически устанавливается при выполнении команды Return from Interrupt - RETI.

Поэтому поведение, о котором вы просите, уже реализовано в аппаратном обеспечении.

Повторный заказ выпуск

Я также сделал некоторые исследования по этому вопросу переупорядочения. Очевидно, что существует огромное несогласие в том, является ли это ошибкой компилятора или нет. Похоже, что основной риск переупорядочения состоит в том, что прерывания отключены на более длительный период времени, чем они ожидали. Во время моих исследований я не нашел решения на этом, кроме решений, вызывающих большую нагрузку/активность магазина, что на самом деле не вариант.

+0

как именно вы отключите и включите глобальные прерывания, не вызывая никаких проблем? –

+0

Будут ли нижестоящие лидеры объяснять их нижестоящий? Йохан добавил подсказку к описанию ошибки примерно через 8 минут после моего размещения. – junix

+0

@JohanElmander Я обновил ответ на ваш измененный вопрос. – junix

1

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

Что касается написания кода, который не должен прерываться, я, как правило, нашел достаточно, чтобы использовать атомную функциональность в <util/atomic.h>. Если этого недостаточно, и вы действительно должны убедиться, что нет переупорядочения, возможно, вы можете написать критические разделы в сборке.

Возможно, вы могли использовать барьеры памяти наряду с созданием всего в этом разделе кода волатильным, но во многих случаях это было бы довольно значительной пессимизацией. Собрание, генерируемое этим, может намекать на то, что вы напишете, если вы должны написать сборку вручную.

Смежные вопросы