В этом примере показано, как избежать многословных операций в сгенерированном коде с помощью 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 object, по умолчанию, 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.
Создание кода C для функции 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 генерирует статическую библиотеку 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 содержит несколько многословных операций.
Создание кода 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;
}Для этой функции созданный код не содержит многословных операций.