2016-07-26 58 views
0

我正在使用xMega AVR微控制器,並且無法將硬件寄存器作爲指針傳遞。很確定這是指針魔術,但經過漫長的一天不能理解錯誤。傳遞硬件寄存器指針

PORTA定義(在GCC-AVR工具鏈)如下:

#define PORTA (*(PORT_t *) 0x0600) 

這工作:

int main(void) 
{ 
    // This will set GPIO high 
    PORTA.DIRSET = 1 << 1; 
    PORTA.OUTSET = 1 << 1; 

    while(1) {}; 
} 

,這將無法工作:

void gpio_output_set(PORT_t * port, unsigned char pin) 
{ 
    // This will *NOT* set GPIO high 
    port->DIRSET = 1 << pin; 
    port->OUTSET = 1 << pin; 
} 

int main(void) 
{ 
    gpio_output_set(&PORTA, 1); 

    while(1) {}; 
} 

爲什麼?

+1

請解釋您的確切意思是「這不起作用」,所以**再次編輯您的問題**。 –

+0

謝謝,更新。 –

+3

但是你的編輯還不夠。什麼不工作?你是如何編譯你的代碼的?您是否看過生成的彙編代碼('gcc -S -fverbose-asm -O') –

回答

4

,我認爲它應該工作。

本質上,它一樣

PORT_t* pPort = &*(PORT_t*)0x0600; 
pPort->DIRSET = 0x01; 

那麼,爲什麼這應該是一個問題嗎? Atmel軟件框架庫也使用以下代碼:

void PORT_ConfigureInterrupt0(PORT_t* port, PORT_INT0LVL_t intLevel, uint8_t pinMask); 

PORT_ConfigureInterrupt0(&PORTC, PORT_INT0LVL_MED_gc, 0x01); 
+0

你是對的。我的代碼中存在一個錯誤,但我不記得細節了。 –

1

你或許應該有

#define PORTA ((PORT_t *) 0x0600) 

(無初始*投前!)

然後以某種替換您set線像

gpio_output_set(PORTA, (unsigned char)10); 
+0

對不起,代碼中的拼寫錯誤。再試一次。 –

+0

我不會重新定義PORTA,因爲這條線是從GCC-AVR工具鏈中包含的。 –

+3

您需要定義一個新的常量或宏:'#define PORTA_ADDRESS((PORT_t *)0x600)'。問題是AVR的宏是從端口*讀*的;它不代表港口的地址。這就是爲什麼我更願意編寫自己的SDK而不是使用供應商的一個例子。通過MISRA和靜態分析儀是其他原因。 –