AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
10.09.2013, 14:00
|
|
Гражданин KAZUS.RU
Регистрация: 16.03.2011
Сообщений: 486
Сказал спасибо: 8
Сказали Спасибо 131 раз(а) в 116 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
Смысл в том, что я не хочу "случайно" разрешить прерывания, если putch() вызвана из какого-то куска, где они запрещены. Есть более "прямой" способ, чем сохранение SREG?
|
Способ есть, но не всем он нравится - используйте Си++.
Код:
|
class TCritSect
{
public:
TCritSect () : StatusReg( SREG ) { cli(); }
~TCritSect() { SREG = StatusReg; }
private:
status_reg_t StatusReg;
}; |
Хотя и на сях можно что-то придумать (смотрите в util/atomic.h). но зачем...
Например так:
Код:
|
uint8_t CriticalNestCounter;
void EnterCritical()
{
cli();
CriticalNestCounter++;
}
void ExitCritical()
{
if (--CriticalNestCounter==0) {
sei();
}
} |
Последний раз редактировалось _Артём_; 10.09.2013 в 16:54.
|
|
|
|
11.09.2013, 10:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Глюк с UART при засыпании
можно ещё 1 вариант.
usart_putch() и usart_putch_sei()
и из нужного места вызывать нужную функцию.
|
|
|
|
11.09.2013, 11:29
|
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Как-то "то-на-то" и выходит.
Не, всё-таки, почему вы меня "отговариваете" использовать SREG? Все примеры в мануале (что чтение/запись 16 бит регистров, что примеры для TWI) используют его именно для этого и именно с такими же комментариями - сохранить статус, чтобы потом вернуть прерывания "как было".
ЗЫ: Да, я понимаю, что сохраняя его несколько "заранее", теряю флаги переполнения и прочего, но там это, вроде, не принципиально (да и можно сохранение/восстановление "вплотную" к критической секции сделать)
|
|
|
|
11.09.2013, 12:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Глюк с UART при засыпании
Сообщение от av0000
|
Как-то "то-на-то" и выходит.
|
Посчитайте по тактам - сколько в том и другом случае.
Я из-за параноидального стремления WinAVR сохранять в стеке всё подряд, а также из-за выкидывании нужных мне глобальных регистровых переменных либо в память, либо вообще (если без volatile) перешёл на CV.
Код у него предсказуемый и достаточно быстрый.
Сообщение от av0000
|
Не, всё-таки, почему вы меня "отговариваете" использовать SREG?
...
сохранить статус, чтобы потом вернуть прерывания "как было".
|
есть участок кода, где нужно, чтобы прерывания были запрещены.
тогда в этом участке не будет работать передача данных по UART.
Я бы постарался избежать такого построения программ. В крайнем случае - продублировал бы функцию. Это сохранило бы быстродействие, ненамного увеличив код.
|
|
|
|
11.09.2013, 21:51
|
|
Частый гость
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Глюк с UART при засыпании
Godzilla82, ну, у меня всё больше avr-gcc, ибо Ubuntu Нагородил оптимизированный makefile, рекурсивно ходящий по подкаталогам, и горя не знаю
Сообщение от Godzilla82
|
Посчитайте по тактам - сколько в том и другом случае.
|
Судя по листингу сохранение/восстановление SREG выливается в одну единственную команду - "in r25, __SREG__" на старте и out __SREG_,r25 на выходе. Уж всяко короче, чем городить искусственный флаг
Сообщение от Godzilla82
|
Я бы постарался избежать такого построения программ
|
Само собой! Тут, скорее, защита от дурака ну и для отладки полезно - можно _относительно_ безопасно что-то печатать из прерываний, пока буфер не заполнится, потом может прийти "сереный лис" если модуль скомпилен с блокировкой по заполнению буфера
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:26.
|
|