gpt4 book ai didi

c++ - 在 VXWorks 6.7(workspace-4) 中由 c++(UsrAppInit) 执行的 ADA 文件有问题吗?

转载 作者:行者123 更新时间:2023-11-28 04:29:43 25 4
gpt4 key购买 nike

我在 ADA(一个简单的 Hello world)中构建并正确编译了一个文件。我想使用 taskspawn 从 c++ 执行文件 .o。为此,我读到您必须在 C++ 中声明类似的内容:

...

#include <taskLib.h>

/* Ada binder-generated main - ADA_MAIN is passed as a macro from the makefile */

extern void ADA_MAIN(void);

void UsrAppInit()

{

int stackSize = 0x80000;


int spawnFlags = VX_FP_TASK;

/* MAIN_TASK_NAME is passed as a macro from the makefile */
char * mainTaskName = (char *) MAIN_TASK_NAME;

int priority = 100;

/* Spawn Ada environment task */

taskSpawn(mainTaskName, priority, spawnFlags, stackSize,
(FUNCPTR) ADA_MAIN, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}

为了完成这个过程,我在 makefile 中将 ADA_MAIN 声明为 MACRO(在我的例子中,makefile 是 makefile.mk)

(MAIN_ADA pathOfmyADAexe and MAIN_TASK_NAME " hell 世界的程序")

但是 MACRO 在这个过程中没有被识别,所以我在 MAIN_TASK_NAME 和 ADA_MAIN 的编译中有错误。关于我怎么失踪的任何建议?我也可以用不同的方式做,但是怎么做呢?

最佳答案

我不知道你的ADA_MAIN,你也没有告诉我们你的MACRO是什么,所以谈论它们有点困难。此外,我已经有一段时间没有使用 VxWorks 了(然后,我们得到了支持,因此可以访问为我们构建的交叉编译器:我们的主程序是在 Ada 中)。

也就是说,您的问题归结为 building a program with Ada components where the main program isn't in Ada .

Ada 程序需要详细说明。这是调用运行时库的所有组件并安排它们以正确顺序初始化的过程。你问什么组件?嗯,例如,有明显的 Ada.Text_IO;还有一些不太明显的事情,例如异常处理。

细化代码是使用gnatbind生成的。

鉴于此 hello.adb

with Ada.Text_IO;
procedure Hello is
begin
Ada.Text_IO.Put_Line ("hello!");
end Hello;

您确实需要提供一个规范,否则编译器将生成一个链接器名称,例如 __ada_hello;通过 hello.ads 进行控制,

procedure Hello with
Export,
Convention => C,
External_Name => "hello";

您将使用交叉编译套件。组件以目标名称为前缀,例如powerpc-wrs-vxworks-gnatmakearm-eabi-gnatbind,但我将只使用下面的裸组件名称。

$ gnatmake -c hello.adb

生成hello.ohello.ali(如果程序更复杂,它也会编译闭包)。

现在绑定(bind):

$ gnatbind -n -Lhello -static hello.ali

在哪里

  • -n : 主程序不在 Ada 中
  • -Lhello: adainit, adafinal 更名为helloinit, hellofinal<
  • -static:很确定 VxWorks 不支持共享库?

生成 b~hello.ads, b~hello.adb(根据编译器版本,~ 可能被替换为例如双下划线)。编译:

$ gnatmake -c b~hello.adb

现在,从 C++ 调用。你需要告诉编译器 Ada 代码中的符号,例如你好.h:

extern "C" {
void helloinit();
void hellofinal();
void hello();
}

然后是main.cc中的主程序:

#include "hello.h"

int main() {
helloinit();
hello();
hellofinal();
}

剩下的就是 C++ 编译和链接,它需要 libgnat.a 和(用于任务处理)libgnarl.a 中的 Ada 运行时,当然非常特定于编译器和安装:在这里,在 macOS 主机上,我使用了

$ g++ main.cc b~hello.o hello.o /opt/gcc-8.1.0/lib/gcc/x86_64-apple-darwin15/8.1.0/adalib/libgnat.a
$ ./a.out
hello!

将其转换为 VxWorks 上下文,我会说您将从主程序中调用 helloinit()(您可能不需要 hellofinal() ),并将 hello 传递给 taskSpawn() 以代替您的 ADA_MAIN

关于c++ - 在 VXWorks 6.7(workspace-4) 中由 c++(UsrAppInit) 执行的 ADA 文件有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53276028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com