(หวังว่า) ปัญหาของฉันในเวอร์ชันที่เรียบง่าย:
สมมติว่าฉันใช้พอร์ต GPIO ทุกพอร์ตของ mcu cortex M-4 ของฉันเพื่อทำสิ่งเดียวกันทุกประการ เช่น อ่านพอร์ตจากการเปลี่ยนแปลงระดับพิน ฉันทำให้โค้ดของฉันง่ายขึ้น ดังนั้นมันจึงไม่เชื่อเรื่องพระเจ้าในพอร์ต แต่ฉันมีปัญหากับวิธีแก้ปัญหาที่ดีสำหรับการนำฟังก์ชันตัวจัดการขัดจังหวะเดิมกลับมาใช้ใหม่
- มีวิธีที่ฉันสามารถใช้ฟังก์ชันตัวจัดการขัดจังหวะเดียวกันในขณะที่มีวิธีค้นหาว่าพอร์ตใดที่ทำให้เกิดการขัดจังหวะหรือไม่? ตามหลักการแล้ว O(1)/บางตัวจะไม่ขยายขนาดขึ้นอยู่กับจำนวนพอร์ตที่บอร์ดมี
- ฉันควรมีตัวจัดการที่แตกต่างกันสำหรับแต่ละพอร์ตที่เรียกใช้ฟังก์ชันเดียวกันกับที่รับพารามิเตอร์พอร์ตหรือไม่ (ดีที่สุดที่ฉันคิดได้จนถึงตอนนี้)
ชอบมาก:
void worker (uint32_t gpio_id) {
*work goes here*
}
void GPIOA_IRQ_Handler(void) { worker(GPIOA_id); }
void GPIOB_IRQ_Handler(void) { worker(GPIOB_id); }
void GPIOC_IRQ_Handler(void) { worker(GPIOC_id); }
...
ปัญหาที่แท้จริงของฉัน:
ฉันกำลังเรียนรู้และเล่นซอกับ FreeRTOS และสร้างไดรเวอร์ง่ายๆ สำหรับ debug/stdio UART ซึ่งเป็นปุ่มบางปุ่มที่อยู่ใน dev ของฉัน คณะกรรมการเป็นต้น จนถึงตอนนี้ฉันได้สร้างไดรเวอร์สำหรับอุปกรณ์ต่อพ่วง/พอร์ตเฉพาะแล้ว
ตอนนี้ฉันกำลังต้องการสร้างไดรเวอร์ I2C โดยไม่รู้ว่าจะใช้อินเทอร์เฟซใด (มีพอร์ต I2C 10 พอร์ตใน MCU ของฉัน) และอาจอนุญาตให้ใช้รหัสไดรเวอร์กับหลายพอร์ตพร้อมกัน ฉันรู้ว่าพอร์ตทั้งหมดที่ใช้ในเวลาคอมไพล์
ฉันมีความคิดที่ดีทีเดียวเกี่ยวกับวิธีทำให้ไดรเวอร์ไม่เชื่อเรื่องพระเจ้าในพอร์ต ยกเว้นว่าฉันกำลังติดอยู่กับการหาวิธีที่ดีในการค้นหาว่าพอร์ตใดที่ทริกเกอร์การขัดจังหวะโดยใช้ฟังก์ชันตัวจัดการเดียว (นอกเหนือจากการวนรอบ reg สถานะการขัดจังหวะของทุกพอร์ตเนื่องจากนั่นคือ O (n))
อย่างที่ฉันบอกไปแล้วว่าสิ่งที่ดีที่สุดที่ฉันคิดขึ้นมาคือการไม่มีตัวจัดการตัวเดียวและมีตัวจัดการที่แตกต่างกันบนตารางเวกเตอร์แทนซึ่งทั้งหมดเรียกใช้ฟังก์ชันตัวทำงานเดียวกันในนั้นและส่งพารามิเตอร์พอร์ต วิธีการนี้จะทำให้โค้ดไดรเวอร์เกะกะ แต่ มันคือ O(1) (เว้นแต่คุณจะคำนึงถึงความซับซ้อนของโค้ดด้วย)
- ฉันจะทำสิ่งนี้ผิดหรือเปล่าและควรทำให้มันโง่ง่าย ๆ และใช้ไดรเวอร์ตามพอร์ต / กรณีใช้งานที่ฉันต้องการจริง ๆ ในวิธีที่ง่ายที่สุดเท่าที่จะเป็นไปได้ (ไม่มีแผนที่จะใช้บัส I2C หลายตัวด้วยซ้ำ แม้ว่าจะใช้งานได้น่าสนใจก็ตาม)
ขอบคุณล่วงหน้า หวังว่ากระทู้จะไม่คลุมเครือหรือยาวจนเกินไป (รู้สึกว่าจะยาวไปนะ)
*handler() { ...}
ทั้งหมดเหล่านี้ เนื่องจากบรรทัดเหล่านี้ให้อาร์กิวเมนต์เฉพาะและติดตั้งเวกเตอร์โดยทั่วไป การใช้เทคนิคการประกอบอันชาญฉลาดจะทำให้แหล่งที่มากลายเป็นฝันร้ายที่ต้องรักษาไว้ -- ฉันจะเริ่มต้นด้วยตัวจัดการ 2 ตัว โดยแต่ละตัวมีการใช้งานในตัวจัดการที่เปิดตัวของตัวเอง ต่อไปผมจะพัฒนาอัลกอริธึมขั้นสุดท้าย DMA หรืออย่างอื่น จากนั้นฉันก็จะตรวจสอบว่าความแตกต่างอยู่ที่ไหน และพิจารณาการปรับโครงสร้างใหม่ในแง่ของ DRY - person the busybee   schedule 03.07.2020