Enums ADA中使用枚举的约束错误警告
我想知道为什么在下面的示例中使用枚举时,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
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语句的问题。