2017-03-04 74 views
0

在我的微控制器課程中,我們正在爲SAMD20J18微控制器編寫嵌入式C語言。將結構定義的地址存儲到指針中時是否創建了一個結構實例?

我們節目的開頭包含下面的代碼兩行:

Port *ports = PORT_INSTS; 
PortGroup *porA = &(ports->Group[0]); 

第二行意味着對我來說,Port結構的實例存在,因爲它Group成員被訪問。但是,課程手冊指出PORT_INSTSPort結構定義的基地址(如下所示),而不是它的一個實例。結構Port的實例是通過將結構定義的地址存儲在指針ports中創建的?對我來說更有意義的是,PORT_INSTS地址指向結構Port的現有實例。我錯了還是手冊錯了?

這裏是手冊的相關部分:

manual

+0

'Port * ports = PORT_INSTS; '將內存映射到'Port'結構,但它必須被初始化。編譯器不會爲您創建任何內容。 –

+0

您可以看到PORT_INSTS變爲PORTS,而PORTS是硬連線地址。您必須從文檔中知道該地址是否有一個端口或一組端口。使用元素0應該沒問題,但只有學習文檔才能讓人更放心。或直接體驗您使用的硬件,這是我沒有的。 –

+0

是不是在嵌入式世界中這樣的結構指針的原因,指向寄存器集,這是內存映射,並且不需要被創建? –

回答

1

的代碼是相同的:

Port *ports = (Port *)0x41004400UL; 

指針ports指向具有所述存儲器地址0x41004400存儲。設備硬件將此地址範圍映射到端口控制器內的寄存器。 Link to documentation

+0

可以說在0x41004400處有一個已經存在的'Port'類型的結構嗎? –

+2

@ByronS:在硬件訪問的情況下,是的;您正在訪問內存尋址的I/O端口,並且它們由硬件「預分配」。該設備存在於地址(您希望);你不能在同一地址分配其他任何東西。 –

+1

@ByronS:更準確地說,'Ports'的定義與硬件寄存器結構相匹配。當端口*引用特定器件寄存器起始地址時,可以通過該結構訪問該器件的各個寄存器。如果一個'Ports'對象在常規內存中被實例化,它就沒有什麼語義用途 - 只有在覆蓋其代表的寄存器結構的硬件設備時纔有意義。 – Clifford

2

第二行意味着我存在一個Port結構的實例,因爲它的組成員正在被訪問。然而,課程手冊指出PORT_INSTS是Port結構定義的基地址(如下所示),而不是它的一個實例。

這是兩件事情。該結構的目的是在現有的MCU硬件寄存器之上創建一個抽象層。從給定的基地址開始,寄存器已經存在於硬件中。這就是爲什麼你不必分配任何東西。