Этот пример показывает, как избежать операций многословных в сгенерированном коде при помощи функции accumpos
вместо простого сложения в вашем алгоритме MATLAB®. Точно так же можно использовать accumneg
для вычитания.
Этот пример требует лицензии MATLAB Coder™.
Запишите простой алгоритм MATLAB, который добавляет два числа и возвращает результат.
function y = my_add1(a, b)
y = a+b;
Запишите второй алгоритм MATLAB, который добавляет два числа с помощью accumpos
и возвращает результат.
function y = my_add2(a, b) y = accumpos(a, b); % floor, wrap
accumpos
добавляет a
и b
с помощью типа данных a
. b
брошен в тип данных a
. Если a
является объектом fi
, по умолчанию, accumpos
устанавливает округляющийся режим на 'Floor'
и действие переполнения к 'Wrap'
. Это игнорирует свойства fimath
a
и b
.
Сравните выходные параметры двух функций в MATLAB.
a = fi(1.25, 1, 32,5);
b = fi(0.125, 0, 32);
%%
y1 = my_add1(a, b)
y2 = my_add2(a, b)
y1 = 1.3750 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 62 FractionLength: 34 y2 = 1.3750 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 32 FractionLength: 5
Для простого сложения растет размер слова, но использование accumpos
, размер слова результата совпадает с размером слова a
.
Сгенерируйте код С для функционального my_add1
. Во-первых, отключите использование типа данных long long
, потому что это обычно не поддерживается целевым компьютером.
hw = coder.HardwareImplementation; hw.ProdHWDeviceType = 'Generic->32-bit Embedded Processor'; hw.ProdLongLongMode = false; hw.ProdBitPerLong = 32; cfg = coder.config('lib'); cfg.HardwareImplementation = hw; codegen my_add1 -args {a,b} -report -config cfg
MATLAB Coder генерирует статическую библиотеку C и обеспечивает ссылку на отчет генерации кода.
Просмотрите сгенерированный код для простого сложения. Щелкните по ссылке View report
, чтобы открыть отчет генерации кода и затем прокрутить к коду для функции my_add1
.
/* Function Declarations */ static void MultiWordAdd(const unsigned long u1[], const unsigned long u2[], unsigned long y[], int n); static void MultiWordSignedWrap(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[]); static void sLong2MultiWord(long u, unsigned long y[], int n); static void sMultiWord2MultiWord(const unsigned long u1[], int n1, unsigned long y[], int n); static void sMultiWord2sMultiWordSat(const unsigned long u1[], int n1, unsigned long y[], int n); static void sMultiWordShl(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[], int n); static void sMultiWordShr(const unsigned long u1[], int n1, unsigned int n2, unsigned long y[], int n); static void uLong2MultiWord(unsigned long u, unsigned long y[], int n);
Сгенерированный код C содержит несколько операций многословных.
Сгенерируйте код С для функционального my_add2
.
codegen my_add2 -args {a,b} -report -config cfg
Просмотрите сгенерированный код для сложения с помощью accumpos
. Щелкните по ссылке View report
, чтобы открыть отчет генерации кода и затем прокрутить к коду для функции my_add2
.
int my_add2(int a, unsigned int b) { int y; y = a + (int)(b >> 29); /* floor, wrap */ return y; }
Для этой функции сгенерированный код не содержит операций многословных.