Pesan Antrian untuk RTOS untuk mikrokontroler


10

Saat ini saya sedang menulis RTOS untuk mikrokontroler. Semuanya ditulis dalam C ++ 11 - jika ada yang tertarik, dan tautan ke repositori ada di bagian bawah.

Saat ini saya sedang menulis sebuah kelas yang merupakan antrian data sederhana untuk melewatkan objek di antara utas (atau antara penangan interupsi dan utas atau penangan interupsi dan penangan interupsi lainnya). Biasanya saya mencoba mengikuti beberapa API umum yang ditemukan di proyek lain, namun saya tidak menemukan contoh antrian konkuren yang emplace()berfungsi DAN mendukung waktu tunggu.

"Masalah" umum saya adalah bahwa saya tidak dapat memutuskan antara dua antarmuka ini:

( std::chrono::duration<Rep, Period>adalah tipe templated, saya menghilangkan boilerplate template untuk kejelasan)

Versi pertama:

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
    ...
}

Versi kedua:

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(std::chrono::duration<Rep, Period>, T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
    ...
}

(akan ada set kedua fungsi ini dengan ...Untilakhiran - ini akan menggunakan titik waktu bukan durasi)

Versi pertama mengikuti "gaya umum" memiliki batas waktu sebagai parameter terakhir (contohnya adalah antrian pesan POSIX std::condition_variable,, antrian sederhana di RTOS apa pun untuk mikrokontroler). Masalahnya adalah bahwa tidak mungkin untuk memiliki argumen batas waktu ini sebagai yang terakhir untuk fungsi tryEmplaceFor (), karena dalam kasus templat variadik argumen "dikenal" haruslah yang pertama (*). Jadi versi kedua adalah "konsisten" - semua fungsi dengan batas waktu memiliki batas waktu sebagai argumen pertama. Varian ini memiliki masalah yang jelas mungkin menjadi contoh pertama dari memiliki batas waktu sebagai argumen pertama untuk fungsi tersebut.

Antarmuka mana yang akan melayani OS dengan lebih baik:

  • menetapkan standar memiliki batas waktu sebagai argumen terakhir (dengan pengecualian tryEmplaceFor()dan tryEmplaceUntil()- di mana harus menjadi argumen pertama (*))?
  • konsistensi - lebih suka batas waktu menjadi argumen pertama?

(*) - Saya tahu bahwa secara teknis saya dapat memiliki batas waktu sebagai argumen terakhir untuk tryEmplaceFor()dan tryEmplaceUntil(), tetapi saya lebih suka menghindari penggunaan templat ajaib untuk skenario sederhana seperti itu - melakukan semua Instansiasi rekursif ini hanya untuk mendapatkan argumen terakhir sepertinya sedikit berlebihan, terutama ketika saya memvisualisasikan kesalahan kompiler akan menghasilkan jika pengguna melakukan sesuatu yang salah ...



Apa perbedaan antara versi pertama dan kedua? Mohon sorot.
JBRWilkinson

1
Pengamatan: tidak semua orang tahu POSIX cukup baik untuk merasa terganggu oleh penempatan waktu, tetapi semua orang yang menggunakan antarmuka Anda akan frustrasi oleh API yang tidak konsisten. Saya memilih # 2.
J Trana

Jawaban:


0

Seperti yang disarankan oleh jawaban yang dihapus (sayangnya) dan komentar, saya mengikuti baris "konsistensi" (varian kedua yang disajikan) - dalam semua "coba ... Untuk" dan "coba ... Sampai" berfungsi batas waktu (durasi atau titik waktu) adalah argumen pertama.

Ini adalah kode pada tahap saat ini - tautan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.