В большинстве случаев для портирования исходного кода C/C++ среды VisualDSP++ (VDSP) на компилятор GCC достаточно просто перекомпилировать код с использованием Blackfin GCC [2]. Однако Вам нужно позаботиться о различиях дополнительных директив и синтаксиса компиляторов VDSP C/C++ и GCC, поскольку каждый из них определяет свой собственный набор расширений языка. В этой статье рассматривается трансляция между собой этих диалектов (перевод [1]). Всякий раз, когда это возможно, консультируйтесь с документацией на оба компилятора.
[Директивы #pragma]
Прагмы это специальные директивы языка, позволяющие реализовать поддержку компилятором особенностей целевого процессора.
Для большинства моделей процессоров GCC использует не прагмы, а атрибуты, поскольку они более естественно вписываются в стандарт языка.
Constraints for asm Operands site:gcc.gnu.org (http://gcc.gnu.org/onlinedocs/gcc/Constraints.html).
Constraints for Particular Machines site:site:gcc.gnu.org (http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html).
VDSP
GCC
Описание
Регистры
a
a
Регистры общей адресации
P0 - P5
p
A
e
Регистры аккумуляторов
A0, A1
e
b
b
Регистры адресации DAG
I0 - I3
i
d
d
Общие регистры для данных
R0 - R7
D
r
E
D
Четные регистры данных
R0, R2, R4, R6
f
f
Регистры-модификаторы
M0 - M3
h
нет аналога
Старшие половинки регистров данных
R0.H, R1.H, ..., R7.H
H
нет аналога
Младшие или старшие половинки регистров данных
R0.H, R0.L, ..., R7.L, R7.H
I
нет аналога
Пары регистров данных
(R0-R1), (R2-R3), (R4-R5), (R6-R7)
l
нет аналога
Младшие половинки регистров данных
R0.L, R1.L, ..., R7.L
L
k
Регистры счетчика цикла
LC0, LC1
n
n
Compile time constant
-
O
W
Нечетные регистры данных
R1, R3, R5, R7
[Библиотеки C и C++ времени выполнения (Run-Time Library)]
Для множества расширений Analog Devices в среде VDSP++ в виде библиотек (C/C++ Run Time Library) нет соответствующего эквивалента для gcc или Linux.
Если Вы сталкиваетесь с ошибками наподобие неразрешимой ссылки на внешнюю функцию, то это один из таких случаев. Здесь ничего сделать нельзя, кроме как понять, что делает оригинальный код, и переписать его как функцию POSIX или Linux.
[Ссылки]
1. Port C/C++ source code from VDSP to GCC site:blackfin.uclinux.org. 2. Blackfin GCC site:blackfin.uclinux.org. 3. Using On-Chip SRAM Memory site:blackfin.uclinux.org. 4. Blackfin GCC Built-in Functions site:blackfin.uclinux.org. 5. Using In-line Assembly, Calling External Assembly from C site:blackfin.uclinux.org. 6. PGO Linker: инструмент размещения кода для процессоров Blackfin. 7. Blackfin FAQ: как обеспечить вложенность прерываний?