Чёртовы эмбеддеры

Jul 27, 2021 23:06

Скажите, коллеги, и просто сочувствующие, а вот у вас такой код не вызывает подозрений?

uint8_t *buffer = malloc(...) size_t offset = 0 buf_append_float32(buffer, config->voltage, 1e3, &offset); buf_append_float32(buffer, config->current, 1e3, &offset); buf_append_float32(buffer, config->temperature, 1e2, &offset);

Нет? Точно нет? А должен вызывать ( Read more... )

программизм, терминальное

Leave a comment

Comments 25

eddy_em July 27 2021, 19:49:02 UTC
Очень кривая реализация фиксированной запятой.

Reply

ex0_planet July 27 2021, 19:53:27 UTC
"Очень слабый менеджмент!!!" (с)

Мои претензии больше к тому, что в документации написано float.

Reply

bigmaxx July 28 2021, 04:31:37 UTC
То есть, они используют float при вычислениях, а потом преобразуют его в int при засовывании в буфер (видимо, для передачи по каналу связи).
Погромист писюковой школы, привыкший к бесплатному float и болт положивший на быстродействие, так и будет делать. У того же, кто начинал с 8 бит, при слове float стразу начинает свербить.
Если в конторе на такого кодера нет погромиста-проверяльщика ( как их там сейчас называют - тимлиды?), всё так и будет. Или претензия только в том, что имя функции не отражает то, что она делает?
Что до менеджеров - покажите мне хоть одного , который сходу назовёт разницу между float и int. Да это и не их задача.

Reply

ex0_planet July 28 2021, 05:54:54 UTC
кто начинал с 8 бит, при слове float стразу начинает свербить
float давно уже аппаратный, даже в контроллерах. Кроме пресловутых восьмибиток и M0 какого-нибудь. У меня правда тоже начинает свербить, но по другой причине - в kernel mode это небесплатно (не столько по перформансу, сколько по "еще и за этим следить") в смысле сохранения/восстановления контекста.

Ну и какое-нибудь printf("time %d.%03ds", milliseconds/1000, milliseconds%1000) сильно однозначнее в смысле получаемой точности и округления.

Что до менеджеров - покажите мне хоть одного , который сходу назовёт разницу между float и int
Не знаю, из тех с кем я работал, наверное все бы справились. Вот между float32 и fp24:8 посложнее, но тоже думаю не вызвало бы особых проблем. Вот программиста я видел, который в ядро пытался засунуть floating point вычисления потому что в документации банальный fixed point описали академично, в духе: "число представляется полиномом bit6*2^0+bit5*2^(-1)+bit4*2^(-2)...", хотя там можно было обойтись битовой маской и сдвигом.

Reply


sbj_ss July 28 2021, 07:05:15 UTC
Как битого жизнью программиста меня жутко раздражает, что в функции не передаётся размер буфера. Можно на раз вылезти за его границы.

Reply

ex0_planet July 28 2021, 11:22:25 UTC
Нельзя, эмбеддер проверил все ветки кода и выделенного буфера ТОЧНО ХВАТИТ.

Reply


nicka_startcev July 28 2021, 10:43:58 UTC
>а вот у вас такой код не вызывает подозрений?

вызывает и дофига

1. зачем маллок вместо обычной локальной переменной на стеке
1а. фри не забыли? во всех ветках? а эксепшены убрать не забыли?
2. почему массив, а не структура

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

4. вообще, да, удивляет, насколько "обычные программисты" обожают СИ и ненавидят СГС.

Reply

ex0_planet July 28 2021, 11:21:29 UTC
1,1а это си. ничего не забыли, это здесь просто чтобы типы были понятны

2. потому что это потом в уарт отправлять и не морочиться с memory layout.

3. что надо курить чтобы ЭТО назвать float?

4. по факту это почти сгс и есть :)

Reply

nicka_startcev July 28 2021, 13:48:06 UTC
1. я в похожей ситуации делаю структкрки для всех типов пакетов. в начале - синхра, потом размер, потом тип, потом данные, потом црц. объявляю переменную такого типа на стеке.

2. делаю что-то типа mk_pkt(void *buffer, u32_t size) или без сайз, потому что сайз уже заполнен в пакете, а этак мк_ считает црц и прочие штампы.

ну, лайаут в любом случае надо бы помнить на стороне ембеддед. и с несовпадением лайаута могут быть примерно те же косяки как и с потоком append_foo(&offset); append_bar(&offset);

3. про флоат - дааа...

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

Reply

ex0_planet July 28 2021, 15:00:44 UTC
2. как насчёт структур переменного размера? пачку строк например заслать. це ж жах!

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

4. полусантивольты - это жёстко. в int32 как правило помещается всё что надо при разумном выборе базы из ряда (кило/милли/микро). или, для эстетов, в fp24:8 опять же при разумном выборе.

Reply


Leave a comment

Up