CMSIS vs HAL vs Perpustakaan Periferal Standar

29

Jadi saya beralih dari PIC ke ARM dan saya membeli papan penemuan STM32F4. Sejauh ini saya mengerti bahwa untuk memprogramnya Anda dapat mengakses semua register secara langsung dalam memori (cara yang jelas) dan juga ada 3 perpustakaan utama yang dapat Anda gunakan untuk membuat hidup Anda lebih mudah. Sekarang pertanyaan saya adalah, yang mana dari 3 (CMSIS, HAL, Std Peripherals Lib) yang merupakan level paling rendah? yaitu. yang dengan overhead yang lebih sedikit. Tujuan saya adalah mempelajari cara kerja pengendali dan tidak membuat hidup saya lebih mudah (hanya sedikit), jadi saya ingin tahu yang mana yang lebih dekat dengan inti tanpa menggunakan perakitan.

John
sumber
10
[Sisi STM32] CMSIS pada dasarnya hanya mendaftarkan definisi dan tidak ada kode, jadi CMSIS == akses register langsung. AFAIK ST tidak memiliki unduhan terpisah hanya untuk CMSIS, tetapi ketika Anda mengunduh StdPeriph Lib atau STM32Cube, Anda dapat memilih untuk hanya menggunakan bagian CMSIS saja. Definisi register STM32 ditemukan di salah satu Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hatau Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hmasing - masing.
Aleksi Torhamo

Jawaban:

27

Pasti CMSIS. Ini bukan perpustakaan, itu kebanyakan berisi definisi untuk berbagai register.

Ini persis apa yang dibutuhkan seseorang untuk mengakses register mikrokontroler dengan mudah, sehingga dapat mengimplementasikan HALnya sendiri. Tidak ada overhead, karena Anda hanya mengakses register.

Perlu diingat bahwa CMSIS, tidak seperti dua lainnya, didefinisikan oleh ARM dan bukan ST. Ini berarti bahwa berbagai perpustakaan CMSIS di luar sana untuk berbagai mikrokontroler sangat mirip, yang sangat membantu dalam portabilitas.

Selain itu, CMSIS adalah yang lebih sederhana sehingga (IMO) yang paling serbaguna, dan paling dapat diandalkan, dengan kemungkinan lebih sedikit (atau tidak ada) bug. Beberapa perpustakaan hal untuk berbagai MCU yang saya gunakan cukup terkenal untuk bug mereka.

Di sisi lain, CMSIS membutuhkan lebih banyak pekerjaan dari Anda. Namun itu adalah pilihan pribadi saya, karena saya lebih suka menginvestasikan waktu saya membuat perpustakaan berkualitas, yang sesuai dengan kebutuhan saya, dan memahami cara kerja chip, yang hanya menghabiskan waktu untuk belajar hanya perpustakaan baru.

Fotis Panagiotopoulos
sumber
Saya tidak yakin bahwa ST masih mendukung perpustakaan CMSIS
Scott Seidman
1
Ya ... sesuatu seperti itu. Tidak ada tautan langsung, mereka mencegahnya (sepertinya mereka ingin mengikat pengguna sebanyak mungkin dengan kode mereka, mencegah mereka meninggalkan merek lain), tetapi itu digunakan di perpustakaan mereka yang lain. Anda dapat mengekstraknya dari sana. Ini cukup sederhana, tidak termasuk banyak kode, dan tampaknya matang. Sepertinya aman untuk penggunaan produksi, tidak peduli apakah mereka memasarkannya sebagai didukung atau tidak.
Fotis Panagiotopoulos
Ya, itu menyedihkan bahwa mereka berhenti berkembang ke arah itu. Kepatuhan CMSIS adalah salah satu hal yang membuat saya tertarik pada ST. Saya masih menggunakannya, tetapi saya punya firasat hari akan datang ketika itu tidak nyaman.
Scott Seidman
3
@ScottSeidman, saya pikir Anda bingung CMSIS dengan StdPeriph. CMSIS didukung dengan baik dan akan didukung tanpa batas waktu. StdPeriph-nya pada dasarnya sudah usang sekarang, tetapi CMSIS masih hidup 10 tahun yang lalu.
ScienceSamovar
14

