Mikrodenetleyiciler için RTOS için Message Queue


10

Şu anda mikrodenetleyiciler için bir RTOS yazıyorum. Her şey C ++ 11'de yazılmıştır - eğer kimse ilgilenirse ve depoya bağlantı alttadır.

Şu anda konuları (veya kesme işleyicileri ve iş parçacıkları veya kesme işleyicileri ve diğer kesme işleyicileri arasında) nesneleri geçirmek için basit bir veri kuyruğu olan bir sınıf yazıyorum. Genellikle diğer projelerde bulunan bazı yaygın API'ları izlemeye çalışırım, ancak emplace()işlev VE zaman aşımlarını destekleyen eşzamanlı sıraya ilişkin herhangi bir örnek bulamadım .

Benim genel "sorunum" şu iki arayüz arasında karar veremem:

( std::chrono::duration<Rep, Period>şablonlanmış bir tiptir, netlik için şablon kazan plakasını atlarım)

İlk versiyon:

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>);
    ...
}

İkinci versiyon:

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&&);
    ...
}

(bu işlevlerin ...Untilsonekiyle birlikte ikinci bir grup olacaktır - bunlar süre yerine zaman noktası kullanır)

İlk sürüm, son parametre olarak zaman aşımına sahip olmanın bir "ortak stili" takip eder (örnekler POSIX mesaj kuyrukları, std::condition_variablemikrodenetleyiciler için herhangi bir RTOS'ta basit kuyruklardır). Sorun, tryEmplaceFor () işlevinin sonuncusu olarak bu zaman aşımı bağımsız değişkenine sahip olmanın mümkün olmamasıdır, çünkü değişken şablonlarda "bilinen" bağımsız değişkenlerin önce (*) olması gerekir. Yani ikinci sürüm "tutarlı" - zaman aşımı olan tüm işlevler zaman aşımına sahip olur. Bu varyant, muhtemelen böyle bir işlevsellik için ilk argüman olarak zaman aşımına sahip olmanın ilk örneği olma konusunda bariz bir soruna sahiptir.

Hangi arayüz işletim sistemine daha iyi hizmet eder:

  • zaman aşımına son argüman olarak sahip olma standardını oluşturdu ( tryEmplaceFor()ve tryEmplaceUntil()ilk argüman (*) nerede olmalıdır) hariç ?
  • tutarlılık - zaman aşımının ilk argüman olmasını ister misiniz?

(*) - Teknik olarak zaman aşımına son argüman olarak sahip olabileceğimi biliyorum tryEmplaceFor()ve tryEmplaceUntil()ancak böyle basit bir senaryo için böyle bir şablon büyüsü kullanmaktan kaçınmayı tercih ediyorum - sadece son argümanı almak için tüm bu yinelemeli örneklemeleri yapmak biraz abartılı görünüyor, özellikle kullanıcı yanlış bir şey yaparsa derleyici üretecek hataları görselleştirmek ...



Birinci ve ikinci sürüm arasındaki fark nedir? Lütfen vurgulayın.
JBRWilkinson

1
Gözlem: Herkes POSIX'i zamanın yerleştirilmesinden rahatsız olacak kadar iyi bilmiyor, ancak arayüzünüzü kullanan herkes tutarsız API tarafından hayal kırıklığına uğrayacak. 2. oy verdim.
J Trana

Yanıtlar:


0

Silinen bir cevapla (maalesef) önerildiği gibi, "tutarlılık" satırını (ikinci sunulan varyant) izledim - hepsinde "dene ... için" ve "dene ... kadar" zaman aşımı (süre veya zaman noktası) ilk argüman.

Geçerli aşamadaki kod budur - link

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.