Проблема с файлом ADA, выполняемым c ++ (UsrAppInit) в VXWorks 6.7 (workspace-4)? - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть файл, собранный и правильно скомпилированный в ADA (простой Hello World).Я хочу выполнить файл .o из c ++, используя taskspawn.Для этого я прочитал, что вы должны объявить в 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);
}

, чтобы завершить процесс, я объявил ADA_MAIN как MACRO в make-файле (в моем случае это makefile.mk)

(MAIN_ADA pathOfmyADAexe и MAIN_TASK_NAME "процедура helloworld")

, но MACRO не распознаются в процессе, поэтому у меня ошибка при компиляциидля MAIN_TASK_NAME и ADA_MAIN.Любое предложение о том, как я скучаю?Я тоже мог бы поступить иначе, но как?

1 Ответ

0 голосов
/ 16 ноября 2018

Я не знаю о вашем ADA_MAIN, и вы не говорите нам, каков ваш MACRO, поэтому о них немного сложно говорить. Кроме того, прошло некоторое время с тех пор, как я использовал VxWorks (и тогда нас поддерживали, поэтому у нас был доступ к кросс-компилятору, который сделал сборку для нас: и наша основная программа была в Аде).

Тем не менее, ваша проблема сводится к созданию программы с компонентами 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-gnatmake, arm-eabi-gnatbind, но я просто буду использовать пустое имя компонента ниже.

$ gnatmake -c hello.adb

, который генерирует hello.o, hello.ali (если бы программа была более сложной, она также скомпилировала бы замыкание).

Теперь привязать:

$ gnatbind -n -Lhello -static hello.ali

, где

  • -n: основная программа не в Аде
  • -Lhello: adainit, adafinal переименовано helloinit, hellofinal
  • -static: уверены, что VxWorks не поддерживает общие библиотеки?

генерация b~hello.ads, b~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 ++, который требует времени выполнения Ada в libgnat.a и (для задач) libgnarl.a и, конечно, очень специфичен для компилятора и установки: здесь, на хосте 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.

...