首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VXWorks 6.7(c++-4)中由工作区(UsrAppInit)执行的ADA文件有问题吗?

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

Stack Overflow用户
提问于 2018-11-13 15:37:47
回答 1查看 210关注 0票数 0

我有一个文件构建,并在ADA (一个简单的Hello world)中正确编译。我想使用任务生成器从c++执行文件.o。为了做到这一点,我读到你必须在c++中声明类似这样的东西:

..。

代码语言:javascript
复制
#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 (在我的例子中,makefile是makefile.mk)中将ADA_MAIN声明为宏。

(MAIN_ADA pathOfmyADAexe和MAIN_TASK_NAME“helloworld的过程”)

但是宏在这个过程中不被识别,所以我在编译MAIN_TASK_NAME和ADA_MAIN时出错。有什么建议关于我是怎么失踪的吗?我也可以用不同的方式来做,但是怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2018-11-16 17:05:37

我不知道你的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

代码语言:javascript
复制
with Ada.Text_IO;
procedure Hello is
begin
   Ada.Text_IO.Put_Line ("hello!");
end Hello;

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

代码语言:javascript
复制
procedure Hello with
  Export,
  Convention => C,
  External_Name => "hello";

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

代码语言:javascript
复制
$ gnatmake -c hello.adb

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

现在绑定:

代码语言:javascript
复制
$ gnatbind -n -Lhello -static hello.ali

哪里

  • -n:主程序不在Ada
  • -Lhelloadainit中,adafinal已重命名为helloinit,main程序非常确定VxWorks不支持共享库?

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

代码语言:javascript
复制
$ gnatmake -c b~hello.adb

现在,从C++调用。您需要将Ada代码中的符号告知编译器,例如hello.h

代码语言:javascript
复制
extern "C" {
  void helloinit();
  void hellofinal();
  void hello();
}

然后是main.cc中的主程序

代码语言:javascript
复制
#include "hello.h"

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

这就给您留下了C++编译和链接,它需要libgnat.a和(用于任务处理) libgnarl.a中的Ada运行时,并且当然是特定于编译器和安装的:

代码语言:javascript
复制
$ 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53276028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档