代码之家  ›  专栏  ›  技术社区  ›  Max van Daalen

在Ada Last\u Chance\u处理程序中打印异常消息

  •  3
  • Max van Daalen  · 技术社区  · 6 年前

    我正在学习Ada,使用GNAT编译器,使用AdaCore GPS(GPL)IDE,针对ARM“裸板”硬件(STM32F4使用Ravenscar SFP运行时)。

    对于我基于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\u Exception\u位置为 习惯于

    我一直在想如何转换 null 味精 字节转换为Ada字符串,以便使用 Put_Line() 调用(调试时,我可以通过 半托管 机制)。

    我以前通过设置Ada记录(表示设备寄存器等)的 'Address 属性为常量值。然而,这是我第一次尝试通过 System.Address 变量中的值。

    谁能建议我如何实施 Address_To_String() 程序

    我尝试过Ada字节数组,以及它们和 系统住址 ,也有Ada pointers,但到目前为止,我还没有取得任何成功。

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

    非常感谢,

    3 回复  |  直到 6 年前
        1
  •  4
  •   Simon Wright    6 年前

    Jacob’s answer ,你完全可以自由申报

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

    Msg .

        2
  •  3
  •   RREE    6 年前

    你可以试试这样:

    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;
    
        3
  •  3
  •   Jacob Sparre Andersen    6 年前

    Interfaces.C.Strings.Value . 它接受以下类型的参数 Interfaces.C.Strings.chars_ptr (相当于 char * 在C)中,并返回a String

    推荐文章