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

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

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

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

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

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

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 16.02.2011, 13:25  
urmlr
Почётный гражданин KAZUS.RU
 
Аватар для urmlr
 
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
urmlr на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от code-by Посмотреть сообщение
Может кому-то лучше делать int вместо char
О да! Что нам все эти Керниганы и Ричи с Томсонами а заодно и с АНСИ комитетами по языку "С"? Придурки они все конечно же! То-ли дело МЫ! Гиганты ума и программирования!

Есть причины делать размерность возврата шире чем собственно возвращаемые данные и возвращать особые состояния кодами вне диапазона данных. И боюсь что этих причин больше чем многие в состоянии посчитать без калькулятора.
Реклама:
urmlr вне форума  
Непрочитано 16.02.2011, 14:21  
Cybermaker
Вид на жительство
 
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
Cybermaker на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от urmlr Посмотреть сообщение
О да! Что нам все эти Керниганы и Ричи с Томсонами а заодно и с АНСИ комитетами по языку "С"? Придурки они все конечно же! То-ли дело МЫ! Гиганты ума и программирования!
Если бы у нас как у них было 640 кб оперативки - то нам было бы всё равно. Но так как у нас её значительно меньше - мне вот, допустим, нафиг не надо чтобы ,при создании массива, строка "Hello world" была записанна в двухбайтовом юникоде. Потому и логично использовать всего лишь один флаг вместо удвоения памяти под каждый символ.
Cybermaker вне форума  
Непрочитано 16.02.2011, 15:30  
urmlr
Почётный гражданин KAZUS.RU
 
Аватар для urmlr
 
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
urmlr на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от Cybermaker Посмотреть сообщение
Если бы у нас как у них было 640 кб оперативки
Оооо-Хо-Хо-Хо!!! (голосм Санта Клауса). Язык "С", его стандартная библиотека и операционка Unix делались на машине PDP-11 с размером оперативки 56 кб.

Юникод - изобретение проталкивавшееся мелкомягкими, ни вашим - ни нашим, потому до сих пор нормальными компилерами не поддерживается.

И никто не говорит об удвоении памяти под каждый символ, если getchar возвращает int, это совсем не значит что этот int надо в память фигачить, это сделано (одна из причин) чтобы можно было писать нечто вроде:
Код:
int c;
...
while( (c=getchar()) != EOF)
{
...
  *((char *) ptr++) = c;
...
}
Где значение 'EOF' вне диапазона значений байта.

Последний раз редактировалось urmlr; 16.02.2011 в 15:32. Причина: очепятка в коде
urmlr вне форума  
Непрочитано 16.02.2011, 18:14  
Cybermaker
Вид на жительство
 
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
Cybermaker на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от urmlr Посмотреть сообщение
Юникод - изобретение проталкивавшееся мелкомягкими, ни вашим - ни нашим, потому до сих пор нормальными компилерами не поддерживается.
Тем не менее на 32 битных системах каждый символ занимает 2 байта.

Не вижу смысла дальше обсуждать размерности определений т.к. чтобы не возникло непоняток с ними - всегда использую прототипы.
Cybermaker вне форума  
Непрочитано 16.02.2011, 19:43  
Godzilla82
Почётный гражданин KAZUS.RU
 
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
Godzilla82 на пути к лучшему
Сообщение Re: Отправка числа 0 (ноль) по уарту

Сообщение от Cybermaker Посмотреть сообщение
Тем не менее на 32 битных системах каждый символ занимает 2 байта.
Даже если он описан как:
PHP код:
char stroka[] = "привет"
И почему тогда не 4? Со словом не путаете?

А насчёт int и значения getchar() "вне диапазона" - попишет народ программки, поймёт, что был неправ, глядишь - и толк будет. А так - пока сами не поймут - хоть объясняй, хоть не объясняй.
Godzilla82 вне форума  
Непрочитано 16.02.2011, 20:58  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от urmlr Посмотреть сообщение
От души советую, напишите-ка для себя формулу условия переполнения при условии неиспользования счётчика символов в кольцевом буфере. Только по настоящему, не шаляй-валяй и не от балды. Тогда и увидите.
Придерживаясь стиля компилятора, в котором это было, я бы организовал кольцевой буфер так:

Код:
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
 char status,data;
 status=UCSR0A;
 data=UDR0;

 if (!(status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)))
 {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
 }
}


#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
 char data;
 
 data = '';
 if (rx_rd_index0 != rx_wr_index0)
 {
   data = rx_buffer0[rx_rd_index0];
   if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
 }
  return data;
}
#pragma used-
#endif
В случае, если автору хочется вызывать гетчар, не зная, лежит ли в буфере символ (я то проверял бы, есть в буфере символ, и если есть, вызывал бы гетчар),

Код:
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
 char data;
 
 data = '';
 uart_data = 0;
 if (rx_rd_index0 != rx_wr_index0)
 {
   data = rx_buffer0[rx_rd_index0];
   uart_data=1;
   if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; 
 }
  return data;
}
#pragma used-
#endif

Последний раз редактировалось Someone; 16.02.2011 в 21:04.
Someone вне форума  
Непрочитано 17.02.2011, 01:13  
urmlr
Почётный гражданин KAZUS.RU
 
