2012-01-28 8 views
0

У меня этот проект объяснен в «Wiley-Embedded Signal Processing с архитектурой Micro Signal Architecture.2007» - 2D DCT/IDCT (сжатие изображения) реализовано, и я хочу объединить (переместить эти файлы на ..) с другим личный проект с обработкой изображений (которые имеют только файлы * .cpp) в Visual Dsp для Blackfin BF 537. (сначала в Simulator, а после этого на плате BF537 ..)Как использовать функцию, реализованную в asm из * .cpp-файла, в VisualDsp ++ 5, для Blackfin BF537?

Внедренный проект 2D DCT/IDCT имеет *. c и *. asm файлы и его работы verry well. В какой-то момент для некоторых вычислений из файла 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-файлы в моем проекте (а не сочетание off * .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'" 

In *. каст файл это, как я звоню функции реализованы на ассемблере:

 _r8x8dct(in,coeff,temp); 

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

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

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

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

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

* Пожалуйста, простите меня за мои английские ошибки написания

ответ

0

вызова функций 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 ... 
} 
+0

Ваш ответ решить мою проблему, я сгруппировал protoypes, и работал! Я помню, как вчера пытался что-то подобное, но без успеха ... Спасибо большое! –