|
|
  |
Не могу понять, что значит эта запись!, Описание массивов в IAR 5.30 |
|
|
|
Aug 10 2009, 18:41
|

Гуру
     
Группа: Модератор 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. Такая конструкция позволяет программисту напрямую обращаться к произвольному байту буфера принимаемых данных.
|
|
|
|
|
Nov 14 2009, 08:24
|
Группа: Участник
Сообщений: 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)) это маска ?
|
|
|
|
|
Nov 14 2009, 09:48
|
Группа: Участник
Сообщений: 8
Регистрация: 14-11-09
Из: Ульяновск
Пользователь №: 53 612

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