Вот в чем дело: я работаю над функцией C, которая настраивает структуру, содержащую множество элементов, например *BASE (указатель на структуру), ID, MODE; но BASE - это структура, которая может быть определена как (скажем) "структура a", "структура b", "...", в зависимости от интерфейса. Это объявление структуры (и некоторых примеров):
typedef unsigned int u32_t;
typedef unsigned char u8_t;
typedef struct _interface_t{
u32_t *BASE;
u8_t ID;
u32_t MODE;
} interface_t;
interface_t USART0_DEV = {AT91C_BASE_US0, AT91C_ID_US0, 0}; // <-- Here we have a AT91C_BASE_US0 struct as *BASE
interface_t USART1_DEV = {AT91C_BASE_US1, AT91C_ID_US1, 0};
interface_t TC0_DEV = {AT91C_BASE_TC0, AT91C_ID_TC0, 0}; // <-- Here we have a AT91C_BASE_TC0 struct as *BASE
interface_t TC1_DEV = {AT91C_BASE_TC1, AT91C_ID_TC1, 0};
interface_t TC2_DEV = {AT91C_BASE_TC2, AT91C_ID_TC2, 0};
interface_t TWI_DEV = {AT91C_BASE_TWI, AT91C_ID_TWI, 0}; // <-- Here we have a AT91C_BASE_TWI struct as *BASE
Как видите, я использовал u32_t
вместо структуры, потому что объявляю указатель на эту структуру. Позже у меня есть моя функция, определенная как:
unsigned char ConfigureDevice(interface_t *Interface, u32_t config, u32_t Speed, u32_t IRQ_Trigger, void (*Interface_irq_handler)(void)){
...
Interface->BASE->US_IER = IRQ_Trigger; //Note: US_IER Must receive a vector to a function
...
}
Но я получаю сообщение об ошибке «US_IER не может быть разрешен». Поэтому я попробовал AT91S_USART InterfaceBASE = Interface->BASE; InterfaceBASE->US_IER = IRQ_Trigger;
вместо Interface->BASE->US_IER = IRQ_Trigger;
и не получил никакой ошибки. Но я не могу использовать это, потому что я не всегда знаю, с каким интерфейсом я работаю (пока я не прочитал член ID).
Это становится еще хуже: когда я пытаюсь скомпилировать, я продолжаю получать conflicting type qualifiers for 'u32_t'
ошибку в u32_t
typedef и initialization from incompatible pointer type
и near initialization for USART0_DEV.BASE
предупреждения в каждом из interface_t
определений.
Я искал на форумах, но я не мог понять свои ошибки. Эти вроде помогли:
Что не так с моим кодом? Что я могу сделать, чтобы использовать что-то вроде Interface->BASE->US_IER
РЕДАКТИРОВАТЬ: Привет!, и вот что я получил:
typedef struct _Interface_t{
struct PERIPH_BASE * BASE;
u32_t ID;
u32_t MODE;
Interface_t;
Interface_t USART0_DEV = {(struct PERIPH_BASE *)AT91C_BASE_US0, AT91C_ID_US0, 0};
...
unsigned char ConfigureDevice(Interface_t *Interface, u32_t config, u32_t Speed, u32_t IRQ_Trigger,...
...
((AT91S_SYS)Interface->BASE)->AIC_IECR = IRQ_Trigger; //No problems marked by Eclipse Code Editor
....
}
Выглядит нормально, но при компиляции получаю cast to union type from type not present in union
Error...
US_IER
является первым членом структуры, на которую указываетBASE
? - person jxh   schedule 07.08.2013BASE
для представления универсального указателя. В C общий указатель пишется какvoid *
. Вопрос о том, достаточно ли изменить BASE наvoid *
(и последующие изменения с использованием приведения при доступе к данным через BASE), остается открытым. Вам может быть лучше с профсоюзом, а может и нет. Это может зависеть от того, есть ли у вас открытый список типов интерфейсов. (Кроме того, будьте осторожны при использовании имен, начинающихся с_
.) - person Jonathan Leffler   schedule 07.08.2013type qualifiers for 'u32_t'
в typedef u32_t и предупрежденияinitialization from incompatible pointer type
иnear initialization for USART0_DEV.BASE
в каждом из определений interface_t, даже после попытки привести указатель к u32_t*. Я не понимаю другого способа определения типа - person Roosembert Palacios   schedule 07.08.2013