eddy_em: (Костерок)
eddy_em ([personal profile] eddy_em) wrote2017-01-15 05:44 pm

Мистика…

Уже полдня бьюсь с АЦП через ПДП. На стадии вывода значений возникают непонятные зависания. Что только не делал. И вдруг: бамц, озарение! Если убрать математические операции (деление, умножение, взятие остатка), никакого зависания нет. А как только я пытаюсь отобразить значение, вылезает ошибка.

То ли микроконтроллер дохлый, то ли какая-то хитрость есть в том, чтобы STM32F042 научить целочисленной арифметике кроме сложения и вычитания...

[identity profile] alex-avr2.livejournal.com 2017-01-15 03:07 pm (UTC)(link)
Нечего пенять на микроконтроллер когда у самого говнокод!!!!

[identity profile] eddy-em.livejournal.com 2017-01-15 04:22 pm (UTC)(link)
При чем здесь говнокод, когда явно проблема в операции софтового деления?

Ищу нормальные алгоритмы.

[identity profile] alex-avr2.livejournal.com 2017-01-15 04:25 pm (UTC)(link)
Нифига не явно.
Очень часто одно тянет другое очень косвенно.

[identity profile] hrun-morjov.livejournal.com 2017-01-15 03:07 pm (UTC)(link)
не в китае купленный кирпич? Бо были разговоры, что они с заводов брак тащат с слабопрогнозируемыми глюками

[identity profile] eddy-em.livejournal.com 2017-01-15 04:23 pm (UTC)(link)
Нет, честный "nucleo". Дорогущий, зараза!

Но я, конечно, не ожидал, что у cortex-M0 нет аппаратной операции целочисленного деления. Блин...

[identity profile] electrodyssey.livejournal.com 2017-01-15 04:39 pm (UTC)(link)
Может переполнение где-нибудь, или похожая бяка?

[identity profile] mbr.livejournal.com 2017-01-15 05:14 pm (UTC)(link)
Там не только софтового деления нет. Там всего-то два десятка инструкций оставили. Очень кастрированное ядро. Поэтому не удивляйся, что оно будет тормозить после F1.

[identity profile] mbr.livejournal.com 2017-01-15 05:12 pm (UTC)(link)
у F0 софтовое деление. Оно крайне тормозное. Ты уверен, что бизнес-логика не ломается? Т.е. сначала набирать буфер в прерываниях/дма, а потом делать математику скопом в основном контексте?

Я сталкивался с багом софтового деления у фрискейла - при использовании операции деления в коротких прерываниях возможно undefined behaviour. Глянь в еррату, может есть что похожее.

[identity profile] eddy-em.livejournal.com 2017-01-15 05:35 pm (UTC)(link)
Я нашел рабочий алгоритм деления с остатком, его и буду использовать, раз "готовое" не работает.

Для БТА я вообще не буду в код вставлять деление/умножение — буду пересылать калибровочные значения и "сырые" данные АЦП, а "апельсинка" пусть вычисляет.

Да уж, что-то не ожидал я, что ядро M0 настолько кастрированное. Даже STM8 со своими жуткими восьмибитными инструкциями мне такой заподлянки не выкручивал: sdcc нормально реализует софтовое деление для длинных чисел.

Скорее всего, здесь облом в opencm3. Нужно либо под себя все переделать, чтобы только заголовочные файлы использовать (а библиотеку брать от gcc), либо смириться. Выбираю второе.

[identity profile] alex-avr2.livejournal.com 2017-01-15 06:12 pm (UTC)(link)
Интересно, почему у меня десятки прошивок под F0 с тысячами операций делений в совершенно разном контексте и никогда с этим проблем не было?
Уверен, что у тебя косяк не в как таковом делении, а в чем-то другом. И даже если ты его сейчас замаскируешь костылями - он с большой вероятностью потом все равно всплывет.

Одно из основных правил качественной разработки - если что-то глючит, то разобраться, почему именно оно так происходит.

[identity profile] eddy-em.livejournal.com 2017-01-15 06:52 pm (UTC)(link)
Дык, причина очевидна — старый opencm3. На новый переходить не собираюсь (смена API), а свое собственное еще долго клепать буду. Поэтому буду велосипеды костылями подпирать, а релизы вообще без деления делать.

[identity profile] alex-avr2.livejournal.com 2017-01-15 06:56 pm (UTC)(link)
А при чем тут вообще opencm3 О_О
И нахрена оно нужно? Ты бы еще под SPL писал бы..

А пеняет еще на микроконтроллер...

[identity profile] eddy-em.livejournal.com 2017-01-15 07:02 pm (UTC)(link)
При том, что с нуля писать все дефайны я не собираюсь.

[identity profile] alex-avr2.livejournal.com 2017-01-15 07:13 pm (UTC)(link)
А зачем писать все дефайны, если они все давно написаны в цмсисе?

