LINUX.ORG.RU
ФорумTalks

Ну почему ардуинщики такие криворукие?

 , ,


1

6

По роду деятельности я сейчас программист-ембеддер (по голому железу). До этого много лет был программистом сетевых сервисов. А перед этим пилил десктопный софт на Делфях. Но никогда, ни в одной из этих областей не видел такого количества идиотии, олигофрении, и кретинизма, как в высерах ардуинщиков.

Каждая первая поделка на гитхабе если и работает, то не благодаря стараниям ардуинщика, а вопреки им.

Чтобы не быть голословным. Классика! Ардуинщик обнуляет биты в регистре:

TCCRn |= (0<<CS02)|(0<<CS01)|(0<<CS00);
В данном случае придурку просто повезло, что от содержимого TCCRn ничего не зависит в дальнейшем.

Второй показательный пример, ардуинщик пишет обертку над чужой либой:

int Serial::available(void)
{
	return (unsigned int)(UART_RX_BUFFER_SIZE + UART_RxHead - UART_RxTail) % UART_RX_BUFFER_SIZE;
}

int Serial::read(void)
{
	UART_Receive_Byte(); // возвращает uint8_t
}
Два соседних метода просто гениальны. Вообще непонятно, он свою поделку запускал хоть раз?

Затянуть на восьмибитный кристалл FPU-рантайм безо всякой надобности? Да проще простого!

float Voltage=ADC/1024*1.1/DIVIDER;
...
if(Voltage < 10.5) {
  ...
}
// больше Voltage нигде не упоминается
Потом стонут, что их мигалка светодиодами в 32 килобайта не влезает.

Тут вообще непонятно, о чем в этот момент думал очередной дятел:

USICR = (2<<USIWM0);
Причем оно у него заработало! Но только потому, что бит в этом месте нужно было двинуть на одну позицию левее, чем USIWM0 (для чего объявлен в хидерах и описан в даташите USIWM1). Лишнее подтверждение работы вопреки стараниям кривых рученок.

Про такие мелочи, как запись в регистры битовых констант без сдвига, битовых констант от других регистров, магических хексов вместо битовых констант, и говорить нечего, это просто повально.

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

И вся эта пакость расползается по интернету, торчит на каждой ардуинопомойке, копипастится из проекта в проект. Жуть.

Ардуинщиков — в биореактор.



Последнее исправление: quwy (всего исправлений: 5)

А откуда примеры кода? Из поделок пользователей или из библиотек? Если второе, то из левых или из официальной?

Werenter ★★☆
()
Последнее исправление: Werenter (всего исправлений: 1)

Ага, вот ток когда я с нуля без ссаного глючного жирного HAL написал фреймворк для работы с STM с вот таким кодом:

enum lep32_rcc_csr {
    LEP32_RCC_CSR_LSI_ENABLE         = (0x00000001),
    LEP32_RCC_CSR_LSI_READY          = (0x00000002),
    LEP32_RCC_CSR_REMOVE_RESET       = (0x01000000),
    LEP32_RCC_CSR_PIN_RESET          = (0x04000000),
    LEP32_RCC_CSR_PORPDR_RESET       = (0x08000000),
    LEP32_RCC_CSR_SOFTWARE_RESET     = (0x10000000),
    LEP32_RCC_CSR_WATCHDOG_IND_RESET = (0x20000000),
    LEP32_RCC_CSR_WATCHDOG_WIN_RESET = (0x40000000),
    LEP32_RCC_CSR_LOWPOWER_RESET     = (0x80000000)
};
...
static inline void lep32_gpio_setvcc(lep32_gpio_t * gpio, u16 pins) {
    lep32_gpio_setmode(gpio, pins, 
        LEP32_GPIO_CTRL_O_PUSHPULL, LEP32_GPIO_SPEED_2MHz);
    gpio->bset |= pins;
}

static inline void lep32_gpio_setgnd(lep32_gpio_t * gpio, u16 pins) {
    lep32_gpio_setmode(gpio, pins, 
        LEP32_GPIO_CTRL_O_PUSHPULL, LEP32_GPIO_SPEED_2MHz);
    gpio->breset2 = pins;
}

static inline void lep32_gpio_sethiz(lep32_gpio_t * gpio, u16 pins) {
    lep32_gpio_setmode(gpio, pins, 
        LEP32_GPIO_CTRL_I_HIZ, LEP32_GPIO_SPEED_NONE);
}

static inline void lep32_led(lep32_led_t * led, lep32_led_state_t state) {
    if (state) {
        lep32_gpio_setvcc(led->vcc.io, 1 << led->vcc.pin);
        lep32_gpio_setgnd(led->gnd.io, 1 << led->gnd.pin); 
    } else {
        lep32_gpio_sethiz(led->vcc.io, 1 << led->vcc.pin);
        lep32_gpio_sethiz(led->gnd.io, 1 << led->gnd.pin);
    }
}

На меня налетели те самые «великие инженеры STM, которые писали под микроконтроллеры когда меня еще в проекте не было», обосрали код, потому что он, видите ли, скрывает циферки! А они всегда знают какой адрес у всех регистров и им константы не нужны.

Поэтому пусть бамбука сходят покурить.

PPP328 ★★★★★
()

А зачем эта ваша ардуина вообще нужна если стартовый комплект 85 ойро? Порночайник сделать как то дороговато

DumLemming ★★★
()

Все примеры говнокода гениальны, спасибо ТСу за подборку.

wandrien ★★
()

Ардуинщиков — в биореактор.

ЧСВ так и прёт. Сам-то забыл, как сам был нубом и писал небось говнокод похлеще?

Ардуино распиарено и легко доступно - купил и можешь говнокодить. Или ты решил, что профи не становятся, а ими рождаются? Так вот я тебя огорчу - все когда-то начинают с нуля и пишут полнейшую чушь. А ты, вместо того, чтоб писать что-то полезное в сети, например, статьи на тему «Как правильно программировать под ардуино», пытаешься стебаться.

u5er ★★
()
Ответ на: комментарий от wandrien

А кто его слушает, этот компилятор?

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

soomrack ★★★★★
()

По роду деятельности я сейчас программист-ембеддер (по голому железу). До этого много лет был программистом сетевых сервисов. А перед этим пилил десктопный софт на Делфях.

Что из этого тебя заставило так возгордиться, что ты решил попрыгать на новичках и притащить их на форум?

HerbertHoover
()
Ответ на: комментарий от soomrack

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

Да, пример с USICR = (2<<USIWM0); это красиво иллюстрирует )

wandrien ★★
()
Ответ на: комментарий от wandrien

Компилятор очевидно выдал варнинг, а код скорее всего получился рабочий т.к. return value из UART_Receive_Byte пробросилось наружу. Вот и не стали ничего исправлять. Я такой подход не одобряю и всегда компилирую всё с -Werror если что, но подобная конструкция реально будет скорее работать чем не работать.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

но подобная конструкция реально будет скорее работать чем не работать.

Если у фунций разный тип возвращаемого значения – может и не работать. Если брать cdecl ABI на IA-32, то float vs int или int32_t vs int64_t.

wandrien ★★
()

В ардуину идут либо железячники, часть из которых вообще ни разу не программисты совсем (наговнокодил – проверил, что железка заработала – норм, в продакшон!!!), либо новички, которые пока ничего не умеют. Отсюда и результат. Набравшись опыта люди оттуда валят.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от etwrq

Напишите конвертер и вперед. Паять матрицы ледов только долго. Но можно купить led-панельки, но шарм теряется.

PPP328 ★★★★★
()
Ответ на: комментарий от u5er

Сам-то забыл, как сам был нубом и писал небось говнокод похлеще?

