Я установил GNAT-GPS и AVR-ELF 3 дня назад, чтобы поиграть.Я вздрогнул и подумал, что могу поиграть еще.У меня нет опыта работы не с VHDL Ada.
Вот сценарий, который я работаю в C:
Я настроил его так, чтобы с помощью typedef GPIO я мог обращаться ко всей необходимой информациинастроить вывод GPIO (т. е. номер контакта, адрес рег. контакта, адрес рег. dd и адрес рег. порта).Затем я делаю то же самое для, скажем, LED0, так что логически я могу подключить LED0 к GPIO15, который сам подключен к PB1 микроконтроллера AVR.
Я пытаюсь сделать то же самое в Ada.Я чувствую, что могу написать С на Аде;не стесняйтесь сообщить мне впоследствии, если есть лучший способ сделать это в Ada.
Я настроил регистры AVR для определенного контакта, чтобы подключиться к его короткому названию ссылки:
-- PB1
PB1_Port_reg : Unsigned_8;
PB1_Dd_reg : Unsigned_8;
PB1_Pin_reg : Unsigned_8;
for PB1_Port_reg'Address use AVR.Atmega328p.PORTB'Address;
for PB1_Dd_reg'Address use AVR.Atmega328p.DDRB'Address;
for PB1_Pin_reg'Address use AVR.Atmega328p.PINB'Address;
PB1_Pin : constant := 1;
Затем я устанавливаю ссылку на его короткое имя для подключения к номеру контакта пакета:
-- ATmega328p DIP28 Pin15 is PB1
Pin15_Port_reg : Unsigned_8;
Pin15_Dd_reg : Unsigned_8;
Pin15_Pin_reg : Unsigned_8;
for Pin15_Port_reg'Address use PB1_Port_reg'Address;
for Pin15_Dd_reg'Address use PB1_Dd_reg'Address;
for Pin15_Pin_reg'Address use PB1_Pin_reg'Address;
Pin15_Pin : constant := PB1_Pin;
Затем я определяю запись для хранения всех параметров контакта:
type gpio_t is record
pin : Unsigned_8;
pin_reg : Unsigned_8;
dd_reg : Unsigned_8;
port_reg : Unsigned_8;
end record;
Thisпозволяет мне написать следующую функцию:
procedure gpio_map (gpio_t_dest : in out gpio_t; gpio_t_pin, gpio_t_pin_reg, gpio_t_dd_reg, gpio_t_port_reg : in Unsigned_8) is
begin
gpio_t_dest.pin := gpio_t_pin;
gpio_t_dest.pin_reg := gpio_t_pin_reg;
gpio_t_dest.dd_reg := gpio_t_dd_reg;
gpio_t_dest.port_reg := gpio_t_port_reg;
end gpio_map;
В будущем я буду искать ее как:
procedure gpio_map_future (gpio_t_dest : in out gpio_t; gpio_t_src : in gpio_t) is
begin
gpio_t_dest.pin := gpio_t_src.pin;
gpio_t_dest.pin_reg := gpio_t_src.pin_reg;
gpio_t_dest.dd_reg := gpio_t_src.dd_reg;
gpio_t_dest.port_reg := gpio_t_src.port_reg;
end gpio_map;
Эта функция gpio_map используется для подключениявывод пакета gpio_t на номер вывода пакета:
gpio_map(gpio15, Pin15_pin, Pin15_pin_reg, Pin15_dd_reg, Pin15_port_reg);
Я считаю, что светодиод правильно инициализируется, если я использую эту функцию:
core_reg_write(Pin15_dd_reg, Shift_Left(1,Integer(Pin15_pin))); -- works
Но инициализируется неправильно, если я:
core_reg_write(gpio15.dd_reg, Shift_Left(1,Integer(gpio15.pin))); -- does not work
Это, однако, работает:
core_reg_write(Pin15_dd_reg, Shift_Left(1,Integer(gpio15.pin))); -- works
Мне ясно, что у меня есть
Pin15_pin = 1 @ address (don't care - a variable)
Pin15_pin_reg = (don't care) @ address 0x23
Pin15_dd_reg = (0b00000000) @ address 0x24
Pin15_port_reg = (don't care) @ address 0x25
И что
gpio15.pin = 1 @ address (don't care, but not same as Pin15_pin address)
gpio15.pin_reg = (don't care) @ address IS NOT 0x23
gpio15.dd_reg = (don't care) @ address IS NOT 0x24
gpio15.port_reg = (don't care) @ address IS NOT 0x25
Как мне сохранить фиксированные адреса памяти для записей членов, то есть получить
gpio15.pin_reg = (don't care) @ address 0x23
gpio15.dd_reg = (don't care) @ address 0x24
gpio15.port_reg = (don't care) @ address 0x25
И еще лучше яf Я также могу получить
gpio15.pin = 1 @ address (same as Pin15_pin address)
Извините за длинный вопрос;надеясь, что это поможет прояснить ситуацию.