[identity profile] eddy-em.livejournal.com 2017-01-15 07:22 pm (UTC)(link)
Я не видел в цмсисе ничего, что позволит мне написать
DMA1_CCR5 |= DMA_CCR_MINC | DMA_CCR_TCIE | DMA_CCR_EN;

CMSIS - он только для всего семейства общее содержит, а уже конкретно для STM32 нужно где-то брать заголовки.

[identity profile] alex-avr2.livejournal.com 2017-01-15 07:31 pm (UTC)(link)
Ты какую-то хрень пишешь.
Те дефайны что ты написал это и есть цмсис. к опенцм3 вообще никакого отношения не имеет.

http://www.keil.com/dd/docs/arm/st/stm32f0xx/stm32f0xx.h

[identity profile] eddy-em.livejournal.com 2017-01-15 07:43 pm (UTC)(link)
Это — не cmsis, это инклюд от ST.
У меня в сниппетах такой есть в CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h. Но в нем мне не нравится, что описания регистров через структуры делаются. В opencm3 удобней.

Найти бы где готовый пример, чтобы проверить... Я те же сниппеты без мучений в течение 4-8 часов не соберу: там Makefile отсутствует. Поди-ка собери все, что там им нужно...

Где бы нормальный Makefile взять, чтобы скомпилировать примеры вообще безо всяких левых библиотек и стартап-файлов?

[identity profile] alex-avr2.livejournal.com 2017-01-15 07:47 pm (UTC)(link)
Это — не cmsis, это инклюд от ST.
Тут ты формально прав, да, это надо было мне уточнить. Но так сложилось, что все давно это называют цмсисом и не парятся :)

>>не нравится, что описания регистров через структуры делаются

И в чем же плюсы такого? Структуры - наоборот удобно.

>>Makefile отсутствует.

а нефиг говносредами пользоваться.
Я вот одну кнопочку нажимаю и все готово.

[identity profile] eddy-em.livejournal.com 2017-01-15 07:50 pm (UTC)(link)
> Структуры - наоборот удобно.
Ну, учитывая то, что gcc в отличие от sdcc умеет оптимизировать, то действительно, все равно.

> а нефиг говносредами пользоваться.
Я как раз говносредами не пользуюсь. У меня IDE geany и компилятор gcc.

> Я вот одну кнопочку нажимаю и все готово.
Мне больше нравится видеть всю информацию в консоли, поэтому хоть и могу на хоткеи все повесить, лучше набрать make, посмотреть выхлоп, а затем уже make flash.

[identity profile] alex-avr2.livejournal.com 2017-01-15 07:53 pm (UTC)(link)
А я нажимаю кнопочку тоже весь выхлоп вижу :)

[identity profile] eddy-em.livejournal.com 2017-01-15 07:58 pm (UTC)(link)
Меня от мастдайки в частности и от проприетарщины вообще так воротит, что я лучше сменю сферу деятельности, чем буду в этом говне копаться!

[identity profile] alex-avr2.livejournal.com 2017-01-15 08:01 pm (UTC)(link)
Ну тогда учачи с копанием в своем говне :)))

[identity profile] eddy-em.livejournal.com 2017-01-15 08:38 pm (UTC)(link)
Попробую без opencm3 сделать blink и воткнуть туда деление. Если будет работать, так и буду продолжать.
Непонятно только, как туда usb и (в случае необходимости) lwip прикручивать: в opencm3-то все сделано единым массивом, никаких лишних движений не нужно делать.

[identity profile] alex-avr2.livejournal.com 2017-01-15 08:42 pm (UTC)(link)
Удачи :)

С usb/ethernet/sdio (и может еще парой сложных блоков) - да, без готовых решений довольно заморочно вручную писать, это минус. Все остальное пишется влет на регистрах без заморочек.

[identity profile] simsun.livejournal.com 2017-01-15 07:50 pm (UTC)(link)
О!
я тоже этот вот .h подпихиваю в GCC из cmd
из него уже stm32f030x6.h подставляется

[identity profile] eddy-em.livejournal.com 2017-01-15 07:51 pm (UTC)(link)
Makefile'ом не поделишься?

[identity profile] simsun.livejournal.com 2017-01-15 09:17 pm (UTC)(link)
ума не приложу что там можно полезного увидеть в моём исполнении, для одного файла наверно и скрипта хватило. Да ещё и для win,кстати, но мне не жалко :)))

ps не скажу, что помню откуда и для чего часть ключей GCC :)
-D STM32F030x4 - откуда то из прошлого там например

[identity profile] eddy-em.livejournal.com 2017-01-15 09:23 pm (UTC)(link)
Да я вот думаю на F0 полностью на сниппеты перейти. А там ld-файлов нет, да и вообще как-то странно заковыряно.
Ладно, буду разбираться как-нибудь в другое время.