Пока эти функции реализованы только для архитектуры ARMv7-M (Cortex-M3). В принципе, код можно компилировать и для ARMv7E-M (Cortex-M4), но это будет не совсем оптимально, так как под Cortex-M4 некоторые моменты можно реализовать более эффективно. В дальнейшем хочу добавить еще несколько функций, сейчас вот приступлю к делению и квадратному корню. Так же собираюсь добавить реализацию для других архитектур, может быть даже не ARM если кто-нибудь заинтересуется и захочет помочь.
Циферка 4 в названии означает, что библиотека предполагает использование 32-битных (4 байта) целых для представления чисел с фиксированной точкой. Библиотека поддерживает работу с числами в формате от Q1 до Q31, т.е. каждая функция (за некоторыми исключениями) имеет свою версию для каждого конкретного формата.
Использование 32-битных чисел приводит к необходимости вычисления их 64-битного произведения, т.е. очень желательно, чтобы целевое устройство имело такой аппаратный умножитель, иначе это все надо будет реализовывать ручками, и будет это все работать очень медленно. Поэтому я хочу сделать вторую версию библиотеки, работающую с 16-битными числами. В большинстве случаев их точности будет достаточно, а вычислительных мощностей нужно будет гораздо меньше. Для начала думаю реализовать ее для Cortex-M0, в нем же, если не ошибаюсь, как раз нету умножителя с 64-битным результатом.
Ах да, для ARM это все написано на ARM-овском ассемблере, который armasm, который в Keil. К библиотеке нужно будет добавить какой-нибудь make чтобы её собирать (прям сейчас займусь), кое-то по мелочи допилить, прокомментировать и можно будет уже использовать. Пока же вы можете просто подсмотреть что и как реализовано (если интересно), или выдернуть себе в проект нужную функцию, они все проверены и должны работать. По точности и скорости каждой функции спрашивайте тут, у меня, GitHub вики со всей этой информацией пока еще в планах.
Собственно проект на GitHub
Итого на текущий момент реализовано следующее:
- ARMv7-M (Cortex-M3)
- clip (ограничивает величину верхним и нижним пределом, чтобы не писать несколько if)
- int (возвращает целую часть)
- frac (возвращает дробную часть)
- round (округляет до ближайшего целого)
- sgn (вычисляет функцию signum)
- abs (возвращает абсолютное значение)
- mul (умножает два числа)
- sin (вычисляет синус)
- cos (соответственно косинус)