CMSIS vs HAL vs Thư viện ngoại vi tiêu chuẩn


29

Vì vậy, tôi đang chuyển từ PIC sang ARM và tôi đã mua một bảng khám phá STM32F4. Cho đến nay tôi hiểu rằng để lập trình nó, bạn có thể truy cập tất cả các thanh ghi trực tiếp vào bộ nhớ (cách rõ ràng) và cũng có 3 thư viện chính bạn có thể sử dụng để làm cho cuộc sống của bạn dễ dàng hơn. Bây giờ câu hỏi của tôi là, cái nào trong số 3 (CMSIS, HAL, Std ngoại vi Lib) là mức thấp nhất? I E. một với ít chi phí Mục tiêu của tôi là tìm hiểu hoạt động bên trong của bộ điều khiển và không làm cho cuộc sống của tôi dễ dàng hơn (chỉ một chút), vì vậy tôi muốn biết cái nào gần với lõi hơn mà không cần dùng đến lắp ráp.


10
[Phía STM32 của] CMSIS về cơ bản chỉ là các định nghĩa đăng ký và không có mã, vì vậy CMSIS == truy cập đăng ký trực tiếp. AFAIK ST không có bản tải xuống riêng cho chỉ CMSIS, nhưng khi bạn tải xuống StdPeriph Lib hoặc STM32Cube, bạn có thể chọn chỉ sử dụng phần CMSIS. Các định nghĩa thanh ghi STM32 được tìm thấy trong một Libraries/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.hhoặc Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.htương ứng.
Aleksi Torhamo

Câu trả lời:


27

Chắc chắn là CMSIS. Nó không chính xác là một thư viện, nó chủ yếu chứa các định nghĩa cho các thanh ghi khác nhau.

Đó chính xác là những gì người ta cần để truy cập vào các thanh ghi của vi điều khiển một cách dễ dàng, để thực hiện HAL của riêng mình. Nó không có phí, vì bạn chỉ cần truy cập vào các thanh ghi.

Hãy nhớ rằng CMSIS, không giống như hai cái kia, được định nghĩa bởi ARM và không phải ST. Điều này có nghĩa là các thư viện CMSIS khác nhau dành cho các bộ vi điều khiển khác nhau khá giống nhau, điều này hỗ trợ rất nhiều cho tính di động.

Hơn nữa, CMSIS là đơn giản hơn vì vậy (IMO) là linh hoạt nhất và đáng tin cậy nhất, có thể có ít (hoặc không có) lỗi. Một số thư viện hal cho các mcu khác nhau mà tôi đã sử dụng khá khét tiếng vì lỗi của họ.

Mặt khác, CMSIS cần khá nhiều công việc từ bạn. Tuy nhiên, đó là lựa chọn cá nhân của tôi, vì tôi thích đầu tư thời gian của mình để tạo ra các thư viện chất lượng, phù hợp với nhu cầu của tôi và hiểu cách thức hoạt động của chip, chỉ cần dành thời gian để tìm hiểu một thư viện mới.


Tôi không chắc chắn rằng ST vẫn hỗ trợ thư viện CMSIS
Scott Seidman

1
Chà ... một cái gì đó như thế. Không có liên kết trực tiếp, họ không khuyến khích điều đó (có vẻ như họ muốn ràng buộc người dùng càng nhiều càng tốt với mã của họ, không khuyến khích họ để lại cho một số thương hiệu khác), nhưng nó được sử dụng trong các thư viện khác của họ. Bạn có thể giải nén nó từ đó. Nó khá đơn giản, không bao gồm nhiều mã và có vẻ chín chắn. Có vẻ như nó an toàn cho sử dụng sản xuất, bất kể họ có tiếp thị nó như được hỗ trợ hay không.
Fotis Panagiotopoulos

Vâng, đó là một người lập dị rằng họ đã ngừng phát triển theo hướng đó. Việc tuân thủ CMSIS là một trong những điều thu hút tôi đến ST ngay từ đầu. Tôi vẫn sử dụng nó, nhưng tôi có cảm giác ngày sẽ đến khi nó không thuận tiện.
Scott Seidman

3
@ScottSeidman, tôi nghĩ bạn đã nhầm lẫn CMSIS với StdPeriph. CMSIS được hỗ trợ tốt và sẽ được hỗ trợ vô thời hạn. StdPeriph của nó về cơ bản không còn được sử dụng nữa, nhưng CMSIS vẫn tồn tại như 10 năm trước.
ScienceSamovar

14

Để tìm hiểu làm thế nào nó hoạt động bạn muốn sử dụng không có ở trên. Nhận một trình biên dịch chéo cánh tay và các tài liệu từ st, được thực hiện. Bắt đầu viết mã. những con chip này thường rất dễ lập trình. tài liệu cho bạn biết bit nào trong thanh ghi làm gì.

Bất kỳ / tất cả các thư viện này đều có ý định loại bỏ sự hiểu biết / gánh nặng / công việc đó khỏi bạn và khiến nó cảm thấy giống như một cuộc gọi api giống như trải nghiệm lập trình ứng dụng. Đó là những gì rất nhiều người muốn. Bạn có thể sử dụng tất cả các nguồn cho các thư viện này để giúp hiểu, nhưng khi bạn hiểu rõ hơn về nó, bạn sẽ tìm thấy các lỗ hổng và vấn đề trong các thư viện, đôi khi là mã rất đáng sợ. mã được ghép lại với nhau, được viết một cách khái quát và được chuyển từ chip này sang chip khác, có lẽ các tính năng hỗ trợ mà chip của bạn không có, v.v. Và tất cả chúng đều có quá nhiều chi phí. 10 đến 100 lần quá nhiều mã cho nhiệm vụ, chắc chắn rất nhiều trong số đó có thể tối ưu hóa đi nhưng tại sao lại có nó ở nơi đầu tiên?

Cho dù bạn tự đi hay sử dụng một trong những thư viện này, bạn vẫn nên xem nguồn cho các thư viện bạn sử dụng để xem bạn có thoải mái với những gì họ đang làm không, nếu nó hợp lý, phù hợp với tài liệu chip, v.v. gặp sự cố, bạn có khả năng phải tìm hiểu nội dung của họ nhiều như của bạn để tìm hiểu lý do tại sao.

Lưu ý rằng các tài liệu chip cũng không hoàn hảo, đó là một phần của niềm vui.

Tôi không hiểu tại sao lắp ráp lại xuất hiện trong một cuộc thảo luận về lập trình kim loại trần. Bạn có thể nhận được bằng cách lắp ráp rất ít. Đối với các chip cortex-m này, về mặt kỹ thuật, bạn chỉ cần nhiều asm này để được khởi động:

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

Bạn không thể dựa vào dữ liệu cũng như bss và bạn không thể quay lại từ chính với số asm tối thiểu đó. Nhưng đó là tất cả những gì bạn cần cho kim loại trần. Bây giờ nếu bạn muốn làm gián đoạn, bạn cần thêm các mục trong bảng vectơ. nhiều dòng .word. Tôi đề nghị nhiều asm hơn, nhưng có thể 10 hoặc 20 dòng nữa.

đây thường là tất cả các asm tôi sử dụng.

.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

Vâng, nó nói cortex-m0 nhưng đây là bootstrap thực tế cho mã m4 của tôi. Tôi thích điều này là ngón tay cái không phải ngón tay cái2. Và tôi chỉ sử dụng lại mã này từ cortex-m này sang mã khác, thay đổi địa chỉ con trỏ ngăn xếp khi cần, vì vậy nó hoạt động cho m0, m3 và m4. Tôi chưa có m7 và tôi cũng chưa nghiên cứu nhiều về nó.

Việc kích hoạt fpu có thể cần thêm một vài dòng asm vì cần có hướng dẫn cụ thể. Nhưng vấn đề là không nhầm lẫn giữa lập trình cấp thấp và asm. C có những gì bạn cần để cấu hình chip, cũng như viết một ứng dụng. Các thư viện mà bạn đang nói đến được viết bằng C không phải là asm, vì vậy rõ ràng họ cũng không cần sử dụng asm.

Nếu bạn muốn tìm hiểu các hoạt động bên trong, viết mã của riêng bạn. Không sử dụng các thư viện này ngoài mục đích tham khảo. Đôi khi việc hack nó dễ dàng hơn là cố gắng đọc qua mã của họ. (không chỉ ST mà tất cả các nhà cung cấp. Một trong những nhà cung cấp có một dòng mã rất đáng báo động. Tôi sử dụng nó như một câu hỏi phỏng vấn, không phải sẽ đăng nó ở đây).

