FPU на F407 - Как

Пито
Ср 19 апреля 2017 г. 13:55
Этот пост о FPU на STM32F407 и друзьях.

ОБНОВЛЯТЬ
Быстрое руководство по установке FPU на досках STM32F407 в рамках STM32Duino

Будет точным дальше на

FPU на STM32F4XX - это единая точность плавающей запятой. Это не будет работать для ускорения математики с двойной точностью.
Размер 32 -битный с этим FPU. Ожидаемая точность составляет ~ 7 цифр с основными математическими примитивами и типичными алгоритмами. С трансцендентальными математическими функциями ожидают 5-6 цифр.

Единственная точная теоретическая область от +/- 1.175494351E-38 .. 3.402823466E+38.
Не все реальные числа имеют свое единственное представление о точности, хотя.

FPU предоставляет только несколько основных примитивных функций (например, Add, sub, mul, div, sqrt) и несколько других вспомогательных функций. Он не дает вам результатов, таких как sinf (), все же библиотеки SW математики должны использоваться для трансцендентальных функций. С помощью STM32DUINO будет использоваться библиотеки GCC-встроения (когда используются правильные флаги компиляции). Вместо этого вы также можете использовать библиотеку CMSIS DSP.
[Приложение = 1] STM32F407 FPU instr.Jpg [/вложение]
Единственная точность хороша для:
1. Аудио, видео, обработка, управление и регулирование датчиков - везде, где вам нужна скорость, большая динамика, но более низкое разрешение приемлемо
2. Для DSP с 12-18-битными значениями ADC, FFT, IFFT, FIR IIR-фильтров, конверсии SI
3. Математика с и распечатывая реальные значения с большими диапазонами заказа (Pico, Nano,.., Мега, Гига), но с 6-7 цифр
4. Математика рассчитывает, где алгоритм может принять более низкое разрешение.


Единственная точность не подходит для:
1. навигация, врача общей практики, картография, землепользование
2. Измерение и вычисляется с частотами (DDS, измерения частоты и т. Д.)
3. Численные расчеты в области науки и техники - в математике, физике, астрономии и т. Д.
4. карманные калькуляторы
5. Системы и симуляторы CAD
6. Финансовый расчет.


Подсказка: я рекомендую это чтение https: // ece.Uwaterloo.ca/~ dwharder/nume ... /бумага.PDF
Как использование математики с плавающей запятой иногда может быть сложной..

На вашей платформе.txt Add -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant

AG123
Ср 19 апреля 2017 г. 15:40
Я не слишком уверен, есть ли способ сказать, что если -mfloat-abi = hard -mfpu = fpv4-sp-d16 определено, мы запустили коды инициализации для FPU.
А пока я не нашел ни одного Маркоса и не определяет как связанный с -mfloat -abi = жесткий и т. Д

Казалось бы, аппаратный поплавок должен быть обработан как несколько «библиотечного» подхода. Я подумал, что пропавший CMSIS Libmath.Библиотеки, вероятно, является причиной, побуждающей мой эскиз «повесить». Удивительно, что с GCC 6 я, казалось, не нажимал компиляция или ошибки, которые функционируют

Эдогальдо
Ср 19 апреля 2017 г. 16:27
Хороший совет, который я только что нашел.
Бег: arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -E -dM - < /dev/null

Пито
Ср 19 апреля 2017 г. 16:41
VFP - регистры FP FPU. Когда вы компилируете с -SOFTFP, VFP не используются (вместо этого используются стандартные регистры R). Я получаю ошибки с -Hard, потому что он хочет использовать VFPS Regs, но что -то важное отсутствует..

Эдогальдо
Ср 19 апреля 2017 г. 16:53
Пито написал:VFP - регистры FP FPU. Когда вы компилируете с -Софт, VFP не используется. Я получаю ошибки с -Hard, потому что он хочет использовать VFPS Regs, но что -то важное отсутствует..

Пито
Ср 19 апреля 2017 г., 19:01
С -mfloat-abi = hard -mfpu = fpv4-sp-d16 он генерирует инструкции, такие как vpadd.u

AG123
Ср 19 апреля 2017 г., 19:04
FPU включает коды
http: // Infocenter.рука.com/help/topic/co ... BJHIG.HTML //enable the fpu (cortex-m4 - stm32f4* and above) void enablefpu() { __asm volatile ( " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ " ldr r1, [r0] \n" /* read CAPCR */ " orr r1, r1, #( 0xf << 20 )\n" /* Set bits 20-23 to enable CP10 and CP11 coprocessors */ " str r1, [r0] \n" /* Write back the modified value to the CPACR */ " dsb \n" /* wait for store to complete */ " isb" /* reset pipeline now the FPU is enabled */ ); }

Пито
Ср 19 апреля 2017 г., 19:33
Теперь с (soebler, ниже флагов, добавленных в C и C ++) -mfloat-abi=softfp -mfpu=fpv4-sp-d16

AG123
Ср 19 апреля 2017 г., 20:16
На самом деле, это не неправильно, или, скорее, GCC очень хорошо известен «удалением кодов» с этими (более высокими) оптимизацией
Он обсуждается где -то на форумах Boinc (Mass Distributed Community Computing Projects)

Если у вас есть утверждение C = A + B, и C нигде не ссылается. GCC мог бы * удалить * это, и это происходит с кодами Whetstone (возможно, с оптимизацией -O3), если GCC станет даже «умнее» и удаляет все коды Whetstone, потому что это «ничего не делает». Самый быстрый суперкомпьютер в мире Petaflops в 0 наносекундах :ржу не могу:

п.с. Люди Boinc сделали, это присвоение результатов Whetstone глобальным переменным, чтобы GCC не удалил его, но мы оставили бы это «улучшение» на другое время

Эдогальдо
Ср 19 апреля 2017 г., 8:20 вечера
Вероятно, лучший способ протестировать улучшения FPU - это пропустить оптимизацию..

Пито
Ср 19 апреля 2017 г., 8:22 вечера
Хорошо, когда -O3 оптимизировал все расчеты, и мы провели 65mips с -SoftFP, а с -O3 и -Hard мы получаем 340mips, которые составляют 5x -это будет номер, который я ожидаю от F407 FPU. Но люди говорят, что -ффт и -ард похожи.. Это сбивает с толку..
Я попробую с -O0 в качестве последнего упражнения сегодня..
РЕДАКТИРОВАТЬ: 65mips, скорее всего..

Пито
Ср 19 апреля 2017 г., 20:38
-O0, -g, 4.8.3-2014q1, -mfloat-abi = softfp, 168mhz Loops: 1000Iterations: 10Duration: 23948 millisec. C Converted Single Precision Whetstones: 41.76 MIPS

AG123
Ср 19 апреля 2017 г., 21:18
Загрузка Whetstone.Здесь тоже

Использование:
Подключитесь к консоли USB-серии, нажмите «G», чтобы запустить

- V0.5 исправлений для единственной точности, вызовите единую точность математических функций LIB вместо двойной точности функций
Выбраны коды для обнаружения программного обеспечения плавающей запятой или аппаратной плавающей запятой
- V0.4 добавлены коды, обеспечивающие FPU
- V0.3 Исправлена ​​двойная двойная
- V0.2 Исправлены некоторые синтаксические ошибки
- V0.1 первоначальный выпуск

AG123
Ср 19 апреля 2017 г., 21:25
Привет, пито,

STM32F407VET
Скомпилированная оптимизация -O0 без оптимизации, нет отладка
аппаратное плавание, единственная точность Beginning Whetstone benchmark at 168 MHz ... Loops:1000, Iterations:1, Duration:2486.45 millisec C Converted Single Precision Whetstones:40.22 mflops

Пито
Ср 19 апреля 2017 г., 21:29
Спасибо! По крайней мере, мы знаем, что используем похожий чип :)

