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

时间:2018-11-13 07:37:47

标签: c++ macros ada vxworks

我有一个文件生成文件,并且已在ADA(一个简单的Hello world)中正确编译。我想使用taskpawn从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和MAIN_TASK_NAME“ helloworld的过程”)

但是在此过程中无法识别MACRO,因此在编译MAIN_TASK_NAME和ADA_MAIN时出现错误。关于我怎么想念的任何建议?我也可以用其他方式来做,但是怎么做?

1 个答案:

答案 0 :(得分:1)

我不知道您的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(如果程序更复杂,它也会编译闭包)。

现在绑定:

$ gnatbind -n -Lhello -static hello.ali

其中

  • -n:主程序不在Ada中
  • -Lhelloadainitadafinal重命名为helloinithellofinal
  • -static:可以确定VxWorks不支持共享库吗?

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

$ gnatmake -c b~hello.adb

现在,从C ++调用。您需要将Ada代码中的符号告知编译器,例如hello.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