Enums ADA中使用枚举的约束错误警告

Enums ADA中使用枚举的约束错误警告,enums,ada,gnat,Enums,Ada,Gnat,我想知道为什么在下面的示例中使用枚举时,Ada会提示约束错误警告。因为我一直在使用枚举,所以我可以替换它们以获得更好的实现 type Uart_Instance_Type is (COM1, COM2, COM3); for Uart_Instance_Type use ( COM1 => 16#0001# , COM2 => 16#0002# , COM3 => 16#0003# ); type UART_Reg

我想知道为什么在下面的示例中使用枚举时,Ada会提示约束错误警告。因为我一直在使用枚举,所以我可以替换它们以获得更好的实现

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;
编译器提示位于最后一行(“UART:…”),并显示:

  warning: "Constraint Error" may call Last_Chance_Handler
在使用枚举时,是否有更好的实现来避免这些警告


提前感谢!:)

我认为您必须为受限(Ravenscar?)运行时进行编译,这就是为什么任何异常都会导致调用
Last\u Chance\u Handler

我遇到了很多类似这样的令人恼火的警告,并最终追踪到使用
-gnatwa
(“打开下面用+”标记的所有信息/警告”),这将启用
-gnatw.x
(“打开非本地异常警告”)

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


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

我认为您必须为受限(Ravenscar?)运行时编译,这就是为什么任何异常都会导致调用
Last\u Chance\u处理程序的原因

我遇到了很多类似这样的令人恼火的警告,并最终追踪到使用
-gnatwa
(“打开下面用+”标记的所有信息/警告”),这将启用
-gnatw.x
(“打开非本地异常警告”)

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


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

你使用什么编译器?UART\U寄存器访问的定义是什么?我在上面的代码中添加了它的定义。你使用什么编译器?UART\U寄存器访问的定义是什么?我在上面的代码中添加了它的定义。换句话说,实际的代码没有问题(哪个Gnat 4.9.2编译正常)。我想知道……
UARTs:array(Uart\u Instance\u Type)是否会通过允许所有COM端口而不是(公认的完整)来抑制警告子集。是的,我正在为受限Ravenscar编译。我认为我的实现可能有问题,这就是我收到这些警告的原因。例如,如果我对
Uart\u instance\u type
类型的变量使用case语句,它总是会提示与上面相同的警告,但如果我使用“if/else”“那就没有了。有什么想法吗?我不得不说它看起来像个bug。也许它会在GNAT GPL 2015中得到修复。@BrianDrummond,使用托管编译器编译带有
pragma Profile(Ravenscar)
的包不会显示任何问题,
pragma限制(无异常传播)
当且仅当枚举表示存在时,才会显示规范中的问题,并且无论枚举表示如何,都会显示case语句的问题。换句话说,实际代码(Gnat 4.9.2编译正常)没有问题。我想知道
UARTs:array(Uart\u实例\u类型)of…
将通过允许所有COM端口而不是(承认已完成)来抑制警告子集。是的,我正在为受限Ravenscar编译。我认为我的实现可能有问题,这就是我收到这些警告的原因。例如,如果我对
Uart\u instance\u type
类型的变量使用case语句,它总是会提示与上面相同的警告,但如果我使用“if/else”然后它就没有了。有什么想法吗?我不得不说它看起来像个bug。也许它会在GNAT GPL 2015中得到修复。@BrianDrummond,使用托管编译器编译带有
pragma Profile(Ravenscar)
的包不会出现任何问题,
pragma限制(无异常传播)
当且仅当枚举表示存在时,才会显示规范中的问题,并且无论枚举表示如何,都会显示case语句的问题。