访问Ada中的易失性寄存器

时间:2015-02-10 15:49:41

标签: ada gnat

我想写一个非常简单的驱动程序来初始化,写入/读取微控制器上的某些外设,就像我在C中完成它一样。 我以GPIO外设为例进行初始化,写入和读取。

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

任何想法如何解决?

1 个答案:

答案 0 :(得分: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;

现在我们有易失性类型,而不仅仅是易变物