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 для різних процесорів, які я використовував, є досить сумно відомими для своїх помилок.

З іншого боку, CMSIS потребує від вас значно більшої роботи. Однак це мій особистий вибір, оскільки я вважаю за краще вкладати свій час, створюючи якісні бібліотеки, які відповідають моїм потребам та розуміння того, як працює чіп, просто витрачаю час на вивчення лише нової бібліотеки.


Я не впевнений, що ST все ще підтримує бібліотеку CMSIS
Скотт Сейдман

1
Ну ... щось подібне. Прямого посилання немає, вони відштовхують його (схоже, вони хочуть якомога більше прив’язати користувачів до свого коду, відмовляючи їм залишати якусь іншу марку), але він використовується в інших їхніх бібліотеках. Ви можете витягти його звідти. Він досить простий, не включає багато коду і здається зрілим. Виглядає як безпечний для використання, незалежно від того, продають вони його як підтримуваний чи ні.
Фотіс Панагіотопулос

Так, це непросто, що вони перестали розвиватися в цьому напрямку. Відповідність CMSIS була однією з речей, яка привернула мене до ST в першу чергу. Я все ще користуюся ним, але маю відчуття, що настане день, коли це буде не зручно.
Скотт Сейдман

3
@ScottSeidman, я думаю, ви переплутали CMSIS зі StdPeriph. CMSIS добре підтримується і буде підтримуватися нескінченно. Її StdPeriph, яка в основному застаріла зараз, але CMSIS така ж жива, як і 10 років тому.
ScienceSamovar

14

Щоб дізнатися, як це працює, не потрібно використовувати жодне з перерахованого вище. Отримайте компілятор арматурного хреста та документацію від st. Почніть кодування. ці фішки, як правило, дуже легко програмувати. документація розповідає про те, які біти в яких регістрах роблять для чого.

Будь-яка / всі ці бібліотеки призначені для того, щоб зняти з вас таке розуміння / тягар / роботу і зробити так, щоб просто почути такий вигляд, як досвід програмування додатків. А це те, чого хоче багато людей. Ви можете використовувати все джерело для цих бібліотек, щоб допомогти зрозуміти, але, коли ви вдосконалюєтесь, ви виявляєте дірки та проблеми в бібліотеках, іноді дуже страшний код. код кидається разом, пишеться загалом і грубо переноситься з однієї мікросхеми на іншу, можливо, підтримує функції, які ваш чіп не має, і т. д. І всі вони мають надмірну кількість накладних витрат. Від 10 до 100 разів занадто багато коду для завдання, впевнено, що багато чого може оптимізуватись, але навіщо це в першу чергу?

Незалежно від того, чи є ви власною чи використовуєте одну з цих бібліотек, ви все одно повинні переглянути джерело бібліотек, якими ви користуєтесь, щоб побачити, чи вам комфортно з тим, що вони роблять, якщо це має сенс, відповідає чіп-документації тощо. Коли щось помиляється, вам, ймовірно, доведеться перекопати їх речі стільки, скільки і ваші, щоб дізнатися, чому.

Зауважте, чип-документи також не є ідеальними, що є частиною задоволення.

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

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

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

це, як правило, вся asm, яку я використовую.

.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. Я вважаю за краще, щоб це був великий палець, а не великий палець2. І я просто повторно використовую цей код від однієї кори-м до іншої, змінюючи за необхідністю адресу вказівника стека, щоб він працював для m0, m3 та m4. У мене ще немає m7, і я його багато не досліджував.

Увімкнення fpu може зажадати ще декількох рядків asm, оскільки потрібні конкретні інструкції. Але справа в тому, щоб не плутати програмування низького рівня та ASM. C має те, що потрібно для налаштування чіпа, а також написання програми. Бібліотеки, про які ви говорите, написані в C не asm, тому очевидно, їм також не потрібно використовувати ASM.

Якщо ви хочете дізнатися внутрішню роботу, напишіть власний код. Не використовуйте ці бібліотеки, окрім як посилання. Іноді легше просто зламати це, ніж намагатися читати їх код. (не тільки для ST, але для всіх постачальників. Один з постачальників мав рядок коду, настільки тривожний, що я використовую його як питання інтерв'ю, але не збираюся його розміщувати тут).

ST безперечно, але для інших енергоносіїв, щоб заощадити енергію, передбачено можливість включення годин для розділів мікросхеми, тому перед тим, як увійти і спробувати замигнути світлодіод, вам потрібно знайти біт включення для цього блоку gpio і подивитися, якщо він виходить увімкнено скидання, якщо не ввімкнути його, розмовляючи з цією логікою gpio без годинника, що дозволяє йому просто висить процесор, оскільки він чекає відповіді з логіки, яка ніколи не відповість. Вони не завжди розповідають вам про ці можливості. Після включення тоді вони іноді проводять вас через ініт для певної периферії. Документи ST досить непогані. Виходячи з мікрочіпа, який отримує досить погану оцінку для документації, у вас не повинно виникнути проблем.


2
ОП не запитувала про процедуру запуску чи щось подібне. Яка саме бібліотека найбільше підходить для його використання.
Фотіс Панагіотопулос

asm згадувався, і таким чином коментарі до asm
old_timer

2
Також CMSIS не містить коду, за винятком деякого мінімуму. Він не включає код запуску, сценарії зв’язків або щось подібне. Він містить лише визначення для регістрів. Навіщо писати криптовалютний код або винаходити колесо, а не використовувати приємне ім'я для доступу до регістрів безпосередньо?
Фотіс Панагіотопулос

2
@John Ви можете легко запустити мікроконтролер ARM з абсолютною відсутністю ASM, однаково ефективно. Якщо зацікавлені, задайте нове запитання та прокоментуйте тут посилання, щоб показати вам кілька прикладів.
Фотіс Панагіотопулос

1
@ user3634713 Мене насправді дуже цікавить. Дякую electronics.stackexchange.com/questions/224618/…
Джон

2

Я використав і те, і інше, лише доступ до реєстру голого металу та периферійну бібліотеку std. Мені легше просто мати справу з реєстрами. Крім того, якщо ви використовуєте відладчик, ви можете переглядати регістри та підтвердити, що вони містять те, що ви їх запрограмували. Я думаю, ви також дізнаєтесь більше про роботу мікросхеми саме таким чином.


2

Походячи з 8-бітового світу, я завжди звик програмувати периферійні пристрої через регістри. Інформаційні таблиці мікроконтролерів (тобто посібники з STM32) описують периферійні пристрої виключно в реєстрі. Оскільки програміст повинен прочитати цю саму документацію, щоб знати про периферійні функції та особливості перед будь-якою спробою її використання, то мені здається природним почати програмування регістрів. Завдяки продуманому розміщенню коду та коментуванням, я вважаю, що код може бути приємно читати та змінювати навіть після повернення до нього місяцями пізніше.


2

До цього часу я використовував визначення CMSIS і користувався регістрами безпосередньо. Тим часом я використовував бібліотеки HAL у кількох проектах. Це мало значний вплив на час роботи коду, тому я його кинув. Хоча CMSIS слугує моїм інтересам, я сьогодні буду шанувальником libopencm3 . Це якLL бібліотеки, надані ST. Однак він охоплює більше мікроконтролерів навіть у сімействах ST:

Проект libopencm3 (раніше відомий як libopenstm32) має на меті створити вільну / вільну / відкриту бібліотеку мікропрограмного забезпечення для різних мікроконтролерів 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 та інші однаково погані.
Лундін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.