3

我正在使用 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.AddressAda 指针,但到目前为止我还没有取得任何成功。

任何帮助或建议将不胜感激!

非常感谢,

...最大限度

4

3 回答 3

4

以防万一雅各布的回答不清楚,你完全可以自由地宣布

with Interfaces.C.Strings;
procedure Last_Chance_Handler
  (Msg : Interfaces.C.Strings.chars_ptr; Line : Integer);

牢记Msg.

于 2017-11-14T15:25:30.077 回答
3

如果你来到 last_chance_handler,有些东西可能坏了,你不应该过分依赖你的环境。Ada.Text_IO 是一个非常重的包。你应该尽量避免它,尤其是在这里。

你可以尝试这样的事情:

with GNAT.IO;
with System.Storage_Elements;
procedure Last_Chance_Handler
   (Msg : System.Address; Line : Integer)
is
   use System.Storage_Elements; -- make "+" visible for System.Address

   function Peek (Addr : System.Address) return Character
   is
      C : Character with Address => Addr;
   begin
      return C;
   end Peek; 
   A : System.Address := Msg;
begin
   GNAT.IO.Put ("line :");
   GNAT.IO.Put (line); -- avoid the secondary stack for Line'Image
   GNAT.IO.New_Line;
   while Peek(A) /= ASCII.NUL loop
      GNAT.IO.Put (Peek(A));
      A := A + 1;
   end loop;
   GNAT.IO.New_Line;
end;
于 2017-11-16T21:45:12.783 回答
3

您正在寻找的操作可能是Interfaces.C.Strings.Value. 它接受一个类型的参数Interfaces.C.Strings.chars_ptr(相当于char *C 中的)并返回一个String.

于 2017-11-14T09:52:30.623 回答