Доступ к энергозависимому регистру в Аде

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

Теперь у нас есть изменчивый тип, а не просто изменчивый объект

Другие вопросы по тегам