我正在使用 AdaCore GPS (GPL) IDE 使用 GNAT 编译器学习 Ada,针对 ARM“裸板”硬件(使用 Ravenscar SFP 运行时的 STM32F4)。
对于我基于 ARM 的嵌入式工作,我来自 C/C++ 背景。
无论如何,我已经实现了一个定义如下的“最后机会处理程序”,
procedure Last_Chance_Handler (Msg : System.Address; Line : Integer);
pragma Export (C, Last_Chance_Handler, "__gnat_last_chance_handler");
这是实际的过程(文件中的一个片段.adb
),
procedure Last_Chance_Handler (Msg : System.Address; Line : Integer) is
begin
LEDs_All_On;
-- Put_Line("Detail :" & Address_To_String(Msg));
Put_Line("Line :" & Line'Image);
loop
null;
end loop;
end Last_Chance_Handler;
该Msg
论点记录如下,
Msg 参数是一个 C 以 null 结尾的字符串,表示由编译器生成的 raise 语句的源位置,如果使用了 pragma Suppress_Exception_Locations,则为一个零长度字符串。
我一直在试图弄清楚如何将null
终止的Msg
字节转换为 Ada 字符串,以便我可以使用调用显示它(调试时我可以通过半主机机制Put_Line()
访问这种类型的输出)。
我之前通过将 Ada 记录(表示设备寄存器等)的'Address
属性设置为常量值,将其映射到物理内存地址。但是,这是我第一次尝试通过System.Address
变量中保存的值访问内存。
谁能建议我如何实施该Address_To_String()
程序?
我已经尝试过 Ada 字节数组和它们之间的未经检查的转换,以及System.Address
Ada 指针,但到目前为止我还没有取得任何成功。
任何帮助或建议将不胜感激!
非常感谢,
...最大限度