Предупреждение об ошибке ограничения при использовании Enum в ADA

Я хотел бы знать, почему предупреждения об ошибках ограничения выводятся в Ada при использовании перечислений, как в примере ниже. Поскольку я использовал Enums, я могу заменить их для лучшей реализации.

type Uart_Instance_Type is (COM1, COM2, COM3);

for Uart_Instance_Type use
  ( COM1   =>    16#0001# ,
    COM2   =>    16#0002# ,
    COM3   =>    16#0003# 
  );

  type UART_Register_Type is record
    SR         : Half_Word; -- USART Status register
    Reserved_0 : Half_Word;
    DR         : Half_Word; -- USART Data register
    Reserved_1 : Half_Word;
    BRR        : Half_Word; -- USART Baud rate register
    Reserved_2 : Half_Word;
  end record
  with volatile;

  for UART_Register_Type use record
    SR           at  0  range 0 .. 15;
    Reserved_0   at  2  range 0 .. 15;
    DR           at  4  range 0 .. 15;
    Reserved_1   at  6  range 0 .. 15;
    BRR          at  8  range 0 .. 15;
    Reserved_2   at 10  range 0 .. 15;
  end record;

type UART_Register_Access is access all UART_Register_Type;

UARTs: array (Uart_Instance_Type range COM1 .. COM3) of aliased UART_Register_Access;

Приглашение компилятора в последней строке ("UARTs: ...)" показывает:

  warning: "Constraint Error" may call Last_Chance_Handler

Есть ли лучшая реализация, чтобы избежать этих предупреждений при использовании Enums?

Заранее спасибо! :)


person Elisabeth    schedule 12.05.2015    source источник
comment
Какой компилятор вы используете? И каково определение UART_Register_Access?   -  person Holt    schedule 12.05.2015
comment
Я добавил его определение в код выше.   -  person Elisabeth    schedule 12.05.2015


Ответы (1)


Я думаю, вы должны компилировать для ограниченной (Ravenscar?) Среды выполнения, поэтому любое исключение приведет к вызову Last_Chance_Handler.

Я столкнулся с множеством раздражающих предупреждений, подобных этому, и в конечном итоге связал его с компиляцией с помощью
-gnatwa («включить всю информацию / предупреждения, отмеченные ниже знаком +»), что позволяет
-gnatw.x (" включить предупреждения для нелокальных исключений »).

Вы можете подавить предупреждения с помощью -gnatw.X.

(Для информации вы можете увидеть параметры командной строки, сказав gnatmake -h (или arm-eabi-gnatmake -h). Их много.)

person Simon Wright    schedule 12.05.2015
comment
другими словами, нет проблем с реальным кодом (который Gnat 4.9.2 компилирует нормально). Интересно, сможет ли UARTs: array (Uart_Instance_Type) of ... подавить предупреждение, разрешив все COM-порты вместо (по общему признанию полного) подмножества. - person user_1818839; 12.05.2015
comment
Да, я собираю для ограниченного Ravenscar. Я подумал, что с моей реализацией что-то не так, и поэтому получил эти предупреждения. Например, если я использую оператор case для переменной типа Uart_Instance_Type, он всегда выводит то же предупреждение, что и выше, но если я использую if / else, то этого не происходит. Любая идея? - person Elisabeth; 12.05.2015
comment
Я должен сказать, что это похоже на ошибку. Возможно, это будет исправлено в GNAT GPL 2015. @BrianDrummond, компиляция пакета с pragma Profile (Ravenscar) с использованием размещенного компилятора не показывает никаких проблем, pragma Restrictions (No_Exception_Propagation) показывает проблему в спецификации тогда и только тогда, когда присутствует представление перечисления, и показывает проблема с операторами case независимо от представления перечисления. - person Simon Wright; 13.05.2015