Флоаты в STM32F303

Кто любит RISC в жизни, заходим, не стесняемся.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Флоаты в STM32F303

Сообщение 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 :)
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Флоаты в STM32F303

Сообщение 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]Это точно! Когда видишь такое, как выше.... :facepalm:
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Флоаты в STM32F303

Сообщение jcxz »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180176#p4180176"]jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?[/uquote]Подсмотреть как делает printf()? Не? 8)

Например по школьной формуле: Изображение
a = 2; c = 10; b = число.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Флоаты в STM32F303

Сообщение AVI-crak »

Не знаю как лучше, но деление в цикле явно самый провальный вариант. Например для 3.40282346639e+38 накопится значительная ошибка. А для чисел ниже 1.00000011116e-06 ошибку будет видно сразу.
Eddy_Em - чем таблицы не угодили?
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение 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 содрать за исключением имени обработчика прерывания.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Флоаты в STM32F303

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]проверил сразу[/url] несколько разных чисел.[/uquote]
Точность выше всяких похвал получилась, у себя делю минимальные 1.1754943E-38 на 2 и получаю 0, а у тебя делю на миллион и получаю 11.2104E-45 :) Осталось бесконечность починить, на ней тоже виснет :)
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Флоаты в STM32F303

Сообщение 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]Чтобы проверить, надо немного голову задействовать.
Проверяют на критичных (граничных) условиях, а не на каких попало. Критичные условия будут на таких числах, на которых ошибка округления скажется. А ваша "проверка" - профанация. В утиль. :dont_know:
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Флоаты в STM32F303

Сообщение AVI-crak »

Reflector писал(а):у себя делю минимальные 1.1754943E-38 на 2 и получаю 0
Кхм, минимальное это 1.40129846432e-45.
https://www.h-schmidt.net/FloatConverter/IEEE754.html
Поиграйся немного.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Флоаты в STM32F303

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит.
Ищу, где ж я накосячил.[/uquote]Осталось конфигурацию ног проверить.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

VladislavS, В точку! Я пошел погулять (благо, у нас тут вероятность во время прогулки людей встретить очень низкая, а то в каком-нибудь говногороде я со своей короной сидел бы дома круглосуточно!), стал обдумывать - и вспомнил, что ноги не настроил на альтернативную функцию!

Вот все-таки не понимаю инженеров ST: они взяли вроде бы лучшее от STM32F0 и засунули в 303. Но USB оставили тот самый убогий, который у F103. Ну, благо, хоть CAN и USB одновременно работать могут (я, кстати, глянул внимательно даташит: у B и C 512 байт буфера USB не делятся с CAN ­- и на том спасибо).
Но, блин, нет HSI48 и внутренней подтяжки — вот что за ë-моë?!
Да и эти убогие регистры USB'шные, где часть флагов set/reset, а часть — toggle! Это ж что они там курили-то? Но, видать, т.к. решили оставить наследие (чтобы не переписывать USB), в более поздних моделях те же самые косяки оставили. Мудаки, блин!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Флоаты в STM32F303

Сообщение 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 не просто так выравнивает стек во всех функциях, из которых вызываются другие.
Последний раз редактировалось jcxz Вс фев 13, 2022 18:57:47, всего редактировалось 1 раз.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Флоаты в STM32F303

Сообщение 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]
А если написать:

Код: Выделить всё

__set_SP(__get_SP() + 8);
то результат будет правильный?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

Интересненько: перед инициализацией USB пишу:

Код: Выделить всё

SYSCFG->CFGR1 |= SYSCFG_CFGR1_USB_IT_RMP;
И… Фигвам! Все равно вместо usb_lp_isr срабатывает прерывание usb_lp_can1_rx0_isr! Вот что за труляля?!!
А ведь, судя по даташиту, должно работать! Иначе как я разделю прерывания для USB и CAN?

Судя по тому, что после установки этот бит отсутствует, китайцы продали какой-то очень странный чип, выдающий себя за F303, но таковым не являющийся!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Флоаты в STM32F303

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180396#p4180396"]

Код: Выделить всё

SYSCFG->CFGR1 |= SYSCFG_CFGR1_USB_IT_RMP;
И… Фигвам![/uquote]
Может тактирование SYSCFG не включил?
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

Reflector, да что ж такое! Я уже в который раз на этом попадаюсь!..
Кстати, в F0x2 не нужно было альтернативные функции на ноги включать, да и тактирование SYSCFG тоже… В общем F303 — это просто жесть какая-то!..
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Флоаты в STM32F303

Сообщение jcxz »

[uquote="Reflector",url="/forum/viewtopic.php?p=4180369#p4180369"]А если написать:

Код: Выделить всё

__set_SP(__get_SP() + 8);
то результат будет правильный?[/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
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

Эх, не выходит цветочек каменный: не подошел код от F103 — не проходит энумерация… Чую, что что-то не так с этими дебильными обращениями к памяти (где-то нужно их к uint16_t приводить, где-то — к uint8_t…)
Придется сравнивать мануалы на F103 и F303. А в апноуте по миграции с F103 на F303 ни хрена про USB не сказано ☹
Но оно даже до стадии USB_ISTR_CTR не доходит! В ISTR постоянно флаги ERR и ESOF…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Флоаты в STM32F303

Сообщение VladislavS »

Ничем они не отличаются вообще. Под спойлером кусочек кода, в котором отражена вся разница в реализации USB на шести семействах (те что не OTG). Всё запускается влёт, даже скучно как-то.
СпойлерИзображение
pma.png
(40.69 КБ) 152 скачивания
Кроме как nigger-code твои проблемы трудно объяснить.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Флоаты в STM32F303

Сообщение Eddy_Em »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4180509#p4180509"]Кроме как nigger-code твои проблемы трудно объяснить.[/uquote]
Эт точно. Только быдлокод один и тот же, но на F103 работает, а на F303 вызывает ERR…
ХЗ, копаюсь в этом Г дальше.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Ответить

Вернуться в «ARM»