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

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

nicka_startcev July 28 2021, 16:36:39 UTC
2. пачка строк - да, но это редкость. у меня чаще бывали портянки по 1..512 байт итого из инт8..16..32/флоат32 полей с разными именами. (как пример - дюжина приемопередатчиков с усилителями и фазокорректорами, а также их питанием и термеметрией)

4. полусантивольты - это я загнул, да. а так - в таких местах я бы на текущий момент делал примерно так: все данные пересылать в примерно родном для показометра формате (инт/уинт, дополняем до 8..16..32 бит, корректно расширяем знак), делать данные максимально однородными (все по 32, или все по 16, или котовасия с размазыванием чего попало встык на массив из байтов), делать команду чтения диапазона и команду чтения дескриптора. дескриптор читать редко, буквально только при инициализации. в дескрипторе держать избыточную ботву и про единицы измерения (или даже коэффициенты для пересчета по полиному или экспоненте), и про человекочитаемые имена.

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

но это так, нулевое приближение, дальше нужна конкретика про типовое и про максимальное использование: в случае какого-нибудь тупого усбмодема (или приравненного к нему) это будет развесистый набор дескрипторов, пачка настроечно-показушных команд (возможно, через отдельный EP, возможно в стиле "AT-команд"), и тупой канал с контролем переполнения типа того же usb cdc

Reply

ex0_planet July 28 2021, 20:53:51 UTC
Это если при проектировании подумать успели до того как руки сами пустились в пляс.

Чаще же бывает так, что "ой, вот здесь еще терморезистор читать надо". Но в конфиге нет места. Точнее, изменение в каком-нибудь базовом MSG_GET_CONFIG сломает всю задеплоенную базу, а об версионировании протокола никто не подумал. Поэтому если мы этот NTC прилепим в хвост какому-нибудь MSG_GET_BATTERY_LEVEL, то почти никто ничего не заметит....

Reply

nicka_startcev July 28 2021, 22:30:50 UTC
еще, кстати, стОит подумать про аналоги "NaN" - когда датчик отсутствует или бредит. чтоб при опросе посредника сразу было видно, где именно лажа.

Reply


Leave a comment

Up