Тогда зачем IAR стек в функциях выравнивает? Просто так?
ARM много чего рекомендует и запрещает, например, у M0 есть инструкция DMB которая не делает ничего, но ARM все равно рекомендует ее использовать. Примерно то же и с выравниванием на 8, оно нужно только когда при прерываниях сохраняются регистры FP, но в этом случае такое выравнивание включается автоматически, независимо от настроек. В документации даже картинка есть и псевдокод:
jcxz, а у тебя есть лучше вариант, как легко и просто получить десятичную степень флоата?
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Не знаю как лучше, но деление в цикле явно самый провальный вариант. Например для 3.40282346639e+38 накопится значительная ошибка. А для чисел ниже 1.00000011116e-06 ошибку будет видно сразу. Eddy_Em - чем таблицы не угодили?
Добавлено after 2 minutes 43 seconds: У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит. Ищу, где ж я накосячил. Причем, здесь практически полностью USB можно с F103 содрать за исключением имени обработчика прерывания.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Точность выше всяких похвал получилась, у себя делю минимальные 1.1754943E-38 на 2 и получаю 0, а у тебя делю на миллион и получаю 11.2104E-45 Осталось бесконечность починить, на ней тоже виснет
Чтобы проверить, надо немного голову задействовать. Проверяют на критичных (граничных) условиях, а не на каких попало. Критичные условия будут на таких числах, на которых ошибка округления скажется. А ваша "проверка" - профанация. В утиль.
У меня сейчас другая беда: USB настраиваю (в тактировании проверил - PLL делится на 1.5 для USB), активирую подтяжку - и тишина. В прерывание не входит. Ищу, где ж я накосячил.
VladislavS, В точку! Я пошел погулять (благо, у нас тут вероятность во время прогулки людей встретить очень низкая, а то в каком-нибудь говногороде я со своей короной сидел бы дома круглосуточно!), стал обдумывать - и вспомнил, что ноги не настроил на альтернативную функцию!
Вот все-таки не понимаю инженеров ST: они взяли вроде бы лучшее от STM32F0 и засунули в 303. Но USB оставили тот самый убогий, который у F103. Ну, благо, хоть CAN и USB одновременно работать могут (я, кстати, глянул внимательно даташит: у B и C 512 байт буфера USB не делятся с CAN - и на том спасибо). Но, блин, нет HSI48 и внутренней подтяжки — вот что за ë-моë?! Да и эти убогие регистры USB'шные, где часть флагов set/reset, а часть — toggle! Это ж что они там курили-то? Но, видать, т.к. решили оставить наследие (чтобы не переписывать USB), в более поздних моделях те же самые косяки оставили. Мудаки, блин!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Тогда зачем IAR стек в функциях выравнивает? Просто так?
ARM много чего рекомендует и запрещает, например, у M0 есть инструкция DMB которая не делает ничего, но ARM все равно рекомендует ее использовать. Примерно то же и с выравниванием на 8, оно нужно только когда при прерываниях сохраняются регистры FP
Функции LogCR0() имеют printf()-подобный интерфейс вызова (изнутри вызывают библиотечную _Printf()) и печатают в поток отладочного вывода. Результат работы Zf2((double *)t.y) (напечатанный результат):
Вывод: Выравнивание SP на 8 необходимо! А не просто рекомендуемо. Как минимум - если используются функции стандартной си-библиотеки (семейство ...printf() и т.п.). И IAR не просто так выравнивает стек во всех функциях, из которых вызываются другие.
Последний раз редактировалось jcxz Вс фев 13, 2022 18:57:47, всего редактировалось 1 раз.
Да, стандартная функция numeric_limits<float>::min() ввела меня в заблуждение поскольку выдает минимум для нормализованных чисел, однако аппаратно кортексы только их и поддерживают(denormalized numbers are flushed to 0 before floating-point operations), видимо потому моя функция 0 и выдает...
И… Фигвам! Все равно вместо 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). Всё запускается влёт, даже скучно как-то. Спойлер
Кроме как nigger-code твои проблемы трудно объяснить.
Эт точно. Только быдлокод один и тот же, но на F103 работает, а на F303 вызывает ERR… ХЗ, копаюсь в этом Г дальше.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения