2012-05-24 8 views
2

В основном я получаю данные из другого потока в RTOS. Эти данные являются штырем на плате. Все порты ввода-вывода находятся в структурах/объединениях в файле iodefine.h. См. Это, например, о том, как Micrium сделал это:typecast to not typedefined struct

struct st_portd { 
union { 
    unsigned char BYTE; 
    struct { 
     unsigned char B0:1; 
     unsigned char B1:1; 
     unsigned char B2:1; 
     unsigned char B3:1; 
     unsigned char B4:1; 
     unsigned char B5:1; 
     unsigned char B6:1; 
     unsigned char B7:1; 
    } BIT; 
} DDR; 
unsigned char wk0[31]; 
union { 
    unsigned char BYTE; 
    struct { 
     unsigned char B0:1; 
     unsigned char B1:1; 
     unsigned char B2:1; 
     unsigned char B3:1; 
     unsigned char B4:1; 
     unsigned char B5:1; 
     unsigned char B6:1; 
     unsigned char B7:1; 
    } BIT; 
} DR; 
unsigned char wk1[31]; 
union { 
    unsigned char BYTE; 
    struct { 
     unsigned char B0:1; 
     unsigned char B1:1; 
     unsigned char B2:1; 
     unsigned char B3:1; 
     unsigned char B4:1; 
     unsigned char B5:1; 
     unsigned char B6:1; 
     unsigned char B7:1; 
    } BIT; 
} PORT; 
unsigned char wk2[31]; 
union { 
    unsigned char BYTE; 
    struct { 
     unsigned char B0:1; 
     unsigned char B1:1; 
     unsigned char B2:1; 
     unsigned char B3:1; 
     unsigned char B4:1; 
     unsigned char B5:1; 
     unsigned char B6:1; 
     unsigned char B7:1; 
    } BIT; 
} ICR; 
unsigned char wk3[95]; 
union { 
    unsigned char BYTE; 
    struct { 
     unsigned char B0:1; 
     unsigned char B1:1; 
     unsigned char B2:1; 
     unsigned char B3:1; 
     unsigned char B4:1; 
     unsigned char B5:1; 
     unsigned char B6:1; 
     unsigned char B7:1; 
    } BIT; 
} PCR; 
}; 

Очень умный способ, если вы спросите меня. Таким образом, я сохраняю этот вывод как 2 символа в структуре, называемой Порт и Пин.

struct StepperMotor { 
    CPU_INT32U ID; 
    CPU_CHAR *EnablePort; 
    CPU_CHAR EnablePin; 
    CPU_CHAR *DirectionPort; 
    CPU_CHAR DirectionPin; 
    CPU_CHAR *PulsePort; 
    CPU_CHAR PulsePin; 
}; 

Я хотел бы использовать булавку таким образом:

(struct st_portd)(steppermotor->PulsePort)->DR.BYTE ^= (1 << steppermotor->PulsePin); 

шаговый электродвигатель является структурой. Только таким образом я получаю сообщение об ошибке говорящее

запрос для члена «DR» в чем-то не структуры или объединения

Как я в состоянии использовать steppermotor-> PulsePort-> DR. BYTE, не создавая для него новую переменную? Надеюсь, кто-нибудь может мне помочь!

+0

Что такое 'st_port0'? Это опечатка, которая должна быть 'st_portd'? – dasblinkenlight

+0

Я просто думал об этом, но это не опечатка, это точно та же структура данных, что и другой порт ввода-вывода. Спасибо за информацию, хотя, плохо измените ее сейчас. – Davey

ответ

2

Поскольку вы бросаете указатель, вы должны быть приведения его в указатель на структуру, а не саму структуру, например:

((struct st_portd*)steppermotor->PulsePort)->DR.BYTE ^= (1 << steppermotor->PulsePin); 

Также обратите внимание, что ваши Скобки в неправильно место.

+0

Работаю как шарм, спасибо огромное! – Davey

+0

Было ли это не очевидно ...? –

+1

Почему, по-вашему, я разместил здесь вопрос? – Davey

 Смежные вопросы

  • Нет связанных вопросов^_^