Страница 1 из 2

Синтаксис языка С в AVR Studio 5

Добавлено: Вс фев 12, 2012 20:17:58
Leo_vrn
Подскажите, где можно найти нормальное описание синтаксиса языка С, применяемого в AVR Studio 5 ?

До этого писал только на ассемблере, решил освоить С, но не хочу уходить с AVR Studio.
Столкнулся с большой проблемой, при попытке что-либо написать и скомпилировать постоянно вылезают ошибки синтаксиса, но нигде не получается найти, как синтаксически правильно именно в AVR Studio писать ту или конструкцию.
В самой AVR Studio никакого хелпа похоже не предусмотрено вообще. :(

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Вс фев 12, 2012 20:26:38
IfoR
Так вы напишите код, на который оно ругается.
И сама AVR Studio с Си кодом работать не умеет - компилятор там WinAvr. Хотя может в 5-той версии свой появился. :dont_know:

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Вс фев 12, 2012 20:56:14
hybroid
Leo_vrn писал(а):В самой AVR Studio никакого хелпа похоже не предусмотрено вообще. :(
Да и не должно его быть там. Это IDE. Хелп есть у компилятора. Гуглите winavr или gcc avr.

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 01:39:55
Leo_vrn
Да нагуглил уже давно.
Например, как там операции с портами должны происходить?

почему-то на, например, portb.1 оно ругается
на PB1 тоже ругается (хотя в файле определений это есть).
Как правильно к портам и пинам обращаться?
В примерах по AVR GCC и WinAVR именно как PORTB.1 обращения идут.
Например у того же Шпака в "Программирование на языке С для AVR и PIC микроконтроллеров" примеры даны именно для WinAVR и AVR Studio, только работать почему-то описанный там синтаксис не хочет.

Описанные в этой http://easyelectronics.ru/rabota-s-port ... na-si.html статье примеры (написано, что примеры для компилятора AVR GCC) не проходят при компиляции (куча ошибок синтаксиса).


Так где нарыть описание использования языка именно для AVR Studio 5?

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 04:24:00
hybroid
Leo_vrn писал(а):(куча ошибок синтаксиса)
Хорошо бы взглянуть на лог компиляции. И на исходник.

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 05:01:52
Leo_vrn
Мне бы всё же описание синтаксиса языка, а не разбор какого-то кусочка кода. :)

Есть 15 летний опыт программирования на Pascal (Delphi) и разных вариациях ассемблера.
Теперь вот для больших проектов на AVR нужно изучать Си. На асме что-то большое писать слишком долго.

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 05:31:21
hybroid
Откуда мне (да и остальным) известно, что у вас там происходит? Про синтаксис уже сказали - банальный GCC для AVR. А вы же не удосужились нормально описать, что у вас за "куча ошибок". Как, блин, блондинка, которая звонит сисадмину и говорит про какое-то окошко с какой-то кнопочкой. Телепатов нету, они не выдержали нагрузки и совершили массовое самогубство :( Может у вас не подключен io.h.. Сидеть теперь и гадать?

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 09:21:26
IfoR
Leo_vrn, конструкция типа PORTB.1 используется только в CVAVR, ну или ещё в других. В WinAvr для установки битов нужно пользоваться битовыми операциями. Например, установка в PORTB бита 2:

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

PORTB |= 1<<2; 
Сброс этого же бита:

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

PORTB &= ~(1<<2); 
Установка 2 и 5 бита:

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

PORTB |= (1<<2)|(1<<5); 
и т.д. Некоторые для удобства пишут макросы аля setBit(PORTB, 2).
И о каком таком "синтаксисе AVR Studio 5" идёт речь? Си - это стандартизированный язык и на него есть стандарт с регламентированными конструкциями и то что они точно должны делать и компилятор должен всё точно также исполнять. Иначе говоря, не важно что писать: мигалку для микроконтроллера или систему стабилизации для истребителя для какого-то мегакомпьютера - синтаксис один и тот же. Ну а то что некоторые разработчики добавляют нестандартные конструкции в свои компиляторы, так это другой компилятор не виноват, что он не знает этих конструкций. Максимум виноват программист, который написал этот компиляторозависимый код.

А PB1 - это наверно номер бита 1 порта PORTB:

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

PORTB |= 1<<PB1;  

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 10:33:31
phanis

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

Сброс этого же бита:
Код:
PORTB &= ~(1<<2); 
А сброс сразу нескольких бит как будет ?

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 11:00:08
SubDia
phanis писал(а):А сброс сразу нескольких бит как будет ?
В точности так же. Сбрасываем 2, 3 и 4 биты.

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

PORTB &= ~((1<<2)|(1<<3)|(1<<4));

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 11:04:01
Jack_A
phanis писал(а):

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

Сброс этого же бита:
Код:
PORTB &= ~(1<<2); 
А сброс сразу нескольких бит как будет ?

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

PORTB &= ~( (1<<2) | (1<<3) | (1<<6) ); 
Хотя бы и так. Сбросить 2,3 и 6-й биты .

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 11:06:03
hybroid
В avr-gcc вместо (1<<PB2), например, можно использовать _BV(PB2).
Т.е. пример выше будет выглядеть так:

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

PORTB &= ~( _BV(PB2) | _BV(PB3) | _BV(PB6) );

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 15:23:27
ut1wpr
hybroid писал(а):В avr-gcc вместо (1<<PB2), например, можно использовать _BV(PB2).
Т.е. пример выше будет выглядеть так:

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

PORTB &= ~( _BV(PB2) | _BV(PB3) | _BV(PB6) );
И опять получим код, который будет понимать только ГСС. Это тот же макрос, только встроенный в Гнусь. Любой отход от стандарта ANSI C приводит к зависимости от компилятора. Так стоит-ли плодить сущности? :)
Если не понимать, что лежит в основе того или иного макроса - обречен сидеть под одним и тем же компилятором, портирование недоступно...

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 15:37:32
phanis
Ага понял спасибо, при установке бит нет общих скобок

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

PORTB |=  (1<<2) | (1<<3) | (1<<6) ;
, а при сбросе есть общая скобка

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

 PORTB &= ~( (1<<2) | (1<<3) | (1<<6) ); 
т.е если просто написать

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

PORTB &= ~ (1<<2) | (1<<3) | (1<<6) ;
не срабатывает как нужно, вот такой тонкий момент интересовал.
Вроде просто, а не поставил скобки и все, долго не мог понять в чем дело..
Спасибо еще раз..

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 16:09:04
ut1wpr
phanis писал(а):Ага понял спасибо, при установке бит нет общих скобок

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

PORTB |=  (1<<2) | (1<<3) | (1<<6) ;
, а при сбросе есть общая скобка

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

 PORTB &= ~( (1<<2) | (1<<3) | (1<<6) ); 
т.е если просто написать

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

PORTB &= ~ (1<<2) | (1<<3) | (1<<6) ;
не срабатывает как нужно, вот такой тонкий момент интересовал.
Вроде просто, а не поставил скобки и все, долго не мог понять в чем дело..
Спасибо еще раз..
Проблема не в сбросе или установке, а в порядке выполнения операторов в порядке их приоритетов. Без общей скобки оператор побитной инверсии (тильда) будет относится только к первому выражению. Заключение ВСЕГО проореного выражения в скобки приведет к именно его побитной инверсии.

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 16:58:40
hybroid
ut1wpr писал(а):И опять получим код, который будет понимать только ГСС.
Сударь, я с этого и начал мой пост с этим примером.
Если совсем заморачиваться стандартами Си - можно и подохнуть. А если вы не собираетесь менять компилятор, почему бы и не использовать его удобные возможности?

PS: вы сами часто встречали сорцы, которые проглотит любой компилятор? о.О

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 17:53:42
phanis
Еще вот такой вопрос. Операции

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

   |=   &=    ^=  *=    /=  
обязательно должны быть слитно написаны с знаком равно..??
Если да, то почему так?

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 18:07:13
ut1wpr
phanis писал(а):Еще вот такой вопрос. Операции

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

   |=   &=    ^=  *=    /=  
обязательно должны быть слитно написаны с знаком равно..??
Если да, то почему так?
Стоп! С этого момента надо прекратить задавать вопросы в форуме. Читаем Кернигана и Ричи, желательно в оригинале. Не спеша и вдумчиво. Форумы - не курсы обучения. Здесь топчется народ, знающий Си от А до Я и даже больше, но это не повод их мучать подобными вопросами. Вы собрались основы программирования на вопросах и ответах изучить? Желательна хоть небольшая, но все-таки платформа знаний. Я без обид, это же очевидно, не выучив азбуки, не научитесь слога составлять...
PS А по сути вопроса: Что вам скажет компилятор, если вы оператор for напишите не слитно, а раздельно? Правильно. Потому что это ОПЕРАТОР.
И |= написанное раздельно будет компилятором воспринято как ДВА самостоятельных оператора | и =

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 18:23:18
phanis
Да ясно теперь. потому что это

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

   l_значение = выражение
              l_значение += выражение
              l_значение -= выражение
              l_значение *= выражение
              l_значение /= выражение
              l_значение %= выражение
              l_значение >>= выражение
              l_значение <<= выражение
              l_значение &= выражение
              l_значение ^= выражение
              l_значение |= выражение
операции присваивания. Это не флуд, я частенько на таких мелочах попадался. Можно же например написать А = B + C; А=B+C; с пробелами и без вот я к чему..
Спасибо за разъяснения.

Re: Синтаксис языка С в AVR Studio 5

Добавлено: Пн фев 13, 2012 18:36:26
ut1wpr
phanis писал(а):Можно же например написать А = B + C; А=B+C; с пробелами и без вот я к чему..
Спасибо за разъяснения.
"А = B + C;" тождественно равно "А=B+C;" В вашем примере лишние пробелы безболезенно уберет сам компилятор на первом проходе. Все-таки Кернигана и Ричи читать придется, несмотря ни на какие уловки. Извините, я выпадаю из дальнейших обсуждений.
Удачи в освоении.