我想写一个非常简单的驱动程序来初始化,写入/读取微控制器上的某些外设,就像我在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
任何想法如何解决?
答案 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;
现在我们有易失性类型,而不仅仅是易变物