О том стоит ли использовать 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 функциями.