Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

FPU Cortex M4

Пт июн 19, 2015 18:04:22

Приветствую всех!
Нужна помощь тех, кто знает как работать с этими библиотеками.
Возникла задача - считать синусы и косинусы, если использовать библиотеку 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

Копался в поисковиках очень долго, единственное вменяемое viewtopic.php?f=59&t=105037, "задефайнил" ARM_MATH_CM4 не помогло.

В приложении сам проект во всеми используемыми файлами
Вложения
CortexM4_TestBoard.rar
(388.74 KiB) Скачиваний: 408

Re: FPU Cortex M4

Пт июн 19, 2015 21:30:13

Не подключать system_ARMCM4.c

И -
Код:
//#include "math.h"
#include <arm_math.h>


и вуаля :
Код:
\                                 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

Спасибо! Все заработало. Выиграл еще 10 тактов :)) стало 150 :beer: Думаю, быстрее уже не выйдет, к сожалению. Но это уже кудал лучше чем на ядре без FPU, где вычисления были в 5!!! раз медленнее.

Re: FPU Cortex M4

Сб июн 20, 2015 07:31:26

Cat, собственно все есть в справке на CMSIS , конкретно CMSIS DSP Software Library .

Советую также обновить IAR и CMSIS , первый знамо где лежит второе качается с сайта ARM совершенно бесплатно .
Ну и по организации проекта - хэдеры нет нужды подключать к проекту , достаточно прописать пути в препроцессоре и включить их в исходнике.

Изображение


Ну и SPL ... Не стоит она того чтоб тратить на нее свое время...

Re: FPU Cortex M4

Вс июн 21, 2015 14:04:46

Честно говоря, ни разу не сталкивался с задачей такой точности, где б на вычисление синуса таблицы с интерполяцией не хватало :)

Re: FPU Cortex M4

Вс июн 21, 2015 14:49:45

int32_t sin_table[256]; //0xFFFF0000 соответствует -1, 0x0000FFFF соотв. +1

void InitSinTab(void)
// тут прошу прощения, с нецелочисленной математикой на си не занимался,
так что инициализация не скомпелится, но смысл должен быть понятен
{
for (int i=0;i<256;i++) sin_table[i] = 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

Задача, для которой нужна такая точность - делаю свой автономный контроллер ЧПУ, готовые варианты не устраивают либо по цене, либо по реализации. Чего-то среднего купить нельзя. Таблица синусов не влезет ни в какую память, когда надо отрисовать дугу радиусом скажем метр, и длиной пару метров при разрешении 0,01 мм.

Re: FPU Cortex M4

Вт июн 23, 2015 12:06:40

Cat писал(а): радиусом скажем метр, и длиной пару метров при разрешении 0,01 мм

Да уж, для такой точности, таблица будет ~600К значений

Re: FPU Cortex M4

Вт июн 23, 2015 21:58:49

А задача не позволяет к компу подключить?

Re: FPU Cortex M4

Ср июн 24, 2015 10:40:11

es131245 писал(а):А задача не позволяет к компу подключить?

Как раз иду по пути избавления от расчетов и управления на компьютере, дабы избавиться от глюков и тормозов винды. С компьютера по LAN будет отправляться G-код, производиться настройка и мониторинг работы. Все. Windows, Linux не являются промышленными системами реального времени. К тому же можно быть уверенным в ПО и железе лишь тогда, когда сам его проектируешь.

Задрали тупняки и сбои при обсчете и отправке по USB криволинейных траекторий. Последняя капля наступила, когда виндовое приложение (комплект от Planet CNC) глюкануло, станок включил шпиндель с очень острой фрезой на максимальную мощность и отправил механику по произвольному вектору на предельной скорости :shock: :shock: :shock: , еле успел руку убрать и дернуть рубильник, а то бы без руки уже ходил. :shock:

Все это происходило при остановленном станке, менял заготовку. Теперь я чет очкую

Re: FPU Cortex M4

Ср июн 24, 2015 12:04:35

Cat писал(а):Задача, для которой нужна такая точность - делаю свой автономный контроллер ЧПУ, готовые варианты не устраивают либо по цене, либо по реализации.

А советские старые ЧПУ и нюхом не слыхивали о фпу и имели точность повыше.

Re: FPU Cortex M4

Ср июн 24, 2015 13:28:53

pcb писал(а):А советские старые ЧПУ и нюхом не слыхивали о фпу и имели точность повыше.

аналоговые, прямоточные, оптико-лазерные ЭВМ на 580ик80? :))
Если бы ТЕ программисты работали сегодня, то местная школота этого сайта была бы на помойке и побиралась бы среди пивных ларьков.

