Доступ к энергозависимому регистру в Аде
Я хочу написать очень простой драйвер для инициализации, записи / чтения с некоторых периферийных устройств на микроконтроллере, точно так же, как я делал это в 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 ответ
Краткий ответ:
объявлять 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;
Теперь у нас есть изменчивый тип, а не просто изменчивый объект