我认为您的目标 CPU 均受 Alire 支持gnat_arm_elf
编译器:-mcpu=cortex-r5
, cortex-a72
;英飞凌 CPU(即使是价格超过 1 万英镑的 CPU!)都是 ARM Cortex。
毫无疑问,您的客户为 C 程序提供运行时支持,但这也有其局限性;例如,它是否提供printf
?你如何进行日志记录?
您的客户对认证有什么要求? (好吧,可证明性)。如果问题很严重,您可能需要 AdaCore 支持合同。
你很可能不想提出例外;异常需要 Ada 运行时支持。另一方面,如果有人尝试,例如,该怎么办?除以零?你可以编译-gnatp
抑制所有检查(实际上,我不确定例如越界数组访问检查是否会被抑制)。
我尝试从light-cortex-m4
运行时,使用后alr toolchain --select
安装gnat_arm_elf
编译器。
第一次尝试mathfunc.gpr
(Alire 坚持小写)可能是
project mathfunc is -- alr insists on lower-case
for Library_Name use "MathFunc";
for Source_Dirs use ("src/");
for Object_Dir use "obj";
for Create_Missing_Dirs use "True";
for Library_Interface use ("MathFunc_Ada");
for Library_Src_Dir use "include";
for Library_Dir use "lib";
for Target use "arm-eabi";
for Runtime ("ada") use "light-cortex-m4";
package Compiler is
for Default_Switches ("Ada") use ("-O2", "-gnatp", "-g");
end Compiler;
package Binder is
for Switches ("Ada") use ("-n"); -- C main program
end Binder;
end mathfunc;
(我不确定我们是否需要 Binder 开关-n
).
以此构建,符号lib/libMathFunc.a
are
$ arm-eabi-nm lib/libMathFunc.a
mathfunc_ada.o:
00000000 T MathFunc_Ada
U __aeabi_fadd
U ada__numerics__elementary_functions__cos
U ada__numerics__elementary_functions__sin
00000000 D mathfunc_ada_E
b__mathfunc.o:
0000002c T MathFuncinit
U __gnat_binder_ss_count
U __gnat_default_ss_pool
U __gnat_default_ss_size
00000014 R mathfunc_adaB
00000010 R mathfunc_adaS
U mathfunc_ada_E
00000000 D mathfuncmain_E
00000000 T mathfuncmain__Tsec_default_sized_stacksBIP
00000068 T mathfuncmain___elabb
00000000 b mathfuncmain__sec_default_sized_stacks
所以你可以看到运行时需要__aeabi_fadd
(可能来自 GCC 支持而不是 Ada)和很多东西b__mathfunc.o
,它是由活页夹生成的,以支持我们请求的“独立库”支持,包括Library_Interface
在探地雷达中。其中一部分与精细化有关。您也许无需任何详细说明就可以摆脱困境,但要付出一些可支持的 Ada 功能的代价。
建筑main
,在子目录中main
,用这个alire.toml
name = "main"
(omitted)
[[depends-on]]
mathfunc = "*"
[[pins]]
mathfunc = { path='..' }
还有这个探地雷达:
with "mathfunc";
project Main is
for Languages use ("c");
for Main use ("main.c");
for Exec_Dir use ".";
for Source_Dirs use (".");
for Object_Dir use "obj";
for Create_Missing_Dirs use "true";
for Target use "arm-eabi";
for Runtime ("ada") use "light-cortex-m4";
end Main;
由于未定义的引用,构建失败printf
and MathFuncfinal
;后者没有创建,但假设您不打算卸载静态库,这并不重要。
评论这些呼吁,我们得到
$ alr build
ⓘ Building main=0.1.0-dev/main.gpr...
Compile
[c] main.c
Link
[archive] libmain.a
[index] libmain.a
[link] main.c
/Users/simon/.cache/alire/dependencies/gnat_arm_elf_12.2.1_f4bfd822/bin/../lib/gcc/arm-eabi/12.2.0/../../../../arm-eabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
Build finished successfully in 0.75 seconds.
失踪者在哪里_start
这将是您和您的客户之间的问题(必须有一种方式让 C 程序启动!)。
Sizes:
$ arm-eabi-size main
text data bss dec hex filename
18024 42 674 18740 4934 main
对我来说,这看起来仍然很大,需要更多的调查。
在我的机器(Mac)上,运行时位于
$HOME/.cache/alire/dependencies/gnat_arm_elf_12.2.1_f4bfd822/arm-eabi/lib/gnat/light-cortex-m4
我不确定你需要ada_target_properties
.
Ada 源码位于gnat/
.
runtime.xml
指定用于处理代码的编译器和链接器选项(也在重建库时使用)。
两个 GPR 用于构建运行时。
希望有点帮助!我意识到有很多东西需要消化。