Насильная остановка прерыаний при чтении символа c USART

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс авг 31, 2008 01:27:15

Сообщение Aster »

вот код с кодевижн по обработке прерывания прихода символа в усарт
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif


тут функция самого прерывания и функция гетчара
так вот в курсе 123авр фрагмент
#asm("cli")
--rx_counter;
#asm("sei")
описан(http://avr123.nm.ru/z5.htm)но я его корне не пойму....зачем и смысл останалиать прерыания потом его заново запускать....непойму...

так тут написано что прерыания блокируютса из за того что цытирую...



Так как мы считали символ из буфера нужно уменьшить число символов в нем подлежащих считыванию.

#asm("cli") // запретить прерывания глобально
--rx_counter; // вычесть 1 из rx_counter
#asm("sei") // разрешить прерывания глобально

Обратите внимание что перед декрементом мы запрещаем прерывания, а после прерывания включаем опять.

Зачем ? Вот фо ??? воскликнул бы англоязычный читатель ...

А затем, что в обработчике прерывания есть инкремент rx_counter - и если на декременте возникнет прерывание мы можем зациклится в этом месте программы и получить ошибку в числе символов в буфере.


....получаетса что они останалиают прерыания только для того чтоб непомешать декрименту....но а смысл если когда произойдет прерывание то по его окончанию всеравно декримент выполнится, ведь прерывание не портит функции --rx_counter если выполняется в тот жэ момент
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 885
Зарегистрирован: Сб июл 19, 2008 02:16:33
Откуда: Саратов

Сообщение Kotische »

Aster писал(а):А затем....
У тебя нифига не видно описания переменной rx_counter. Если она типа int (по хорошему она должна быть ещё и volatile int) , то на 8 битном микроконтроллере данная операция не является атомарной - она транслируется в несколько ассемблерных команд. И прерывение этой операции в середине опреации может разрушить значение в этой переменной. Самый простой вариант защиты от этой беды запретить прерывания на время выполнения "критической секции" кода.
Реклама
Э...
Аватара пользователя
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва

Сообщение tych »

Aster писал(а): в курсе 123авр написано что прерыания блокируютса из за того что цытирую...

Так как мы считали символ из буфера нужно уменьшить число символов в нем подлежащих считыванию.

Код: Выделить всё

#asm("cli")   // запретить прерывания глобально
--rx_counter; // вычесть 1 из rx_counter
#asm("sei")   // разрешить прерывания глобально 
ИМХО в курсе у меня это написано, но из этого текста не следует что прерывания мы блокируем именно потому что: "нужно уменьшить число символов в нем подлежащих считыванию."

Прерывания блокируются чтобы точно исполнить строчку:

Код: Выделить всё

--rx_counter; // вычесть 1 из rx_counter
При этом случившиеся за время блокировки и ЛОКАЛЬНО разрешенные прерывания встанут в очередь согласно порядку перечисления в даташите и будут выполняться при ГЛОБАЛЬНОМ их разрешении. Ничто не забыто, никто не забыт !
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс авг 31, 2008 01:27:15

Сообщение Aster »

хм...ладно если дейстительно запрет прерыаний глобально выполняется для сохранения целостности операции декрементироания то как тогда бытьесли как раз прерыание выполняется в тот самый период времени когда был получен запрет...как жэ тогда...ведь получается мы потеряем символ если запретили прерыания..а он выполнился как раз тогда когда его и запретили...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Вс авг 31, 2008 01:27:15

Сообщение Aster »

блин сори..не увидел ответ на мой вопрос выше))))
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 885
Зарегистрирован: Сб июл 19, 2008 02:16:33
Откуда: Саратов

Сообщение Kotische »

Aster писал(а):как тогда бытьесли как раз прерыание выполняется в тот самый период времени когда был получен запрет...
Ты используешь терминологию вводящую в непонятки...
Правильно сказать приходит запрос на прерывание, и он запоминается в дебрях микроконтроллера, точнее в регистре флажков, когда прерывания разрешаться... контроллер позырит в реистр флажков, и эти прерывания обработает... :roll:
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»