Очередной промежуточный итог...
самое главное - добавил для PWM режим плавного перевода из крайних состояний. Попробовал в отладке - вроде работает. На самой медленной скорости "1" одна серва переводится примерно 10 сек, десять серв примерно столько же, на 30 сотых позже. Нормально, в-общем. Правда тестировал без серв и плат PCA, закомментировав обработку ошибок инициализации I2C. Когда будет реальная отправка команд, самая медленная скорость сервы может стать еще медленнее и более того, зависеть от кол-ва плат
Возможно и очень не сильно, все таки редко одновременно переводится много серв. На 1-2 будет совсем не заметно.
Все это удалось благодаря отказу от "штатной" библиотеки с реализацией очереди и написанию свои объектов очереди FIFO. На этом сэкономил память и теперь под буферы команд сразу бронируется память, поэтому без всяких сюрпризов переполнения. Дополнительно в обработчик команд I2C добавил опцию - теперь команды можно обрабатывать пачками регулируемого размера.
Алгоритмы тестирования запускаю цифрами через сериал-порт. Легко можно имитировать команды с пульта. Например, на команду в виде цифры "0" навесил одновременный перевод 10 стрелок
Видимо скоро придется писать протокол на сериал-порт, чтобы уже по-серьезному нагружать, например из "терминала" какого нить запуская тестовые скрипты.
Код:
Скетч использует 13390 байт (43%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1598 байт (78%) динамической памяти, оставляя 450 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
Памяти на грани, но вроде пока хватает. В коде отсутствуют локальные переменные в виде больших массивов. Но не помешает еще раз проверить библиотеку локонета на этот же предмет.