Вот эталон, который я использовал в прошлом. Он вычисляет интегралы различных сумасшедших функций. Поступает из кода Rosetta, но я изменил функции (он сравнивает методы численной интеграции и результаты аналитической интеграции соответствующих функций).
Мы можем использовать его в качестве эталона для одиночных и двойных экспериментов. Я с трудом представляю, что что -то оптимизирует что -то :)
Просто добавьте измерение времени, и это. Это намного лучше, как динозавр Уэтстона :) // A Benchmark - Integrals - Single Precision (with FPU on/off) // Based on http://rosettacode.org/wiki/Numerical_integration // Pito 4/2014 // Mod for STM32duino 4/2017 // Functions F: f1a = INTEGRAL(f1), etc. #include #include #include #include #define WITH_FPU 1 void prntf(char *fmt, ... ){ char buf[128]; // resulting string limited to 128 chars va_list args; va_start (args, fmt ); vsnprintf(buf, 128, fmt, args); va_end (args); Serial.print(buf); } // Integration methods // float int_leftrect(float from, float to, int n, float (*func)(float)) { float h = (to-from)/n; float sum = 0.0, x; for(x=from; x <= (to-h); x += h) sum += func(x); return h*sum; } float int_rightrect(float from, float to, int n, float (*func)(float)) { float h = (to-from)/n; float sum = 0.0, x; for(x=from; x <= (to-h); x += h) sum += func(x+h); return h*sum; } float int_midrect(float from, float to, int n, float (*func)(float)) { float h = (to-from)/n; float sum = 0.0, x; for(x=from; x <= (to-h); x += h) sum += func(x+h/2.0); return h*sum; } float int_trapezium(float from, float to, int n, float (*func)(float)) { float h = (to - from) / n; float sum = func(from) + func(to); int i; for(i = 1;i < n;i++) sum += 2.0*func(from + i * h); return h * sum / 2.0; } float int_simpson(float from, float to, int n, float (*func)(float)) { float h = (to - from) / n; float sum1 = 0.0; float sum2 = 0.0; int i; float x; for(i = 0;i < n;i++) sum1 += func(from + h * i + h / 2.0); for(i = 1;i < n;i++) sum2 += func(from + h * i); return h / 6.0 * (func(from) + func(to) + 4.0 * sum1 + 2.0 * sum2); } /* test functions */ // F1 float f1(float x) { return ( x*x /( (-1.0 + powf(x,4.0)) * (-1.0 + powf(x,4.0)) ) ); } float f1a(float x) { return ( ( (-4.0 * x*x*x)/(-1.0 + x*x*x*x) - 2.0*atanf(x) - logf(-1.0 + x) + logf(1.0 + x))/16.0 ); } // F2 float f2(float x) { return ( sinf(x + 1.0)*cosf(x - 1.0)/tanf(x - 1.0) ); } float f2a(float x) { return ( ( 2.0*x*cosf(2.0) + 4.0*logf(sinf(1.0 - x))*sinf(2.0) + sinf(2.0*x) )/4.0 ) ; } // F3 float f3(float x) { return ( (5.0 + 3.0*x)/(1.0 - x - x*x + x*x*x) ); } float f3a(float x) { return ( -4.0/(-1.0 + x) - logf(-1.0 + x)/2.0 + logf(1.0 + x)/2.0 ) ; } // F4 float f4(float x) { return ( 1.0 /(2.0 + x*x*x*x) ); } float f4a(float x) { float k = 2.0; float m = 0.25; return ( (-k*atanf(1.0 - powf(k,m)*x) + k*atanf(1.0 + \ powf(k,m)*x) - logf(k - k*powf(k,m)*x + sqrtf(k)*x*x) + \ logf(k + k*powf(k,m)*x + sqrtf(k)*x*x))/(8.0*powf(k,m)) ) ; } typedef float (*pfunc)(float, float, int , float (*)(float)); typedef float (*rfunc)(float); #define INTG(F,A,B) (F((B))-F((A))) void setup () { int i, j; float ic, tmp; if(WITH_FPU) { __asm volatile ( " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ " ldr r1, [r0] \n" /* read CAPCR */ " \n" " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ " str r1, [r0] \n" " dsb \n" " isb" /* reset the pipeline, now the FPU is enabled */ ); } Serial.begin(115200); // while(!Serial.isConnected()); pfunc f[5] = { int_leftrect, int_rightrect, int_midrect, int_trapezium, int_simpson }; const char *names[5] = { "leftrect", "rightrect", "midrect", "trapezium", "simpson" }; rfunc rf[] = { f1, f2, f3, f4 }; rfunc If[] = { f1a, f2a, f3a, f4a }; float ivals[] = { 2.0, 10.0, -1.0, -0.7, 10.0, 50.0, 0.0, 10.0 }; int approx[] = { 10000, 10000, 10000, 10000 }; prntf("\nBenchmark starts..\n"); uint32 elapsed = millis(); for(j=0; j < (sizeof(rf) / sizeof(rfunc)); j++) { for(i=0; i < 5 ; i++) { ic = (*f[i])(ivals[2*j], ivals[2*j+1], approx[j], rf[j]); tmp = INTG((*If[j]), ivals[2*j], ivals[2*j+1]); prntf("%10s [%1.1e %1.1e] num: %1.6e, ana: %1.6e\n", names[i], ivals[2*j], ivals[2*j+1], ic, tmp); } prntf("\n"); } elapsed = millis() - elapsed; prntf("Benchmark ends, elapsed %d msecs\n", elapsed); } void loop() {}

AG123
Ср 19 апреля 2017 г., 21:43
@pito,

Для Whetstone, чтобы предотвратить оптимизацию GCC, я видел несколько примеров, таких как использование глобальных переменных или массивов для хранения результатов вычисления Whetstone

Примером этого является проект BOINC, где эталон Whetstone используется для вычисления «кредитов» для участников в качестве оценки «работы», выполненной
https: // github.com/boinc/boinc/blob/mas ... Тинс.CPP
Коды BOINC исправлены результаты расчетов в глобальные переменные и массивы во время расчетов, чтобы опции GCC -O не удаляли их

В то же время я предполагаю, что мы сделаем и позволили бы GCC «обмануть» немного & получить более высокий m/gflops :ржу не могу:
ОК, подписание на день/ночь

Эдогальдо
Ср 19 апреля 2017 г., 22:22
AG123 написал:Привет, пито,

STM32F407VET
Скомпилированная оптимизация -O0 без оптимизации, без отладки
аппаратное плавание, единственная точность Beginning Whetstone benchmark at 168 MHz ... Loops:1000, Iterations:1, Duration:2486.45 millisec C Converted Single Precision Whetstones:40.22 mflops

AG123
Чт 20 апреля 2017 г. 5:21 утра
@edogaldo Спасибо,

STM32F407VET
Скомпилированная оптимизация -O0 без оптимизации, нет отладка, -FSINGLE-PRECIONS-Constant
аппаратное плавание, единственная точность Loops:1000, Iterations:1, Duration:2030.42 millisec C Converted Single Precision Whetstones:49.25 mflops

AG123
Чт 20 апреля 2017 г., 6:51
@pito давайте опубликуем свои контрольные результаты и, возможно, код, а также в потоке Dhrystone и Whetstone

Я думаю, что оптимизация -O2 и -O3, вероятно, удалила некоторые коды, но, тем не менее, просто весело наблюдать за этими «невозможными» mflops Вы слышали о новом супер компьютере Cray? Это’S так быстро, он выполняет бесконечную петлю за 6 секунд.
:ржу не могу:

Пито
Чт 20 апреля 2017 г., 7:28
-O0, -g, 4.8.3-2014q1, -mfloat-abi = hard -mfpu = fpv4-sp-d16 -fsingle-presision-constant, 168mhz Loops: 1000Iterations: 10Duration: 19638 millisec. C Converted Single Precision Whetstones: 50.92 MIPS

Пито
Чт 20 апреля 2017 г. 8:11
@AG123: я обновил выше контрольного эталона интеграл с вариантом внедрения/выкл.
Я могу построить его, но он здесь не работает. Понятия не знаю, почему.. Может быть, математические библиотеки отсутствуют?? Но он строит без ошибки.
Вы можете попробовать запустить его в своей среде, пожалуйста?

