Перейти к содержанию

Getchar() В Сv -зачем Надо Останаливать Прерывание


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://forum.cxem.net/z5.htm)но я его в корне не пойму....зачем и смысл останалиать прерыания потом его заново запускать....непойму...

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

"-----

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

#asm("cli") // запретить прерывания глобально

--rx_counter; // вычесть 1 из rx_counter

#asm("sei") // разрешить прерывания глобально

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

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

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

"----

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

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • На сигнал о включении транзистора. В общем выпаял я его, прозвонил - труп. Заказал новый на озоне - 222 рубля. Пока для проверки припаял тумблер. Включается и выключается без сильного моргания диодами у чипов 3116. теперь они моментально загораются при включении и медленно гаснут при выключении. Подкинул динамик -щелчков нет. Самая главная проблема можно считать решена. Теперь осталось две - разобраться почему блютуз, усб и т.д. работают постоянно, по мне они должны подключаться только тогда, когда выбираются в качестве источника звука. Но это не понятно, должны ли они так работать или же еще что крякнуло. выходит был скачек напряжения на питании, есть трансформаторный гул в динамике, значит наверно пробито что то еще.
    • Браво.   Сначала продает файлы и герберы, а потом выдает что производят без его ведома. Не продавай файлы и герберы - сам производи тогда будет с ведома.
    • Чем плох 1306 так тем, что он выгорает, поставили модуль на пару недель теста, 1306 под замену, поэтому через минуту тушим его.
    • Ну вы же уже подали на него питание пока тестировали. Если бы было что-то не так, то он бы уже приказал долго жить. Скорей всего на плате экрана стоит стаб на 3.3 В. Пото му как на всех картинках он подключен к ардуиновскому +5. 
    • Те 1306 которые мы используем они по даташиту на 3.3В, но они 8 пиновые, твой 4 пиновый, китайцы пишут (не даташит)  от 3.3В до 5В. С ардуины есть 3,3В выход туда и подключи
    • Да, как оказалось идеально работают на Вентуре. Виндой я не пользуюсь практически. Выводил разные изображения на экран - ничего сложного. Единственное, не понял до конца какое питание правильное - 5 или 3,3В?
    • Там все просто, ищите цепи которые на схеме другого упса выделил красным. Скорее всего у вас тоже самое. Но в вашем случае можно автотрансформатор на входе бесперебойника  поставить с отводом  на 220 В и забыть о проблеме.
×
×
  • Создать...