(Mudah-mudahan) versi sederhana dari masalah saya:
Katakanlah saya menggunakan setiap port GPIO di MCU korteks M-4 saya untuk melakukan hal yang persis sama, seperti membaca port pada perubahan level pin. Saya telah menyederhanakan kode saya sehingga menjadi port-agnostik, tetapi saya mengalami masalah dengan solusi yang bagus untuk menggunakan kembali fungsi pengendali interupsi yang sama.
- Apakah ada cara agar saya dapat menggunakan fungsi pengendali interupsi yang sama sambil memiliki metode untuk menemukan port mana yang memicu interupsi? Idealnya beberapa O(1)/tidak ditingkatkan tergantung pada berapa banyak port yang dimiliki papan.
- Haruskah saya memiliki penangan berbeda untuk setiap port yang memanggil fungsi yang sama yang menggunakan parameter port? (Yang terbaik yang bisa saya pikirkan sejauh ini)
Jadi seperti:
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); }
...
Masalah saya yang sebenarnya:
Saya belajar dan mengutak-atik FreeRTOS dan membuat driver sederhana untuk debug/stdio UART, beberapa tombol yang ada di dev. papan, seterusnya. Sejauh ini saya telah membuat driver untuk periferal/port tertentu.
Sekarang saya ingin membuat driver I2C tanpa mengetahui antarmuka mana yang akan saya gunakan (ada 10 port I2C di mcu saya), dan berpotensi mengizinkan kode driver digunakan pada beberapa port secara bersamaan. Saya tahu semua port yang digunakan pada waktu kompilasi.
Saya punya ide yang cukup bagus tentang cara membuat driver menjadi port-agnostic, kecuali saya sedang memikirkan cara yang bagus untuk menemukan port mana yang memicu interupsi menggunakan fungsi handler tunggal. (selain menelusuri status interupsi setiap port karena itu O(n)).
Seperti saya katakan, hal terbaik yang saya temukan adalah tidak memiliki satu penangan dan sebagai gantinya memiliki penangan berbeda pada tabel vektor yang semuanya memanggil fungsi pekerja yang sama di dalamnya dan meneruskan parameter port. Metode ini mengacaukan kode driver, namun merupakan O(1) (kecuali jika Anda mempertimbangkan kompleksitas kode).
- Apakah saya melakukan semua ini salah dan harus membuatnya tetap bodoh dan mengimplementasikan driver sesuai dengan port/kasus penggunaan yang sebenarnya saya perlukan dengan cara yang paling sederhana? (bahkan tidak punya rencana untuk menggunakan beberapa bus I2C, meskipun itu akan menarik untuk diterapkan)
Terima kasih sebelumnya, semoga postingannya tidak terlalu ambigu atau panjang (saya rasa agak panjang maaf).
*handler() { ...}
ini, karena baris tersebut memberikan argumen spesifik dan biasanya memasang vektor. Menggunakan trik perakitan yang cerdik akan membuat sumbernya sulit dipelihara. -- Saya akan mulai dengan 2 penangan, masing-masing diimplementasikan dalam penangan yang diluncurkan sendiri. Selanjutnya saya akan mengembangkan algoritma akhir, DMA atau apa pun. Hanya kemudian saya akan menyelidiki di mana perbedaannya, dan mempertimbangkan refactoring dalam arti KERING. - person the busybee   schedule 03.07.2020