CMSIS 및 HAL 및 표준 주변기기 라이브러리


29

PICs에서 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각각에 있습니다.
Aleksi Torhamo

답변:


27

확실히 CMSIS. 이것은 정확히 라이브러리가 아니며 대부분 다양한 레지스터에 대한 정의를 포함합니다.

자신의 HAL을 구현하려면 마이크로 컨트롤러의 레지스터에 쉽게 액세스해야합니다. 레지스터에 액세스하기 때문에 오버 헤드가 없습니다.

CMSIS는 다른 두 가지와 달리 ST가 아닌 ARM에 의해 정의됩니다. 이는 다양한 마이크로 컨트롤러를위한 다양한 CMSIS 라이브러리가 상당히 유사하여 이식성을 크게 지원한다는 것을 의미합니다.

또한 CMSIS가 더 단순하므로 버그가 적거나 없을 수있는 가장 다재다능하고 신뢰할 수있는 (IMO) 것입니다. 내가 사용한 다양한 MCU에 대한 일부 정지 라이브러리는 버그로 유명합니다.

반면 CMSIS는 더 많은 작업이 필요합니다. 그러나 필자는 필자가 필요로하는 양질의 라이브러리를 만들고 칩이 작동하는 방식을 이해하고 새로운 라이브러리를 배우기 위해 시간을 투자하는 데 시간을 투자하기를 선호하기 때문에 개인적인 선택입니다.


ST가 여전히 CMSIS 라이브러리를 지원하는지 잘 모르겠습니다
Scott Seidman

1
글쎄 .. 직접적인 링크는 없으며, 사용자를 코드에 최대한 묶어 다른 브랜드로 떠나는 것을 원하지 않는 것처럼 보이지만 다른 라이브러리에서는 사용됩니다. 거기에서 추출 할 수 있습니다. 그것은 매우 간단하고 많은 코드를 포함하지 않으며 성숙해 보입니다. 지원 대상으로 판매하는지 여부에 관계없이 프로덕션 용도로 안전합니다.
Fotis Panagiotootopoulos 2014 년

그래, 그 방향으로의 개발을 중단 한 것은 번거 롭다. CMSIS 규정 준수는 처음에 ST로 이끌어 준 것 중 하나였습니다. 나는 아직도 그것을 사용하지만, 편리하지 않을 때가 올 것 같은 느낌이 듭니다.
Scott Seidman

3
@ScottSeidman, CMSIS를 StdPeriph와 혼동했다고 생각합니다. CMSIS는 잘 지원되며 무기한 지원 될 것입니다. 현재 기본적으로 사용되지 않는 StdPeriph이지만 CMSIS는 10 년 전에 살아 있습니다.
ScienceSamovar

14

그것이 어떻게 작동하는지 배우려면 위의 어느 것도 사용하지 않으려합니다. st에서 arm cross 컴파일러와 문서를 얻으십시오. 코딩을 시작하십시오. 이러한 칩은 일반적으로 프로그래밍하기가 쉽습니다. 이 문서는 레지스터가 어떤 비트를 수행하는지 알려줍니다.

이러한 라이브러리는 모두 이해 / 부담 / 작업을 제거하고 어플리케이션 프로그래밍 경험과 같은 API를 호출하는 것처럼 느끼도록하기위한 것입니다. 많은 사람들이 원하는 것입니다. 이러한 라이브러리에 대한 모든 소스를 사용하여 이해하는 데 도움이 될 수 있지만, 라이브러리에 익숙해지면 라이브러리에서 구멍과 문제, 때로는 매우 무서운 코드를 발견하게됩니다. 코드가 함께 던져져 일반적으로 작성되고 대략 한 칩에서 다른 칩으로 포팅되어 칩에없는 기능 등을 지원할 수 있습니다. 그리고 모두 오버 헤드가 너무 많습니다. 작업에 너무 많은 코드를 10 ~ 100 배 많이 사용하면 많은 코드가 최적화 될 수 있지만 왜 처음에 존재합니까?

자신이 사용하든 이러한 라이브러리 중 하나를 사용하든, 자신이하는 일에 익숙한 지, 이해가되는지, 칩 문서와 일치하는지 등을 확인하기 위해 사용하는 라이브러리의 소스를 계속 살펴 봐야합니다. 잘못되면 당신은 그 이유를 찾기 위해 당신의 것만 큼 많은 것을 파헤쳐 야 할 것입니다.

칩 문서도 완벽하지 않다는 점에 주목하십시오. 그것은 재미의 일부입니다.

베어 메탈 프로그래밍에 대한 토론에서 어셈블리가 나타나는 이유를 이해하지 못합니다. 아주 적은 조립으로 얻을 수 있습니다. 이러한 cortex-m 칩의 경우 기술적으로 부팅하려면 많은 양의 asm이 필요합니다.

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

당신은 데이터 나 BS에 의존 할 수 없으며 최소한의 asm으로 main에서 돌아올 수 없습니다. 그러나 그것은 당신이 맨손으로 금속을 생산하는 데 필요한 모든 것입니다. 이제 인터럽트를 수행하려면 벡터 테이블에 더 많은 항목이 필요합니다. 더 많은 .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 코드의 실제 부트 스트랩입니다. 나는 이것을 thumb2가 아닌 thumb으로 선호합니다. 그리고이 코드를 한 cortex-m에서 다른 cortex-m으로 재사용하여 스택 포인터 주소를 필요에 따라 변경하므로 m0, m3 및 m4에서 작동합니다. 나는 아직 m7을 가지고 있지도 않고 많이 연구하지도 않았습니다.