ST chắc chắn nhưng các nhà cung cấp khác cũng vậy, để tiết kiệm năng lượng, có đồng hồ cho phép các phần của chip, vì vậy trước khi bạn đi vào và cố gắng nháy đèn led, bạn cần tìm bit kích hoạt cho khối gpio đó và xem liệu nó có xuất hiện không nếu thiết lập lại được kích hoạt, nếu không thì kích hoạt nó, nói chuyện với logic gpio đó mà không có đồng hồ cho phép nó chỉ đơn giản là treo bộ xử lý vì nó đang chờ phản hồi từ logic sẽ không bao giờ phản hồi. Họ không luôn luôn nói với bạn về những cho phép này. Sau khi kích hoạt, đôi khi họ sẽ đưa bạn qua init cho một số thiết bị ngoại vi cụ thể. Tài liệu ST khá tốt. Đến từ microchip đạt điểm khá tệ cho tài liệu, bạn không nên có vấn đề gì.


2
OP đã không hỏi về thủ tục khởi nghiệp, hoặc bất cứ điều gì tương tự. Thư viện nào phù hợp nhất cho việc sử dụng của anh ấy / cô ấy.
Fotis Panagiotopoulos

asm đã được đề cập và do đó, các bình luận về asm
old_timer

2
Ngoài ra, CMSIS không chứa mã, ngoài một số mức tối thiểu. Nó không bao gồm mã khởi động, tập lệnh liên kết hoặc bất cứ thứ gì tương tự. Nó chỉ chứa định nghĩa cho các thanh ghi. Tại sao viết mã mật mã, hoặc phát minh lại bánh xe, thay vì sử dụng tên đẹp để truy cập trực tiếp vào sổ đăng ký?
Fotis Panagiotopoulos

2
@ John Bạn có thể dễ dàng khởi động một vi điều khiển ARM mà không cần ASM, hiệu quả tương đương. Nếu quan tâm hãy hỏi một câu hỏi mới, và bình luận một liên kết ở đây để cho bạn thấy một số ví dụ.
Fotis Panagiotopoulos

1
@ user3634713 Tôi thực sự rất thích thú. Cảm ơn Electronics.stackexchange.com/questions/224618/
John

2

Tôi đã sử dụng cả hai, chỉ cần truy cập đăng ký kim loại trần và thư viện ngoại vi std. Tôi thấy nó dễ dàng hơn chỉ để đối phó với các thanh ghi. Ngoài ra nếu bạn đang sử dụng trình gỡ lỗi, bạn có thể xem các thanh ghi và xác nhận chúng chứa những gì bạn đã lập trình chúng. Tôi nghĩ bạn cũng tìm hiểu thêm về hoạt động của chip theo cách đó.


2

Comming from the 8bit world I was always used to programming peripherals via registers. Microcontroller data sheets (i.e STM32 reference manuals) describe the peripherals exclusively in register notation. Since the programmer must read this very same documentation to know about the peripheral funtions and features before any attempt is made to use it then it seems natural to me to start programming the registers. With carful code layout and commenting I find the code can be pleasantly to read and modify even after coming back to it months later.


2

Until now I have used CMSIS definitions and enjoyed using registers directly. Meanwhile, I used HAL libraries in few projects. It had a considerable influence on code running time so I quit it. Although CMSIS serves my interest, these days I am going to be a fan of libopencm3. It is like LL libraries provided by ST. However, it covers more micro-controllers even in ST families:

The libopencm3 project (previously known as libopenstm32) aims to create a free/libre/open-source firmware library for various ARM Cortex-M3 microcontrollers, including ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 and others.

please note that:

Despite the name, libopencm3 also supports other ARM Cortex "related" microcontrollers such as Cortex-M0 or Cortex-M4/Cortex-M4F ones, for example.

you can find the list of supported micro-controllers here.


The actual problem is that ST has the wrong idea of what a HAL is supposed to do. A proper HAL will have a function like adc_get_result() which wraps in the complete ADC peripheral driver including real-time aspects, interrupts etc. The ST one seems to rather be write_to_scary_register which is basically just a bloated wrapper around the register access. In all fairness, ST isn't the only vendor to provide such excess bloat, Atmel ASF and others are equally bad.
Lundin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.