AG123
Чт 20 апреля 2017 г. 9:01
@pito
STM32F4VET с_FPU 0, Оптимизация -OS (Оптимизировать размер), отладка, v6.3.1-2017-Q1-Update
программное обеспечение плавающей запятой, единственная точность Benchmark starts.. leftrect [2.0e+00 1.0e+01] num: 6.720000e-03, ana: 6.712139e-03 rightrect [2.0e+00 1.0e+01] num: 6.705779e-03, ana: 6.712139e-03 midrect [2.0e+00 1.0e+01] num: 6.712879e-03, ana: 6.712139e-03 trapezium [2.0e+00 1.0e+01] num: 6.712058e-03, ana: 6.712139e-03 simpson [2.0e+00 1.0e+01] num: 6.712050e-03, ana: 6.712139e-03 leftrect [-1.0e+00 -7.0e-01] num: -2.613795e-03, ana: -2.612248e-03 rightrect [-1.0e+00 -7.0e-01] num: -2.613944e-03, ana: -2.612248e-03 midrect [-1.0e+00 -7.0e-01] num: -2.613870e-03, ana: -2.612248e-03 trapezium [-1.0e+00 -7.0e-01] num: -2.612268e-03, ana: -2.612248e-03 simpson [-1.0e+00 -7.0e-01] num: -2.612271e-03, ana: -2.612248e-03 leftrect [1.0e+01 5.0e+01] num: 2.825554e-01, ana: 2.824790e-01 rightrect [1.0e+01 5.0e+01] num: 2.824033e-01, ana: 2.824790e-01 midrect [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 trapezium [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 simpson [1.0e+01 5.0e+01] num: 2.824791e-01, ana: 2.824790e-01 leftrect [0.0e+00 1.0e+01] num: 6.603576e-01, ana: 6.601052e-01 rightrect [0.0e+00 1.0e+01] num: 6.598577e-01, ana: 6.601052e-01 midrect [0.0e+00 1.0e+01] num: 6.601063e-01, ana: 6.601052e-01 trapezium [0.0e+00 1.0e+01] num: 6.601086e-01, ana: 6.601052e-01 simpson [0.0e+00 1.0e+01] num: 6.601073e-01, ana: 6.601052e-01 Benchmark ends, elapsed 8161 msecs

Пито
Чт 20 апреля 2017 г. 11:25 утра
Что интересно:
1. а .корзина для mmini, -os, dp, nofpu 47.8 КБ
2. а .корзин для 407, -O0, FPU -Hard, SP 33 КБ
Это странно.. Почему Whetstone собирает и работает. Та же самая математика.H, почти те же математические функции (SIN/COS...).

Эдогальдо
Чт 20 апреля 2017 г. 11:36 утра
Пито написал:Что интересно:
1. а .корзина для mmini, -os, dp, nofpu 47.8 КБ
2. а .корзин для 407, -O0, SP 33 КБ
Это странно.. Почему Whetstone собирает и работает. Та же самая математика.H, почти те же математические функции (SIN/COS...).

Пито
Чт 20 апреля 2017 г., 11:48
@Edogaldo: обновлено.

Проблема кажется другой:
1. Я прокомментировал всю математику по функциям и возвращаю остроумие 1.0 - не идти с FPU, а затем
2. Я заменил результаты PRTN на простые серийные.println ("hello") - нет, иди с FPU, а затем
3. Я заменил «плавание» на «двойной», а FPU включен - он работает и печатает привет.

Whetstone работает с «Float» и FPU ON, и с той же конфигурацией (включает, ASM), как и здесь (и с теми же математическими функциями, кроме Powf (), я прокомментировал здесь).
Таким образом, мое подозрение указывает на эти упражнения с указателями «плавания», пока FPU включен, как: typedef float (*pfunc)(float, float, int , float (*)(float)); typedef float (*rfunc)(float);

AG123
Чт 20 апреля 2017 г. 12:31
@pito для единого точного компиляции, с_fpu = 1, я попытался сделать их статическими глобальными переменными e.глин. typedef float (*pfunc)(float, float, int , float (*)(float)); typedef float (*rfunc)(float); #define INTG(F,A,B) (F((B))-F((A))) static pfunc f[5] = { int_leftrect, int_rightrect, int_midrect, int_trapezium, int_simpson }; static rfunc rf[4] = { f1, f2, f3, f4 }; static rfunc If[4] = { f1a, f2a, f3a, f4a }; static const char *names[5] = { "leftrect", "rightrect", "midrect", "trapezium", "simpson" };

Пито
Чт 20 апреля 2017 г. 12:45
Как только я перепутал с отладчиком, это случается, он остановился здесь: /* STM32 ISR weak declarations */ .thumb /* Default handler for all non-overridden interrupts and exceptions */ .globl __default_handler .type __default_handler, %function __default_handler: b . <<<<<< cursor .weak __exc_nmi .globl __exc_nmi .set __exc_nmi, __default_handler .weak __exc_hardfault .globl __exc_hardfault .set __exc_hardfault, __default_handler .weak __exc_memmanage .globl __exc_memmanage .set __exc_memmanage, __default_handler .weak __exc_busfault .globl __exc_busfault .set __exc_busfault, __default_handler .weak __exc_usagefault .globl __exc_usagefault .set __exc_usagefault, __default_handler .weak __stm32reservedexception7 .globl __stm32reservedexception7 .set __stm32reservedexception7, __default_handler .weak __stm32reservedexception8 .globl __stm32reservedexception8 .set __stm32reservedexception8, __default_handler .weak __stm32reservedexception9 .globl __stm32reservedexception9 .set __stm32reservedexception9, __default_handler

AG123
Чт 20 апреля 2017 г. 12:50
Я думаю, что в компиляции C ++ в наших встроенных настройках компиляции у нас есть набор флагов, которые удаляют различные вещи в c++
-fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics

Пито
Чт 20 апреля 2017 г. 13:07
Как вы думаете, FPU = 1 начинает связываться с целочисленными расчетами в init () где -то? Предоставляем ли мы плавающую запятую в init ()?
PS: ближайшая инструкция к исключению была (до исключения)
Vpush (D8, D9)

AG123
Чт 20 апреля 2017 г. 13:10
@pito,
Я думаю, что это, вероятно, не имеет ничего общего с этими кодами FPU_ENABL. Следовательно, я предполагаю, что нам нужно исправить этот ISR (процедура обслуживания прерывания) или что -то, что, возможно, чтобы положить
void exaction_handler (void) {}
или что -то, это, вероятно, очень рано в «до главных» частей кодов

Это звучит как прерывание, уволенное, и там нет обработчика, и не уверен, что это за прерывание (разделение на ноль?), да, и я думаю, что это как -то связано с init () :ржу не могу:

Эдогальдо
Чт 20 апреля 2017 г. 13:57
AG123 написал:@pito,
Я думаю, что это, вероятно, не имеет ничего общего с этими кодами FPU_ENABL. Следовательно, я предполагаю, что нам нужно исправить этот ISR (процедура обслуживания прерывания) или что -то, что, возможно, чтобы положить
void exaction_handler (void) {}
или что -то, это, вероятно, очень рано в «до главных» частей кодов

Это звучит как прерывание, уволенное, и там нет обработчика, и не уверен, что это за прерывание (разделение на ноль?), да, и я думаю, что это как -то связано с init () :ржу не могу:

Пито
Чт 20 апреля 2017 г. 14:48
Так что с тем, что не прерывает огонь? Если бы это было то же самое с Whetstone, это могло бы быть с прерывами. Но Whetstone работает (даже мы не видели никаких результатов..).

AG123
Чт 20 апреля 2017 г. 14:59
Я думаю, что один тест - провести плавание a = 1.0/0.0, может быть, это подтвердит это :ржу не могу:

Глядя на
- Stm32f4/variants/black_f407vet6/stm32_vector_table.С .long __irq_FPU_IRQHandler /* FPU */

Эдогальдо
Чт 20 апреля 2017 г. 15:28
@Pito/ag123
Просто вопрос: какое ядро ​​вы используете?
Теперь так много..

Пито
Чт 20 апреля 2017 г. 15:42
Я использую тот, который с июля 2016 года.

AG123
Чт 20 апреля 2017 г. 16:09
Я на самом деле работаю над филиалом разработки в хранилище Стива
https: // github.com/stevstrong/arduino_s ... F4_variant

Чтобы использовать коды из ветви, более простой способ просто использовать GIT для проверки этой ветви
http: // www.STM32duino.com/viewtopic.PHP ... = 80#p26483

Обратите внимание, что если вы сделаете клон репозитория, вы, скорее всего, получите «все», включая филиал
Прежде чем начать работу над этой ветвью (после выбора/тяги или клона), необходимо выпустить git checkout Black_F4_variant

Пито
Чт 20 апреля 2017 г., 17:48
ОК, снова с отладчиком.
Это происходит, когда код входит «setup ()» по адресу aa4. В этом адресе есть что -то странное (первое изображение).
Это приходит к ReservedException9, который обрабатывается по адресу DD0 в файле ISRS (второе изображение).
Таким образом, прыжок от main () на setup () на странном AA4 вызывает исключение, IMHO :?:
Вокруг AA4 есть 2 идентичных метки Setup () с одинаковыми созданиями инструкций по ровным и нечетным адресам.
От AAD ASM FPU включает начинается, затем задержка (100), а затем сериал.начинать.
Перед настройкой () существуют математические функции, состоящие в основном из вызовов FPU Instr.
Crash1.jpg
Авария1.JPG (212.25 киб) просмотрено 331 раз

AG123
Чт 20 апреля 2017 г. 18:05
Это сложно, я не вижу ничего плохого в коде (C ++) :ржу не могу:

Я сделал что -то утомительное, переместил все подпрограммы ниже Setup () и Loop (), объявляю функциональные прототипы наверху, не работал, светодиод все еще темный.
Typedefs остаются там, хотя

Пито
Чт 20 апреля 2017 г. 18:18
И вот как отличная работа Whetstone Setup () выглядит (те же настройки FPU).
Математический код перед настройкой () завершается нормально, затем NOP, затем Setup () и т. Д.
Инструкции вокруг setup () кажутся чистыми. На вышеупомянутой сцене с аварией есть большой беспорядок +/- 2 instr в.
WHET OK SETUP.JPG
Whet OK Setup.JPG (176.22 киб) просмотрено 320 раз

AG123
Чт 20 апреля 2017 г. 18:24
Попробуйте что -то еще более утомительное, перенесите интеграл в другой файл CPP и объявите подпрограмму в заголовке :ржу не могу:

Да, это работает! 1 минута я бы загрузил его в файл ZIP, обратите внимание, что я использую чисто именование файлов C/C ++, файл Integral_Main.CPP содержит setup () и loop () и будет переименован в .Суффикс iNO/Тип файла
Интегральный эталон с плавающей запятой находится в Integral_float.CPP
Загрузили исходные коды, замените Serialusb Serial, если вы используете серийный.
Нажмите «G», чтобы начать

With_fpu 1, Optimization -os (оптимизируя размер), отладка, v6.3.1-2017-Q1-Update
аппаратное плавание, единственная точность Benchmark starts.. leftrect [2.0e+00 1.0e+01] num: 6.720000e-03, ana: 6.712139e-03 rightrect [2.0e+00 1.0e+01] num: 6.705779e-03, ana: 6.712139e-03 midrect [2.0e+00 1.0e+01] num: 6.712879e-03, ana: 6.712139e-03 trapezium [2.0e+00 1.0e+01] num: 6.712059e-03, ana: 6.712139e-03 simpson [2.0e+00 1.0e+01] num: 6.712050e-03, ana: 6.712139e-03 leftrect [-1.0e+00 -7.0e-01] num: -2.613795e-03, ana: -2.612248e-03 rightrect [-1.0e+00 -7.0e-01] num: -2.613944e-03, ana: -2.612248e-03 midrect [-1.0e+00 -7.0e-01] num: -2.613870e-03, ana: -2.612248e-03 trapezium [-1.0e+00 -7.0e-01] num: -2.612268e-03, ana: -2.612248e-03 simpson [-1.0e+00 -7.0e-01] num: -2.612271e-03, ana: -2.612248e-03 leftrect [1.0e+01 5.0e+01] num: 2.825554e-01, ana: 2.824790e-01 rightrect [1.0e+01 5.0e+01] num: 2.824033e-01, ana: 2.824790e-01 midrect [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 trapezium [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 simpson [1.0e+01 5.0e+01] num: 2.824791e-01, ana: 2.824790e-01 leftrect [0.0e+00 1.0e+01] num: 6.603576e-01, ana: 6.601052e-01 rightrect [0.0e+00 1.0e+01] num: 6.598577e-01, ana: 6.601052e-01 midrect [0.0e+00 1.0e+01] num: 6.601063e-01, ana: 6.601052e-01 trapezium [0.0e+00 1.0e+01] num: 6.601086e-01, ana: 6.601052e-01 simpson [0.0e+00 1.0e+01] num: 6.601073e-01, ana: 6.601052e-01 Benchmark ends, elapsed 2383 msecs

Пито
Чт 20 апреля 2017 г. 18:42
С with_fpu 1 я думаю :)

AG123
Чт 20 апреля 2017 г. 18:57
Да, потому что, если with_fpu не определено, он будет «повесить» - FPU не включен :ржу не могу:
Вы можете взглянуть на исходные коды, загруженные в последнем посте

Пито
Чт 20 апреля 2017 г., 19:04
Это с версией Ag
Перед настройкой (): вероятно, векторы, затем __do_global_dtors_aux: и frame_dummy.
Integrag.jpg
Интеграл.JPG (179.39 киб) просмотрено 307 раз

Рик Кимбалл
Чт 20 апреля 2017 г., 19:14
Может быть, эта проблема?
http: // Stackoverflow.COM/Вопросы/2711 ... Ting-Point

AG123
Чт 20 апреля 2017 г., 19:23
Я предполагаю, что одна из следующих вещей может быть попытаться поймать обычные исключения с плавающей запятой (e.глин. разделение на ноль), это нужно связываться с прерывами : D

Пито
Чт 20 апреля 2017 г., 19:26
Я не могу заставить вашу версию работать :) :) :) Benchmark starts..

