Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
16.02.2011, 13:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от code-by
|
Может кому-то лучше делать int вместо char
|
О да! Что нам все эти Керниганы и Ричи с Томсонами а заодно и с АНСИ комитетами по языку "С"? Придурки они все конечно же! То-ли дело МЫ! Гиганты ума и программирования!
Есть причины делать размерность возврата шире чем собственно возвращаемые данные и возвращать особые состояния кодами вне диапазона данных. И боюсь что этих причин больше чем многие в состоянии посчитать без калькулятора.
|
|
|
|
16.02.2011, 14:21
|
|
Вид на жительство
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от urmlr
|
О да! Что нам все эти Керниганы и Ричи с Томсонами а заодно и с АНСИ комитетами по языку "С"? Придурки они все конечно же! То-ли дело МЫ! Гиганты ума и программирования!
|
Если бы у нас как у них было 640 кб оперативки - то нам было бы всё равно. Но так как у нас её значительно меньше - мне вот, допустим, нафиг не надо чтобы ,при создании массива, строка "Hello world" была записанна в двухбайтовом юникоде. Потому и логично использовать всего лишь один флаг вместо удвоения памяти под каждый символ.
|
|
|
|
16.02.2011, 15:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
|
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.
Причина: очепятка в коде
|
|
|
|
16.02.2011, 18:14
|
|
Вид на жительство
Регистрация: 21.08.2007
Сообщений: 318
Сказал спасибо: 12
Сказали Спасибо 67 раз(а) в 61 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от urmlr
|
Юникод - изобретение проталкивавшееся мелкомягкими, ни вашим - ни нашим, потому до сих пор нормальными компилерами не поддерживается.
|
Тем не менее на 32 битных системах каждый символ занимает 2 байта.
Не вижу смысла дальше обсуждать размерности определений т.к. чтобы не возникло непоняток с ними - всегда использую прототипы.
|
|
|
|
16.02.2011, 19:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,446
Сказал спасибо: 99
Сказали Спасибо 317 раз(а) в 233 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от Cybermaker
|
Тем не менее на 32 битных системах каждый символ занимает 2 байта.
|
Даже если он описан как:
PHP код:
|
char stroka[] = "привет";
|
И почему тогда не 4? Со словом не путаете?
А насчёт int и значения getchar() "вне диапазона" - попишет народ программки, поймёт, что был неправ, глядишь - и толк будет. А так - пока сами не поймут - хоть объясняй, хоть не объясняй.
|
|
|
|
16.02.2011, 20:58
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
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.
|
|
|
|
17.02.2011, 01:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от Someone
|
я бы организовал кольцевой буфер так
|
В этом фрагменте кода контроля переполнения нет вообще. Т.Е. если, скажем, программа которая вызывает getchar зависнет, то принимаемые символы так и будут писаться в буфер, перезаписывая друг дружку. Если же этот код будет просто работать медленно и на какой-то момент rx_wr_index0 "наедет" на rx_rd_index0, то вы потеряете целый буфер.
Плюс, этот код не может принять нулевой байт, ибо возврат нуля идентичен отсутствию байта в буфере.
Второй фрагмент, собственно, не лучше.
Последний раз редактировалось urmlr; 17.02.2011 в 01:14.
Причина: очепятка
|
|
|
|
17.02.2011, 11:39
|
|
Гражданин KAZUS.RU
Регистрация: 16.06.2005
Сообщений: 944
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
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 .
|
|
|
|
17.02.2011, 12:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 15.07.2009
Адрес: San Jose, USA
Сообщений: 927
Сказал спасибо: 11
Сказали Спасибо 228 раз(а) в 166 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от Someone
|
Имхо в кольцевом буфере контроль переполнения не особенно и нужен [...] только поставится флаг переполнения
|
Самое опасное что только может быть, это код который работает и выдаёт похожие на правильные, но неправильные результаты. С вашим имхом вы как раз на пути туда. А вот отлов переполнения как раз позволяет предотвратить это и что-то таки сделать. Что именно уже зависит от конкретной аппликухи.
Цитата:
|
Я ведь не зря писал, что я делал бы вызов гетчар только если в буфере что-то лежит
|
То есть ваш код имеет недокументированные и неочевидные взаимосвязи. Сиречь поддерживаться в нормальных производственных условиях не может.
Цитата:
|
в исходном коде не хватает сброса этого флага
|
В нормальном исходном коде с нормально сделанной функцией getchar этот флаг не нужен вообще. Это ещё одна причина почему в стандарте getchar возвращает именно int а не char. Потому как иметь какой-то ещё мистический флаг означает нарываться на неприятности. Баги сиречь.
Цитата:
|
Данный код будет работать быстрее исходного
|
Код должен для начала работать правильно, а быстрее или нет - второй вопрос.
Резюме: экзамена по программированию вы бы у меня не сдали
|
|
|
|
17.02.2011, 12:50
|
|
Почётный гражданин KAZUS.RU
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
|
Re: Отправка числа 0 (ноль) по уарту
Сообщение от urmlr
|
Юникод - изобретение проталкивавшееся мелкомягкими, ни вашим - ни нашим, потому до сих пор нормальными компилерами не поддерживается.
|
Правда??!!! А как тада весь Unix работает? Может там по дефолту CP-1251 стоит? Знаете не замечал. Всегда UTF-8. По поводу компилеров - в делфях и вижуал студиях начиная с 2005 версии юникод по дефолту стоит.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:18.
|
|