我想知道为什么在使用枚举时会在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时是否有更好的实现来避免这些警告?
提前致谢! :)
答案 0 :(得分:4)
我认为你必须为受限制的(Ravenscar?)运行时进行编译,这就是任何异常将导致调用Last_Chance_Handler
的原因。
我遇到了像这样的恼人警告的很多,并最终将其追溯到编译
-gnatwa
(“打开下面标有+的所有信息/警告”)启用
-gnatw.x
(“打开非本地例外警告”)。
您可以使用-gnatw.X
来抑制警告。
(有关信息,您可以通过说gnatmake -h
(或arm-eabi-gnatmake -h
)来查看命令行选项。有很多。)