Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу понять, что значит эта запись!
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
MaksimYrievich
Уважаемые профессионалы и любители программирования в 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
[...]
Два неинициализируемых массива переменных типа unsigned char размером USB_BUFSIZE расположены в области памяти USB_BUFFER_SECTION.
MaksimYrievich
А что значит IAR_SECTION? А так же слово __attribute?
SSerge
По поводу __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__(...).
Xenia
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
Спасибо за объяснение! А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал! Действительно после затирания директивы __attribute__ () работоспособность программы не исчезла. Она же из GCC!
Что же получается, если компилятору слово не известно (__attribute__ ) он его просто игнорирует?
Или после этого он его за пустоту считать начинает?:
#define __attribute__(arg)
Alex11
Естественно, после этого дефайна. Он определяет, что __attribute__ вместе с аргументами следует заменить на ничего.
prottoss
Цитата(Xenia @ Aug 11 2009, 02:41) *
...И только ваш пример позволяет догадаться, что речь идет о компиляторе для ARM, т.к. у AVR такого доступа к USB-буферу нет...
smile.gif Извините за оффтоп, но смеялся до коликов - этот код как раз для AVR...От драйвера USB-AVR компании http://obdev.at
Dog Pawlowa
Цитата(MaksimYrievich @ Aug 10 2009, 21:57) *
А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал!

Составители хэлпа безрассудно полагали, что базовые знания по языку и препроцессору уже есть. Без обид smile.gif
Tip: в качестве борьбы с макросами разрешите в свойствах проекта формирование файлов после обработки модулей препроцессором. Они будут с расширением i. Их просмотр помогает разобраться в подобных случаях.
AVRall
Ребят, я новичек поэтому вопрос соответствующий положению )) вот работающая запись
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, 11:58) *
Вы, наверное, вот так хотели?
if( (PINC & (1<<PINC0) ) == 0 ) N=N+1;

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


Сначала считается конъюнкция PINC и единицы, сдвинутой влево на PINC0 бит, и потом сравнение результата с нулем. Можно было проще записать if ( !(PINC & (1<<PINC0)) )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.