Untuk mempelajari cara kerjanya, Anda tidak ingin menggunakan yang di atas. Dapatkan compiler arm cross dan dokumentasi dari st, selesai. Mulai coding. chip ini umumnya sangat mudah diprogram. dokumentasi memberi tahu Anda apa bit dalam register apa melakukan apa.

Setiap / semua perpustakaan ini dimaksudkan untuk menghilangkan pemahaman / beban / pekerjaan dari Anda dan membuatnya merasa seperti hanya memanggil api seperti pengalaman pemrograman aplikasi. Itulah yang diinginkan banyak orang. Anda dapat menggunakan semua sumber untuk pustaka ini untuk membantu memahami, tetapi saat Anda menjadi lebih baik, Anda menemukan lubang dan masalah di pustaka, kadang-kadang kode yang sangat menakutkan. kode dilemparkan bersama, ditulis secara umum dan secara kasar porting dari satu chip ke yang lain, mungkin fitur pendukung yang tidak dimiliki chip Anda, dll. Dan mereka semua memiliki jumlah overhead yang berlebihan. 10 hingga 100 kali terlalu banyak kode untuk tugas itu, tentu banyak yang dapat mengoptimalkan tetapi mengapa ada di sana di tempat pertama?

Apakah Anda pergi sendiri atau menggunakan salah satu perpustakaan ini, Anda harus tetap melihat sumber untuk perpustakaan yang Anda gunakan untuk melihat apakah Anda merasa nyaman dengan apa yang mereka lakukan, jika masuk akal, cocok dengan dokumentasi chip, dll. Ketika sesuatu salah Anda cenderung harus menggali barang-barang mereka sebanyak milik Anda untuk mencari tahu mengapa.

Perhatikan bahwa chip docs juga tidak sempurna, itu adalah bagian dari kesenangan.

Saya tidak mengerti mengapa perakitan muncul dalam diskusi tentang pemrograman bare metal. Anda bisa bertahan dengan sangat sedikit perakitan. Untuk chip korteks-m ini, secara teknis Anda hanya membutuhkan sebanyak ini untuk di-boot:

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

Anda tidak dapat mengandalkan data atau bss dan Anda tidak dapat kembali dari main dengan minimal ASM. Tapi itu semua yang Anda BUTUHKAN untuk mendapatkan logam telanjang. Sekarang jika Anda ingin melakukan interupsi Anda perlu lebih banyak entri dalam tabel vektor. lebih banyak baris kata. Saya merekomendasikan lebih banyak asm, tapi mungkin 10 atau 20 baris lebih.

ini biasanya semua asm yang saya gunakan.

.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

Ya katanya cortex-m0 tapi ini bootstrap yang sebenarnya untuk kode m4 saya. Saya lebih suka ini jempol bukan jempol2. Dan saya hanya menggunakan kembali kode ini dari satu korteks-m ke yang lain, mengubah alamat penunjuk tumpukan yang diperlukan, sehingga bekerja untuk m0, m3 dan m4. Saya belum punya m7, saya juga belum banyak meneliti.

Mengaktifkan fpu mungkin memerlukan beberapa baris asm lagi karena instruksi khusus diperlukan. Tapi intinya adalah jangan bingung pemrograman tingkat rendah dan asm. C memiliki apa yang Anda butuhkan untuk mengkonfigurasi chip, serta menulis aplikasi. Perpustakaan yang Anda bicarakan ditulis dalam C bukan asm, jadi jelas mereka tidak perlu menggunakan asm juga.

Jika Anda ingin mempelajari cara kerja bagian dalam, tulis kode Anda sendiri. Jangan gunakan pustaka ini selain sebagai referensi. Terkadang lebih mudah untuk meretasnya daripada mencoba membaca kode mereka. (bukan hanya ST tetapi semua vendor. Salah satu vendor memiliki sederetan kode sehingga saya menggunakannya sebagai pertanyaan wawancara, tidak akan memposting di sini).

ST tentu saja tetapi vendor lain juga, untuk menghemat daya, memiliki jam yang memungkinkan untuk beberapa bagian dari chip, jadi sebelum Anda masuk dan mencoba untuk mengedipkan sebuah led, Anda perlu menemukan bit aktif untuk blok gpio itu dan melihat apakah itu keluar dari reset diaktifkan, jika tidak kemudian mengaktifkannya, berbicara dengan logika gpio tanpa jam memungkinkan itu hanya menggantung prosesor karena sedang menunggu respons dari logika yang tidak akan pernah merespons. Mereka tidak selalu memberi tahu Anda tentang ini memungkinkan. Setelah diaktifkan maka mereka terkadang memandu Anda melalui init untuk beberapa perangkat tertentu. Dokumen ST cukup bagus. Berasal dari microchip yang mendapat nilai buruk untuk dokumentasi, Anda seharusnya tidak memiliki masalah.

