Как использовать функцию, реализованную в asm из файла * .cpp, в VisualDsp ++ 5, для Blackfin BF537? - PullRequest
0 голосов
/ 28 января 2012

У меня есть этот проект, описанный в разделе «Обработка сигналов Wiley-Embedded с микросигнальной архитектурой 2007» - 2D DCT / IDCT (сжатие изображений) реализовано, и я хочу объединить (переместить эти файлы в..) с другим персональным проектом с обработкой изображений (в котором есть только * .cpp файлы) в Visual Dsp для Blackfin BF 537 .(сначала в Симулятор , а затем на плате BF537 ..)

Реализованный проект 2D DCT / IDCT имеет *. c и *. ASM файлы, и это работает очень хорошо.В какой-то момент, для некоторых вычислений, из файла C используется функция, объявленная (и реализованная) в файле asm.

Я заметил, что если я переместу эти * .c файлы в моем проекте (которые содержат только *.файлы cpp), я получаю много ошибок, и некоторые из них, как этот:

"`[Error li1021] The following symbols referenced in processor 'p0' could not be resolved:
   'something [_something]' referenced from '.\Debug\project name.doj'"

Итак, я думаю, что мне нужно иметь только * .cpp файлы в моем проекте (а не комбинацию из * .cpp и *.c).

В проекте 2D DCT / IDCT проблема возникает, когда я заменяю всех этих *. c файлов на*. cpp файлы.Когда я пытаюсь построить, я получаю эту ошибку компоновки:

"[Error li1021]  The following symbols referenced in processor 'p0' could not be resolved:
   '_r8x8dct(short *, short *, short *) [__r8x8dct__FPsN21]' referenced from '.\Debug\Start_DCT2.doj'
   '_r8x8invdct_ieee(short *, short *, short *) [__r8x8invdct_ieee__FPsN21]' referenced from '.\Debug\Start_DCT2.doj'"

В *. cpp файле вот как я вызываю функцию, реализованную в asm:

     _r8x8dct(in,coeff,temp);

В том же файле *. cpp я включаю заголовочный файл, в котором я объявил функцию:

     void _r8x8dct(fract16 *in, fract16 *coeff, fract16 *temp);

А вот часть *. ASM файл, который содержит функцию:

     .section    L1_code;
     .global     __r8x8dct;
     .align      8;
     __r8x8dct:
     .....................................
     __r8x8dct.end:

Аналог с функцией $_r8x8invdct_ieee()

* извините меня за мои английские ошибки при записи

1 Ответ

0 голосов
/ 28 января 2012

Для вызова функций C из C ++ вам нужно квалифицировать прототипы функций C с помощью extern "C", например,

extern "C" void _r8x8dct(fract16 *in, fract16 *coeff, fract16 *temp);

или, если у вас более одной функции C, вы можете сгруппировать прототипы следующим образом:

extern "C" {

    void _r8x8dct(fract16 *in, fract16 *coeff, fract16 *temp);

    // ... other C function prototypes ...
}
...