MaksimYrievich
Aug 10 2009, 17:55
Уважаемые профессионалы и любители программирования в IAR! У меня проблема! Не могу сообразить, что означает ниже следующий код. Просто не могу сообразить, что означают эти директивы (хелп IARa не предлагать!). Подскажите пожалуйста, вразумите! А вот собственно и код:
__no_init UCHAR usbRxBuf[2][USB_BUFSIZE] __attribute__ ((section (USB_BUFFER_SECTION))) IAR_SECTION(USB_BUFFER_SECTION); /* raw RX buffer: PID, 8 bytes data, 2 bytes CRC */
А в файле stdafx.h сказано, что:
#define __attribute__(arg)
#define IAR_SECTION(section) @ section
#define UCHAR unsigned char
Со строчкой про UCHAR я разобрался!
Dog Pawlowa
Aug 10 2009, 18:06
[...]
Два неинициализируемых массива переменных типа unsigned char размером USB_BUFSIZE расположены в области памяти USB_BUFFER_SECTION.
MaksimYrievich
Aug 10 2009, 18:11
А что значит IAR_SECTION? А так же слово __attribute?
SSerge
Aug 10 2009, 18:23
По поводу __no_init смотреть файл с названием типа CompilerReference.pdf или подобным. Смысл прост - статические переменные (те, которые не auto) инициализируются нулями, если не инициализированы явно. __no_init это отменяет.
Остальное - похоже на попытку сделать исходник, который может компилироваться как IAR-ом, так и GCC.
__attribute__ это для GCC, при компиляции IAR-ом эта часть с помощью препроцессора заменяется на пустое место, а IAR_SECTION(section) превращается в @ section - это указание в какой секции разместить переменную.
В результате компилятору достаётся строка:
__no_init unsigned char usbRxBuf[2][USB_BUFSIZE] @ USB_BUFFER_SECTION;
При компиляции GCC - наоборот убирают IAR_SECTION(...), оставляют __attribute__(...).
MaksimYrievich, в следующий раз, когда будете задавать вопросы, называете пожалуйста компилятор! По номеру версии зачастую бывает трудно определить, с чем вы имеете дело. У компании IAR есть множество компиляторов под большой набор микропроцессоров. А к вашей версии 5.30 подходят два компилятора: EWAVR-530 и EWARM-530. И только ваш пример позволяет догадаться, что речь идет о компиляторе для ARM, т.к. у AVR такого доступа к USB-буферу нет. Поэтому для начала советую вам ознакомиться с темой "Бригада телепатов отвечает на ваши вопросы".
Что касается вашего примера, то он из серии размещения переменных или массивов в заданных областях памяти. Типично такая кострукция имеет вид:
__no_init UCHAR usbRxBuf[2][USB_BUFSIZE] @ segname
где
segname означает имя сегмента памяти, в котором размещается переменная или массив, а
__no_init обязательная в таких случаях индульгенция, разрешающая компилятору эту область не инициализировать. Если этого не разрешить, то он, скорее всего, откажется сделать такое размещение.
Имена сегментов обычно запрятаны в xcl-файлах линкера, там это имя (USB_BUFFER_SECTION) и нужно искать.
Поскольку компилятор не может принять в качестве segname переменную или константу, а требует явного названия в этом месте имени, то такую подмену приходится делать при помощи дефиниций прекомпилятора #define.
#define __attribute__(arg)
и
#define IAR_SECTION(section) @ section
являются такими средствами.
Вторая дефиниция как раз делает такую подстановку, вставляя значок @, а затем приписывая после него то слово, что записано в ее аргументе. А первая дефиниция утрясает согласование типов (впрочем, необходимость этой конструкции мне не до конца понятна).
Таким образом, массив usbRxBuf[2][USB_BUFSIZE] размещается в том месте памяти, которая используется как буфер для USB-канала. Скорее всего, речь идет о режиме работы с двойной буферизацией данных, т.к. массив состоит из двух кусков по USB_BUFSIZE. Такая конструкция позволяет программисту напрямую обращаться к произвольному байту буфера принимаемых данных.
MaksimYrievich
Aug 10 2009, 18:57
Спасибо за объяснение! А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал! Действительно после затирания директивы __attribute__ () работоспособность программы не исчезла. Она же из GCC!
Что же получается, если компилятору слово не известно (__attribute__ ) он его просто игнорирует?
Или после этого он его за пустоту считать начинает?:
#define __attribute__(arg)
Alex11
Aug 10 2009, 19:10
Естественно, после этого дефайна. Он определяет, что __attribute__ вместе с аргументами следует заменить на ничего.
prottoss
Aug 11 2009, 05:57
Цитата(Xenia @ Aug 11 2009, 02:41)

...И только ваш пример позволяет догадаться, что речь идет о компиляторе для ARM, т.к. у AVR такого доступа к USB-буферу нет...

Извините за оффтоп, но смеялся до коликов - этот код как раз для AVR...От драйвера USB-AVR компании
http://obdev.at
Dog Pawlowa
Aug 11 2009, 07:57
Цитата(MaksimYrievich @ Aug 10 2009, 21:57)

А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал!
Составители хэлпа безрассудно полагали, что базовые знания по языку и препроцессору уже есть. Без обид

Tip: в качестве борьбы с макросами разрешите в свойствах проекта формирование файлов после обработки модулей препроцессором. Они будут с расширением i. Их просмотр помогает разобраться в подобных случаях.
AVRall
Nov 14 2009, 08:24
Ребят, я новичек поэтому вопрос соответствующий положению )) вот работающая запись
if(PINC & (1<<PINC0)) ;
else N=N+1;
проверяю нажата ли кнопка на PIN C0. Поосто if(PINC & (1<<PINC0)) не работает. Как мне можно провериь состояние кнопки без else ? if(PINC0==0b1) не робит.. И непонятна сама запись (PINC & (1<<PINC0)) это маска ?
Цитата(AVRall @ Nov 14 2009, 11:24)

Как мне можно провериь состояние кнопки без else ?
Вы, наверное, вот так хотели?
if( (PINC & (1<<PINC0) ) == 0 ) N=N+1;
AVRall
Nov 14 2009, 09:48
Цитата(Палыч @ Nov 14 2009, 11:58)

Вы, наверное, вот так хотели?
if( (PINC & (1<<PINC0) ) == 0 ) N=N+1;
ДАААА ! ! ! Спасибо, ни человек а ЧЕЛОВЕЧИЩЕ ! ! Уже 10й день кнопку мучаю ! А можно узнать логику этого выражения (PINC & (1<<PINC0) ) == 0 ?
Цитата(AVRall @ Nov 14 2009, 12:48)

А можно узнать логику этого выражения (PINC & (1<<PINC0) ) == 0 ?
Сначала считается конъюнкция PINC и единицы, сдвинутой влево на PINC0 бит, и потом сравнение результата с нулем. Можно было проще записать if ( !(PINC & (1<<PINC0)) )
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.