В статье алгоритмическая оптимизация функции sin() для бюджетных микроконтроллеров stm32, повышающая производительность в 10 и более раз. Тригонометрические функции, характеризующиеся высоким потреблением процессорного времени, могут негативно влиять на выбор бюджетных микроконтроллеров ( без модуля FPU ) для задач, где важна скорость счёта, например, контроль пространственного положения. Библиотечные тригонометрические функции с двойной точностью в два раза медленнее, чем с одинарной. Это досадный факт. На иллюстрации время работы «sin()» и «sinf()», измеренное в тактах CPU, на диапазоне [-420° .. +420°] с шагом 5°, плюс слабый шум. Производительность библиотечных «sin()» и «sinf()» высока вблизи точки «0» и снижается в два раза пропорционально модулю аргумента. Возникает потребность считать тригонометрию несколько быстрее, без FPU, но допуская худшую точность: у аргумента — в пределах чувствительности доступных электронных датчиков положения, например, LSM6DSO; у результата — в пределах точности доступных шаговых двигателей и сервомашин, например, HS-5082MG. Требования к исходному коду: a) Исходный код без интеллектуального балласта третьих лиц;b) Самодостаточный компилируемый модуль на основе стандартных библиотек;c) Кросс-платформенность — отсутствие вставок на ассемблере. Требования к исполняемому коду:a) Ограниченный объём бинарного кода — чем меньше, тем лучше;b) Ограниченный объём статических и динамических данных — чем меньше, тем лучше. Требования к интерфейсу (привычный):a) float sint( float x );b) float cost( float x ). Требования к аргументу:a) Объектная сущность: геометрический плоский угол;b) Единица измерения: угловой градус в десятичном виде: 1,0 °;c) Точность измерения: +/- 0,05 °;d) Рабочий диапазон: +/- 5400 °;e) Тип данных: float, согласно IEEE 754. Требование к результату: a) Объектная сущность: тригонометрические функции «sin» и «cos»; b) Точность счёта: +/- 0,005; c) Тип данных: float, согласно IEEE 754. Сравнительный анализ способов приближения тригонометрических функций за границами настоящей публикации. Применяемый метод считает синус плоского угла в рабочем диапазоне от 0 до ½π. Синусы углов за пределами рабочего диапазона находятся через осевую симметрию применительно к результату из рабочего диапазона. Вычисление синуса угла в рабочем диапазоне заменяется поиском точки на куске одномерного сплайна: В некоторых условиях сплайн и синус демонстрируют схожее поведение. Аппроксимирующий сплайн представляется формой Безье. Точка сплайна вычисляется геометрически, редуцированным методом де Кастельжо. Алгоритм оптимизируется на соответствие функции синус. Косинус считается как синус, сдвинутый по фазе на 1½ π. Характеристики бинарного кода на платформе Cortex M0: размер бинарного кода — 168 байт; размер стека — 40 байт (локальные переменные — 24 байта); статическая и динамическая память — без надобности. Результат с тремя точными знаками после запятой и гарантированной ошибкой в четвёртом знаке — | 0,0003 |. Скорость работы вновь созданной функции на платформе Cortex M0 превосходит библиотечные «sin» и «sinf» в 10 и более раз. У алгоритма есть опции, выбираемые через условную компиляцию: медленный счёт — гарантирует ошибку |0,0003| и менее; быстрый счёт — даёт преимущество в ~20 тактов на Cortex M0, ухудшая ошибку до |0,0004|. Преимущество в 15-25 тактов ( ~1us ) — это существенный прирост производительности для бюджетных контроллеров на малых частотах. На платформе Cortex M4 быстрый метод счёта даёт сомнительное преимущество в 3-5 тактов, соразмерное погрешности измерения, и ухудшение точности до |0,0004|. В целом, тестирование алгоритма на Cortex M4 показало приемлемый результат с малым превосходством по скорости библиотечной функции «sinf», оптимизированной под имеющийся FPU. На графике отсутствует функция «sin» [ double sin ( double x ) ], показывающая худшее на десятичный порядок время. На платформе Cortex M4 каждый вызов «sin» [ double sin ( double x ) ] забирает порядка 2500 тактов. Итоговый алгоритм допускает аргумент в угловых градусах и в радианах.Выбор единицы измерения аргумента осуществляется через условную компиляцию. Алгоритм соответствует техническим требованиям, показывая удовлетворительную скорость и ожидаемую точность счёта. Есть некоторый потенциал для улучшения характеристик алгоритма. С практической точки зрения этот потенциал целесообразно отложить в будущее. Файл заголовок Исходный код  Программирование. Качество гарантированное опытом.