我有一个关于调用ROM中“C”函数的方法的问题,寻找一种方法来实现这一点,而不涉及链接时间的变化。
例如,我们知道“C”函数:
int my_func(int a);
位于地址0xFFFF_AAAA;
所以我们尝试:
type ROM_my_func is access function (a : Interfaces.C.int) return Interfaces.C.int;
pragma Convention (C, ROM_my_func);
ADA_my_func : ROM_my_func := 16#FFFF_AAAA#;
我无法解决的错误是ADA_my_func的分配,不确定是否存在类型转换,并且尝试使用 System.Address_To_Access_Conversions 也未证明成功。
非常感谢任何示例和/或帮助的指针。
答案 0 :(得分:4)
如果您使用的是现代GNAT和Ada2012,您可以说
function My_Func (A : Interfaces.C.Int) return Interfaces.C.Int
with
Import,
Convention => C,
Address => System'To_Address (16#ffff_aaaa#);
请注意System’To_Address
是特定于GNAT的;你可以使用System.Storage_Elements.To_Address
。
我在GDB下运行了一个程序并获得了
(gdb) run
Starting program: /Users/simon/tmp/so/asker
Program received signal SIGSEGV, Segmentation fault.
0x00000000ffffaaaa in ?? ()
所以它显然是正确的事情。
不使用Ada2012方面,您可以写
function My_Func (A : Interfaces.C.Int) return Interfaces.C.Int;
pragma Import (C, My_Func);
for My_Func'Address use System'To_Address (16#ffff_aaaa#);