eddy_em: (Костерок)
eddy_em ([personal profile] eddy_em) wrote2017-01-20 12:02 am

Решена проблема деления на STM32F042

В попытке выяснить, кто же виноват, и что с этим делать, я собрал в кучу заголовочные файлы от ST с инициализацией от opencm3 и сделал "безбиблиотечную" среду.
Для проверки деления набросал «мыргалку», которая либо равномерно мигает диодом с периодом 4 секунды (если надета перемычка между землей и PA12), либо морзянит "SOS".
arm-none-eabi-gcc, собираемый кроссдевом в генте на этом примере обломался: как только я снимал перемычку, микроконтроллер уходил в глубокие раздумья.

Гугол подсказал мне, что эта проблема возникала далеко не у меня одного. И решения ее стандартным gcc просто нет! Но есть пропатченные тулчейны. Отсюда я скачал тулчейн, распаковал директорию в /opt и попробовал.
Теперь в директории arm-none-eabi/lib/thumb появились раздельные библиотеки для разных архитектур ARM. Вот эта строчка Makefile
LDLIBS		+= $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
позволяет слинковаться с правильной библиотекой (v6-m/libgcc.a). В итоге деление работает без проблем!

Жаль, что в генте так плохо с разработкой под микроконтроллеры!

[identity profile] masterspammer.livejournal.com 2017-01-20 06:02 am (UTC)(link)
А что было? Компилятор родил неверный код?

[identity profile] eddy-em.livejournal.com 2017-01-20 06:08 am (UTC)(link)
Да, компилятор хоть и городил код для софтового деления (оказывается, M0 не умеет аппаратно делить целые числа), но на этом коде происходил затык (hardfault, наверное).

Вообще, надо gcc5 попробовать. Возможно, у него этого бага нет.

[identity profile] mbr.livejournal.com 2017-01-20 06:32 am (UTC)(link)
Там есть другие проблемы, более серьезные.

Вообще странно, потому как у меня 4.8 работает без проблем, был достаточно сложный дизайн, там всяко было деление. А есть подробная ссылка на issue?

[identity profile] eddy-em.livejournal.com 2017-01-20 06:43 am (UTC)(link)
Ты как собирал? Я простым crossdev -t arm-none-eabi. Версия arm-none-eabi-4.7.3, с 5.4.0 еще не пробовал. Возможно, там нет этого бага.

Уже и не помню, что там за функция вызывалась, что-то вроде __udiv_from_thumb. По ней гугол и выдал кучу матов народа, у которого деление вызывало hardfault.

Сейчас сравнить не могу: дома компилял.
Edited 2017-01-20 06:46 (UTC)

[identity profile] mbr.livejournal.com 2017-01-20 06:47 am (UTC)(link)
Я не собирал, я ж не гентушник :) Взял собранный arm-none-eabi в ppa.

Hardfault у меня в ртоси отслеживается и вываливает корку. Такого не было. Ты на 0 проверял? В аппаратном делении тоже hardfault при /0, там нужно предварительно пару флагов поставить, чтобы оно вызывало usage fault. Вот я подозреваю что там криво сделана эмуляция и всего то.

[identity profile] eddy-em.livejournal.com 2017-01-20 06:53 am (UTC)(link)
У тебя в /usr/arm-none-eabi/lib/thumb есть поддиректории под разные архитектуры? Вот в моей сборке они отсутствуют!
Кстати, в этом не сам gcc виноват, а newlib. У меня версия 2.0.0.

> Ты на 0 проверял?
Не проверял. Но, судя по дизассемблеру, ничего страшного быть не должно.

Обновил newlib до 2.5.0. Ничего не изменилось: железякозависимые версии библиотеки не собрались. В общем, этот crossdev хрень какую-то генерит!
Edited 2017-01-20 07:02 (UTC)

[identity profile] mbr.livejournal.com 2017-01-20 01:26 pm (UTC)(link)
> Не проверял. Но, судя по дизассемблеру, ничего страшного быть не должно.