fpu를 활성화하려면 특정 지침이 필요하므로 몇 줄의 asm이 더 필요할 수 있습니다. 그러나 요점은 저수준 프로그래밍과 asm을 혼동하지 않는다는 것입니다. C에는 칩을 구성하고 응용 프로그램을 작성하는 데 필요한 것이 있습니다. 당신이 이야기하는 라이브러리는 asm이 아닌 C로 작성되었으므로 asm을 사용할 필요는 없습니다.

내부 작업을 배우려면 자신의 코드를 작성하십시오. 이러한 라이브러리를 참조 용으로 사용하지 마십시오. 때로는 코드를 읽는 것보다 해킹하는 것이 더 쉬운 경우가 있습니다. (ST뿐만 아니라 모든 공급 업체도 있습니다. 공급 업체 중 하나에 코드 줄이있어서 인터뷰 질문으로 사용합니다. 여기에 게시하지 않을 것입니다).

ST는 확실히하지만 다른 공급 업체도 전력을 절약하고 칩의 섹션에 대해 클럭을 활성화하므로 LED를 깜박이려면 gpio 블록의 활성화 비트를 찾아서 나오는지 확인해야합니다. 리셋이 활성화 된 경우 활성화되지 않은 경우 클럭없이 GPIO 로직과 통신하면 결코 응답하지 않는 로직의 응답을 기다리는 동안 프로세서가 중단됩니다. 그들은 항상 이러한 기능에 대해 말하지 않습니다. 활성화되면 때로는 특정 주변 장치의 초기화 단계를 안내합니다. ST 문서는 꽤 좋습니다. 문서화에있어 상당히 나쁜 등급을받는 마이크로 칩에서 나온다면 문제가 없을 것입니다.


2
OP는 시동 절차 또는 이와 유사한 것에 대해 묻지 않았습니다. 어떤 라이브러리가 자신의 용도에 가장 적합합니까?
Fotis Panagiotootopoulos 2014 년

asm이 언급되어 asm에 대한 의견
old_timer

2
또한 CMSIS에는 최소한의 코드 만 포함되어 있습니다. 시작 코드, 링커 스크립트 또는 이와 유사한 것은 포함되지 않습니다. 레지스터에 대한 정의 만 포함합니다. 좋은 이름을 사용하여 레지스터에 직접 액세스하는 대신 암호 코드를 작성하거나 휠을 재발 명하는 이유는 무엇입니까?
Fotis Panagiotootopoulos 2014 년

2
@John 동일하게 ASM을 전혀 사용하지 않고도 ARM 마이크로 컨트롤러를 쉽게 시작할 수 있습니다. 관심이 있다면 새로운 질문을하고 여기에 링크를 달아 몇 가지 예를 보여줍니다.
Fotis Panagiotootopoulos 2014 년

1
@ user3634713 저는 실제로 매우 관심이 있습니다. 감사합니다 electronics.stackexchange.com/questions/224618/…
John

2

베어 메탈 레지스터 액세스와 표준 주변 장치 라이브러리를 모두 사용했습니다. 레지스터를 다루는 것이 더 쉽다는 것을 알았습니다. 또한 디버거를 사용하는 경우 레지스터를보고 프로그래밍 한 내용이 레지스터에 있는지 확인할 수 있습니다. 그런 식으로 칩 작동에 대해 더 많이 알고 있다고 생각합니다.


2

8 비트 세계에서 온 나는 항상 레지스터를 통해 주변 장치를 프로그래밍하는 데 익숙했습니다. 마이크로 컨트롤러 데이터 시트 (예 : STM32 참조 매뉴얼)는 레지스터 표기법으로 만 주변 장치를 설명합니다. 프로그래머는 주변 장치의 기능과 기능을 사용하기 전에이 같은 문서를 읽어야하기 때문에 레지스터 프로그래밍을 시작하는 것이 당연합니다. 많은 코드 레이아웃과 주석을 달면 몇 개월 후에 코드를 다시 읽은 후에도 코드를 즐겁게 읽고 수정할 수 있습니다.


2

지금까지 CMSIS 정의를 사용했으며 레지스터를 직접 사용하는 것을 즐겼습니다. 한편, 몇몇 프로젝트에서 HAL 라이브러리를 사용했습니다. 코드 실행 시간에 상당한 영향을 미쳤으므로 종료했습니다. CMSIS가 제 관심을 받고 있지만 요즘 에는 libopencm3 의 팬이 될 것 입니다. LLST에서 제공하는 라이브러리 와 같습니다 . 그러나 ST 제품군에서도 더 많은 마이크로 컨트롤러를 다루고 있습니다.

libopencm3 프로젝트 (이전의 libopenstm32)는 ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 등 다양한 ARM Cortex-M3 마이크로 컨트롤러를위한 무료 / libre / open-source 펌웨어 라이브러리를 만드는 것을 목표로합니다.

점에 유의하시기 바랍니다:

이름에도 불구하고, libopencm3은 예를 들어 Cortex-M0 또는 Cortex-M4 / Cortex-M4F와 같은 다른 ARM Cortex "관련"마이크로 컨트롤러도 지원합니다.

지원되는 마이크로 컨트롤러 목록은 여기를 참조하십시오 .


실제 문제는 ST가 HAL이해야 할 일에 대해 잘못 알고 있다는 것입니다. 적절한 HAL은 adc_get_result()실시간 측면, 인터럽트 등을 포함한 완전한 ADC 주변 장치 드라이버에서 랩핑 하는 것과 같은 기능 을합니다. ST write_to_scary_register는 기본적으로 레지스터 액세스 주변의 부풀린 랩퍼 인 것 같습니다 . 모든 공정성에서, ST가 그러한 과잉 팽만감을 제공하는 유일한 공급 업체는 아니며 Atmel ASF와 다른 업체들도 마찬가지로 나쁘다.
Lundin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.