CMSIS - HAL - Standart Çevre Birimleri Kütüphanesi


29

Böylece PIC'lerden ARM'e geçiyorum ve bir STM32F4 keşif panosu satın aldım. Şimdiye kadar bunu programlamak için ya tüm kayıtlara doğrudan bellekte erişebildiğinizi (bariz bir şekilde) anlayabiliyorum ve ayrıca hayatınızı kolaylaştırmak için kullanabileceğiniz 3 ana kütüphane var. Şimdi benim sorum şu, bu üç taneden hangisi (CMSIS, HAL, Std Peripherals Lib) en düşük seviye? yani. daha az ek yüke sahip olan. Amacım denetleyicinin iç işleyişini öğrenmek ve hayatımı kolaylaştırmak değil (sadece biraz), bu yüzden hangisinin meclise başvurmadan başvurmadan çekirdeğe daha yakın olduğunu bilmek istiyorum.


10
[CMSIS'in [STM32 tarafı] aslında sadece tanımları ve kodları kaydetmediğinden, CMSIS == doğrudan kayıt erişimine sahiptir. AFAIK ST'nin yalnızca CMSIS için ayrı bir indirmesi yoktur, ancak StdPeriph Lib veya STM32Cube'ü indirdiğinizde, yalnızca CMSIS bölümünü kullanmayı seçebilirsiniz. STM32 kayıt tanımları, sırasıyla Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hveya Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hsırasıyla bulunur.
Aleksi Torhamo

Yanıtlar:


27

Kesinlikle CMSIS. Tam olarak bir kütüphane değil, çoğunlukla çeşitli kayıtlar için tanımları içeriyor.

Kendi HAL'sini uygulamak için mikrodenetleyicinin kayıtlarına kolayca erişmek için gereken şey tam olarak budur. Genel kayıt yok, çünkü sadece kayıtlara erişirsiniz.

Diğer ikisinin aksine CMSIS'in ST tarafından değil, ARM tarafından tanımlandığını unutmayın. Bu, çeşitli mikrodenetleyiciler için çeşitli CMSIS kitaplıklarının oldukça benzer olduğu anlamına gelir, bu da taşınabilirliğe büyük ölçüde yardımcı olur.

Ayrıca, CMSIS daha basit olanıdır (IMO), muhtemelen daha az (veya hiç) hatayla en çok yönlü ve en güvenilir olandır (IMO). Kullandığım çeşitli mcu'lar için bazı hal kütüphaneleri, böcekleri için oldukça rezil.

Öte yandan, CMSIS'in sizden oldukça fazla çalışmaya ihtiyacı var. Ancak bu benim kişisel seçimim, çünkü zamanımı sadece yeni bir kütüphane öğrenmek için zaman harcayan kaliteli kütüphaneler yaratmaya, ihtiyaçlarıma uygun ve çipin nasıl çalıştığını anlamaya yatırım yapmayı tercih ediyorum.


ST'nin hala CMSIS kütüphanesini desteklediğinden emin değilim
Scott Seidman

1
Şey ... bunun gibi bir şey. Doğrudan bir bağlantı yoktur, vazgeçirirler (kullanıcıları kodlarına olabildiğince bağlamak istiyorlar, başka bir marka için bırakmalarını engellerler gibi görünüyorlar), ancak diğer kütüphanelerinde kullanılıyor. Oradan çıkarabilirsiniz. Bu oldukça basittir, bir kod içermez ve olgun görünür. Desteklenip pazarlanmasa da, üretimde kullanımı güvenli gibi görünüyor.
Fotis Panagiotopoulos

Evet, bu yönde gelişmeyi bıraktıkları için bir serseri. CMSIS uyumluluğu beni en başta ST'ye iten şeylerden biriydi. Hala kullanıyorum, ancak uygun olmayacaksa günün geleceğini hissediyorum.
Scott Seidman

3
@ScottSeidman, CMSIS'i StdPeriph ile karıştırdığınızı düşünüyorum. CMSIS iyi desteklenmektedir ve süresiz olarak desteklenecektir. Temelde şu an kullanımdan kaldırılmış olan StdPeriph'i, ancak CMSIS 10 yıl önce olduğu kadar canlı.
ScienceSamovar

14

Nasıl çalıştığını öğrenmek için yukarıdakilerin hiçbirini kullanmak istemiyorsunuz. Bir kol çapraz derleyici ve st gelen belgeleri alın. Kodlamaya başla. Bu yongalar genellikle programlanması gerçekten kolaydır. belgeler size hangi kayıtların ne yaptığını gösterir.

Bu kütüphanelerin herhangi birinin / hepsinin bu anlayışı / yükü / işi sizden kaldırması ve bir api benzeri bir uygulama programlama deneyimi çağırması gibi hissetmesini sağlaması amaçlanmıştır. Bir çok insanın istediği şey bu. Bu kütüphanelerin bütün kaynağını anlamaya yardımcı olmak için kullanabilirsiniz, ancak bu konuda daha iyi hale geldikçe kütüphanelerde delikler ve problemler, bazen çok korkutucu kodlar bulacaksınız. kod bir araya getirilmiş, bir yongadan diğerine genel ve kabaca yazılmış, belki de yonganızın desteklemediği, vb. özelliklere sahip. Görev için 10 - 100 kez çok fazla kod var, birçoğunun en iyi duruma gelebileceğinden emin olabilirsiniz, ancak neden ilk başta oradalar?

Kendinizinkine gidin ya da bu kütüphanelerden birini kullanıyor olsanız da, ne yaptıklarından memnun olup olmadığını, mantıklıysa, çip belgelerine uyduğunu vb. yanlış giderse nedenini bulmak için sizinki kadar eşyalarını kazmak zorunda kalırsınız.

Çip dokümanlar da mükemmel değil, bu eğlenceli bir parçası.

Montajın neden çıplak metal programlama hakkında bir tartışmada ortaya çıktığını anlamıyorum. Çok az montaj ile alabilirsiniz. Bu cortex-m çipleri için, teknik olarak sadece önyükleme yapmak için bu kadar bir alana ihtiyaç duyarsınız:

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

Ne veriye ne de bss'ye güvenemezsiniz ve asgari seviyeden asm ile geri dönemezsiniz. Ama bu, çıplak metalden en iyi olan için ihtiyacın olan tek şey. Şimdi kesinti yapmak istiyorsanız, vektör tablosunda daha fazla girişe ihtiyacınız var. daha fazla .word satırları. Daha fazla takas öneririm, ama belki 10 veya 20 satır daha.

bu genellikle kullandığım tek şey.

.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

Evet cortex-m0 diyor ama bu benim m4 kodum için gerçek önyükleme. Bunun thumb2 değil thumb olmasını tercih ederim. Ve bu kodu sadece bir korteks-m'den diğerine yeniden kullanıyorum, yığın göstergesinin adresini gerektiği gibi değiştiriyorum, bu yüzden m0, m3 ve m4 için çalışıyor. Henüz bir m7'm yok, ne de çok araştırdım.

Fpu'nun etkinleştirilmesi, belirli talimatlar gerektiğinden birkaç satır daha gerektirebilir. Ancak mesele, düşük seviye programlama ve asm ile karıştırılmamasıdır. C bir uygulama yazmanın yanı sıra çipi yapılandırmak için ihtiyacınız olana sahiptir. Bahsettiğiniz kütüphaneler asm değil de C dilinde yazılmıştır, bu yüzden açıkça kullanmaları da gerekmez.

İçsel çalışmaları öğrenmek istiyorsanız, kendi kodunuzu yazınız. Bu kütüphaneleri referans olarak kullanmayınız. Bazen sadece kodları kırmaya çalışmaktan çok daha kolaydır. (sadece ST değil, tüm satıcılar. Satıcılardan birinin bir kod satırı vardı, bu yüzden endişe verici bir röportaj sorusu olarak kullanıyorum, hiçbiri buraya göndermeyeceğim).

ST kesinlikle ama diğer üreticilerin de güç tasarrufu için saatin çipin bölümlerini etkinleştirebilmesi için, bu nedenle içeri girip bir ışığı yanıp sönmeye çalışmadan önce, o gpio bloğu için etkinleştirme bitini bulup çıkıp çıkmadığını görmeniz gerekir. sıfırlama etkinse, o zaman etkinleştirilmezse, bir gpio mantığıyla bir saate izin vermeden konuşmak, işlemciyi asla yanıt vermeyecek bir mantıktan yanıt beklerken basitçe işlemciyi kapatır. Size her zaman bu olanaklardan bahsetmezler. Etkinleştirildikten sonra bazen belirli bir çevre birimi için initte size yol gösterirler. ST docs oldukça iyi. Belgelendirme için oldukça kötü bir not alan mikroçipten geliyorsanız, bir sorun yaşamazsınız.


2
OP, başlatma prosedürü veya benzeri bir şey hakkında soru sormadı. Hangi kitaplık, kullanımı için çok uygundur.
Fotis Panagiotopoulos

asm bahsedildi ve bu nedenle asm
old_timer

2
Ayrıca CMSIS, minimum düzeyde olmak üzere kod içermez. Başlangıç ​​kodunu, bağlayıcı komut dosyalarını veya benzeri şeyleri içermez. Sadece kayıtlar için tanımları içerir. Kayıtlara doğrudan erişmek için hoş bir ad kullanmak yerine neden şifreli kod yazmalı veya tekerleği yeniden icat etmelisiniz?
Fotis Panagiotopoulos

2
@John Eşit derecede verimli bir şekilde ASM'siz mutlak ASM'li bir ARM mikroişlemcisini kolayca başlatabilirsiniz. İlgileniyorsanız, yeni bir soru sorun ve size birkaç örnek göstermek için buraya bir link yorum yapın.
Fotis Panagiotopoulos

1
@ user3634713 Aslında çok ilgileniyorum. Teşekkür electronics.stackexchange.com/questions/224618/...
John

2

Her ikisini de kullandım, sadece metal kayıt erişimini ve std çevre kütüphanesini kullandım. Kayıtlarla uğraşmayı daha kolay buluyorum. Ayrıca, bir hata ayıklayıcı kullanıyorsanız, kayıtları görüntüleyebilir ve ne için programladığınızı içerdiklerini doğrulayabilirsiniz. Bence bu şekilde çipin çalışması hakkında daha fazla şey öğreniyorsunuz.


2

8bit dünyadan gelince, her zaman çevre birimlerini yazmaçlarla programlamaya alıştım. Mikrodenetleyici veri sayfaları (örn. STM32 referans kılavuzları) çevre kayıtlarını sadece kayıt notasyonu ile açıklamaktadır. Programcı, herhangi bir girişimde bulunmadan önce çevresel işlevler ve özellikler hakkında bilgi sahibi olmak için bu aynı belgeyi okuması gerektiğinden, kayıtları programlamaya başlamak bana doğal geliyor. Dikkatli kod düzeni ve yorumlarla kodun aylar sonra geri döndükten sonra bile okunması ve değiştirilmesi hoş bir şey olabilir.


2

Şimdiye kadar CMSIS tanımlarını kullandım ve doğrudan kayıtları kullanmaktan zevk aldım. Bu arada, birkaç projede HAL kütüphanelerini kullandım. Kod çalıştırma süresi üzerinde önemli bir etkisi vardı, bu yüzden bıraktım. Her ne kadar CMSIS ilgime hizmet etse de, bugünlerde libopencm3 hayranı olacağım . LLST tarafından sağlanan kütüphaneler gibidir . Bununla birlikte, ST ailelerinde bile daha fazla mikro denetleyiciyi kapsar:

Libopencm3 projesi (daha önce libopenstm32 olarak bilinir), ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 ve diğerleri de dahil olmak üzere çeşitli ARM Cortex-M3 mikrodenetleyicileri için ücretsiz / libre / açık kaynaklı bir ürün yazılımı kütüphanesi oluşturmayı amaçlamaktadır.

lütfen bunu not al:

İsmine rağmen, libopencm3, örneğin Cortex-M0 veya Cortex-M4 / Cortex-M4F olanlar gibi diğer ARM Cortex "ilişkili" mikrodenetleyicilerini de destekler.

Desteklenen mikro denetleyicilerin listesini burada bulabilirsiniz .


Asıl sorun, ST'nin bir HAL'ın ne yapması gerektiği konusunda yanlış fikre sahip olmasıdır. Uygun bir HAL, adc_get_result()gerçek zamanlı yönler, kesintiler vs. dahil olmak üzere tüm ADC çevre birim sürücüsüne sarar, gibi bir işleve sahip olacaktır write_to_scary_register. Adil olmak gerekirse, ST bu kadar fazla şişkinlik sağlayan tek satıcı değil, Atmel ASF ve diğerleri eşit derecede kötü.
Lundin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.