old_timer
sumber
2
OP tidak bertanya tentang prosedur start-up, atau semacamnya. Pustaka mana yang paling cocok untuk penggunaannya.
Fotis Panagiotopoulos
asm disebutkan dan dengan demikian komentar pada asm
old_timer
2
Juga CMSIS tidak mengandung kode, kecuali beberapa minimum. Itu tidak termasuk kode start-up, skrip linker atau semacamnya. Ini hanya berisi definisi untuk register. Mengapa menulis kode samar, atau menemukan kembali roda, alih-alih menggunakan nama yang bagus untuk mengakses register secara langsung?
Fotis Panagiotopoulos
2
@ John Anda dapat dengan mudah memulai mikrokontroler ARM dengan absolutelly tanpa ASM, sama efisiennya. Jika tertarik ajukan pertanyaan baru, dan beri komentar tautan di sini untuk menunjukkan beberapa contoh.
Fotis Panagiotopoulos
1
@ user3634713 Saya sebenarnya sangat tertarik. Terima kasih electronics.stackexchange.com/questions/224618/…
John
2

Saya telah menggunakan keduanya, hanya akses register logam kosong dan perpustakaan periferal std. Saya merasa lebih mudah hanya untuk berurusan dengan register. Juga jika Anda menggunakan debugger, Anda dapat melihat register dan mengonfirmasi bahwa register itu berisi apa yang telah Anda programkan. Saya pikir Anda belajar lebih banyak tentang pengoperasian chip dengan cara itu juga.

Joe McCarron
sumber
2

Datang dari dunia 8bit saya selalu terbiasa dengan pemrograman peripheral melalui register. Lembar data mikrokontroler (yaitu manual referensi STM32) menjelaskan periferal secara eksklusif dalam notasi register. Karena programmer harus membaca dokumentasi yang sama ini untuk mengetahui tentang fungsi periferal dan fitur-fitur sebelum ada upaya untuk menggunakannya maka tampaknya wajar bagi saya untuk mulai memprogram register. Dengan tata letak kode yang penuh perhatian dan komentar saya menemukan kode dapat menyenangkan untuk membaca dan memodifikasi bahkan setelah kembali lagi beberapa bulan kemudian.

Adam
sumber
2

Sampai sekarang saya telah menggunakan definisi CMSIS dan menikmati menggunakan register secara langsung. Sementara itu, saya menggunakan perpustakaan HAL di beberapa proyek. Itu memiliki pengaruh yang cukup besar pada waktu menjalankan kode jadi saya berhenti. Meskipun CMSIS melayani minat saya, hari ini saya akan menjadi penggemar libopencm3 . Ini seperti LLperpustakaan yang disediakan oleh ST. Namun, itu mencakup lebih banyak pengendali mikro bahkan dalam keluarga ST:

Proyek libopencm3 (sebelumnya dikenal sebagai libopenstm32) bertujuan untuk membuat perpustakaan firmware bebas / libre / open-source untuk berbagai mikrokontroler ARM Cortex-M3, termasuk ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 dan lainnya.

harap dicatat bahwa:

Terlepas dari namanya, libopencm3 juga mendukung mikrokontroler ARM Cortex "terkait" lainnya seperti Cortex-M0 atau Cortex-M4 / Cortex-M4F, misalnya.

Anda dapat menemukan daftar pengendali mikro yang didukung di sini .

Pana
sumber
Masalah sebenarnya adalah bahwa ST memiliki gagasan yang salah tentang apa yang seharusnya dilakukan oleh HAL. HAL yang tepat akan memiliki fungsi seperti adc_get_result()yang membungkus driver periferal ADC lengkap termasuk aspek real-time, interupsi dll. Yang ST sepertinya write_to_scary_registeradalah yang pada dasarnya hanya pembungkus membengkak di sekitar akses register. Dalam semua keadilan, ST bukan satu-satunya vendor yang memberikan kelebihan seperti itu, Atmel ASF dan lainnya sama buruknya.
Lundin