Страница 1 из 2
FPU Cortex M4
Добавлено: Пт июн 19, 2015 18:04:22
Cat
Приветствую всех!
Нужна помощь тех, кто знает как работать с этими библиотеками.
Возникла задача - считать синусы и косинусы, если использовать библиотеку math.h и функции cosf sinf, то без оптимизации кода по скорости на каждое вычисление синуса и косинуса требуется 240 тактов процессора, если с оптимизацией, то 160. Хочу быстрее

Вернее надо.
Среда IAR 6.5
Посоветовали пользоваться библиотекой arm_math, но для этого надо подключить файлы arm_math.h system_ARMCM4.c
Подключил.
В результате при компиляции вываливается ошибка
Fatal Error[Pe1696]: cannot open source file "ARMCM4.h" D:\ARM\CortexM4F\CortexM4_TestBoard\inc\Sys\system_ARMCM4.c 25
Копался в поисковиках очень долго, единственное вменяемое
http://radiokot.ru/forum/viewtopic.php?f=59&t=105037, "задефайнил" ARM_MATH_CM4 не помогло.
В приложении сам проект во всеми используемыми файлами
Re: FPU Cortex M4
Добавлено: Пт июн 19, 2015 21:30:13
dosikus
Не подключать
system_ARMCM4.c
И -
и вуаля :
Код: Выделить всё
\ In section .text, align 4, keep-with-next
44 void mathFun (void) {
\ _Z7mathFunv: (+1)
\ 00000000 0xB510 PUSH {R4,LR}
45
46 alpha=0.1; //угол, сука, уже в радианах!!!! это очень удобно
\ 00000002 0x.... LDR.N R4,??DataTable3_4
47 c=10;
\ 00000004 0x.... LDR.N R0,??DataTable3_5 ;; 0x41200000
\ 00000006 0x6060 STR R0,[R4, #+4]
\ 00000008 0xED9F 0x.... VLDR.W S0,??DataTable3 ;; 0x3dcccccd
\ 0000000C 0xED84 0x0A02 VSTR S0,[R4, #+8]
48 a=c*arm_sin_f32(alpha); //Однако, пришла печаль. Без FPU на это действие надо 700 тактов!!! Берем проц с 4 ядром
\ 00000010 0x.... 0x.... BL arm_sin_f32
\ 00000014 0xEDD4 0x0A01 VLDR S1,[R4, #+4]
\ 00000018 0xEE20 0x0A80 VMUL.F32 S0,S1,S0
\ 0000001C 0xED84 0x0A00 VSTR S0,[R4, #0]
Ну и у меня 7.20 и надо стартап менят ибо :
Warning[25]: Label 'XXXXX_IRQHandler' is defined pubweak in a section implicitly declared root
А здесь кусок листинга из
arm_sin_f32.c
Спойлер
Код: Выделить всё
206 /* input x is in radians */
207 /* Scale the input to [0 1] range from [0 2*PI] , divide input by 2*pi */
208 in = x * 0.159154943092f;
\ arm_sin_f32: (+1)
\ 00000000 0xEDDF 0x.... VLDR.W S1,??DataTable1 ;; 0x3e22f983
\ 00000004 0xEE60 0x0A20 VMUL.F32 S1,S0,S1
209
210 /* Calculation of floor value of input */
211 n = (int32_t) in;
\ 00000008 0xEEBD 0x1AE0 VCVT.S32.F32 S2,S1
212
213 /* Make negative values towards -infinity */
214 if(x < 0.0f)
\ 0000000C 0xEEB5 0x0A40 VCMP.F32 S0,#0.0
\ 00000010 0xEE11 0x0A10 VMOV R0,S2
\ 00000014 0xEEF1 0xFA10 FMSTAT
\ 00000018 0xBF48 IT MI
215 {
216 n = n - 1;
\ 0000001A 0x1E40 SUBMI R0,R0,#+1
217 }
218
219 /* Map input value to [0 1] */
220 in = in - (float32_t) n;
\ 0000001C 0xEE00 0x0A10 VMOV S0,R0
\ 00000020 0xEEB8 0x0AC0 VCVT.F32.S32 S0,S0
\ 00000024 0xEE30 0x0AC0 VSUB.F32 S0,S1,S0
221
222 /* Calculation of index of the table */
223 index = (uint32_t) (tableSize * in);
\ 00000028 0xEDDF 0x.... VLDR.W S1,??DataTable1_1 ;; 0x43800000
\ 0000002C 0xEE20 0x0A20 VMUL.F32 S0,S0,S1
\ 00000030 0xEEFC 0x0AC0 VCVT.U32.F32 S1,S0
224
225 /* fractional value calculation */
226 fract = ((float32_t) tableSize * in) - (float32_t) index;
\ 00000034 0xEEB8 0x1A60 VCVT.F32.U32 S2,S1
\ 00000038 0xEE30 0x0A41 VSUB.F32 S0,S0,S2
227
228 /* Initialise table pointer */
229 tablePtr = (float32_t *) & sinTable[index];
230
231 /* Read four nearest values of output value from the sin table */
232 a = *tablePtr++;
233 b = *tablePtr++;
234 c = *tablePtr++;
235 d = *tablePtr++;
236
237 /* Cubic interpolation process */
238 wa = -(((0.166666667f) * (fract * (fract * fract))) +
239 ((0.3333333333333f) * fract)) + ((0.5f) * (fract * fract));
240 wb = (((0.5f) * (fract * (fract * fract))) -
241 ((fract * fract) + ((0.5f) * fract))) + 1.0f;
242 wc = (-((0.5f) * (fract * (fract * fract))) +
243 ((0.5f) * (fract * fract))) + fract;
244 wd = ((0.166666667f) * (fract * (fract * fract))) -
245 ((0.166666667f) * fract);
246
247 /* Calculate sin value */
248 sinVal = ((a * wa) + (b * wb)) + ((c * wc) + (d * wd));
249
250 /* Return the output value */
251 return (sinVal);
\ 0000003C 0xEE20 0x2A00 VMUL.F32 S4,S0,S0
\ 00000040 0xEE62 0x2A00 VMUL.F32 S5,S4,S0
\ 00000044 0xED9F 0x.... VLDR.W S6,??DataTable1_2 ;; 0x3e2aaaab
\ 00000048 0x.... 0x.... ADR.W R0,sinTable
\ 0000004C 0xEE10 0x1A90 VMOV R1,S1
\ 00000050 0xEE62 0x3A83 VMUL.F32 S7,S5,S6
\ 00000054 0xEB00 0x0081 ADD R0,R0,R1, LSL #+2
\ 00000058 0xEEB6 0x4A00 VMOV.F32 S8,#0.5
\ 0000005C 0xEDDF 0x.... VLDR.W S9,??DataTable1_3 ;; 0x3eaaaaab
\ 00000060 0xEEB0 0x5A63 VMOV.F32 S10,S7
\ 00000064 0xEE22 0x4A04 VMUL.F32 S8,S4,S8
\ 00000068 0xEE00 0x5A24 VMLA.F32 S10,S0,S9
\ 0000006C 0xEDD0 0x0A00 VLDR S1,[R0, #0]
\ 00000070 0xEE74 0x4A45 VSUB.F32 S9,S8,S10
\ 00000074 0xEE64 0x0AA0 VMUL.F32 S1,S9,S1
\ 00000078 0xEEF6 0x4A00 VMOV.F32 S9,#0.5
\ 0000007C 0xEEB6 0x5A00 VMOV.F32 S10,#0.5
\ 00000080 0x1D00 ADDS R0,R0,#+4
\ 00000082 0xEE62 0x4AA4 VMUL.F32 S9,S5,S9
\ 00000086 0xEE00 0x2A05 VMLA.F32 S4,S0,S10
\ 0000008A 0xEE34 0x2AC2 VSUB.F32 S4,S9,S4
\ 0000008E 0xED90 0x1A00 VLDR S2,[R0, #0]
\ 00000092 0xEEF7 0x4A00 VMOV.F32 S9,#1.0
\ 00000096 0x1D00 ADDS R0,R0,#+4
\ 00000098 0xEE32 0x2A24 VADD.F32 S4,S4,S9
\ 0000009C 0xEE42 0x0A01 VMLA.F32 S1,S4,S2
\ 000000A0 0xEDD0 0x1A00 VLDR S3,[R0, #0]
\ 000000A4 0xEEBE 0x1A00 VMOV.F32 S2,#-0.5
\ 000000A8 0x1D00 ADDS R0,R0,#+4
\ 000000AA 0xEE02 0x4A81 VMLA.F32 S8,S5,S2
\ 000000AE 0xEE34 0x1A00 VADD.F32 S2,S8,S0
\ 000000B2 0xEE40 0x3A43 VMLS.F32 S7,S0,S6
\ 000000B6 0xEE21 0x1A21 VMUL.F32 S2,S2,S3
\ 000000BA 0xED90 0x0A00 VLDR S0,[R0, #0]
\ 000000BE 0xEE03 0x1A80 VMLA.F32 S2,S7,S0
\ 000000C2 0xEE30 0x0A81 VADD.F32 S0,S1,S2
\ 000000C6 0x4770 BX LR ;; return
252
Re: FPU Cortex M4
Добавлено: Сб июн 20, 2015 01:50:52
Cat
Спасибо! Все заработало. Выиграл еще 10 тактов

стало 150

Думаю, быстрее уже не выйдет, к сожалению. Но это уже кудал лучше чем на ядре без FPU, где вычисления были в 5!!! раз медленнее.
Re: FPU Cortex M4
Добавлено: Сб июн 20, 2015 07:31:26
dosikus
Cat, собственно все есть в справке на CMSIS , конкретно
CMSIS DSP Software Library .
Советую также обновить IAR и CMSIS , первый знамо где лежит второе качается с сайта ARM совершенно бесплатно .
Ну и по организации проекта - хэдеры нет нужды подключать к проекту , достаточно прописать пути в препроцессоре и включить их в исходнике.
Ну и SPL ... Не стоит она того чтоб тратить на нее свое время...
Re: FPU Cortex M4
Добавлено: Вс июн 21, 2015 14:04:46
FPGAlover
Честно говоря, ни разу не сталкивался с задачей такой точности, где б на вычисление синуса таблицы с интерполяцией не хватало

Re: FPU Cortex M4
Добавлено: Вс июн 21, 2015 14:49:45
FPGAlover
int32_t sin_table[256]; //0xFFFF0000 соответствует -1, 0x0000FFFF соотв. +1
void InitSinTab(void)
// тут прошу прощения, с нецелочисленной математикой на си не занимался,
так что инициализация не скомпелится, но смысл должен быть понятен
{
for (int i=0;i<256;i++) sin_table
= 65535*sin(i*2*pi/256);
}
// а тут идет чисто целочисленная математика
int32_t my_sin (int32_t A) // аргумент A=65536 соответствует 2пи, ноль есть ноль. Очень удобно 
{ // приводить к условиям 0<A<2пи и А>=0 не надо!
int32_t s1 = sin_table[ (A>>8) & 0xFF];
int32_t s2 = sin_table[ ((A+1)>>8) & 0xFF];
return s1+((A & 0xFF)*(s2-s1))/256;
}
PS/ Если кому интересно - могу провести анализ погрешности.
Re: FPU Cortex M4
Добавлено: Пн июн 22, 2015 11:56:39
Cat
Задача, для которой нужна такая точность - делаю свой автономный контроллер ЧПУ, готовые варианты не устраивают либо по цене, либо по реализации. Чего-то среднего купить нельзя. Таблица синусов не влезет ни в какую память, когда надо отрисовать дугу радиусом скажем метр, и длиной пару метров при разрешении 0,01 мм.
Re: FPU Cortex M4
Добавлено: Вт июн 23, 2015 12:06:40
FPGAlover
Cat писал(а): радиусом скажем метр, и длиной пару метров при разрешении 0,01 мм
Да уж, для такой точности, таблица будет ~600К значений
Re: FPU Cortex M4
Добавлено: Вт июн 23, 2015 21:58:49
es131245
А задача не позволяет к компу подключить?
Re: FPU Cortex M4
Добавлено: Ср июн 24, 2015 10:40:11
Cat
es131245 писал(а):А задача не позволяет к компу подключить?
Как раз иду по пути избавления от расчетов и управления на компьютере, дабы избавиться от глюков и тормозов винды. С компьютера по LAN будет отправляться G-код, производиться настройка и мониторинг работы. Все. Windows, Linux не являются промышленными системами реального времени. К тому же можно быть уверенным в ПО и железе лишь тогда, когда сам его проектируешь.
Задрали тупняки и сбои при обсчете и отправке по USB криволинейных траекторий. Последняя капля наступила, когда виндовое приложение (комплект от Planet CNC) глюкануло, станок включил шпиндель с очень острой фрезой на максимальную мощность и отправил механику по произвольному вектору на предельной скорости

, еле успел руку убрать и дернуть рубильник, а то бы без руки уже ходил.
Все это происходило при остановленном станке, менял заготовку. Теперь я чет очкую
Re: FPU Cortex M4
Добавлено: Ср июн 24, 2015 12:04:35
pcb
Cat писал(а):Задача, для которой нужна такая точность - делаю свой автономный контроллер ЧПУ, готовые варианты не устраивают либо по цене, либо по реализации.
А советские старые ЧПУ и нюхом не слыхивали о фпу и имели точность повыше.
Re: FPU Cortex M4
Добавлено: Ср июн 24, 2015 13:28:53
bad2cat
pcb писал(а):А советские старые ЧПУ и нюхом не слыхивали о фпу и имели точность повыше.
аналоговые, прямоточные, оптико-лазерные ЭВМ на 580ик80?
Если бы ТЕ программисты работали сегодня, то местная школота этого сайта была бы на помойке и побиралась бы среди пивных ларьков.
кста, раньше для БПФ, тригонометрию высчитывали на компе (на фортране или С) и загружали в ПЗУ типа 573рф2 или рт, чтобы контроллер этой фигнёй не страдал, а перемножением занимался уже аппаратный умножитель типа 588вр2,3 и т.д.
Т.е. перед работой процессор перегружал из ПЗУ коэффициенты синуса в статическую память (раньше на ЭСЛ к1500ру417 или подобное, потом на импортной кэш-статике типа 61256). А пока умножитель просчитывал результат, контроллер сортировал данные , т.к. порядок выходных данных в некоторых алгоритмах БПФ был сильно запутан, вот контроллер и занимался этой сортировкой одновременно, пока умножитель считает. Параллелизм.

Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 12:56:02
Cat
Я раньше везде пихал МК, куда только можно, сейчас, когда количество знаний и опыта растет, стараюсь по максимуму делать автоматику аналоговой, предельно простой, или же беру ПЛИС. Видимо старею.
Проблема со скоростью расчетов таки решилась. Как и бывает в 99% случаев - RTFM
Может кому пригодится:
https://www.iar.com/Support/resources/a ... p-library/
http://supp.iar.com/FilesPublic/UPDINFO ... dendum.pdf
Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 13:06:51
bad2cat
Cat писал(а):Я раньше везде пихал МК, куда только можно, сейчас, когда количество знаний и опыта растет, стараюсь по максимуму делать автоматику аналоговой, предельно простой, или же беру ПЛИС. Видимо старею.

ну тут рядом тема "яркость подсветки от освещённости" решается путём фотодиода, усилителя, ацп, софта, таблиц перекодировки, шим, ключа, светодиода (схему не видел, но наверняка на полевике с изолированным затвором, ибо современным "программистам" страшно паять биполярники, да и не умеют они их пользовать от слова "вабще").
А раньше?
фото-диод, транзистор, лампочка

Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 13:58:04
Cat
У светодиода далеко не линейная зависимость яркости от напряжения питания, я бы все же оставил шим, но сделал так - фотодиод+TL594+необходимая маленькая обвеска+подстроечник+ключ(если маломощный полевик серии IRLL с малой емкостью затвора, то без драйвера). Все. Встроенных ОУ ошибки более чем достаточно.
Только ТССС... не палите контору. Пусть занимаются секасом дальше.

Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 14:12:25
bad2cat
Cat писал(а):У светодиода далеко не линейная зависимость яркости от напряжения питания
э кхм.
ну как бы я вам не открою секрет, если скажу тоже самое про лампу накаливания

Как известно, одни из лучших генераторов синуса - как раз "на лампочках". Как раз благодаря нелинейности.
Так что баш на баш. Но светодиод - это же "хай тек"!!

Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 14:56:17
Cat
Ну тут две беды - частота и надежность. Лампочка скоро перегорит

Хотя может я просто не в теме и есть специальные вечные лампочки для таких применений. Как насчет частот выдаваемого синуса
П.С. Для меня этот способ генерации синуса - маленькое открытие. Это я все по старинке - таблица+ЦАП
Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 15:06:20
bad2cat
Причём заметьте, высококачественного синуса, для измерений КНИ.
Лампочки обычно брали СМН, сверхминиатюрные накаливания, вроде должен быть срок приличный.
Частоты звуковые обычно, до 20 кГц.
Интересно, что лампочки использовались в 2 разных случаях:
1. Для формирования синуса (лампочки с маленькой нитью).
2. Для АРУ, точнее для регулировки уровня выходного сигнала на разных частотах, так как для инерционных ламп с массивной нитью частота не имеет значения.
Но в обоих случаях используется эффект нелинейности сопротивления.
Вот ведь же примитивно-то как!

Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 15:19:12
Cat
Буду знать, спасибо.
Хотя недавно доделал блок регулировки выходного тока на гальваническую установку, советскую, там два здоровых таких шкафа - один - трехфазный трансформатор с диодным мостом, второй - регулятор тока и напряжения на индуктивностях. Работает, скажем так, не очень, вроде регулирует, но стабильность и прочие параметры не на высоте, для капризных операций не подходит.
Пришлось второй шкафчик отправить на помойку, и делать маленький (по сравнению с ним) DC-DC преобразователь на 12 В 400А(частота преобразования 100 кГц). Современные технологии таки иногда рулят. Пока еще в боевом применении на максимальных токах не пробовали, но предварительные тесты показывают высочайшее качество выходного напряжения. Ни пульсаций тебе, + точно поддерживается заданный ток. Скоро будет запущено на проектную мощность.
Re: FPU Cortex M4
Добавлено: Чт июн 25, 2015 15:50:22
bad2cat
Cat писал(а):регулировки выходного тока на гальваническую установку, советскую, там два здоровых таких шкафа - один - трехфазный трансформатор с диодным мостом, второй - регулятор тока и напряжения на индуктивностях.
ну всему своё время.
Cat писал(а):Пришлось второй шкафчик отправить на помойку, и делать маленький (по сравнению с ним) DC-DC преобразователь на 12 В 400А(частота преобразования 100 кГц). Современные технологии таки иногда рулят. Скоро будет запущено на проектную мощность.
Охренеть. аккуратнее там. Чем моделировали?
Я так понимаю, там главные потери - динамические на переключателях?