Message Queue for RTOS per microcontrollori

9

Attualmente sto scrivendo un RTOS per microcontrollori. Il tutto è scritto in C ++ 11 - se qualcuno è interessato, e il link al repository è in fondo.

Attualmente sto scrivendo una classe che è una semplice coda dati per il passaggio di oggetti tra thread (o tra gestori di interrupt e thread o gestori di interrupt e altri gestori di interrupt). Di solito cerco di seguire alcune API comuni trovate su altri progetti, ma non ho trovato nessun esempio di coda concorrente che ha emplace() funzione AND supporta timeout.

Il mio "problema" generale è che non riesco a decidere tra queste due interfacce:

( std::chrono::duration<Rep, Period> è un tipo di modello, ometto il modello boilerplate per chiarezza)

Prima versione:

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

Seconda versione:

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

(ci sarà una seconda serie di queste funzioni con suffisso ...Until - queste utilizzerebbero il tempo anziché la durata)

La prima versione segue uno "stile comune" di avere il timeout come ultimo parametro (esempi sono code di messaggi POSIX, std::condition_variable , code semplici in qualsiasi RTOS per microcontrollori). Il problema è che non è possibile avere questo argomento di timeout come l'ultimo per la funzione tryEmplaceFor (), perché nel caso di modelli variadici gli argomenti "noti" devono essere i primi (*). Quindi la seconda versione è "coerente": tutte le funzioni con timeout hanno il timeout come primo argomento. Questa variante ha un ovvio problema di essere probabilmente il primo esempio di avere il timeout come primo argomento per tale funzionalità.

Quale interfaccia servirebbe meglio il sistema operativo:

  • standard stabilito di avere il timeout come ultimo argomento (con l'eccezione di tryEmplaceFor() e tryEmplaceUntil() - dove deve essere il primo argomento (*))?
  • coerenza - preferisci che il timeout sia il primo argomento?

(*) - So che tecnicamente potrei avere il timeout come ultimo argomento per tryEmplaceFor() e tryEmplaceUntil() , ma preferirei evitare l'uso di tale modello magico per uno scenario così semplice - facendo tutte queste istanze ricorsive solo per ottenere l'ultimo argomento sembra un po 'eccessivo, specialmente quando visualizzo gli errori che il compilatore produrrebbe nel caso in cui l'utente faccia qualcosa di sbagliato ...

posta Freddie Chopin 09.12.2014 - 23:19
fonte

1 risposta

0

Come suggerito da una risposta che è stata cancellata (sfortunatamente) e dai commenti, ho seguito la riga "coerenza" (seconda variante presentata) - in tutto "prova ... Per" e "prova ... Fino a" funziona il timeout (durata o punto temporale) è il primo argomento.

Questo è il codice allo stadio attuale - link

    
risposta data 30.12.2014 - 09:51
fonte

Leggi altre domande sui tag