AG123
Чт 20 апреля 2017 г., 19:31
void интеграл (void) определяется в интегральном.час
Источник в Integral_float.CPP

в setup () или loop ()
Вам нужно позвонить в интеграл (), который является контрольным кодом

Загрузите версию, которая, вероятно, более STM32Duino «совместимая», так как моя - это в значительной степени царапина

Ой Странно, не кажется актуальным, он работает здесь, я имею в виду интеграл ()
;)

определения, используемые как извлеченные из Makefile mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Wall -Wextra -DSTM32_HIGH_DENSITY -DSTM32F4 -DBOARD_black_f4 -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG -DDEBUG_LEVEL=DEBUG_NONE -DVECT_TAB_ADDR=0x8000000 -DVECT_TAB_BASE -DF_CPU=168000000L -DSERIAL_USB -DUSB_VID=0x1EAF -DUSB_PID=0x0004 -DUSB_MANUFACTURER="Unknown" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple/usbF4/VCP" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_OTG_Driver/inc" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Core/inc" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple/usbF4/STM32_USB_Device_Library/Class/cdc/inc" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/cores/maple/libmaple/usbF4" -I"/opt3/src/workspace/STM32F4duinoblinky/STM32F4/variants/black_f407vet6" -std=gnu++11 -fabi-version=0 -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"

Пито
Чт 20 апреля 2017 г., 19:36
В Ag.INO я называю Integral () в loop () как в вашем источнике (я использую ваш источник).
Я поставил интеграл.H и Integral_float.CPP и AG.Ино в тот же проект.
Компилируется 50K без ошибок или предупреждения.
Он печатает, поэтому серийные работы.
Прилагал мой код без USB и светодиодов.
Agsetup.jpg
Агсетуп.JPG (24.65 киб) просмотрено 291 раз

AG123
Чт 20 апреля 2017 г., 19:56
ОК загрузил Integral_bench.молния
Нажмите «G», чтобы начать : D

Я собрал это в Arduino Ide 1.8.2, выбранный доске "STM32 Discovery F407"
Обратите внимание, что serialusb существует и определяется, мне не нужно заменяться serialusb серийным

