LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Я использовал её какое-то время. Однако она меня не устраивает по нескольким причинам:

1) Недопиленность. Например, I2C реализован до конца только для STM32F3xx.

2) Местами быдлокод. Например, в той же реализации USB. Там есть поля регистра, которые нельзя просто так взять и записать. Нужно записать единички в те битики, которые должны изменить состояние на противоположное, а куда запишется нолик останется неизменным. И в libopencm3 реализовано считывание значение в регистра во временную переменную, цикл по всем битам этого значения, проверка надо ли его менять, запись единички если надо, а потом запись нового значения в регистр. А ведь достаточно REG = REG & (~FIELD_MASK) ^ field_value.

3) Местами слишком платформоспецифичные решения. Например, настройка GPIO и PLL для STM32F1xx и остальных серий очень и очень сильно отличается, вплоть до разных функций и разной последовательности операций. Да, я понимаю, что у STM32F1xx соответствующие модули немного другие, но ведь можно было бы как-то сгладить этот угол.

В результате мне это надоело и я решил запилить свою библиотеку с блек-джеком и шлюхами. Которая должна удовлетворять двум противоречащим критериям - по максимуму скрывать особенности платформы, чтобы код приложения был полностью одинаков во всех случаях, однако в отличии от всяких ардуин предоставлять штатные возможности для деланья всяких платформоспецифичных вещей. Это реализовано с помощью классов C++ (да, у меня даже ножка GPIO имеет свой класс, правда, код всё равно получается оптимальнее, чем у Arduino, ибо вызов виртуальной функции быстрее, чем поиск пина в таблице всех пинов платы). Базовый класс умеет то, что должна уметь соответствующая периферия на любом контроллере, а для каждой платформы я его расширяю с учётом её особенностей. В итоге, когда не нужны особые вещи, можно вызывать базовые функции, семантика которых не отличается от платформы к платформе.

https://github.com/KivApple/controllerFramework - вот текущее состояние. Уже умею GPIO (STM32, в планах поддержка Linux), USART (STM32, Linux), I2C (STM32, в планах поддержка Linux i2c-dev) и EXTI (STM32). Есть библиотеки для OneWire на базе USART, а также некоторых I2C-датчиков.

Сейчас работаю над поддержкой USB для STM32.

Исходная версия KivApple, :

Я использовал её какое-то время. Однако она меня не устраивает по нескольким причинам:

1) Недопиленность. Например, I2C реализован до конца только для STM32F3xx.

2) Местами быдлокод. Например, в той же реализации USB. Там есть поля регистра, которые нельзя просто так взять и записать. Нужно записать единички в те битики, которые должны изменить состояние на противоположное, а куда запишется нолик останется неизменным. И в libopencm3 реализовано считывание значение в регистра во временную переменную, цикл по всем битам этого значения, проверка надо ли его менять, запись единички если надо, а потом запись нового значения в регистр. А ведь достаточно REG = REG & (~FIELD_MASK) ^ field_value.

3) Местами слишком платформоспецифичные решения. Например, настройка GPIO и PLL для STM32F1xx и остальных серий очень и очень сильно отличается, вплоть до разных функций и разной последовательности операций. Да, я понимаю, что у STM32F1xx соответствующие модули немного другие, но ведь можно было бы как-то сгладить этот угол.

В результате мне это надоело и я решил запилить свою библиотеку с блек-джеком и шлюхами. Которая должна удовлетворять двум противоречащим критериям - по максимуму скрывать особенности платформы, чтобы код приложения был полностью одинаков во всех случаях, однако в отличии от всяких ардуин предоставлять штатные возможности для деланья всяких платформоспецифичных вещей. Это реализовано с помощью классов C++ (да, у меня даже ножка GPIO имеет свой класс, правда, код всё равно получается оптимальнее, чем у Arduino, ибо вызов виртуальной функции быстрее, чем поиск пина в таблице всех пинов платы). Базовый класс умеет то, что должна уметь соответствующая периферия на любом контроллере, а для каждой платформы я его расширяю с учётом её особенностей. В итоге, когда не нужны особые вещи, можно вызывать базовые функции, семантика которых не отличается от платформы к платформе.

https://github.com/KivApple/controllerFramework - вот текущее состояние. Уже умею GPIO (STM32), USART (STM32, Linux), I2C (STM32, в планах поддержка Linux i2c-dev) и EXTI (STM32). Есть библиотеки для OneWire на базе USART, а также некоторых I2C-датчиков.

Сейчас работаю над поддержкой USB для STM32.