О главе
«Си для встраиваемых систем»
Это онлайн версия книги «Си для встраиваемых систем». В печатном формате её можно приобрести у нас в магазине, а в виде файла epub/mobi/pdf на площадке LeanPub.
Стоимость разработки ПО — ключевая составляющая в производстве любого современного продукта. Любое устройство можно разбить на маленькие компоненты, выполняющие задачи, которые часто повторяются. Например, кнопка может быть использована как в микроволновке, так и в телефоне. Стандартизируя интерфейсы микроконтроллеров от разных производителей, можно значительно упростить работу программиста и ускорить ее. Компания ARM предлагает библиотеку CMSIS — это независимый от производителя уровень абстракции над железом для серии ядер Cortex-M, который предоставляет простой интерфейс к ядру его периферии и операционной системе реального времени.
Абстракция, наряду с разделением труда, одно из величайших «изобретений» человечества.

CMSIS позволяет разработчику на языке Си обращаться к ячейкам памяти (регистрам) не напрямую, по их адресу, а по синонимам.
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
Это удобно, так как вам не нужно залезать в документацию, чтобы посмотреть адрес и положение нужного вам бита. Однако названия не всегда очевидны, и вам нужно действительно хорошо знать, как работает МК и какие регистры вам нужны. С повышением уровня абстракции разработка упрощается, но зачастую за счет понижения производительности.
Компания ST, решая проблему ускорения разработки, выпустила стандартную библиотеку периферии (StdPeriph, SPL). Многим она нравится, так как вместо работы с регистрами напрямую разработчику предлагается заполнять структуры и вызывать функции, которые в свою очередь производят настройку тех или иных блоков.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
Стандартная библиотека, однако, получилась не такой, какой виделась — с расширением линейки МК приходилось добавлять всё новые возможности. В конечном итоге одна и та же библиотека, предоставляющая схожий интерфейс, выглядит по-разному. В данный момент ее разработка прекращена, но ей продолжают пользоваться.
Решая проблему унификации, ST разработала еще две библиотеки: низкоуровневую (Low Layer), которая по сути является оберткой для CMSIS и позволяет выполнять все необходимые операции вызовом макросов или инлайновых функций; и библиотеку аппаратной абстракции (HAL), использующую низкоуровневую библиотеку внутри.
// RCC init with LL
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
// RCC init with HAL
__HAL_RCC_GPIOA_CLK_ENABLE();
Какую библиотеку использовать — решение программиста (иногда — заказчика). Одни позволяют получить высокую производительность и компактный бинарник (требуется меньше памяти), другие за счет меньшей производительности позволяют ускорить разработку, улучшить переносимость и поддерживаемость кода.
core_cmInstr.h и core_cmFunc.h теперь не существуют (в папкеCMSIS\Core|Include их нет). Теперь это файлы cmsis_compiler.h и cmsis_iccarm.h or cmsis_armcclang.h or cmsis_armcc.h or cmsis_gcc.h для компилляторов IAR or ARM6 or ARM5 or GCC, соответственно
0
Простите, но все, что вы написали про __HAL_LOCK и __HAL_UNLOCK — чушь!
Это просто ЗАГОТОВКА(пример) — она не работает, если определен макрос USE_RTOS то макросы вообще пустые (ничего не делают).
В синхронном коде, нам ничего не нужно блокировать и разблокировать, ибо все последовательно и этот код просто лишний!
В асинхронном коде (RTOS) макросы не используют атомарные операции (эксклюзивный монитор — асм команды типа LDREX/STREX) из-за чего просто не могут обеспечить роль мьютекса(блокировки) для доступа к драйверу. При асинхронности при наличии IRQ, это вообще туши свет, что будет если нас выдернуло IRQ а мы знаете ли заняты? мы что должны перепланировать IRQ? если да, то я боюсь что новичок накуралесит такого что будет плохо всем…
Я когда-то на старом форуме ST находил описание, мол ребята это мы хотели, но руки не дошли, так что
жрите что даем (и мы должны либо надеяться и использовать мьютекс из РТОС, либо понимать что текущий механизм нифига не защищает!)
даже на новом форуме есть подобные темы: https://community.st.com/s/question/0D50X00009XkeOGSAZ/questions-surrounding-hallock
Просто вы вводите в заблуждение новичков, они потом будут думать, что в HAL-е все ок, там блокировка, нельзя так делать, у них еще не окрепли мозги, они не умеют думать критически, они вам просто верят как учителю (авторитету), а вы их обманываете — не хорошо!