2015-02-10 1 views
4

Я хочу написать очень простой драйвер для инициализации, записи/чтения с некоторых периферийных устройств на микроконтроллере, так же, как я это сделал в C. Я использую в качестве примера GPIO периферийные для инициализации, записи и чтения.Доступ к неустойчивому регистру в Ada

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

Если я объявляю список доступа ко всем GPIOs:

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» должны быть псевдонимом. –

+0

Если вы этого не сделаете, вы получите еще один тип ошибок ошибок, связанных с проверкой строгого типа. – Elisabeth

+0

Если я это сделаю, я по-прежнему получаю ту же ошибку: '142: 29 префикс атрибута« ACCESS »должен быть aliased.' – Elisabeth

ответ

5

Короткий ответ:

объявить GPIOA, как алиас, как это:

GPIOA : aliased GPIO_Register 

EDIT:

немного длиннее ответ:

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 доступ к изменчивому объекту не может дать доступ к не-non -устойчивый тип ' – Elisabeth

+0

Тогда вам нужно также сделать' GPIO_Register' изменчивым типом. – egilhh

+0

'GPIO_Register' является зависимой от платформы записью:' type GPIO_Register - это запись MODER: Bits_16x2; IDR: Word; ODR: Word; end record; ' – Elisabeth

Смежные вопросы