Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: структуры и указатели
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
AD_Wolf
People,
подскажите...

Есть 3 регистра с адресами:
Цитата
/* Pin Connect Block */
#define PINSEL0 (*((volatile unsigned long *) 0xE002C000))
#define PINSEL1 (*((volatile unsigned long *) 0xE002C004))
#define PINSEL2 (*((volatile unsigned long *) 0xE002C014))


хочу, чтобы было, как в хидере для at91, что-то типа

Код
typedef struct PIN_CONNECT
{
volatile unsigned long PINSEL0;
volatile unsigned long PINSEL1;
...
} PIN_CON, *pPIN_CON;

#define BASE_PIN_CON ( (pPIN_CON) 0xE002C000 )


вопрос: как в структуру вместо "..." добавить PINSEL2 если его адрес 0xE002C014, а не 0xE002C008?
P.S.
по поводу использования структур и указателей на них в хидерах - уже начитался в предыдущем посте at91.
данный вопрос интересует просто для самообразования
zltigo
Цитата(AD_Wolf @ Aug 19 2008, 16:18) *
вопрос: как в структуру вместо

Вписать пустой long
AD_Wolf
Цитата(zltigo @ Aug 19 2008, 18:24) *
Вписать пустой long


Вот так?

Код
typedef struct PIN_CONNECT
{
volatile unsigned long PINSEL0;
volatile unsigned long PINSEL1;
volatile unsigned long;
volatile unsigned short;
volatile unsigned long PINSEL2;
} PIN_CON, *pPIN_CON;

#define BASE_PIN_CON ( (pPIN_CON) 0xE002C000 )


В Keil не проверял, быстро в visual попробовл, он ругнулся
no members defined using this type
zltigo
Цитата(AD_Wolf @ Aug 19 2008, 16:32) *
В Keil не проверял, быстро в visual попробовл, он ругнулся
no members defined using this type

Либо фиктивные имена, либо
Код
volatile unsigned long PINSEL0;
volatile unsigned long PINSEL1;
volatile unsigned long :32;
volatile unsigned short :16;
volatile unsigned long PINSEL2;
} PIN_CON, *pPIN_CON;

Ну и паковать структуру не забыть. Но похоже Вас куда-то совсем неправильно понесло c выравниванием по 16 bit. Я кажется предвижу следующий вопрос sad.gif
AD_Wolf
Цитата(zltigo @ Aug 19 2008, 18:36) *
Либо фиктивное имя, либо
Код
volatile unsigned long PINSEL0;
volatile unsigned long PINSEL1;
volatile unsigned long :32;
volatile unsigned short :16;
volatile unsigned long PINSEL2;
} PIN_CON, *pPIN_CON;

спасибо, работает

а если адреса такие:
#define MAMCR (*((volatile unsigned char *) 0xE01FC000))
#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))
#define MEMMAP (*((volatile unsigned char *) 0xE01FC040))
то после MAMTIM нужно 15 пустых лонгов. по-другому никак нельзя сделать?
zltigo
Цитата(AD_Wolf @ Aug 19 2008, 17:13) *
то после MAMTIM нужно 15 пустых лонгов. по-другому никак нельзя сделать?

В общем случае нет.
aaarrr
Цитата(AD_Wolf @ Aug 19 2008, 19:13) *
то после MAMTIM нужно 15 пустых лонгов. по-другому никак нельзя сделать?

Массив лонгов поставьте. Все это есть в атмеловских хидерах.
Alex03
Цитата(AD_Wolf @ Aug 19 2008, 20:18) *
Цитата
/* Pin Connect Block */
#define PINSEL0 (*((volatile unsigned long *) 0xE002C000))
#define PINSEL1 (*((volatile unsigned long *) 0xE002C004))
#define PINSEL2 (*((volatile unsigned long *) 0xE002C014))

вопрос: как в структуру вместо "..." добавить PINSEL2 если его адрес 0xE002C014, а не 0xE002C008?


Цитата(AD_Wolf @ Aug 19 2008, 20:32) *
Вот так?
Код
typedef struct PIN_CONNECT
{
volatile unsigned long PINSEL0;
volatile unsigned long PINSEL1;
volatile unsigned long;
volatile unsigned short;
volatile unsigned long PINSEL2;
} PIN_CON, *pPIN_CON;


Почему short то? 8 и 14 шестнадцатеричные, соответственно 3 лонга д.б.. Можно массив из 3-х лонгов.


Цитата(AD_Wolf @ Aug 19 2008, 21:13) *
а если адреса такие:
#define MAMCR (*((volatile unsigned char *) 0xE01FC000))
#define MAMTIM (*((volatile unsigned char *) 0xE01FC004))
#define MEMMAP (*((volatile unsigned char *) 0xE01FC040))
то после MAMTIM нужно 15 пустых лонгов. по-другому никак нельзя сделать?

Не 15 а 14.

А смысл?
Типа MAM.MEMMAP (ну или по аналогии BASE_MAM_CON.MEMMAP) приятней читается чем MEMMAP?
Да и ИМХО MEMMAP к MAM-у отношения не имеет.
i.dmitry
Цитата(Alex03 @ Aug 20 2008, 07:36) *
вопрос: как в структуру вместо "..." добавить PINSEL2 если его адрес 0xE002C014, а не 0xE002C008?
Почему short то? 8 и 14 шестнадцатеричные, соответственно 3 лонга д.б.. Можно массив из 3-х лонгов.
Не 15 а 14.

А смысл?
Типа MAM.MEMMAP (ну или по аналогии BASE_MAM_CON.MEMMAP) приятней читается чем MEMMAP?
Да и ИМХО MEMMAP к MAM-у отношения не имеет.


ааа точно 3 лонга, это же HEX

( 0xE01FC040 - 0xE01FC004 ) = 3С/4 = F
т.е. 15 volatile unsigned char
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.