4.8.3-2014Q1 Аппаратная плавающая точка, параметры на основе платформ.TXT и доски.TXT для вышеупомянутой доски Benchmark starts.. leftrect [2.0e+00 1.0e+01] num: 6.720000e-03, ana: 6.712139e-03 rightrect [2.0e+00 1.0e+01] num: 6.705779e-03, ana: 6.712139e-03 midrect [2.0e+00 1.0e+01] num: 6.712879e-03, ana: 6.712139e-03 trapezium [2.0e+00 1.0e+01] num: 6.712058e-03, ana: 6.712139e-03 simpson [2.0e+00 1.0e+01] num: 6.712050e-03, ana: 6.712139e-03 leftrect [-1.0e+00 -7.0e-01] num: -2.613795e-03, ana: -2.612248e-03 rightrect [-1.0e+00 -7.0e-01] num: -2.613944e-03, ana: -2.612248e-03 midrect [-1.0e+00 -7.0e-01] num: -2.613870e-03, ana: -2.612248e-03 trapezium [-1.0e+00 -7.0e-01] num: -2.612268e-03, ana: -2.612248e-03 simpson [-1.0e+00 -7.0e-01] num: -2.612271e-03, ana: -2.612248e-03 leftrect [1.0e+01 5.0e+01] num: 2.825554e-01, ana: 2.824790e-01 rightrect [1.0e+01 5.0e+01] num: 2.824033e-01, ana: 2.824790e-01 midrect [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 trapezium [1.0e+01 5.0e+01] num: 2.824792e-01, ana: 2.824790e-01 simpson [1.0e+01 5.0e+01] num: 2.824791e-01, ana: 2.824790e-01 leftrect [0.0e+00 1.0e+01] num: 6.603576e-01, ana: 6.601052e-01 rightrect [0.0e+00 1.0e+01] num: 6.598577e-01, ana: 6.601052e-01 midrect [0.0e+00 1.0e+01] num: 6.601063e-01, ana: 6.601052e-01 trapezium [0.0e+00 1.0e+01] num: 6.601086e-01, ana: 6.601052e-01 simpson [0.0e+00 1.0e+01] num: 6.601073e-01, ana: 6.601052e-01 Benchmark ends, elapsed 8136 msecs

Пито
Чт 20 апреля 2017 г. 20:12
Что тот же источник, что и я использую. Мой останавливается в печати см. Выше. Он печатает 3 привет и останавливается.
Я получаю __stm32reservedException9 в prntf("%10s [%1.1e %1.1e] num: %1.6e, ana: %1.6e\n", names[i], ivals[2*j], ivals[2*j+1], ic, tmp);

AG123
Чт 20 апреля 2017 г. 20:29
Ой, кажется, что компиляция по умолчанию в Arduino Ide 1.8.2 для программного плавания
Я попадаю в некоторые ошибки компиляции, когда добавляю аппаратные флаги с компиляцией по плаванию в досках.текст discovery_f407.build.extra_flags=-DMCU_STM32F406VG -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -DSTM32_HIGH_DENSITY -DSTM32F2 -DSTM32F4 -DBOARD_discovery_f4

Пито
Чт 20 апреля 2017 г. 20:39
Скомпилировал ваш эскиз Arduino под Arduino IDE. Сериал используется. Скомпилируется с -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant

AG123
Чт 20 апреля 2017 г. 20:42
Основные части, которые я отредактировал для Printf, - это void prntf(char *fmt, ... ){ char buf[128]; // resulting string limited to 128 chars va_list args; va_start (args, fmt ); vsnprintf(buf, 128, fmt, args); va_end (args); for(int i=0;i<128;i++) { if(buf[i]=='\0') break; if(buf[i]=='\n') SerialUSB.println(); else SerialUSB.write(buf[i]); } }

Пито
Чт 20 апреля 2017 г. 20:45
Да, это тоже сбоя с вашей версией PRNTF.
Да, это тоже сбоя с моей версией.
Я не использую USBERIAL.
Итак, в чем же уловка с вашей версией, которая работает?? :?

AG123
Чт 20 апреля 2017 г. 20:48
Это несколько удивительно, так как это те же файлы, которые я использовал в Eclipse, просто вместо ino я переименую в CPP, чтобы сделать его компиляцию :?

Пито
Чт 20 апреля 2017 г. 20:52
Итак, вернемся к Eclipse. Настройка моей такой же, как и ваша, не?
Это компилируется. Я использую сериал вместо USBERIAL, поэтому .корзины не такого же размера.
Он печатает, поэтому он компилирует и связывает все компоненты, кажется,.
Он сбой во время печати результатов.
Обе версии PRNTF попробовали.

AG123
Чт 20 апреля 2017 г. 20:53
Другая вещь, которая может отличаться, это то, что я использую GCC 6 в Eclipse, а в Arduino Ide это 4.8.3, я не слишком уверен, имеет ли это значение
В настоящее время только программная часть Float Phot работает в Arduino IDE
Подписание на данный момент

Пито
Чт 20 апреля 2017 г. 9:01 вечера
Я заменил PRNTF на пользовательский сериал.println (float2s (IC, 7)), чтобы по крайней мере увидеть результаты. Оно работает:
-OS -G, 4.8.3-2014q1, -mfloat-abi = hard -mfpu = fpv4-sp-d16 -fsingle-presision-constant, fpuon, 168 МГц, Benchmark starts.. left num: 6.7200002e-3 ana: 6.7121386e-3 righ num: 6.7057795e-3 ana: 6.7121386e-3 midr num: 6.7128791e-3 ana: 6.7121386e-3 trap num: 6.7120594e-3 ana: 6.7121386e-3 simp num: 6.7120509e-3 ana: 6.7121386e-3 left num: -2.6137950e-3 ana: -2.6122405e-3 righ num: -2.6139435e-3 ana: -2.6122405e-3 midr num: -2.6138706e-3 ana: -2.6122405e-3 trap num: -2.6122679e-3 ana: -2.6122405e-3 simp num: -2.6122713e-3 ana: -2.6122405e-3 left num: 2.8255537e-1 ana: 2.8247904e-1 righ num: 2.8240325e-1 ana: 2.8247904e-1 midr num: 2.8247917e-1 ana: 2.8247904e-1 trap num: 2.8247917e-1 ana: 2.8247904e-1 simp num: 2.8247909e-1 ana: 2.8247904e-1 left num: 6.6035757e-1 ana: 6.6010518e-1 righ num: 6.5985774e-1 ana: 6.6010518e-1 midr num: 6.6010627e-1 ana: 6.6010518e-1 trap num: 6.6010856e-1 ana: 6.6010518e-1 simp num: 6.6010732e-1 ana: 6.6010518e-1 Benchmark ends, elapsed 924 msecs

Пито
Чт 20 апреля 2017 г., 21:30
Теперь проблема с vsnprintf. Он петля в memset () в цикле (4688-4694), где он увеличивает регистрацию R2 с ~ Zero до == R6 (R6, установленное на 0x8000808) Шаг 16, и когда он достигнет 1048584??).
Vsnprintf опасен.Мы должны избавиться от этого.
Смотрите ниже петли.
vsnprtf ansue.jpg
Проблема VSNPRTF.JPG (154.32 киб) просмотрено 282 раза

Пито
Чт 20 апреля 2017 г., 11:00 вечера
@AG123: прилагал моддированный файл с помощью печатных плав, который работает. Вы можете попробовать. Я получил 924msecs, -O2, FPU на. См. Выше результаты.
Я буду изменять этот материал позже, чтобы печатать результаты после вычисления. Но пока это нормально.
Интересно увидеть ваши результаты.. :)

AG123
Пт 21 апреля 2017 г. 3:21
@pito Спасибо
Да, это работает
V6.3.1-2017-q1-update, оптимизация -O2 (оптимизация больше), отладка, примечание -fsingle-presision-constants не SPECITIFIFITED
аппаратная плавающая точка, единственная точность, с_фпу 1, Hello 1, The Benchmark starts.. left num: 6.7200002e-3 ana: 6.7121386e-3 righ num: 6.7057795e-3 ana: 6.7121386e-3 midr num: 6.7128791e-3 ana: 6.7121386e-3 trap num: 6.7120594e-3 ana: 6.7121386e-3 simp num: 6.7120504e-3 ana: 6.7121386e-3 left num: -2.6137950e-3 ana: -2.6122479e-3 righ num: -2.6139435e-3 ana: -2.6122479e-3 midr num: -2.6138706e-3 ana: -2.6122479e-3 trap num: -2.6122679e-3 ana: -2.6122479e-3 simp num: -2.6122713e-3 ana: -2.6122479e-3 left num: 2.8255537e-1 ana: 2.8247904e-1 righ num: 2.8240327e-1 ana: 2.8247904e-1 midr num: 2.8247923e-1 ana: 2.8247904e-1 trap num: 2.8247917e-1 ana: 2.8247904e-1 simp num: 2.8247907e-1 ana: 2.8247904e-1 left num: 6.6035757e-1 ana: 6.6010518e-1 righ num: 6.5985774e-1 ana: 6.6010518e-1 midr num: 6.6010627e-1 ana: 6.6010518e-1 trap num: 6.6010856e-1 ana: 6.6010518e-1 simp num: 6.6010732e-1 ana: 6.6010518e-1 Benchmark ends, elapsed 2305 msecs

