CMSIS против HAL против стандартной периферийной библиотеки

29

Поэтому я переключаюсь с PIC на ARM и купил плату обнаружения STM32F4. Пока я понимаю, что для его программирования вы можете получить доступ ко всем регистрам непосредственно в памяти (очевидным образом), а также есть 3 основные библиотеки, которые вы можете использовать для облегчения своей жизни. Теперь мой вопрос: какой из этих 3 (CMSIS, HAL, Std Peripherals Lib) самый НИЗКИЙ уровень? то есть. тот с меньшими накладными расходами. Моя цель состоит в том, чтобы изучить внутреннюю работу контроллера и не сделать мою жизнь проще (немного), поэтому я хотел бы знать, какой из них ближе к ядру, не прибегая к использованию сборки.

Джон
источник
10
[Сторона STM32] CMSIS - это, по сути, просто определения регистров, а не код, поэтому CMSIS == прямой доступ к регистру. AFAIK ST не имеет отдельной загрузки только для CMSIS, но когда вы загружаете StdPeriph Lib или STM32Cube, вы можете использовать только часть CMSIS. Определения регистра STM32 обнаружены ни в одном Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hили Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hсоответственно.
Алекси Торхамо

Ответы:

27

Определенно CMSIS. Это не совсем библиотека, она в основном содержит определения для различных регистров.

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

Имейте в виду, что CMSIS, в отличие от двух других, определяется ARM, а не ST. Это означает, что различные библиотеки CMSIS для различных микроконтроллеров очень похожи, что значительно облегчает переносимость.

Кроме того, CMSIS является более простым, поэтому он (IMO) является наиболее универсальным и наиболее надежным, возможно, с меньшим количеством (или отсутствием) ошибок. Некоторые библиотеки hal для различных mcu, которые я использовал, довольно печально известны своими ошибками.

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

Фотис Панайотопулос
источник
Я не уверен, что ST все еще поддерживает библиотеку CMSIS
Скотт Сейдман
1
Ну типа того. Прямой ссылки нет, они ее не поощряют (кажется, что они хотят максимально привязать пользователей к своему коду, не поощряя их переходить на какой-то другой бренд), но они используются в других библиотеках. Вы можете извлечь его оттуда. Это довольно просто, не содержит много кода и кажется зрелым. Похоже, это безопасно для производственного использования, независимо от того, продают ли они его как поддерживаемое или нет.
Фотис Панайотопулос
Да, облом, что они перестали развиваться в этом направлении. Соблюдение CMSIS было одной из причин, которые привлекли меня к ST. Я все еще использую это, но у меня есть чувство, что придет день, когда это не будет удобно.
Скотт Сейдман
3
@ ScottSeidman, я думаю, что вы перепутали CMSIS с StdPeriph. CMSIS хорошо поддерживается и будет поддерживаться бесконечно. Его StdPeriph, который в основном устарел сейчас, но CMSIS так же жив, как и 10 лет назад.
ScienceSamovar
14

Чтобы узнать, как это работает, вы хотите использовать ничего из вышеперечисленного. Получите ручной кросс-компилятор и документацию от st, done. Начните кодировать. эти чипы вообще очень легко программировать. документация говорит вам, какие биты в каких регистрах делают что.

Любая / все эти библиотеки предназначены для того, чтобы снять с вас это понимание / нагрузку / работу и создать ощущение, будто вы просто вызываете API, как опыт разработки приложений. Это то, что хотят многие люди. Вы можете использовать весь исходный код для этих библиотек, чтобы помочь понять, но когда вы станете лучше, вы обнаружите дыры и проблемы в библиотеках, иногда очень страшный код. код, собранный вместе, написанный в общих чертах и ​​грубо перенесенный с одного чипа на другой, возможно, поддерживающий функции, которых нет у вашего чипа, и т. д. И все они имеют чрезмерную нагрузку. В 10-100 раз больше кода для этой задачи, конечно, многие из них могут быть оптимизированы, но зачем это нужно?

Независимо от того, пользуетесь ли вы своей собственной или используете одну из этих библиотек, вам все равно следует поискать исходные библиотеки, которые вы используете, чтобы убедиться, довольны ли вы тем, что они делают, если это имеет смысл, соответствует документации по чипу и т. Д. идет не так, вам, вероятно, придется копаться в их вещах столько же, сколько в вашей, чтобы выяснить, почему.

Обратите внимание, что документы по чипам тоже не идеальны, это часть веселья.

Я не понимаю, почему сборка возникает в дискуссии о программировании голого металла. Вы можете обойтись с очень небольшой сборкой. Для этих чипов cortex-m вам технически нужно только столько ассемблера для загрузки:

.globl _start
_start:
.word 0x20001000
.word main

Вы не можете полагаться ни на данные, ни на bss, и вы не можете вернуться с основного с этим минимумом asm. Но это все, что вам нужно для самого чистого металла. Теперь, если вы хотите делать прерывания, вам нужно больше записей в векторной таблице. больше .word строк. Я рекомендую больше asm, но возможно на 10 или 20 строк больше.

обычно это все, что я использую.

.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .
.align
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr
.thumb_func
.globl dummy
dummy:
    bx lr
.end