Не забыл, но я его на общее обозрение с гордостью не выкладывал.

Ардуино распиарено и легко доступно - купил и можешь говнокодить

Делфя в свое время – аналогично, но такого трешака не было. Не знаю, может в пайтонах и жабаскриптах сейчас так же, не совался.

quwy
() автор топика
Ответ на: комментарий от PPP328

просто видел на балконах уже, шторки которые рисуют осмысленные предложения/картинки.

etwrq ★★★★★
()
Ответ на: комментарий от Werenter

Из поделок пользователей

Из поделок, конечно. Речь про типичного пользователя платформы, а не про ее разработчиков.

Хотя, в ардуиновские либы я не заглядывал, вполне может оказаться, что там то же самое.

quwy
() автор топика

Потому что Ардуино — такое, мать его, Ардуино.

sparkie ★★★★★
()

TCCRn |= (0<<CS02)|(0<<CS01)|(0<<CS00);

Настоящий ардуинщик возьмёт либу для таймеров, а не вот это вот :)

ip ★★★★
()
Ответ на: комментарий от wandrien

И компилятор промолчал?

@soomrack правильно написал: кто его слушает?

У ардуинщика все просто, если код собрался в бинарь (пусть с миллионом хинтов и ворнингов), то значит все написано правильно.

quwy
() автор топика
Ответ на: комментарий от HerbertHoover

Что из этого тебя заставило так возгордиться

Кто тут возгордился? Я всего лишь написал, что в перечисленных отраслях никогда не видел такой тупизны.

попрыгать на новичках и притащить их на форум?

Нормальные новички вопросы задают и тихо пилят свои поделки, а не «либы» на гитхаб выкладывают. Это, как говорили в моей юности, уже не чайники, а ламера.

quwy
() автор топика

потому что это платформа для любительства и обучения

// кэп

навскидку, больше похоже на невнимательность, такие проблемы лучше всего решает среда разработки, просто у ардуинщиков еще нет своей жидеи

Syncro ★★★★★
()
Последнее исправление: Syncro (всего исправлений: 1)
Ответ на: комментарий от ip

Настоящий ардуинщик возьмёт либу для таймеров, а не вот это вот :)

Три раза ХА!

Настоящий ардуинщик возьмет первое что в интернете нашел, ибо про либу таймеров еще знать надо, документацию читать.

Дикая смесь использования ардуиновского «API» и прямого обращения к ресурсам контроллера – в порядке вещей.

quwy
() автор топика
Ответ на: комментарий от firkax

но подобная конструкция реально будет скорее работать чем не работать

Там типы разные. UART_Receive_Byte возвращает uint8_t, а обертка зачем-то 16-битный int. В итоге младший байт результата [скорее всего] будет правильный, а старший – от балды.

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

quwy
() автор топика

Ты во многом прав, но совершенно зря порвался.

Впрочем, это типично.

А ответ на сабжевой вопрос очевиден: потому что не программисты вовсе, и кроме клинических случаев даже не претендуют.

token_polyak ★★★★★
()
Последнее исправление: token_polyak (всего исправлений: 3)
Ответ на: комментарий от Werenter

в си и всех его диалектах вообще мало какой-то культуры унификации, т.е. кто во что горазд, такой тулинг(часто коммерческий) или прием и заюзает

Syncro ★★★★★
()
Ответ на: комментарий от u5er

А ты, вместо того, чтоб писать что-то полезное в сети, например, статьи на тему «Как правильно программировать под ардуино», пытаешься стебаться.

А кто сказал, что не писал? Писал в свое время, кучу времени тратил. Работу прогуливал днями напролет, так хотел нести умное и вечное.

Вот только жизнь показала, что публиковать авторский контент на неподконтрольных ресурсах – очень плохая идея. Когда (не если, а именно когда) твои взгляды на жизнь и контент разойдутся с владельцами ресурса, придется уходить хлопнув дверью, и будет очень жалко потраченных сил.

А публиковать что-то в своем личном бложике на данном отрезке времени – это как в пустоту кричать, только боты тебя и услышат.

quwy
() автор топика

почему

Потому, что arduino создавался для «итальянских домохозяек»™, со стилем программирования аналогичным кулинарным рецептам приготовления пиццы :)

P.S. Для отсечения дилетантов используй недоступный для оных arduino-forth ©.

quickquest ★★★★★
()
Ответ на: комментарий от quwy

Может быть и так, но я не уверен. Асм код проверял? Компилятор часто, даже очень часто, по крайней мере на x86, генерирует такой код как будто вместо char/short возвращается int. Вызывающий код этот int обрезает назад до нужной битности, но даже если не обрезать то может всё обойтись.

firkax ★★★★★
()
Ответ на: комментарий от quwy

только боты тебя и услышат

Поисковые в том числе. Когда новичок будет искать в поисковике «Как сделать <что-то> на ардуино», то есть ненулевые шансы, что твои статьи попадут в поисковую выдачу.

u5er ★★
()
Ответ на: комментарий от firkax

Компилятор часто, даже очень часто, по крайней мере на x86, генерирует такой код как будто вместо char/short возвращается int. Вызывающий код этот int обрезает назад до нужной битности

С x86 понятно, там широкие регистры, а на 8-битках компилятор такие финты себе не позволяет, чрезмерно накладно будет.

Для возврата одного байта используется один регистр, для 16-битного инта – пара регистров. Мне сейчас лень проверять, но наверняка во втором случае используется и регистр из первого, что гарантирует веселый пердолинг.

quwy
() автор топика

Я долго смотрел на этот код:

int Serial::read(void)
{
	UART_Receive_Byte(); // возвращает uint8_t
}

и думал зачем там в конце ;, ведь нужно без него. А потом вспомнил что это не раст D:

cumvillain
()
Последнее исправление: cumvillain (всего исправлений: 2)

А перед этим пилил десктопный софт на Делфях.

Никогда не видел такого количества идиотии, олигофрении, и кретинизма, как в высерах ардуинщиков.

Странно. Ведь практически весь кривой и разваливающийся десктопный софт «на Делфях» в нулевых именно что содержал в себе огромное «количество идиотии, олигофрении, и кретинизма».

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от u5er

Поисковые в том числе

Немного отвлекусь от темы.

Не хочу расстраивать, но все давно намного хуже, чем привыкли думать ветераны. Нет больше вездесущих ботов гугла, которые рыщут по всем закоулкам интернета в поисках информации. Сегодня их нужно долго и упорно упрашивать, чтобы они заглянули к тебе на сайт и проиндексировали хотя бы десяток страниц. Если ты не мегапопулярный ресурс и у тебя тысяча страниц, то индексация всего контента может затянуться на месяцы.

Они начали жестко экономить ресурсы. Заметили, что теперь в гугловой выдаче нет версии из кеша? Это потому что теперь он не затягивает в индекс весь текст страницы. Вместо этого он хранит какой-то хитрый текстовый слепок, типа сжатого с потерями архива, по которому искать ключевики еще можно, а восстановить весь текст – уже нет. Все для минимизации размера индекса, и поэтому того былого оголтелого пожирания информации уже нет. В приоритете теперь только популярные сайты, раскрутить хомяка без миллиона баксов сегодня не выйдет.

Доходит до полного идиотизма, когда по фразе из трех слов, которая есть у тебя на сайте, находит все что угодно (включая страницы без единого слова из фразы), но не тебя. Или заталкивает на пятнадцатую страницу.

Короче, объективный поиск по хомякам и бложикам умер, остались только реддиты, хабры, и стековерфловы.

quwy
() автор топика
Ответ на: комментарий от quwy

Делфя в свое время – аналогично, но такого трешака не было

Было. И очень много.

skiminok1986 ★★★★★
()
Ответ на: комментарий от quwy