AG123
Пт 21 апреля 2017 г. 3:48
Когда завершенная версия будет выполнена, давайте опубликуем источник и приведут к потоке Dhrystone и Whetstone, это лучший эталон, он менее подвержен GCC, снимающим коды, E.глин. -OS, -O2, -O3, по -видимому, не имел большого значения с этим эталоном : D

Пито
Пт 21 апреля 2017 г. 7:08
Хорошо, это версия с серийным.print () только. И новые результаты:
-OS -G, 4.8.3-2014q1, -mfloat-abi = hard -mfpu = fpv4-sp-d16 -fsingle-presision-constant, fpuon, 240 МГц Benchmark starts.. left num: 6.7200002e-3 ana: 6.7121386e-3 righ num: 6.7057795e-3 ana: 6.7121386e-3 midr num: 6.7128791e-3 ana: 6.7121386e-3 trap num: 6.7120594e-3 ana: 6.7121386e-3 simp num: 6.7120509e-3 ana: 6.7121386e-3 left num: -2.6137950e-3 ana: -2.6122405e-3 righ num: -2.6139435e-3 ana: -2.6122405e-3 midr num: -2.6138706e-3 ana: -2.6122405e-3 trap num: -2.6122679e-3 ana: -2.6122405e-3 simp num: -2.6122713e-3 ana: -2.6122405e-3 left num: 2.8255537e-1 ana: 2.8247904e-1 righ num: 2.8240325e-1 ana: 2.8247904e-1 midr num: 2.8247917e-1 ana: 2.8247904e-1 trap num: 2.8247917e-1 ana: 2.8247904e-1 simp num: 2.8247909e-1 ana: 2.8247904e-1 left num: 6.6035757e-1 ana: 6.6010518e-1 righ num: 6.5985774e-1 ana: 6.6010518e-1 midr num: 6.6010627e-1 ana: 6.6010518e-1 trap num: 6.6010856e-1 ana: 6.6010518e-1 simp num: 6.6010732e-1 ana: 6.6010518e-1 Benchmark ends, elapsed 633 msecs..

Стивестронг
Пт 21 апреля 2017 г., 7:19 утра
Пожалуйста, также опишите пошаговый за шагом, что необходимо для работы FPU (может быть?).

Пито
Пт 21 апреля 2017 г., 7:40
Обновил первую страницу..

Быстрое руководство по установке FPU на досках STM32F407 в рамках STM32Duino
Будет точным дальше на

На вашей платформе.txt Add -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant

AG123
Пт 21 апреля 2017 г. 9:38 утра
@pito Поместите эти коды ASM в функцию enable_fpu (), это может помочь в тех случаях, когда кто -то может скопировать эти ASM и поместить их в тот же раздел, что и коды с плавающей запятой, что приведет к жестким разломам и т. Д

Я бы подумал, что в какое -то «будущее» время enable_fpu (), возможно, может попасть в Libmaple как «функция удобства», я.эн. Только наброски, которые нуждаются в них, называет это
Я не уверен, что вызов его в init () может привести к большему потреблению мощности и т. Д., Или, что еще более важно, если он будет вызван на F103, это может привести к тяжелой ошибке/исключению. Следовательно, это будет оставлено пользователю/эскизу, которому это нужно, чтобы назвать это

У меня версия, которая вроде «красиво напечатана» //enable the fpu (cortex-m4 - stm32f4* and above) //http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/BEHBJHIG.html void enablefpu() { __asm volatile ( " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ " ldr r1, [r0] \n" /* read CAPCR */ " orr r1, r1, #( 0xf << 20 )\n" /* Set bits 20-23 to enable CP10 and CP11 coprocessors */ " str r1, [r0] \n" /* Write back the modified value to the CPACR */ " dsb \n" /* wait for store to complete */ " isb" /* reset pipeline now the FPU is enabled */ ); }

Пито
Пт 21 апреля 2017 г. 9:57 утра
Это окончательная версия 1.0 из эталона численной интеграции.
Блоки показывают скорость и точность математической либера.
Трингм нелегко оптимизировать.
Изменения:
1. Добавлены точные результаты Wolfram Alfa
2. Печать результатов теперь выходит из цикла расчета.

-O3 -G, 4.8.3-2014q1, -mfloat-abi = hard -mfpu = fpv4-sp-d16 -fsingle-presision-constant, fpu on, black f407zet @240mhz Numerical Integration Benchmark starts.. Single Precision with FPU, v1.0 F1 Result: 0.00671211394423041159587 leftrect num: 6.720000e-3 ana: 6.712139e-3 righrect num: 6.705780e-3 ana: 6.712139e-3 midrect num: 6.712879e-3 ana: 6.712139e-3 trapezium num: 6.712059e-3 ana: 6.712139e-3 simpson num: 6.712051e-3 ana: 6.712139e-3 F2 Result: -0.00261227114510560413684 leftrect num: -2.613795e-3 ana: -2.612241e-3 righrect num: -2.613944e-3 ana: -2.612241e-3 midrect num: -2.613871e-3 ana: -2.612241e-3 trapezium num: -2.612268e-3 ana: -2.612241e-3 simpson num: -2.612271e-3 ana: -2.612241e-3 F3 Result: 0.28247911095899395473 leftrect num: 2.825554e-1 ana: 2.824790e-1 righrect num: 2.824032e-1 ana: 2.824790e-1 midrect num: 2.824792e-1 ana: 2.824790e-1 trapezium num: 2.824792e-1 ana: 2.824790e-1 simpson num: 2.824791e-1 ana: 2.824790e-1 F4 Result: 0.660105195382224847535 leftrect num: 6.603576e-1 ana: 6.601052e-1 righrect num: 6.598577e-1 ana: 6.601052e-1 midrect num: 6.601063e-1 ana: 6.601052e-1 trapezium num: 6.601086e-1 ana: 6.601052e-1 simpson num: 6.601073e-1 ana: 6.601052e-1 Benchmark ends, elapsed 616621 microsecs..

AG123
Пт 21 апреля 2017 г. 10:05
@pito
Проблема в F1, пользователь, который запускает его с помощью Soft Float, может потребоваться ждать > 10 раз в это количество времени для теста для завершения :ржу не могу:
Я бы предположил, что мы сможем использовать Micros () вместо этого, которое является временем в микросекундах, и мы можем обойтись с меньшими законодательными петлями

Кроме того, я обнаружил, что __arm_pcs_vfp определяется GCC при компиляции с опцией -mfloat-abi = hard -mfpu = fpv4-sp-d16 Следовательно, это можно использовать для определения того, компиляется ли пользователь с оборудованием для оборудования, указанного в параметрах компиляции #ifdef __ARM_PCS_VFP #warning enabling harware fpu enablefpu(); #else #warning using software floating point #endif

Пито
Пт 21 апреля 2017 г. 10:17 утра
Давайте поцеловаемся.
Мы можем улучшить его в ближайшем будущем. Трингм предназначен для FPU, поэтому пользователь F1 должен изменить его для F1.
Единственная точность не предназначена для численной математики, поэтому результаты будут отключены по нескольким причинам.
С новыми процессорами с DP FPU мы можем создать двойную версию.
Q заключается в том, будет ли кто -нибудь его использовать, поэтому не тратьте на него слишком много времени.. ;)
П.
PS: обновил симпатичный отпечаток ASM :)

Эдогальдо
Пт 21 апреля 2017 г. 11:40
AG123 написал:@pito
Проблема в F1, пользователь, который запускает его с помощью Soft Float, может потребоваться ждать > 10 раз в это количество времени для теста для завершения :ржу не могу:
Я бы предположил, что мы сможем использовать Micros () вместо этого, которое является временем в микросекундах, и мы можем обойтись с меньшими законодательными петлями

