Сравнение скорости выполнения SPL кода и работы с регистрами

О том стоит ли использовать Standart Peripheral Librery от STMicroelectronics разговоры идут наверное с момента её выхода в свет.

С одной стороны всё очень круто и понятно, разные контроллеры обладают если не одинаковой то очень схожей библиотекой, которая несомненно ускоряет разработку в разы. С другой стороны тратить ресурсы на структуры данный для настройки не так уж и выгодно, как с точки зрения протяжонности программы так и скорости её выполнения.

Для тех кто не в курсе отмечу, что при вызове функции используемые в ней регистры вносятся в стек, тогда как программа по сути переходит по метке в другую часть адресного пространства. Т.е. вы делаете кучу лишних (не нужных для достижения конечной цели) операций. Хотя такой подход в разы увеличивает и удобство и скорость разработки.

Дабы покончить хотябы с частью холивара на эту тему. Сделал сравнение работы с GPIO. Библиотека написана в одном стиле, так что думаю результаты будут примерно одинаковы.

Итак, что же выполняется быстрее? Все за и против SPL.

Сравнивались функции из stm32f4_discovery.c предоставляемого STM, как эталона написания кода.

Функция Количество тактов
SPL Регистры
STM_EVAL_LEDInit 470 29
STM_EVAL_LEDOn 19 6
STM_EVAL_LEDOff 24 6

Как видите разница довольно существенна, особенно хорошо это видно при инициализации (в 16 раз).\

Но даже функция выключения/включения светодиода (по сути замена бита в регистре) выполняется в 3 раза медленнее, чем это могло произойти.

Для отчётности выкладываю код, который сравнивался с библиотечными функциями.

STM_EVAL_LEDInit сравнивался с

RCC->AHB1ENR |= RCC_AHB1Periph_GPIOD;
GPIOD->MODER |= ((0b01) << 24);
GPIOD->PUPDR |= ((0b01) << 24);
GPIOD->OTYPER |= (0 << 12); // output push pull
GPIOD->OSPEEDR |= (0b10 << 24); //50mhz

Включение светодиода осуществлялось так:

 

GPIOD->ODR |= (1 << 12);

Выключения так:

GPIOD->ODR &=  ~(1 << 12);

Вот собственно и всё.

А теперь уже дело за вами, что использовать и как.

Отмечу только, что для написания новичками с регистрами придётся повозиться. Нужно отыскать в документации какие биты и куда пихать, т.е. разбираться придётся много дольше. С SPL всё просто и приятно, но в 10 раз медленнее.

В скором времени выложу ещё сведения о протяжённости кодов и сравнение с inline функциями.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий