2015-02-10 78 views
4

我想寫一個非常簡單的驅動程序來初始化,寫入/讀取微控制器上的某些外設,就像我在C中完成的一樣。我使用GPIO作爲示例外設進行初始化,寫入和讀取。訪問Ada中的易失性寄存器

GPIOA : GPIO_Register with 
    Volatile, 
    Address => System'To_Address (GPIOA_Base); 
    pragma Import (Ada, GPIOA); 

如果我宣佈一個列表來訪問所有的GPIO:

type GPIO_Register_ptr is access all GPIO_Register with volatile; 

Gpio_List_Pointers : array (Integer range 1 .. 8) of aliased GPIO_Register_ptr; 

,然後分配:

Gpio_List_Pointers(1) := GPIOA'Access; 

我得到的錯誤:

142:29 prefix of "ACCESS" attribute must be aliased 

任何想法如何整理出來?

+0

我不認爲'GPIO_Register_ptr'需要是易失性的,或者'Gpio_List_Pointers'的組件需要被別名。 – 2015-02-10 16:21:16

+0

如果你不這樣做,你會得到另一種與嚴格類型檢查有關的錯誤類型的錯誤。 – Elisabeth 2015-02-10 16:50:40

+0

如果我這樣做,我仍然會得到相同的錯誤:「ACCESS」屬性的'142:29前綴必須是別名。「 – Elisabeth 2015-02-10 16:59:01

回答

5

簡短的回答是:

聲明GPIOA作爲別名,就像這樣:

GPIOA : aliased GPIO_Register 

編輯:

的時間長一點的回答:

GPIOA聲明如下:

GPIOA : aliased GPIO_Register with 
    Volatile, 
    Address => System'To_Address (GPIOA_Base); 

這意味着它是一個易失物體類型的對象仍然是GPIO_Register,這是不是易失性。 所以,當你做

Gpio_List_Pointers(1) := GPIOA'Access; 

'Access回到GPIO_Register類型,這是揮發性的對象的訪問,以及編譯器不會讓你這樣做。

爲了使這個合法,GPIO_Register需要是一個易失性類型。 這是通過改變類型定義包括一個方面說明做:

type GPIO_Register is record 
    MODER : Bits_16x2; 
    IDR : Word; 
    ODR : Word; 
end record 
    with Volatile; 

現在我們有一個揮發型,不只是一個揮發物

+0

然後我得到以下錯誤:'142:29訪問易失性對象不能產生訪問非 - 易失性類型' – Elisabeth 2015-02-10 16:47:05

+0

然後您還需要使'GPIO_Register'爲易失性類型。 – egilhh 2015-02-10 17:00:16

+0

'GPIO_Register'是一個依賴於平臺的記錄:'類型GPIO_Register是記錄 MODER:Bits_16x2; IDR:Word; ODR:Word; 結束記錄; ' – Elisabeth 2015-02-10 17:27:49

相關問題