2012-05-24 46 views
2

基本上,我從RTOS中的另一個線程獲取數據。這些數據是電路板上的一個引腳。所有IO端口都位於iodefine.h文件中的結構/聯合體中。看到這個例如Micrium如何做它:將類型轉換爲非類型定義的結構

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

我只是在想,但它不是一個錯字,它只是其他IO端口的完全相同的數據結構。感謝您的信息,但現在不行了。 – Davey

回答

2

既然你是鑄造一個指針,你應該是它強制轉換爲指針的結構,而不是結構本身,像這樣:

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

另外請注意,您的括號是在一個錯誤的地點。

+0

像魅力一樣工作,非常感謝! – Davey

+0

這不明顯...? – 2012-05-24 13:57:55

+1

你爲什麼認爲我在這裏發佈了這個問題? – Davey