реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Не могу понять, что значит эта запись!, Описание массивов в IAR 5.30
MaksimYrievich
сообщение Aug 10 2009, 17:55
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Уважаемые профессионалы и любители программирования в 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 я разобрался!
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 10 2009, 18:06
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



[...]
Два неинициализируемых массива переменных типа unsigned char размером USB_BUFSIZE расположены в области памяти USB_BUFFER_SECTION.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Aug 10 2009, 18:11
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



А что значит IAR_SECTION? А так же слово __attribute?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 10 2009, 18:23
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



По поводу __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__(...).


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 10 2009, 18:41
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



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. Такая конструкция позволяет программисту напрямую обращаться к произвольному байту буфера принимаемых данных.
Go to the top of the page
 
+Quote Post
MaksimYrievich
сообщение Aug 10 2009, 18:57
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828



Спасибо за объяснение! А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал! Действительно после затирания директивы __attribute__ () работоспособность программы не исчезла. Она же из GCC!
Что же получается, если компилятору слово не известно (__attribute__ ) он его просто игнорирует?
Или после этого он его за пустоту считать начинает?:
#define __attribute__(arg)
Go to the top of the page
 
+Quote Post
Alex11
сообщение Aug 10 2009, 19:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



Естественно, после этого дефайна. Он определяет, что __attribute__ вместе с аргументами следует заменить на ничего.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 11 2009, 05:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Xenia @ Aug 11 2009, 02:41) *
...И только ваш пример позволяет догадаться, что речь идет о компиляторе для ARM, т.к. у AVR такого доступа к USB-буферу нет...
smile.gif Извините за оффтоп, но смеялся до коликов - этот код как раз для AVR...От драйвера USB-AVR компании http://obdev.at


--------------------
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 11 2009, 07:57
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(MaksimYrievich @ Aug 10 2009, 21:57) *
А я уже думал у меня голова взорвется. Об IARовский хелп все глаза сломал!

Составители хэлпа безрассудно полагали, что базовые знания по языку и препроцессору уже есть. Без обид smile.gif
Tip: в качестве борьбы с макросами разрешите в свойствах проекта формирование файлов после обработки модулей препроцессором. Они будут с расширением i. Их просмотр помогает разобраться в подобных случаях.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
AVRall
сообщение Nov 14 2009, 08:24
Сообщение #10





Группа: Участник
Сообщений: 8
Регистрация: 14-11-09
Из: Ульяновск
Пользователь №: 53 612



Ребят, я новичек поэтому вопрос соответствующий положению )) вот работающая запись
if(PINC & (1<<PINC0)) ;
else N=N+1;
проверяю нажата ли кнопка на PIN C0. Поосто if(PINC & (1<<PINC0)) не работает. Как мне можно провериь состояние кнопки без else ? if(PINC0==0b1) не робит.. И непонятна сама запись (PINC & (1<<PINC0)) это маска ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 14 2009, 08:58
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(AVRall @ Nov 14 2009, 11:24) *
Как мне можно провериь состояние кнопки без else ?

Вы, наверное, вот так хотели?
if( (PINC & (1<<PINC0) ) == 0 ) N=N+1;
Go to the top of the page
 
+Quote Post
AVRall
сообщение Nov 14 2009, 09:48
Сообщение #12





Группа: Участник
Сообщений: 8
Регистрация: 14-11-09
Из: Ульяновск
Пользователь №: 53 612



Цитата(Палыч @ Nov 14 2009, 11:58) *
Вы, наверное, вот так хотели?
if( (PINC & (1<<PINC0) ) == 0 ) N=N+1;

ДАААА ! ! ! Спасибо, ни человек а ЧЕЛОВЕЧИЩЕ ! ! Уже 10й день кнопку мучаю ! А можно узнать логику этого выражения (PINC & (1<<PINC0) ) == 0 ?
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 14 2009, 10:02
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(AVRall @ Nov 14 2009, 12:48) *
А можно узнать логику этого выражения (PINC & (1<<PINC0) ) == 0 ?


Сначала считается конъюнкция PINC и единицы, сдвинутой влево на PINC0 бит, и потом сравнение результата с нулем. Можно было проще записать if ( !(PINC & (1<<PINC0)) )
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.14566 секунд с 7
ELECTRONIX ©2004-2016