Может, у меня что-то неправильное в опциях линкера?
Если убираю операции с флоатами - работает, как только добавляю - хардфолт еще до отправки тестового сообщения через USART!..
Добавлено after 29 minutes 2 seconds: Вместо hard написал: -mfloat-abi=soft и оно заработало. Но нафиг мне softfloat, если там аппаратный есть? Все-таки, не пойму никак, как мне аппаратные флоаты на F303 организовать?
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Откуда ж мне знать? В ld-скрипте все секции выравнены на 4.
Сделал выравнивание начала и конца всех секций на 8. Не помогло.
softfp, кстати, тоже не работает.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Ура! Нашел решение: в стартапе я в reset_handler готовлю данные, а потом сразу вызываю main(). А уже оттуда вызываю все настройки. И тут-то нежданчик: оказывается, gcc выталкивал на стек флоаты в main() еще до инициализации FPU. Перенес инициализацию в reset_handler - заработало.
Я пользуюсь IDE, отвали в туман! А вот gdb я не осилил, хоть в qt-creator есть даже "встроенная поддержка" его (правда, нафиг, если удобней в консоли?). Правда, не вижу вообще, чем бы мне в данной ситуации помог отладчик! Он бы мне сказал, что флоаты выкинуты в стек еще до инициализации FPU?
Цитата:
А можно узнать зачем применён оператор |= ? Ну мне так, чисто поржать.
"Все написали и я написал" ☺ Да, исправил на =.
Добавлено after 2 minutes 28 seconds: В общем, обработчик прерывания сброса у меня теперь вот такой:
/* FPU settings ----------*/ #if (__FPU_PRESENT == 1) SCB->CPACR = 0x0f << 20 ; /* set CP10 and CP11 Full Access */ nop(); __DSB(); __ISB(); #endif
// call main main();
// halt for(;;) {} }
Добавлено after 2 minutes 52 seconds: Теперь надо расширить свои сниппеты на вывод числа с плавающей точкой.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
в стартапе я в reset_handler готовлю данные, а потом сразу вызываю main(). А уже оттуда вызываю все настройки.
Сколько прошло с того времени как ты на SystemInit() выступал? Ну так получай, фашист, гранату. Нормальные люди вызывают SystemInit(), инициализируют в нём периферию, затем инициализируют сегменты данных и только потом в main идут. Причём, компилятор это всё заинлайнит сам и вызовов не будет.
В общем, обработчик прерывания сброса у меня теперь вот такой:
Дичь какая-то...
Код:
SCB->CCR |= 0x00000200;
Если хотя бы краем глаза заглянуть в Cortex-M4F Programmming Mnual, то обнаружится, что значение по ресету там как раз 0x00000200. Да даже просто в отладчике это видно.
Код:
SCB->CPACR = 0x0f << 20 ; /* set CP10 and CP11 Full Access */ nop(); __DSB(); __ISB();
Я знаю кунг-фу, карате, джиу-джитсу и ещё много страшных слов. Нафига последние три команды тут? Ты хоть представляешь что они делают?
Код:
for(;;) {}
Ты из main возвращаться решил? Зачем тогда говорил, что noreturn?
Нафига последние три команды тут? Ты хоть представляешь что они делают?
Везде пишут, что синхронизация нужна, а то мало ли что-то зафигачится в стек…
Добавлено after 1 minute 29 seconds: А еще у F303 есть 8кБ "особой" оперативки. Надо посмотреть, как люди ею пользуются — вдруг пригодится… Хотя, конечно, заполнить 40кБ оперативы — постараться надо, разве что с экранными буферами работать.
Добавлено after 2 minutes 28 seconds: Я и вывод флоата в строку уже написал!.. Можно пользоваться. Упс, там малость мусора осталось…
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Везде пишут, что синхронизация нужна, а то мало ли что-то зафигачится в стек…
Что плохого, если что-то, как ты говоришь, "зафигачится" в стек? До разрешения доступа к FPU туда могло уже столько всего "зафигачиться"... Ты всего лишь должен гарантировать отсутствие доступа к FPU до его разрешения. Откуда такой доступ может взяться? Первое - длина конвейера. Ну, при его размере в Cortex-M4F об этом даже говорить смешно. Второе - шалости оптимизатора компилятора. Они тоже не безграничны. Перенеси команду перед инициализацией сегментов данных и периферии. Ни один оптимизатор не вырвется за поток доступа к volatile сущностям, содержащимся в этом коде.
А еще у F303 есть 8кБ "особой" оперативки. Надо посмотреть, как люди ею пользуются — вдруг пригодится…
Самое простое - стек туда. Похоже, ты впервые с разными банками памяти сталкиваешься? На будущее - они могут быть, вообще говоря, выключеными и/или несконфигурированными. Код инициализации сегментов данных или переноса стека должен быть после их включения. Вызов SystemInit() делают в самом начале. Да даже просто тупить в циклах инициализации памяти на 16 МГц с выключенными кэшами и предвыборкой flash - банальная трата времени.
Сделал выравнивание начала и конца всех секций на 8. Не помогло.
С тем же успехом можно было протереть экран монитора.... Вопрос был не про "выравнивание секций", а про выровненность SP во всех функциях, где идёт работа с float.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Reflector, черт! Спасибо, вот это я лоханулся… FIX:
Код:
if(x > 0.) while(x < 1.){ ...
Добавлено after 1 hour 29 minutes 54 seconds: Кстати, зачем выравнивать стек на 8 байт, если флоаты 4-байтные?
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
И какое отношение это имеет к float? Где тут float-ы? double - вижу, float - нет.
Тссс!!! Он сейчас найдёт в GCC -fsingle-precision-constant и скажет, что double только в анале видел
Если честно, то я сомневаюсь в необходимости выравнивания стека по 8 байт. Можете примеры с проблемой привести? Да и не знаю я такого механизма для локальных автоматических переменных.
Если честно, то я сомневаюсь в необходимости выравнивания стека по 8 байт. Можете примеры с проблемой привести? Да и не знаю я такого механизма для локальных автоматических переменных.
Если сомневаетесь - сделайте невыровненным и попробуйте активно поработать. Я точно не помню где именно причина (возможно - внутри _Printf()), но она точно есть. Достаточно полистать сообщения на многих форумах, например electronix-е. Многие наступали на эти грабли.
Он сейчас найдёт в GCC -fsingle-precision-constant и скажет, что double только в анале видел
О, ты прямо за меня можешь говорить! Я действительно этот ключ использую. А как же без него?
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Например вот: https://electronix.ru/forum/index.php?a ... nt-1474218 Даже если в коде вообще нет использования float/double, но CPU имеет FPU, то выравнивание на 8 всё равно крайне рекомендуется. Так как иногда компилятор может проводить оптимизацию копирований некоторых объектов память->память с использованием регистров FPU. Молча их использует. Сталкивался с таким у IAR. Даже где-то на форумах описывал эту ситуацию (с приведением примера проекта). Насколько помню: IAR такое может проделывать при копировании структур (оператором присваивания) размером >=8 байт.
Если сомневаетесь - сделайте невыровненным и попробуйте активно поработать.
Что вы под этим понимаете? Ну расположил я стек где-то в памяти по адресу кратному хоть 1МБ, его top записал в SP и что дальше? Дальше он мне не принадлежит, им рулит компилятор.
Достаточно полистать сообщения на многих форумах, например electronix-е. Многие наступали на эти грабли.
На форумах и не такое увидишь, достаточно эту тему перечитать с начала.
И ещё раз вопрос, как мне повлиять на это самое "выравнивание стека на 8"? Данные (по крайней мере статические) расположить в памяти я могу с выравниванием, сам стек (он по сути тоже данные) тоже могу. Стеки задач во всяких RTOS-ах тоже. А дальше, когда пойдут вызовы функций и прерываний, которые обрабатывает компилятор без моего участия? Если это действительно важно, то компилятор с ключом -mfloat-abi=hard должен сам это делать. Как ещё я могу повлиять на этот процесс?
Так как иногда компилятор может проводить оптимизацию копирований некоторых объектов память->память с использованием регистров FPU. Молча их использует.
Да и хрен бы с ним, пусть использует до тех пор пока это не RTOS без сохранения FPU при переключении задачи. Какая мне разница будет там в асме R0, S0 или D0?
Помню когда AVI-crak форматирование для float написал я с ходу две ошибки нашел,
Хорошая память. Но я решил окончательно забить на "образцовый" выхлоп, в угоду упрощения и скорости. Получилось как-то так: https://github.com/AVI-crak/Rtos_cortex ... r/sPrint.c Время в тиках мк на преобразование чисел, без учёта физики.
Сравнение с оптимизированным и значительно ускоренным вариантом printf https://github.com/mpaland/printf. Сравнивать с официальным вариантом из GCC - не очень корректно, там разница просто космическая получается.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения