eddy_em: (Default)
[personal profile] eddy_em
Таки оно у меня заработало!
Проблему с "остановкой" I2C во время чтения DMA нашел: я сам накосячил в одном месте и просто отключал I2C… Остальное - дальше.

В release-сборке вполне себе скромненько потребляет:
Memory region         Used Size  Region Size  %age Used
             rom:         16 KB       128 KB     12.50%
             ram:       33680 B        40 KB     82.23%
          ccmram:          0 GB         8 KB      0.00%

Самыми жирными являются imdata+confdata в mlxproc.c (16660 байт), да буфер изображения mlx_image (3072Б) с вычисленными параметрами params (10100Б) в mlx90640.c. Ну и килобайтный кольцевой буфер на отправку в USB. Жаль, нет каких-нибудь простых штатных средств, чтобы отсортировать переменные по потребляемой ОЗУ. Нашел лишь в интернете совет, как посмотреть размер на стадии компиляции (хотя, конечно, можно было бы и в gdb посмотреть):
char (*__kaboom)[sizeof( confdata )] = 1;

(при сборке gcc ругается и пишет размер в байтах).
Суммарно получилось где-то на 2.5кБ меньше, чем 33680Б. Вот и интересно, где собака порылась. Понятно, стек там неплохой, мелочь всякая локальная в куче, но таки не пара же килобайт? Может, где что завел временно, да забыл?

Протокол символьный. Если ввести '?', 'h' или 'H', получим в терминале:
https://github.com/eddyem/stm32samples/tree/master/F3:F303/MLX90640multi build#66 @ 2025-09-24
    management of single IR bolometer MLX90640
aa - change I2C address to a (a should be non-shifted value!!!)
c - continue MLX
dn - draw nth image in ASCII
gn - get nth image 'as is' - float array of 768x4 bytes
i0..4 - setup I2C with speed 10k, 100k, 400k, 1M or 2M (experimental!)
l - list active sensors IDs
tn - show temperature map of nth image
p - pause MLX
s - stop MLX (and start from zero @ 'c'
tn - show nth image aquisition time
C - "cartoon" mode on/off (show each new image)
Dn - dump MLX parameters for sensor number n
G - get MLX state
Ia addr [n] - set  device address for interactive work or (with n) change address of n'th sensor
Ir reg n - read n words from 16-bit register
Iw words - send words (hex/dec/oct/bin) to I2C
Is - scan I2C bus
T - print current Tms

По USB эмулирую классический CDC. После подключения udev создает симлинк /dev/mlx_sensor0. Все вспоминаю COKPOWEHEU добрым словом за идею "маркировать" разные устройства (а также интерфейсы в составном устройстве — как, скажем, в контроллере энкодеров астросибовской монтировки) при помощи простого правила udev — через поле iInterface.

Когда у меня уже почти все заработало, нарвался натурально на stack overflow. Поначалу как-то миновало (но странно, почему: я в функцию запихнул стековую переменную размером 10100Б), а потом аукнулось. И эту структуру с пересчитанными коэффициентами я выделил отдельно на куче, а передавал в функции лишь ее адрес (или NULL в случае ошибки).

Однако, таки поначалу я надеялся, что и 8 датчиков можно будет повесить на один STM32, а тут — вона как! 3332 байта на одно изображение, да куча всякой всячины. Сейчас остается 7280Б свободного места. Т.е. хватит еще два датчика добавить, а восьмой — уже некуда. Разве что придумать что-то.
Кстати, можно сократить на 768Б структуру параметров, т.к. я не использую массив маркировок "битых" пикселей. Но это не спасет место, чтобы восьмой датчик впихнуть. Да и ладно: все равно для конкретного устройства нужно пять.

Остается еще дописать управление питанием, отсылку по RS-485, да промакетировать. Ну и сэмулировать проблемы на шине или временное отключение какого-либо датчика (пока что они у меня гроздью спаяны, нужно будет обжать их "штекерами" и на беспаечной макетке в кучу собрать). А потом - нарисовать печатную плату и корпус, ну и изготовить… И, конечно, нудная калибровка - чтобы сшить пять картинок воедино.
Ах, забыл: ведь еще нужно добавить BME280 + один-два NTC + управление подогревом.

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 24th, 2026 08:05 pm
Powered by Dreamwidth Studios