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

 
 
> Не могу понять, что значит эта запись!, Описание массивов в 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
 
Start new topic
Ответов
Xenia
сообщение Aug 10 2009, 18:41
Сообщение #2


Гуру
******

Группа: Модератор 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
prottoss
сообщение Aug 11 2009, 05:57
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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



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

 


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


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