[uquote="jcxz",url="/forum/viewtopic.php?p=4180122#p4180122"]Тогда зачем IAR стек в функциях выравнивает? Просто так? [/uquote]
ARM много чего рекомендует и запрещает, например, у M0 есть инструкция DMB которая не делает ничего, но ARM все равно рекомендует ее использовать. Примерно то же и с выравниванием на 8, оно нужно только когда при прерываниях сохраняются регистры FP, но в этом случае такое выравнивание включается автоматически, независимо от настроек. В документации даже картинка есть и псевдокод:
[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]Это точно! Когда видишь такое, как выше....
jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180176#p4180176"]jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?[/uquote]Подсмотреть как делает printf()? Не?
Например по школьной формуле:
a = 2; c = 10; b = число.
Не знаю как лучше, но деление в цикле явно самый провальный вариант. Например для 3.40282346639e+38 накопится значительная ошибка. А для чисел ниже 1.00000011116e-06 ошибку будет видно сразу.
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 цифрами после точки:
Добавлено after 2 minutes 43 seconds:
У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит.
Ищу, где ж я накосячил.
Причем, здесь практически полностью USB можно с F103 содрать за исключением имени обработчика прерывания.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]проверил сразу[/url] несколько разных чисел.[/uquote]
Точность выше всяких похвал получилась, у себя делю минимальные 1.1754943E-38 на 2 и получаю 0, а у тебя делю на миллион и получаю 11.2104E-45 Осталось бесконечность починить, на ней тоже виснет
[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]Чтобы проверить, надо немного голову задействовать.
Проверяют на критичных (граничных) условиях, а не на каких попало. Критичные условия будут на таких числах, на которых ошибка округления скажется. А ваша "проверка" - профанация. В утиль.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4180218#p4180218"]У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит.
Ищу, где ж я накосячил.[/uquote]Осталось конфигурацию ног проверить.
VladislavS, В точку! Я пошел погулять (благо, у нас тут вероятность во время прогулки людей встретить очень низкая, а то в каком-нибудь говногороде я со своей короной сидел бы дома круглосуточно!), стал обдумывать - и вспомнил, что ноги не настроил на альтернативную функцию!
Вот все-таки не понимаю инженеров ST: они взяли вроде бы лучшее от STM32F0 и засунули в 303. Но USB оставили тот самый убогий, который у F103. Ну, благо, хоть CAN и USB одновременно работать могут (я, кстати, глянул внимательно даташит: у B и C 512 байт буфера USB не делятся с CAN - и на том спасибо).
Но, блин, нет HSI48 и внутренней подтяжки — вот что за ë-моë?!
Да и эти убогие регистры USB'шные, где часть флагов set/reset, а часть — toggle! Это ж что они там курили-то? Но, видать, т.к. решили оставить наследие (чтобы не переписывать USB), в более поздних моделях те же самые косяки оставили. Мудаки, блин!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[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]Сделаем маленький тест:
Функции LogCR0() имеют printf()-подобный интерфейс вызова (изнутри вызывают библиотечную _Printf()) и печатают в поток отладочного вывода.
Результат работы Zf2((double *)t.y) (напечатанный результат):
Вывод: Выравнивание SP на 8 необходимо! А не просто рекомендуемо. Как минимум - если используются функции стандартной си-библиотеки (семейство ...printf() и т.п.). И IAR не просто так выравнивает стек во всех функциях, из которых вызываются другие.
Последний раз редактировалось jcxz Вс фев 13, 2022 18:57:47, всего редактировалось 1 раз.
[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]
А если написать:
И… Фигвам! Все равно вместо usb_lp_isr срабатывает прерывание usb_lp_can1_rx0_isr! Вот что за труляля?!!
А ведь, судя по даташиту, должно работать! Иначе как я разделю прерывания для USB и CAN?
Судя по тому, что после установки этот бит отсутствует, китайцы продали какой-то очень странный чип, выдающий себя за F303, но таковым не являющийся!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Reflector, да что ж такое! Я уже в который раз на этом попадаюсь!..
Кстати, в F0x2 не нужно было альтернативные функции на ноги включать, да и тактирование SYSCFG тоже… В общем F303 — это просто жесть какая-то!..
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Эх, не выходит цветочек каменный: не подошел код от F103 — не проходит энумерация… Чую, что что-то не так с этими дебильными обращениями к памяти (где-то нужно их к uint16_t приводить, где-то — к uint8_t…)
Придется сравнивать мануалы на F103 и F303. А в апноуте по миграции с F103 на F303 ни хрена про USB не сказано ☹
Но оно даже до стадии USB_ISTR_CTR не доходит! В ISTR постоянно флаги ERR и ESOF…
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Ничем они не отличаются вообще. Под спойлером кусочек кода, в котором отражена вся разница в реализации USB на шести семействах (те что не OTG). Всё запускается влёт, даже скучно как-то.
Спойлер
[uquote="VladislavS",url="/forum/viewtopic.php?p=4180509#p4180509"]Кроме как nigger-code твои проблемы трудно объяснить.[/uquote]
Эт точно. Только быдлокод один и тот же, но на F103 работает, а на F303 вызывает ERR…
ХЗ, копаюсь в этом Г дальше.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