Аватар для urmlr
 
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
urmlr на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от Someone Посмотреть сообщение
я бы организовал кольцевой буфер так
В этом фрагменте кода контроля переполнения нет вообще. Т.Е. если, скажем, программа которая вызывает getchar зависнет, то принимаемые символы так и будут писаться в буфер, перезаписывая друг дружку. Если же этот код будет просто работать медленно и на какой-то момент rx_wr_index0 "наедет" на rx_rd_index0, то вы потеряете целый буфер.
Плюс, этот код не может принять нулевой байт, ибо возврат нуля идентичен отсутствию байта в буфере.

Второй фрагмент, собственно, не лучше.

Последний раз редактировалось urmlr; 17.02.2011 в 01:14. Причина: очепятка
urmlr вне форума  
Непрочитано 17.02.2011, 11:39  
Someone
Гражданин KAZUS.RU
 
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
Someone на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от urmlr Посмотреть сообщение
В этом фрагменте кода контроля переполнения нет вообще.
Имхо в кольцевом буфере контроль переполнения не особенно и нужен, но если так сильно хочется, см. ниже.

Цитата:
Т.Е. если, скажем, программа которая вызывает getchar зависнет, то принимаемые символы так и будут писаться в буфер, перезаписывая друг дружку.
В исходном коде абсолютно та же ситуация. Ведь в нем только ставится флаг переполнения, затем сбрасывается счетчик, и снова принимаются байты. В случае, если зависнет программа, из которой вызывается гетчар обрабатывать флаг также будет некому, ведь эта программа зависла , исходный код будет точно так же писать в буфер по кругу, перезаполняя его.

Цитата:
Если же этот код будет просто работать медленно и на какой-то момент rx_wr_index0 "наедет" на rx_rd_index0, то вы потеряете целый буфер.
Данный код будет работать быстрее исходного, т.к. короче и оперирует с меньшим числом переменных. В исходном же коде при описанной ситуации наезда rx_wr_index0 на rx_rd_index0 (сам факт наезда между прочим сигнализирует о переполнении) только поставится флаг переполнения, и точно так же потеряется буфер. И если уж сильно надо ставить флаг переполнения, то

Код:
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
 char status,data;
 
 status=UCSR0A;
 data=UDR0;

 if (!(status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN)))
 {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (rx_wr_index0 == rx_rd_index0) rx_buffer_overflow0=1; 
 }
}

Цитата:
Плюс, этот код не может принять нулевой байт, ибо возврат нуля идентичен отсутствию байта в буфере.
Может, все может. Я ведь не зря писал, что я делал бы вызов гетчар только если в буфере что-то лежит. По моему, очевидно, что если в буфере что-то было, и гетчар возвращает 0, значит в буфер был принят 0.

Цитата:
Второй фрагмент, собственно, не лучше.
Во втором случае (напоминаю, так сделано в исходном коде), гетчар можно вызывать без предварительной проверки наличия данных в буфере, и если он возвращает 0, а uart_data == 1, очевидно, что по уарт в буфер пришел 0, который гетчар и возвращает. Кстати, в исходном коде не хватает сброса этого флага, т.е. программист должен его сбрасывать сам перед вызовом гетчар. И если забудет, то будет считать, что приходят сплошные 0 .
Someone вне форума  
Непрочитано 17.02.2011, 12:23  
urmlr
Почётный гражданин KAZUS.RU
 
Аватар для urmlr
 
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
urmlr на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от Someone Посмотреть сообщение
Имхо в кольцевом буфере контроль переполнения не особенно и нужен [...] только поставится флаг переполнения
Самое опасное что только может быть, это код который работает и выдаёт похожие на правильные, но неправильные результаты. С вашим имхом вы как раз на пути туда. А вот отлов переполнения как раз позволяет предотвратить это и что-то таки сделать. Что именно уже зависит от конкретной аппликухи.
Цитата:
Я ведь не зря писал, что я делал бы вызов гетчар только если в буфере что-то лежит
То есть ваш код имеет недокументированные и неочевидные взаимосвязи. Сиречь поддерживаться в нормальных производственных условиях не может.
Цитата:
в исходном коде не хватает сброса этого флага
В нормальном исходном коде с нормально сделанной функцией getchar этот флаг не нужен вообще. Это ещё одна причина почему в стандарте getchar возвращает именно int а не char. Потому как иметь какой-то ещё мистический флаг означает нарываться на неприятности. Баги сиречь.
Цитата:
Данный код будет работать быстрее исходного
Код должен для начала работать правильно, а быстрее или нет - второй вопрос.

Резюме: экзамена по программированию вы бы у меня не сдали
urmlr вне форума  
Непрочитано 17.02.2011, 12:50  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Отправка числа 0 (ноль) по уарту

Сообщение от urmlr Посмотреть сообщение
Юникод - изобретение проталкивавшееся мелкомягкими, ни вашим - ни нашим, потому до сих пор нормальными компилерами не поддерживается.
Правда??!!! А как тада весь Unix работает? Может там по дефолту CP-1251 стоит? Знаете не замечал. Всегда UTF-8. По поводу компилеров - в делфях и вижуал студиях начиная с 2005 версии юникод по дефолту стоит.
_guardianangel вне форума  
 

Закладки

Метки
avr, mega, uart
Опции темы

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

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

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


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


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