Кроме того, я обнаружил, что __arm_pcs_vfp определяется GCC при компиляции с опцией -mfloat-abi = hard -mfpu = fpv4-sp-d16 Следовательно, это можно использовать для определения того, компиляется ли пользователь с оборудованием для оборудования, указанного в параметрах компиляции #ifdef __ARM_PCS_VFP #warning enabling harware fpu enablefpu(); #else #warning using software floating point #endif

Пито
Пт 21 апреля 2017 12:05
Обновлено первое сообщение.
@407 Эксперты и пользователи: начните использовать FPU и опубликовать свои выводы здесь, в этой теме. После сбора практического опыта мы обновим.
Счастливого борьбы :)

Рик Кимбалл
Пт 21 апреля 2017 12:18
Эдогальдо написал:Я бы также предложил поместить это в функцию «init ()» из «Доски.c ".

Эдогальдо
Пт 21 апреля 2017 г. 12:30
Рик Кимбалл написал:Эдогальдо написал:Я бы также предложил поместить это в функцию «init ()» из «Доски.c ".

Рик Кимбалл
Пт 21 апреля 2017 12:53
Эдогальдо написал:Это может быть хорошо, но почему в вариантах?!

Эдогальдо
Пт 21 апреля 2017 г. 13:47
Рик Кимбалл написал:К сожалению, вызов его в init () не гарантирует, что он будет вызван до какого -либо из конструкторов _pre_init.

Пито
Пт 21 апреля 2017 г. 15:25
К вашему сведению
-OS, -G, 4.8.3-2014Q1, Maple Mini, No FPU, 72 МГц Numerical Integration Benchmark starts.. Single Precision with No FPU, v1.0 F1 Result: 0.00671211394423041159587 leftrect num: 6.720000e-3 ana: 6.712139e-3 righrect num: 6.705780e-3 ana: 6.712139e-3 midrect num: 6.712879e-3 ana: 6.712139e-3 trapezium num: 6.712058e-3 ana: 6.712139e-3 simpson num: 6.712050e-3 ana: 6.712139e-3 F2 Result: -0.00261227114510560413684 leftrect num: -2.613795e-3 ana: -2.612248e-3 righrect num: -2.613944e-3 ana: -2.612248e-3 midrect num: -2.613871e-3 ana: -2.612248e-3 trapezium num: -2.612268e-3 ana: -2.612248e-3 simpson num: -2.612271e-3 ana: -2.612248e-3 F3 Result: 0.28247911095899395473 leftrect num: 2.825554e-1 ana: 2.824790e-1 righrect num: 2.824033e-1 ana: 2.824790e-1 midrect num: 2.824792e-1 ana: 2.824790e-1 trapezium num: 2.824792e-1 ana: 2.824790e-1 simpson num: 2.824791e-1 ana: 2.824790e-1 F4 Result: 0.660105195382224847535 leftrect num: 6.603576e-1 ana: 6.601052e-1 righrect num: 6.598577e-1 ana: 6.601052e-1 midrect num: 6.601063e-1 ana: 6.601052e-1 trapezium num: 6.601086e-1 ana: 6.601052e-1 simpson num: 6.601073e-1 ana: 6.601052e-1 Benchmark ends, elapsed 23992225 microsecs..

AG123
Пт 21 апреля 2017 г. 16:44
На самом деле это просто показывает, что STM32F4 + ART Accelerator + FPU + -FSINGLE -PRECIONS -CONSTANT + SPECIAL MATH MATH MATH FUNCTION + -O2 Оптимизация + Overclock -это реальное ракетное топливо (и это еще не добавляет аппаратные функции FPU, скомпилированные математические функции)) :ржу не могу:
Но чтобы оставить что-то для пользователей STM32 F1, я бы предположил, что у нас есть около 15-20 секунд для пользователей F1
И нам нужно использовать micros () для времени, Ultimate будет, когда мы получим петли за 1 -е., мы можем затем попытаться конкурировать с суперкомпьютерами : D

Пито
Пт 21 апреля 2017 г., 17:23
Хорошо, я смену на 10000 шагов, и измерение будет в USECS.
Я хотел показать только пользователям F1, они система действительно медленная :ржу не могу:

AG123
Пт 21 апреля 2017 г., 17:28
Рик Кимбалл написал:
К сожалению, вызов его в init () не гарантирует, что он будет вызван до какого -либо из конструкторов _pre_init.

Эдогальдо
Пт 21 апреля 2017 г., 17:29
Пито написал:Хорошо, я смену на 10000 шагов, и измерение будет в USECS.
Я хотел показать только пользователям F1, они система действительно медленная :ржу не могу:

AG123
Пт 21 апреля 2017 г., 17:30
STM32 F1 - эталон : D
Для тех, кто слишком плохо : P :ржу не могу:

Пито
Пт 21 апреля 2017 г., 17:41
ОК заменит на политически более правильный эталон с ~ 20 секунд для пользователей F1 и немного быстрее с 407.
Измерение в микросексе.
Обновлено на первой странице (и в других местах).
Q: Надеюсь, «поплавок» в профиле Maplemini не означает «двойной». Это было бы катастрофой..

AG123
Пт 21 апреля 2017 г., 18:02
Возможно, в какой -то момент у нас может быть F4, решая проблему с продавцами
https: // en.Википедия.org/wiki/travellin ... AN_PROBLEM
в реальном времени и выиграть гонки :ржу не могу:
http: // wiki.Evilmadscientist.com/tsp_art
https: // www.Google.компонент.sg/search?Q = TSP+ ... Ducqsaqiiq

Рик Кимбалл
Пт 21 апреля 2017 г., 18:09
Пито написал:Q: Надеюсь, «поплавок» в профиле Maplemini не означает «двойной». Это было бы катастрофой..

Пито
Пт 21 апреля 2017 г., 18:58
:) Я заявил, что, поскольку, если Maplemini использовал двойные кальки (называемые Float в тесте), результаты F1 с float будут лучше, а пользователи F1 могут подумать, что мы обманываем :)
Какой вариант использования вы видите, что использование двойного против поплавка будет полезным? Это хороший Q. Смотрите мое краткое описание на первой странице этой ветки.
SP хорош, когда говорите об использовании «стандартного» MCU в качестве контроллера процесса, где датчики дают вам «несколько цифр входов» (скажем, 4-5). Или когда вы хотите сделать DSP с аудио или видео (даже сегодняшние графические процессоры GO DP).
В тот момент, когда вы хотите что -то более требовательное, т.е. перейдите из Лондона в Сидней, вам нужен DP.
Если вы хотите предсказать положение небесных тел или паутины с спутником ветчины, вам нужен DP.
Или при реализации GPS что -то, вам нужен DP.

Вы можете безопасно приземлиться на Марс под контролем SP или контролировать отношение/двигатель/лоскуты/маневры F-16 с SP, но вы не можете перемещаться на Марс с SP или перемещаться из Лондона в Сидней, сидя в F-F -16 (например, при разговоре с мертвыми расплатами). Просто 6-7 «допустимых цифр» со сложной математикой недостаточно для многих приложений, особенно при перепутении с трансцендентными функциями (обычно они возвращают 5-6 допустимых цифр).

Например, вы можете попытаться сделать это довольно простые расчеты http: // www.подвижный тип.сопутствующий.Великобритания/Скрипты/Латлонг.HTML С SP против DP, в чем разница.

AG123
Пт 21 апреля 2017 г., 8:30 вечера
Я бы подумал, что может иметь значение, если мы сделаем некоторые итеративные корневые материалы, использование поплавок может привести к тому, что алгоритмы идут в петлях и никогда не сходится, поскольку ошибки продолжают накапливаться с каждой итерацией :ржу не могу:
Но я предполагаю, что «платформа» F4 - это своего рода ниша, по крайней мере, производительность приличной/хорошей для этих тестов : D

