Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

Закрытая тема
Опции темы
Непрочитано 10.09.2013, 14:00   #71
_Артём_
Гражданин 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   #72
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

можно ещё 1 вариант.
usart_putch() и usart_putch_sei()
и из нужного места вызывать нужную функцию.
Godzilla82 вне форума  
Непрочитано 11.09.2013, 11:29   #73
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Как-то "то-на-то" и выходит.
Не, всё-таки, почему вы меня "отговариваете" использовать SREG? Все примеры в мануале (что чтение/запись 16 бит регистров, что примеры для TWI) используют его именно для этого и именно с такими же комментариями - сохранить статус, чтобы потом вернуть прерывания "как было".

ЗЫ: Да, я понимаю, что сохраняя его несколько "заранее", теряю флаги переполнения и прочего, но там это, вроде, не принципиально (да и можно сохранение/восстановление "вплотную" к критической секции сделать)
av0000 вне форума  
Непрочитано 11.09.2013, 12:09   #74
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,443
Сказал спасибо: 99
Сказали Спасибо 315 раз(а) в 231 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Глюк с UART при засыпании

Сообщение от av0000 Посмотреть сообщение
Как-то "то-на-то" и выходит.
Посчитайте по тактам - сколько в том и другом случае.
Я из-за параноидального стремления WinAVR сохранять в стеке всё подряд, а также из-за выкидывании нужных мне глобальных регистровых переменных либо в память, либо вообще (если без volatile) перешёл на CV.

Код у него предсказуемый и достаточно быстрый.

Сообщение от av0000 Посмотреть сообщение
Не, всё-таки, почему вы меня "отговариваете" использовать SREG?
...
сохранить статус, чтобы потом вернуть прерывания "как было".
есть участок кода, где нужно, чтобы прерывания были запрещены.
тогда в этом участке не будет работать передача данных по UART.

Я бы постарался избежать такого построения программ. В крайнем случае - продублировал бы функцию. Это сохранило бы быстродействие, ненамного увеличив код.
Godzilla82 вне форума  
Непрочитано 11.09.2013, 21:51   #75
av0000
Частый гость
 
Регистрация: 27.08.2008
Адрес: Москва
Сообщений: 29
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
av0000 на пути к лучшему
По умолчанию Re: Глюк с UART при засыпании

Godzilla82, ну, у меня всё больше avr-gcc, ибо Ubuntu Нагородил оптимизированный makefile, рекурсивно ходящий по подкаталогам, и горя не знаю

Сообщение от Godzilla82 Посмотреть сообщение
Посчитайте по тактам - сколько в том и другом случае.
Судя по листингу сохранение/восстановление SREG выливается в одну единственную команду - "in r25, __SREG__" на старте и out __SREG_,r25 на выходе. Уж всяко короче, чем городить искусственный флаг

Сообщение от Godzilla82 Посмотреть сообщение
Я бы постарался избежать такого построения программ
Само собой! Тут, скорее, защита от дурака ну и для отладки полезно - можно _относительно_ безопасно что-то печатать из прерываний, пока буфер не заполнится, потом может прийти "сереный лис" если модуль скомпилен с блокировкой по заполнению буфера
av0000 вне форума  
Закрытая тема

Закладки

Метки
avr, sleep, usart

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Омывание стирального бака СМА при полоскании Слесарь Делимся опытом 33 29.05.2013 00:03
Проблемы с передачей по UART, нужна помощь sansan25 Микроконтроллеры, АЦП, память и т.д 3 28.01.2012 13:19
Водка и как с ней бороться SerjT Отвлекитесь, эмбеддеры! 108 29.09.2009 21:25
Проблема с электропитанием квартиры tourent Источники питания и свет 85 16.09.2009 07:51
[Решено] Сборник перлов любителей кабельщины mikesmith Отвлекитесь, эмбеддеры! 135 14.08.2007 15:49


Часовой пояс GMT +4, время: 01:17.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot