在ADA中使用Enum的约束错误警告

时间:2015-05-12 09:29:57

标签: enums ada gnat

我想知道为什么在使用枚举时会在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时是否有更好的实现来避免这些警告?

提前致谢! :)

1 个答案:

答案 0 :(得分:4)

我认为你必须为受限制的(Ravenscar?)运行时进行编译,这就是任何异常将导致调用Last_Chance_Handler的原因。

我遇到了像这样的恼人警告的很多,并最终将其追溯到编译 -gnatwa(“打开下面标有+的所有信息/警告”)启用
-gnatw.x(“打开非本地例外警告”)。

您可以使用-gnatw.X来抑制警告。

(有关信息,您可以通过说gnatmake -h(或arm-eabi-gnatmake -h)来查看命令行选项。有很多。)