кста, раньше для БПФ, тригонометрию высчитывали на компе (на фортране или С) и загружали в ПЗУ типа 573рф2 или рт, чтобы контроллер этой фигнёй не страдал, а перемножением занимался уже аппаратный умножитель типа 588вр2,3 и т.д.
Т.е. перед работой процессор перегружал из ПЗУ коэффициенты синуса в статическую память (раньше на ЭСЛ к1500ру417 или подобное, потом на импортной кэш-статике типа 61256). А пока умножитель просчитывал результат, контроллер сортировал данные , т.к. порядок выходных данных в некоторых алгоритмах БПФ был сильно запутан, вот контроллер и занимался этой сортировкой одновременно, пока умножитель считает. Параллелизм. :))

Re: FPU Cortex M4

Чт июн 25, 2015 12:56:02

Я раньше везде пихал МК, куда только можно, сейчас, когда количество знаний и опыта растет, стараюсь по максимуму делать автоматику аналоговой, предельно простой, или же беру ПЛИС. Видимо старею. :)))

Проблема со скоростью расчетов таки решилась. Как и бывает в 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

Cat писал(а):Я раньше везде пихал МК, куда только можно, сейчас, когда количество знаний и опыта растет, стараюсь по максимуму делать автоматику аналоговой, предельно простой, или же беру ПЛИС. Видимо старею. :)))

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

Re: FPU Cortex M4

Чт июн 25, 2015 13:58:04

У светодиода далеко не линейная зависимость яркости от напряжения питания, я бы все же оставил шим, но сделал так - фотодиод+TL594+необходимая маленькая обвеска+подстроечник+ключ(если маломощный полевик серии IRLL с малой емкостью затвора, то без драйвера). Все. Встроенных ОУ ошибки более чем достаточно.

Только ТССС... не палите контору. Пусть занимаются секасом дальше. :wink:

Re: FPU Cortex M4

Чт июн 25, 2015 14:12:25

Cat писал(а):У светодиода далеко не линейная зависимость яркости от напряжения питания
э кхм.
ну как бы я вам не открою секрет, если скажу тоже самое про лампу накаливания :)) Как известно, одни из лучших генераторов синуса - как раз "на лампочках". Как раз благодаря нелинейности.
Так что баш на баш. Но светодиод - это же "хай тек"!! :))
Вложения
sine generator.jpg
(51.14 KiB) Скачиваний: 870
sine_wave_oscillators_10.gif
(4.28 KiB) Скачиваний: 708
Generator1.jpg
(49.55 KiB) Скачиваний: 876

Re: FPU Cortex M4

Чт июн 25, 2015 14:56:17

Ну тут две беды - частота и надежность. Лампочка скоро перегорит :idea: Хотя может я просто не в теме и есть специальные вечные лампочки для таких применений. Как насчет частот выдаваемого синуса :wink:

П.С. Для меня этот способ генерации синуса - маленькое открытие. Это я все по старинке - таблица+ЦАП

Re: FPU Cortex M4

Чт июн 25, 2015 15:06:20

Причём заметьте, высококачественного синуса, для измерений КНИ.
Лампочки обычно брали СМН, сверхминиатюрные накаливания, вроде должен быть срок приличный.
Частоты звуковые обычно, до 20 кГц.
Интересно, что лампочки использовались в 2 разных случаях:
1. Для формирования синуса (лампочки с маленькой нитью).
2. Для АРУ, точнее для регулировки уровня выходного сигнала на разных частотах, так как для инерционных ламп с массивной нитью частота не имеет значения.
Но в обоих случаях используется эффект нелинейности сопротивления.

Вот ведь же примитивно-то как! :))

Re: FPU Cortex M4

Чт июн 25, 2015 15:19:12

Буду знать, спасибо.
Хотя недавно доделал блок регулировки выходного тока на гальваническую установку, советскую, там два здоровых таких шкафа - один - трехфазный трансформатор с диодным мостом, второй - регулятор тока и напряжения на индуктивностях. Работает, скажем так, не очень, вроде регулирует, но стабильность и прочие параметры не на высоте, для капризных операций не подходит.

Пришлось второй шкафчик отправить на помойку, и делать маленький (по сравнению с ним) DC-DC преобразователь на 12 В 400А(частота преобразования 100 кГц). Современные технологии таки иногда рулят. Пока еще в боевом применении на максимальных токах не пробовали, но предварительные тесты показывают высочайшее качество выходного напряжения. Ни пульсаций тебе, + точно поддерживается заданный ток. Скоро будет запущено на проектную мощность.

Re: FPU Cortex M4

Чт июн 25, 2015 15:50:22

Cat писал(а):регулировки выходного тока на гальваническую установку, советскую, там два здоровых таких шкафа - один - трехфазный трансформатор с диодным мостом, второй - регулятор тока и напряжения на индуктивностях.
ну всему своё время.

Cat писал(а):Пришлось второй шкафчик отправить на помойку, и делать маленький (по сравнению с ним) DC-DC преобразователь на 12 В 400А(частота преобразования 100 кГц). Современные технологии таки иногда рулят. Скоро будет запущено на проектную мощность.

Охренеть. аккуратнее там. Чем моделировали?
Я так понимаю, там главные потери - динамические на переключателях?
Ответить