Да, это говорит Cortex-M0, но это фактический загрузчик для моего кода M4. Я предпочитаю, чтобы это был thumb, а не thumb2. И я просто повторно использую этот код из одного cortex-m в другой, меняя адрес указателя стека по мере необходимости, чтобы он работал для m0, m3 и m4. У меня еще нет m7, и я не слишком много его исследовал.

Включение fpu может потребовать еще несколько строк asm, поскольку необходимы конкретные инструкции. Но дело не в том, чтобы смешивать низкоуровневое программирование и асм. C тем, что нужно для настройки чипа, а также для написания приложения. Библиотеки, о которых вы говорите, написаны на C, а не на asm, поэтому, очевидно, им также не нужно использовать asm.

Если вы хотите изучить внутреннюю работу, напишите свой собственный код. Не используйте эти библиотеки, кроме как для справки. Иногда проще просто взломать его, чем пытаться прочитать их код. (не только ST, но и все поставщики. У одного из поставщиков была строка кода, настолько тревожная, что я использую ее как вопрос для собеседования, нет, не собираюсь публиковать ее здесь).

Безусловно, ST, но и другие производители, для экономии энергии, имеют тактовые импульсы для участков чипа, поэтому, прежде чем вы попытаетесь мигнуть светодиодом, вам нужно найти бит включения для этого блока gpio и посмотреть, выйдет ли он. сброса включен, если нет, то включите его, разговаривая с этой логикой gpio без включенных часов, он просто вешает процессор, ожидая ответа от логики, которая никогда не ответит. Они не всегда говорят вам об этих способностях. После включения они иногда проводят вас через init для некоторого определенного периферийного устройства. Документы ST довольно хороши. Исходя из микрочипа, который получает довольно плохую оценку за документацию, у вас не должно быть проблем.

Старожил
источник
2
ОП не спрашивал ни о процедуре запуска, ни о чем-либо подобном. Какая библиотека лучше всего подходит для его / ее использования.
Фотис Панайотопулос
Asm был упомянут и, таким образом, комментарии на asm
old_timer
2
Кроме того, CMSIS не содержит код, за исключением некоторого минимума. Он не включает в себя стартовый код, скрипты компоновщика или что-то в этом роде. Он содержит только определения для регистров. Зачем писать загадочный код или изобретать велосипед, а не использовать красивое имя для прямого доступа к регистрам?
Фотис Панайотопулос
2
@John Вы можете легко запустить микроконтроллер ARM без каких-либо затрат, одинаково эффективно. Если интересно, задайте новый вопрос и прокомментируйте ссылку здесь, чтобы показать вам несколько примеров.
Фотис Панайотопулос
1
@ user3634713 Я на самом деле очень заинтересован. Спасибо electronics.stackexchange.com/questions/224618/…
Джон
2

Я использовал и то, и другое, просто доступ к регистру и периферийную библиотеку STD. Мне легче просто иметь дело с регистрами. Также, если вы используете отладчик, вы можете просмотреть регистры и подтвердить, что они содержат то, что вы запрограммировали для них. Я думаю, что вы узнаете больше о работе чипа таким же образом.

Джо Маккаррон
источник
2

Исходя из 8-битного мира, я всегда привык программировать периферийные устройства через регистры. В паспортах микроконтроллеров (т. Е. Справочных руководствах по STM32) описывается периферийное оборудование исключительно в регистрационной записи. Поскольку программист должен прочитать эту самую документацию, чтобы узнать о периферийных функциях и возможностях, прежде чем предпринимать какие-либо попытки его использования, для меня естественно начать программирование регистров. С капризным расположением кода и комментариями я считаю, что код можно приятно читать и изменять даже после того, как он вернулся к нему через несколько месяцев.

Адам
источник
2

До сих пор я использовал определения CMSIS и получал удовольствие от непосредственного использования регистров. Между тем, я использовал библиотеки HAL в нескольких проектах. Это оказало значительное влияние на время выполнения кода, поэтому я вышел из него. Хотя CMSIS отвечает моим интересам, в эти дни я собираюсь быть поклонником libopencm3 . Это как LLбиблиотеки, предоставляемые ST. Тем не менее, он охватывает больше микроконтроллеров даже в семействах ST:

Проект libopencm3 (ранее известный как libopenstm32) направлен на создание бесплатной библиотеки прошивки / libre / open-source для различных микроконтроллеров ARM Cortex-M3, включая ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 и другие.

пожалуйста, обратите внимание, что:

Несмотря на название, libopencm3 также поддерживает другие «связанные» микроконтроллеры ARM Cortex, например, такие как Cortex-M0 или Cortex-M4 / Cortex-M4F.

Вы можете найти список поддерживаемых микроконтроллеров здесь .

Пана
источник
Фактическая проблема заключается в том, что ST имеет неверное представление о том, что должен делать HAL. Надлежащий HAL будет иметь такую ​​функцию, adc_get_result()которая заключает в себе полный драйвер периферийного устройства АЦП, включая аспекты в реальном времени, прерывания и т. Д. Похоже, что ST write_to_scary_register- это просто раздутая оболочка для доступа к регистру. Справедливости ради, ST не единственный поставщик, который обеспечивает такое избыточное вздутие, Atmel ASF и другие одинаково плохи.
Лундин