Страница 3 из 6
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 13:54:29
Reflector
[uquote="jcxz",url="/forum/viewtopic.php?p=4180122#p4180122"]Тогда зачем IAR стек в функциях выравнивает? Просто так?

[/uquote]
ARM много чего рекомендует и запрещает, например, у M0 есть инструкция DMB которая не делает ничего, но ARM все равно рекомендует ее использовать. Примерно то же и с выравниванием на 8, оно нужно только когда при прерываниях сохраняются регистры FP, но в этом случае такое выравнивание включается автоматически, независимо от настроек. В документации даже картинка есть и псевдокод:
Код: Выделить всё
PushStack(integer ExceptionType)
if HaveFPExt() && CONTROL.FPCA == '1' then
framesize = 0x68;
forcealign = '1';
else
framesize = 0x20;
forcealign = CCR.STKALIGN;
.....
Это и M7 касается, тем не менее
ARM deprecates implementation or use of 4-byte SP alignment 
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 14:41:01
jcxz
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4179991#p4179991"]Мужики! Мне тут в ЖЖ товарищи подсказали наилучший перевод слова "быдлокод"[/uquote]Видимо они это сказали когда увидели такое:
Код: Выделить всё
// now convert float to 1.xxxE3y
while(x > 1000.f){
x /= 1000.f;
pow += 3;
}
if(x > 0.) while(x < 1.){
x *= 1000.f;
pow -= 3;
}
Добавлено after 1 minute 1 second:
[uquote="Reflector",url="/forum/viewtopic.php?p=4180111#p4180111"]По большому счету даже правильность работы любительских функций форматирования для чисел с плавающей точкой под большим вопросом...[/uquote]Это точно! Когда видишь такое, как выше....

Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 15:14:17
Eddy_Em
jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 15:42:49
jcxz
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180176#p4180176"]
jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?[/uquote]Подсмотреть как делает printf()? Не?
Например по школьной формуле:

a = 2; c = 10; b = число.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 16:15:11
AVI-crak
Не знаю как лучше, но деление в цикле явно самый провальный вариант. Например для 3.40282346639e+38 накопится значительная ошибка. А для чисел ниже 1.00000011116e-06 ошибку будет видно сразу.
Eddy_Em - чем таблицы не угодили?
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 16:25:39
Eddy_Em
[uquote="jcxz",url="/forum/viewtopic.php?p=4180197#p4180197"]Например по школьной формуле[/uquote]
Не хватало еще логарифм табулировать ради этого!
Добавлено after 3 minutes 41 second:
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4180214#p4180214"]Например для 3.40282346639e+38 накопится значительная ошибка. А для чисел ниже 1.00000011116e-06 ошибку будет видно сразу.[/uquote]
Вывод 2.473829e31 с 0-4 цифрами после точки:
Код: Выделить всё
25E30
24.7E30
24.74E30
24.738E30
24.7383E30
Вывод -1.23456789e-37:
Код: Выделить всё
-123E-39
-123.5E-39
-123.46E-39
-123.457E-39
-123.4568E-39
Я ж
проверил сразу несколько разных чисел.
Добавлено after 2 minutes 43 seconds:
У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит.
Ищу, где ж я накосячил.
Причем, здесь практически полностью USB можно с F103 содрать за исключением имени обработчика прерывания.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 17:24:32
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]проверил сразу[/url] несколько разных чисел.[/uquote]
Точность выше всяких похвал получилась, у себя делю минимальные 1.1754943E-38 на 2 и получаю 0, а у тебя делю на миллион и получаю 11.2104E-45

Осталось бесконечность починить, на ней тоже виснет

Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 17:28:19
jcxz
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"][uquote="jcxz",url="/forum/viewtopic.php?p=4180197#p4180197"]Например по школьной формуле[/uquote]Не хватало еще логарифм табулировать ради этого![/uquote]Зачем его "табулировать"?
Включите голову!
Добавлено after 3 minutes 32 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]Я ж
проверил сразу несколько разных чисел.[/uquote]Чтобы проверить, надо немного голову задействовать.
Проверяют на критичных (граничных) условиях, а не на каких попало. Критичные условия будут на таких числах, на которых ошибка округления скажется. А ваша "проверка" - профанация. В утиль.

Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 18:18:17
AVI-crak
Reflector писал(а):у себя делю минимальные 1.1754943E-38 на 2 и получаю 0
Кхм, минимальное это 1.40129846432e-45.
https://www.h-schmidt.net/FloatConverter/IEEE754.html
Поиграйся немного.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 18:25:08
VladislavS
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит.
Ищу, где ж я накосячил.[/uquote]Осталось конфигурацию ног проверить.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 18:36:07
Eddy_Em
VladislavS, В точку! Я пошел погулять (благо, у нас тут вероятность во время прогулки людей встретить очень низкая, а то в каком-нибудь говногороде я со своей короной сидел бы дома круглосуточно!), стал обдумывать - и вспомнил, что ноги не настроил на альтернативную функцию!
Вот все-таки не понимаю инженеров ST: они взяли вроде бы лучшее от STM32F0 и засунули в 303. Но USB оставили тот самый убогий, который у F103. Ну, благо, хоть CAN и USB одновременно работать могут (я, кстати, глянул внимательно даташит: у B и C 512 байт буфера USB не делятся с CAN - и на том спасибо).
Но, блин, нет HSI48 и внутренней подтяжки — вот что за ë-моë?!
Да и эти убогие регистры USB'шные, где часть флагов set/reset, а часть — toggle! Это ж что они там курили-то? Но, видать, т.к. решили оставить наследие (чтобы не переписывать USB), в более поздних моделях те же самые косяки оставили. Мудаки, блин!
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 18:54:12
jcxz
[uquote="Reflector",url="/forum/viewtopic.php?p=4180140#p4180140"][uquote="jcxz",url="/forum/viewtopic.php?p=4180122#p4180122"]Тогда зачем IAR стек в функциях выравнивает? Просто так?

[/uquote]
ARM много чего рекомендует и запрещает, например, у M0 есть инструкция DMB которая не делает ничего, но ARM все равно рекомендует ее использовать. Примерно то же и с выравниванием на 8, оно нужно только когда при прерываниях сохраняются регистры FP[/uquote]Сделаем маленький тест:
Код: Выделить всё
__packed struct {
float x;
double y[2];
} static t __align64 = {1.f, {1., 2.}};
Zf2((double *)t.y);
...
void Zf2(double *p)
{
u32 m[8];
memset(m, 0xEE, sizeof(m));
LogCR0("addr = %08X; SP = %08X; m = %08X", p, __get_SP(), m);
LogCR0("1: y1 = %f; y2 = %f", p[0], p[1]);
__set_SP(__get_SP() + 4);
LogCR0("2: y1 = %f; y2 = %f", p[0], p[1]);
__set_SP(__get_SP() - 4);
}
Функции LogCR0() имеют printf()-подобный интерфейс вызова (изнутри вызывают библиотечную _Printf()) и печатают в поток отладочного вывода.
Результат работы Zf2((double *)t.y) (напечатанный результат):
addr = 1000DB44; SP = 1000CF98; m = 1000CFA0
1: y1 = 1.000000; y2 = 2.000000
2: y1 = 0.000000; y2 = 0.000000
Как нетрудно заметить - в случае с SP не выровненным на 8 (а только на 4) получаем неверный результат.
Листинг Zf2() (на всяк случай):
Спойлер
Код: Выделить всё
void Zf2(double *p)
{
_Z3Zf2Pd: (+1)
0xB510 PUSH {R4,LR}
0xB08A SUB SP,SP,#+40
0x4604 MOV R4,R0
u32 m[8];
memset(m, 0xEE, sizeof(m));
0x22EE MOVS R2,#+238
0x2120 MOVS R1,#+32
0xA802 ADD R0,SP,#+8
0x.... 0x.... BL __aeabi_memset4
LogCR0("addr = %08X; SP = %08X; m = %08X", p, __get_SP(), m);
0x466A MOV R2,SP
0xAB02 ADD R3,SP,#+8
0x4621 MOV R1,R4
0x.... 0x.... ADR.W R0,?_14
0x.... 0x.... BL _Z12ServiceLogCRPKcz
LogCR0("1: y1 = %f; y2 = %f", p[0], p[1]);
0xED94 0x0B02 VLDR D0,[R4, #+8]
0xED8D 0x0B00 VSTR D0,[SP, #+0]
0xE9D4 0x2300 LDRD R2,R3,[R4, #+0]
0x.... 0x.... ADR.W R0,?_15
0x.... 0x.... BL _Z12ServiceLogCRPKcz
__set_SP(__get_SP() + 4);
0x4668 MOV R0,SP
0x1D00 ADDS R0,R0,#+4
0x4685 MOV SP,R0
LogCR0("2: y1 = %f; y2 = %f", p[0], p[1]);
0xED94 0x0B02 VLDR D0,[R4, #+8]
0xED8D 0x0B00 VSTR D0,[SP, #+0]
0xE9D4 0x2300 LDRD R2,R3,[R4, #+0]
0x.... 0x.... ADR.W R0,?_16
0x.... 0x.... BL _Z12ServiceLogCRPKcz
__set_SP(__get_SP() - 4);
0x4668 MOV R0,SP
0x1F00 SUBS R0,R0,#+4
0x4685 MOV SP,R0
}
0xB00A ADD SP,SP,#+40
0xBD10 POP {R4,PC}
IAR ANSI C/C++ Compiler V7.80.4.12462/W32 for ARM
Вывод:
Выравнивание SP на 8 необходимо! А не просто рекомендуемо. Как минимум - если используются функции стандартной си-библиотеки (семейство ...printf() и т.п.). И IAR не просто так выравнивает стек во всех функциях, из которых вызываются другие.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 19:18:29
Reflector
[uquote="AVI-crak",url="/forum/viewtopic.php?p=4180335#p4180335"]Кхм, минимальное это 1.40129846432e-45.[/uquote]
Да, стандартная функция numeric_limits<float>::min() ввела меня в заблуждение поскольку выдает минимум для нормализованных чисел, однако аппаратно кортексы только их и поддерживают(denormalized numbers are flushed to 0 before floating-point operations), видимо потому моя функция 0 и выдает...
Добавлено after 22 minutes 21 second:
[uquote="jcxz",url="/forum/viewtopic.php?p=4180367#p4180367"]Как нетрудно заметить - в случае с SP не выровненным на 8 (а только на 4) получаем неверный результат.[/uquote]
А если написать:
то результат будет правильный?
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 19:30:16
Eddy_Em
Интересненько: перед инициализацией USB пишу:
И… Фигвам! Все равно вместо usb_lp_isr срабатывает прерывание usb_lp_can1_rx0_isr! Вот что за труляля?!!
А ведь, судя по даташиту, должно работать! Иначе как я разделю прерывания для USB и CAN?
Судя по тому, что после установки этот бит отсутствует, китайцы продали какой-то очень странный чип, выдающий себя за F303, но таковым не являющийся!
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 19:43:29
Reflector
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180396#p4180396"]
И… Фигвам![/uquote]
Может тактирование SYSCFG не включил?
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 19:49:21
Eddy_Em
Reflector, да что ж такое! Я уже в который раз на этом попадаюсь!..
Кстати, в F0x2 не нужно было альтернативные функции на ноги включать, да и тактирование SYSCFG тоже… В общем F303 — это просто жесть какая-то!..
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 20:04:05
jcxz
[uquote="Reflector",url="/forum/viewtopic.php?p=4180369#p4180369"]А если написать:
то результат будет правильный?[/uquote]Естественно:
Код: Выделить всё
addr = 1000DB44; SP = 1000CF98; m = 1000CFA0
1: y1 = 1.000000; y2 = 2.000000
2: y1 = 1.000000; y2 = 2.000000
PS:
Код: Выделить всё
void Zf2(double *p)
{
u32 m[8];
memset(m, 0xEE, sizeof(m));
LogCR0("1: addr = %08X; SP = %08X; m = %08X", p, __get_SP(), m);
LogCR0("1: y1 = %f; y2 = %f", p[0], p[1]);
__set_SP(__get_SP() + 4);
LogCR0("2: addr = %08X; SP = %08X; m = %08X", p, __get_SP(), m);
LogCR0("2: y1 = %f; y2 = %f", p[0], p[1]);
__set_SP(__get_SP() + 4);
LogCR0("3: addr = %08X; SP = %08X; m = %08X", p, __get_SP(), m);
LogCR0("3: y1 = %f; y2 = %f", p[0], p[1]);
__set_SP(__get_SP() - 8);
}
static void DteZf1()
{
__packed struct {
float x;
double y[2];
} static t __align64 = {1.f, {1., 2.}};
Zf2((double *)t.y);
}
Вывод:
1: addr = 1000DB44; SP = 1000CF98; m = 1000CFA0
1: y1 = 1.000000; y2 = 2.000000
2: addr = 1000DB44; SP = 1000CF9C; m = 1000CFA4
2: y1 = 0.000000; y2 = 0.000000
3: addr = 1000DB44; SP = 1000CFA0; m = 1000CFA8
3: y1 = 1.000000; y2 = 2.000000
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 21:21:27
Eddy_Em
Эх, не выходит цветочек каменный: не подошел код от F103 — не проходит энумерация… Чую, что что-то не так с этими дебильными обращениями к памяти (где-то нужно их к uint16_t приводить, где-то — к uint8_t…)
Придется сравнивать мануалы на F103 и F303. А в апноуте по миграции с F103 на F303 ни хрена про USB не сказано ☹
Но оно даже до стадии USB_ISTR_CTR не доходит! В ISTR постоянно флаги ERR и ESOF…
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 21:55:30
VladislavS
Ничем они не отличаются вообще. Под спойлером кусочек кода, в котором отражена вся разница в реализации USB на шести семействах (те что не OTG). Всё запускается влёт, даже скучно как-то.
Спойлер

Кроме как nigger-code твои проблемы трудно объяснить.
Re: Флоаты в STM32F303
Добавлено: Вс фев 13, 2022 21:59:16
Eddy_Em
[uquote="VladislavS",url="/forum/viewtopic.php?p=4180509#p4180509"]Кроме как nigger-code твои проблемы трудно объяснить.[/uquote]
Эт точно. Только быдлокод один и тот же, но на F103 работает, а на F303 вызывает ERR…
ХЗ, копаюсь в этом Г дальше.