а не «либы» на гитхаб выкладывают

Ситуация буквально «Алло, не могу говорить @ Но ты сам позвонил»

buddhist ★★★★★
()
Ответ на: комментарий от quwy

Что на счёт видео на ютубе? Есть куча каналов, где авторы выкладывают обучающие видео и зачастую они прямо в поисковике и выдаются.

u5er ★★
()
Ответ на: комментарий от Morin

Точно? А если это запись какой-нибудь лекции в универе? С таким же успехом ты можешь заявить, что за лекции в универах сжигать надо на костре. Такое себе заявление, согласись?

u5er ★★
()
Ответ на: комментарий от quwy

Нет больше вездесущих ботов гугла,

У меня они постоянно лазят, и не только гугл но и яндекс и вроде бинг, при том что реальной посещаемости наоборот почти нет.

firkax ★★★★★
()

Эт вы ещё с пром. автоматизацией не сталкивались, имхо чистые автоматизаторы почти все такие. Что-то в духе i=0; if (i != 0) {... норм явление.

anc ★★★★★
()
Ответ на: комментарий от u5er

речь не о лекциях, а о сраной моде записать на видео 40 минут своего мычания, хотя смысла на десяток строк

Morin ★★★★
()
Ответ на: комментарий от u5er

Что на счёт видео на ютубе?

Как можно делать то, что сам категорически не потребляешь?

Да и с ютубом ровно та же проблема. Банят по жалобе первого встречного только так, с удалением залитого контента.

quwy
() автор топика
Ответ на: комментарий от quwy

А на лор постить? Тут бан с удалением не принят.

Werenter ★★☆
()
Ответ на: комментарий от quwy

Нормальные новички вопросы задают и тихо пилят свои поделки, а не «либы» на гитхаб выкладывают. Это, как говорили в моей юности, уже не чайники, а ламера.

Вы хоть помните отличие чайника от ламера?

anc ★★★★★
()

«Не стреляйте в пианиста…»

vaddd ★☆
()

c++ на ардуине (которая 8-битная, а не арм) - это тревожный сигнальчик сам по себе, заранее ожидаю что будет самая наихудшая из возможных комбинаций, т.е. кто-то кто одновременно не очень понимает чего творит ни в с++, ни в ардуине.

с библиотеками там совсем другая проблема.

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

простой пример: поморгать лентой из адрессных светодиодов типа ws2812 (проектов такой направленности миллион)

есть сразу несколько неплохих библиотек: (по памяти): fast led, neo pixel, и еще парочка известных и популярных. все весьма навороченные и продвинутые.

вот только они все абсолютно неконфигурабельные и написаны так, что нельзя отключить ненужные фичи.

вот не нужны мне всякие цветокоррекции, конвертация между цветовыми пространствами, подсчеты уровня потребления энергии и все остальное, что происходит по пути и сильно тормозит процесс.

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

казалось бы, что задача достаточно частая: заиметь ардуину в качестве простой низкоуровневой управлялки, без вносимой ей отсебятины, а высокоуровневый поток данных гнать предварительно сгенерировав его на более мощном ПК/тв-боксе и т/д/, где весь необходимый процессинг делается быстро и безболезненно.

в результате пришлось надергать кусочки кода отовсюду, чтобы сделать свою собственную «библиотеку» аж на целых на 100 строчек кода. а само моргание вообще ассемблерной вставкой сделать (заботливо скопированной из якобы «самой быстрой» библиотеки для работы с теми адрессными светодиодами).

и так происходит чуть менее чем всегда, когда нужна производительность (накопировать чужого кода и применить готовые библиотеки сходу не выйдет).

т.е. цена нужного решения не очень высокая, чтобы сделать это самому в специфичном для задачи варианте. а вот сделать конфигурабельную на уровне кода библиотеку и потом еще и поддерживать это - слишком много гемора при нулевой выгоде.

n_play
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)