Цитата(adnega @ Jul 4 2015, 09:34)

Обработку кнопок и светодиодов провожу в системном таймере.
Аналогично. Hook вызывается из SysTick_Handler(), это системный таймер.
Цитата(adnega @ Jul 4 2015, 09:34)

Изменение состояний светодиодов
произвожу через данные структуры.
Если я правильно понял, то речь скорее идет о способе управления, поллинг или событийно. Другими словами, либо сразу установить состояние светодиода, либо установить в памяти бит где-то в структуре, который периодически опрашивается. Иначе, не вижу расхождений.
Цитата(adnega @ Jul 4 2015, 09:34)

Вы же рассматриваете светодиоды и кнопки как объекты (т.е. данные и код для обработки этих данных) - вам прямой путь в плюсы.
Такие вещи, как светодиоды/кнопки и еще много других, используются в 9 проектах из 10. Какие-то проекты допустимо исполнить на плюсах, но в основном, заказчики хотят чистый Си. Делать по две реализации каждого драйвера, каждого сервиса - совсем не хочется. Да и почему бы не выжать из Сей максимум его возможностей?

Цитата(adnega @ Jul 4 2015, 09:34)

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

Цитата(adnega @ Jul 4 2015, 09:34)

Или делать по аналогии .set(&led[0], NEW_STATE) передавая явно указатель на объект (а не его номер).
А тогда не вижу особого смысла городить "метод" - разумнее оставить все как есть, обычный вызов функции, с парой аргументов.
Если посмотреть, то у set() есть два аргумента, первый константа, причем известная на этапе компиляции, второй переменная. Т.е. задача, выходит, сводится к тому, что бы подпихнуть эту константу и полностью скрыть первый аргумент. Выходит, что это должно быть две функции, собственно метод и его обертка.