Для GPS, я бы подумал, что для точного позиционирования необходима двойная точность. Однако, если требуется только относительное положение и в небольших столичных городах или городах, я попытался использовать «Земля плоская».эн. Теорема Пифагор, и я могу в значительной степени «подделать» расстояния между двумя точками в районе (скажем, на основе местоположения клеточной башни, она, безусловно, не сработает, если мы находимся на противоположных сторонах Spere :ржу не могу:

Пито
Пт 21 апреля 2017 г., 8:41 вечера
Да, «численная стабильность» для SP плоха. Таким образом, вы, конечно, не хотите получить докторскую степень на такой платформе :)
Даже сравнение т.е. Если (q == r) может не работать надежно, вместо этого вы должны использовать if ((q < (r + epsilon)) или (q > (R - Epsilon))))).. чтобы убедиться, что это работает.. Многие калькуляторы за 30 долларов используют 25digits+, чтобы найти правильные корни :) Так что забудьте такую ​​математику на FPU 407.
С CMSIS DSP Libs вы можете попробовать FFT и такие вещи. Это будет хорошо работать. Может быть быстрее, чем с целыми числами.. Нет проблем с масштабированием, насыщением, конверсиями Q15 и т. Д. Просто подайте плавание, и вы получите хорошие спектра поплавков..
PS:
FFT 1024 балла на F429:
Q15 457us
Q31 855us
SP Float 547US
http: // www.ул.com/content/ccc/resource/ ... 273990.PDF

AG123
Пт 21 апреля 2017 г., 8:51 вечера
Конечно, для * твердого ядра *, вероятно, может сделать высоко оптимизированную двойную точку с точностью с использованием сборочной сборочной настройки твердого ядра, убедившись, что петли развернуты и разгоняют его до 240 МГц или выше, и позвольте ускорителю искусства управлять им там :ржу не могу:

Пито
Пт 21 апреля 2017 г., 20:57
Посмотрите выше в DOC STM: SP Float 1024 Points FFT 1.В 56 раза быстрее, чем Q32 (целое число), один. И вы увидите намного более приятные спектры..

Пито
Сб 22 апреля 2017 г. 10:12
К вашему сведению - я построил CMSIS FFT Float32 "ARM_FFT_BIN_EXAMPLE_F32" (из источников, поскольку мне не удалось получить DSPLIB, связанный в Слобере), 1024Points Float32 FFT, FPU ON, Black 407Zet, Sloeber.
Ввод/выход - плавание (тестовый сигнал из примера файла).

-O3, -g, 4.8.3-2014Q1, 168 МГц FFT.. elapsed 700 microsecs FFT Magn.. elapsed 211 microsecs FFT Bins.. elapsed 61 microsecs

Пито
SAT 22 апреля 2017 г. 18:02
И, наконец, 3 тона, амплитуды 100000.0 в 50, 100.0 в 120 и 0.1 в 230. Это означает, что разница в 60 дБ+60 дБ в амплитудах. Настройки, как указано выше.
Вы можете увидеть, что тон при 230 все еще видна (к счастью, не скрыт на фоне шума), несмотря на большой числовой шум поплавки.
FFT 3 Tones.jpg
FFT 3 тона.JPG (63.11 киб) просмотрено 781 раз

Пито
SAT 22 апреля 2017 г. 9:55 вечера
Я поместил код ASM включения перед __LIBC_INIT_ARRAY (); в start_c.c и это работает. .. #if defined (__GNUC__) && defined (__VFP_FP__) #warning enabling harware fpu __asm volatile ( " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ " ldr r1, [r0] \n" /* read CAPCR */ " orr r1, r1, #( 0xf << 20 )\n" /* Set bits 20-23 to enable CP10 and CP11 coprocessors */ " str r1, [r0] \n" /* Write back the modified value to the CPACR */ " dsb \n" /* wait for store to complete */ " isb" /* reset pipeline now the FPU is enabled */ ); #else #warning using software floating point #endif /* Run initializers. */ __libc_init_array(); ..

AG123
Солнце 23 апреля 2017 г. 7:06 утра
Я обнаружил, что конкретное определение __ARM_PCS_VFP отображается только if -mthumb -mcpu = cortex -m4 -mfloat -abi = hard -mfpu = fpv4 -sp -d16 определяется
Очевидно, этот конкретный определение не будет отображаться с -mthumb -mcpu = cortex -m4 -mfloat -abi = softfp -mfpu = fpv4 -sp -d16 (i.эн. программное обеспечение плавает)
Или, если это просто осталось, я бы предположил, что Eclipse или, возможно, GCC просто используйте плавучих точек программного обеспечения, если ничего не указано

Пито
Солнце 23 апреля 2017 г. 11:05
«SoftFP» не означает программное плавание.
Это означает, что FPU использует стандартные регистры для параметров, проходящих в FPU. Это по причинам совместимости.
И -Hard, так и -Softfp используют FPU.
Это может произойти, что -ффп с FPU OFF будет использовать программные математические процедуры, а не проверена.

victor_pv
Солнце 23 апреля 2017 г. 14:09
Не уверен, что я пропустил это в одном из постов, но я не смог его найти. Используя команду из Edogaldo и подтвердил проверку некоторых потоков в Google, кажется, что определение при использовании FPU или нет так:

Не используется аппаратный FPU: __SOFTFP__ 1 __ARM_PCS 1

AG123
Солнце 23 апреля 2017 г. 15:09
Я тоже сделал немного Google и нашел определения здесь и цитировал некоторые определения
http: // Infocenter.рука.com/help/topic/co ... 21827.HTML __ARM_PCS 1 Set for 32-bit targets only. Set to 1 if the default procedure calling standard for the translation unit conforms to the base PCS. __ARM_PCS_VFP 1 Set for 32-bit targets only. Set to 1 if the default procedure calling standard for the translation unit conforms to the VFP PCS. That is, -mfloat-abi=hard. __SOFTFP__ 1 Set to 1 when compiling with software floating-point on 32-bit targets. Set to 0 otherwise.

AG123
Солнце 23 апреля 2017 г. 15:16
И вот несколько историй о том, что FPU-ing довольно плавучие ошибки или проблемы, вызвавшие некоторые большие проблемы, один из которых Bascially говорит, что если вы строите летающую машину и точность MIL $, это может быть безопаснее использовать удвоение и получить ЦП/MCU с FPU, который делает это :ржу не могу:
http: // ta.Тви.ТУДЕЛЬФТ.nl/users/vuik/wi2 ... стержня.HTML

Пито
Солнце 23 апреля 2017 г. 18:04
К вашему сведению - я заменил код для печати поплавков (мы используем его в эталонном эталоне интеграции - фиксировано), так как код сделал ошибку с другими вычислениями, которые я сделал недавно. Вместо того, чтобы получить 100.0 Я получил только 10.0..

victor_pv
Солнце 23 апреля 2017 г. 18:33
AG123 написал:... #if defined(__GNUC__) && (__ARM_PCS==1 || __ARM_PCS_VFP==1) #warning enabling harware fpu enable_fpu(); #endif ...

AG123
Солнце 23 апреля 2017 г. 18:43
Хорошо, согласно этому
http: // Поддержка.выражение.com/content/h ... -кора-м4 Инструментальный аппарат GCC предлагает 3 метода для обработки плавающей точки на STM32F4XX. Правильный метод зависит от вашего приложения и его требований:
Эмулированный поплавок (-mfloat-abi = мягкий вариант), который отключает FPU
Аппаратный FPU (-mfloat-abi = опция SoftFP) со стандартным прохождением параметров EABI
Аппаратный FPU (-mfloat-abi = жесткий вариант) с конкретным прохождением параметров
Я не уверен, что: если ни один из этих флагов не указан и что в кодах есть плавание (однократные вычисления точности), что является опцией, которую GCC использует в качестве по умолчанию? Если по умолчанию эмулируют поплавок I.эн. Пропустив FPU вообще, мы, вероятно, в безопасности (я.эн. У нас не будет __arm_pcs == 1 || __Arm_pcs_vfp == 1) флаги, так как любой из них там означает, что подключить FPU, или возникнет тяжелая ошибка, так как вызов просто упадет (FPU отключен)

Если по умолчанию -MFLOAT -FBI = Soft (I.эн. Программное плавание эмуляция) Добавление аппаратного плавания будет тогда просто выбрать «вариант», в котором мы можем поместить эти варианты -mfloat -abi = softfp или -mfloat -abi = жесткие варианты в конкретных платах.Раздел варианта TXT

Подписание на данный момент ;)

NetDuino 2 Plus