Далпаеб. Там даже системный флаг есть, который по такому условию hard/usage fault делает. Возможно где-то могли и эмулировать.

[identity profile] balmerdx.livejournal.com 2017-01-20 07:06 am (UTC)(link)
Да, хотелось бы более подробного изложения причины падения.

[identity profile] balmerdx.livejournal.com 2017-01-20 07:10 am (UTC)(link)
Вечером ради интереса попробую деление на STM32F030.

[identity profile] eddy-em.livejournal.com 2017-01-20 07:12 am (UTC)(link)
Надо тоже к своей девборде ноги припаять, и на 030 основные эксперименты проводить. А то, боюсь, пока дойдет до серьезной разработки, я флеш в nucleo выжгу вусмерть! Там не так-то и много циклов перезаписи гарантируется (конечно, это не 100, как у STM8S003 — 100 циклов я за полчаса уничтожу — но и не миллиард...).

[identity profile] mbr.livejournal.com 2017-01-20 01:28 pm (UTC)(link)
Там же солюшн был:

> For a quick fix try adding --with-arch=cortex-m0 to GCC configure line.

Ты пробовал?

[identity profile] eddy-em.livejournal.com 2017-01-20 01:30 pm (UTC)(link)
Не пробовал: в ебилде gcc черт ногу сломит: там уйма внешних модулей вызывается.
Надо загуглить, как правильно gcc собирать с нестандартными ключами.

[identity profile] mbr.livejournal.com 2017-01-20 01:29 pm (UTC)(link)
У меня так:

-mcpu=cortex-m0 -mthumb -D__CORTEX_M0 -D__thumb2__=1 -mtune=cortex-m0

Все работает без проблем.

[identity profile] eddy-em.livejournal.com 2017-01-20 01:32 pm (UTC)(link)
Это — ключи, с которыми gcc вызывается. Они не помогут, если сам gcc криво собран.
Кстати, "-D__thumb2__=1" используется один-единственный раз (выбор типа инструкций в CMSIS), "-D__CORTEX_M0" — скорее всего для твоей собственной обвязки, "-mtune=cortex-m0" никакой роли не играет (абсолютно одинаковый выхлоп получается что с ним, что без него).

[identity profile] mbr.livejournal.com 2017-01-20 01:42 pm (UTC)(link)
Я не разбирался глубоко. Содрал с официальных самплов где-то. Оно just works.

[identity profile] balmerdx.livejournal.com 2017-01-20 11:06 pm (UTC)(link)
Попробовал, в arm-none-eabi нет такой проблемы. Деление корректно работает.

[identity profile] eddy-em.livejournal.com 2017-01-21 09:06 am (UTC)(link)
Гента? Какая версия gcc?

[identity profile] balmerdx.livejournal.com 2017-01-21 11:59 am (UTC)(link)
Стараюсь пользoваться mainstream решениями, поэтому Ubuntu. Впрочем под MacOs, где надо собирать arm-none-eabi все тоже самое.

gcc version 4.9.3 20150529

[identity profile] eddy-em.livejournal.com 2017-01-21 01:12 pm (UTC)(link)
Значит, проблема в гентовском crossdev.

К сожалению, кроме генты ничего приличного нет. Думал на кальку перейти, но там еще хуже — часть пакетов бинарных, устанавливаемых через ее менеджера, часть — гентовских, устанавливаемых портиджем. Остаюсь на генте, пока она не поцтеризуется — тогда, видимо, буду на BSD переходить.

[identity profile] balmerdx.livejournal.com 2017-01-21 03:42 pm (UTC)(link)
А почему не хочешь arm-none-eabi из исходников собрать?

[identity profile] eddy-em.livejournal.com 2017-01-21 04:42 pm (UTC)(link)
Да ладно: с армовского сайта бинарники скачал — работают. Нафиг.