CMSIS เทียบกับ HAL เทียบกับมาตรฐานห้องสมุดอุปกรณ์ต่อพ่วง


29

ดังนั้นฉันจึงเปลี่ยนจาก PICs เป็น ARM และฉันซื้อบอร์ดค้นพบ STM32F4 จนถึงตอนนี้ฉันเข้าใจว่าในการเขียนโปรแกรมคุณสามารถเข้าถึงการลงทะเบียนทั้งหมดในหน่วยความจำโดยตรง (วิธีที่ชัดเจน) และยังมีห้องสมุดหลัก 3 แห่งที่คุณสามารถใช้เพื่อทำให้ชีวิตของคุณง่ายขึ้น ตอนนี้คำถามของฉันคือหนึ่งในสามของเหล่านั้น (CMSIS, HAL, Std อุปกรณ์ต่อพ่วง 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 ซึ่งแตกต่างจากอีกสองรายการนั้นถูกกำหนดโดย ARM ไม่ใช่ ST ซึ่งหมายความว่าไลบรารี CMSIS ต่างๆที่อยู่ในนั้นสำหรับไมโครคอนโทรลเลอร์ต่าง ๆ นั้นค่อนข้างคล้ายคลึงกันซึ่งช่วยในการพกพาอย่างมาก

นอกจากนี้ CMSIS ก็เป็นโปรแกรมที่ง่ายกว่าดังนั้นจึงเป็น (IMO) ซึ่งเป็นเอนกประสงค์และเชื่อถือได้มากที่สุดโดยอาจมีข้อบกพร่องน้อยลง (หรือไม่มี) บางห้องสมุด Hal สำหรับ mcu ต่างๆที่ฉันเคยใช้นั้นค่อนข้างน่าอับอายสำหรับข้อบกพร่องของพวกเขา

ในทางกลับกัน CMSIS ต้องการงานมากกว่าคุณ อย่างไรก็ตามเป็นทางเลือกส่วนตัวของฉันเนื่องจากฉันต้องการลงทุนเวลาของฉันในการสร้างห้องสมุดคุณภาพที่เหมาะสมกับความต้องการของฉันและทำความเข้าใจวิธีการทำงานของชิปซึ่งใช้เวลาในการเรียนรู้เพียงแค่ห้องสมุดใหม่


ฉันไม่แน่ใจว่า ST ยังคงรองรับไลบรารี CMSIS
Scott Seidman

1
อืม ... อะไรแบบนั้น ไม่มีลิงก์โดยตรงพวกเขาไม่สนับสนุน (ดูเหมือนว่าพวกเขาต้องการผูกมัดผู้ใช้ให้มากที่สุดเท่าที่จะเป็นไปได้ในรหัสของพวกเขาทำให้พวกเขาต้องออกจากแบรนด์อื่น) แต่มันถูกใช้ในห้องสมุดอื่นของพวกเขา คุณสามารถแยกมันออกมาได้ มันค่อนข้างง่ายไม่รวมรหัสมากและดูผู้ใหญ่ ดูเหมือนจะปลอดภัยสำหรับการใช้งานการผลิตไม่ว่าพวกเขาจะทำการตลาดตามที่ได้รับการสนับสนุนหรือไม่ก็ตาม
Fotis Panagiotopoulos

ใช่มันเป็นคนเกียจคร้านที่พวกเขาหยุดพัฒนาไปในทิศทางนั้น การปฏิบัติตาม CMSIS เป็นหนึ่งในสิ่งที่ดึงดูดให้ฉันเข้าสู่ ST ในตอนแรก ฉันยังคงใช้มัน แต่ฉันมีความรู้สึกว่าวันนั้นจะมาถึงเมื่อมันไม่สะดวก
Scott Seidman

3
@ScottSeidman ฉันคิดว่าคุณสับสน CMSIS กับ StdPeriph CMSIS ได้รับการสนับสนุนเป็นอย่างดีและจะได้รับการสนับสนุนอย่างไม่มีกำหนด StdPeriph ของมันที่เลิกใช้โดยทั่วไปในขณะนี้ แต่ CMSIS นั้นมีชีวิตเหมือนเมื่อ 10 ปีที่แล้ว
ScienceSamovar

14

หากต้องการเรียนรู้วิธีการทำงานคุณไม่ต้องการใช้สิ่งใดในข้างต้น รับ arm cross compiler และเอกสารจาก st, เสร็จสิ้น เริ่มการเข้ารหัส ชิปเหล่านี้มักจะเขียนโปรแกรมได้ง่ายจริงๆ เอกสารประกอบจะบอกคุณว่าบิตในสิ่งที่ลงทะเบียนทำอะไร

ใด ๆ / ทั้งหมดของห้องสมุดเหล่านี้มีวัตถุประสงค์เพื่อลบความเข้าใจ / ภาระ / งานออกจากคุณและทำให้มันรู้สึกเหมือนเพิ่งเรียก api เช่นประสบการณ์การเขียนโปรแกรมประยุกต์ ซึ่งเป็นสิ่งที่คนจำนวนมากต้องการ คุณสามารถใช้แหล่งข้อมูลทั้งหมดสำหรับไลบรารีเหล่านี้เพื่อช่วยให้เข้าใจ แต่เมื่อคุณเริ่มดีขึ้นคุณจะพบช่องโหว่และปัญหาในไลบรารีบางครั้งรหัสที่น่ากลัวมาก โค้ดที่ถูกโยนเข้าด้วยกันเขียนโดยทั่วไปและส่งต่อจากชิปหนึ่งไปอีกชิปหนึ่งอาจสนับสนุนคุณสมบัติที่ชิปของคุณไม่มี ฯลฯ และพวกเขาทั้งหมดมีจำนวนโอเวอร์เฮดมากเกินไป รหัสมากเกินไป 10 ถึง 100 เท่าสำหรับงานแน่ใจว่ามันมากอาจปรับไป แต่ทำไมมันมีในสถานที่แรก?

ไม่ว่าคุณจะไปเองหรือใช้หนึ่งในห้องสมุดเหล่านี้คุณยังควรดูแหล่งที่มาของห้องสมุดที่คุณใช้เพื่อดูว่าคุณพอใจกับสิ่งที่พวกเขากำลังทำอยู่หรือไม่ถ้ามันสมเหตุสมผล ผิดพลาดคุณมีแนวโน้มที่จะขุดสิ่งต่างๆให้มากที่สุดเพื่อค้นหาว่าทำไม

โปรดทราบว่าเอกสารชิปไม่ได้สมบูรณ์แบบนั่นเป็นส่วนหนึ่งของความสนุก

ฉันไม่เข้าใจว่าทำไมการชุมนุมเกิดขึ้นในการสนทนาเกี่ยวกับการเขียนโปรแกรมโลหะเปลือย คุณสามารถไปด้วยการชุมนุมน้อยมาก สำหรับชิป cortex-m เหล่านี้คุณต้องใช้ asm มากเท่านั้นในการบู๊ต:

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

คุณไม่สามารถพึ่งพาข้อมูลหรือ bss และคุณไม่สามารถกลับจากหลักด้วย asm ที่น้อยที่สุด แต่นั่นคือทั้งหมดที่คุณต้องการสำหรับโลหะเปลือยเปล่า ตอนนี้ถ้าคุณต้องการขัดจังหวะคุณต้องมีรายการเพิ่มเติมในตารางเวกเตอร์ เพิ่มเติม. word lines ฉันแนะนำ 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 แต่นี่เป็น bootstrap จริงสำหรับรหัส m4 ของฉัน ฉันชอบที่จะเป็นหัวแม่มือไม่ใช่ thumb2 และฉันเพิ่งใช้รหัสนี้อีกครั้งจาก cortex-m เป็นอีกอันหนึ่งโดยเปลี่ยนที่อยู่ตัวชี้สแต็กตามต้องการดังนั้นจึงใช้งานได้สำหรับ m0, m3 และ m4 ฉันยังไม่มี m7 และฉันก็ทำการวิจัยไม่มาก

การเปิดใช้งาน fpu อาจต้องการ asm อีกสองสามบรรทัดตามคำแนะนำเฉพาะ แต่ประเด็นคืออย่าสับสนการเขียนโปรแกรมระดับต่ำและ asm C มีสิ่งที่คุณต้องกำหนดค่าชิปเช่นเดียวกับการเขียนโปรแกรม ห้องสมุดที่คุณกำลังพูดถึงเขียนด้วยภาษา C ไม่ใช่ asm ดังนั้นแน่นอนว่าพวกเขาไม่จำเป็นต้องใช้ asm เช่นกัน

หากคุณต้องการเรียนรู้การทำงานภายในให้เขียนโค้ดของคุณเอง อย่าใช้ไลบรารีเหล่านี้นอกเหนือจากการอ้างอิง บางครั้งการแฮ็คมันง่ายกว่าการอ่านรหัสของพวกเขา (ไม่ใช่แค่ ST แต่เป็นของผู้ขายทั้งหมดหนึ่งในผู้ขายมีบรรทัดของรหัสดังนั้นน่ากลัวฉันใช้มันเป็นคำถามสัมภาษณ์ไม่ไม่โพสต์ที่นี่)

ST แน่นอน แต่ผู้ขายรายอื่นเช่นกันเพื่อประหยัดพลังงานมีนาฬิกาเปิดใช้งานสำหรับส่วนของชิปดังนั้นก่อนที่คุณจะเข้าไปในและพยายามที่จะกระพริบนำคุณต้องค้นหาบิตเปิดใช้งานสำหรับบล็อก gpio นั้นและดูว่ามันจะออกมา ของการเปิดใช้งานการรีเซ็ตหากไม่เปิดใช้งานการพูดคุยกับตรรกะ gpio นั้นโดยไม่ใช้นาฬิกาจะทำให้มันหยุดโปรเซสเซอร์เนื่องจากรอการตอบสนองจากตรรกะที่จะไม่ตอบสนอง พวกเขาไม่ได้บอกคุณเสมอเกี่ยวกับการเปิดใช้งานเหล่านี้ เมื่อเปิดใช้งานแล้วบางครั้งพวกเขาจะแนะนำคุณผ่าน init สำหรับอุปกรณ์ต่อพ่วงบางอย่าง เอกสาร ST ค่อนข้างดี มาจาก microchip ที่ได้เกรดไม่ดีนักสำหรับเอกสารคุณไม่ควรมีปัญหา


2
OP ไม่ได้ถามเกี่ยวกับขั้นตอนการเริ่มต้นหรืออะไรอย่างนั้น ไลบรารีใดเหมาะที่สุดสำหรับการใช้งานของเขา / เธอ
Fotis Panagiotopoulos

asm ถูกกล่าวถึงและทำให้ความคิดเห็นใน asm
old_timer

2
CMSIS ยังไม่มีรหัสนอกเหนือจากขั้นต่ำเปลือยบางอย่าง ไม่รวมรหัสเริ่มต้นสคริปต์ตัวเชื่อมโยงหรืออะไรทำนองนั้น มันมีคำจำกัดความสำหรับการลงทะเบียนเท่านั้น ทำไมต้องเขียนรหัสลับหรือสร้างวงล้อใหม่แทนที่จะใช้ชื่อที่ดีในการเข้าถึงรีจิสเตอร์โดยตรง
Fotis Panagiotopoulos

2
@ John คุณสามารถเริ่มต้นไมโครคอนโทรลเลอร์ ARM ได้อย่างง่ายดายด้วย absolutelly no ASM อย่างมีประสิทธิภาพ หากสนใจถามคำถามใหม่และแสดงความคิดเห็นลิงค์ที่นี่เพื่อแสดงตัวอย่าง
Fotis Panagiotopoulos

1
@ user3634713 จริงๆแล้วฉันสนใจมาก ขอบคุณelectronics.stackexchange.com/questions/224618/…
John

2

ฉันได้ใช้ทั้งการเข้าถึงรีจิสเตอร์โลหะและไลบรารีอุปกรณ์ต่อพ่วงมาตรฐาน ฉันพบว่ามันง่ายกว่าที่จะจัดการกับการลงทะเบียน นอกจากนี้หากคุณกำลังใช้ดีบักเกอร์คุณสามารถดูการลงทะเบียนและยืนยันว่าพวกเขามีสิ่งที่คุณตั้งโปรแกรมไว้ให้ ฉันคิดว่าคุณเรียนรู้เพิ่มเติมเกี่ยวกับการทำงานของชิปด้วยวิธีนี้


2

มาจากโลก 8 บิตฉันมักจะใช้ในการเขียนโปรแกรมอุปกรณ์ต่อพ่วงผ่านการลงทะเบียน แผ่นข้อมูลไมโครคอนโทรลเลอร์ (เช่นคู่มืออ้างอิง STM32) อธิบายอุปกรณ์ต่อพ่วงเฉพาะในรูปแบบการลงทะเบียน เนื่องจากโปรแกรมเมอร์จะต้องอ่านเอกสารเดียวกันนี้เพื่อทราบเกี่ยวกับฟังก์ชั่นและคุณสมบัติของอุปกรณ์ต่อพ่วงก่อนที่จะพยายามใช้งานใด ๆ ดังนั้นจึงเป็นเรื่องธรรมดาที่ฉันจะเริ่มเขียนโปรแกรมลงทะเบียน ด้วยเลย์เอาต์รหัสที่รอบคอบและการแสดงความคิดเห็นฉันพบว่าโค้ดสามารถอ่านและแก้ไขได้อย่างเป็นสุขแม้หลังจากกลับมาหลายเดือนแล้ว


2

จนถึงตอนนี้ฉันใช้คำจำกัดความของ CMSIS และสนุกกับการใช้รีจิสเตอร์โดยตรง ในขณะเดียวกันฉันใช้ห้องสมุด HAL ในบางโครงการ มันมีอิทธิพลอย่างมากต่อเวลาใช้งานโค้ดดังนั้นฉันจึงเลิกมัน แม้ว่า CMSIS ให้บริการความสนใจของฉันวันนี้ฉันจะเป็นแฟนของlibopencm3 มันก็เหมือนLLห้องสมุดที่จัดทำโดย ST อย่างไรก็ตามมันครอบคลุมไมโครคอนโทรลเลอร์มากขึ้นแม้ในตระกูล ST:

โครงการ libopencm3 (ก่อนหน้านี้รู้จักกันในนาม libopenstm32) มีวัตถุประสงค์เพื่อสร้างไลบรารีเฟิร์มแวร์ฟรี / libre / โอเพนซอร์สสำหรับไมโครคอนโทรลเลอร์ ARM Cortex-M3 ต่างๆรวมถึง ST STM32, Toshiba TX03, Atmel SAM3U, NXP LPC1000 และอื่น ๆ

โปรดทราบว่า:

แม้จะมีชื่อ libopencm3 ยังรองรับไมโครคอนโทรลเลอร์ ARM ที่เกี่ยวข้องกับ "ไมโครคอนโทรลเลอร์" อื่น ๆ เช่น Cortex-M0 หรือ Cortex-M4 / Cortex-M4F

คุณสามารถหารายชื่อของการสนับสนุนไมโครคอนโทรลเลอร์ที่นี่


ปัญหาที่แท้จริงคือ 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.