Coda messaggi per RTOS per microcontrollori


10

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 di dati per passare oggetti tra thread (o tra gestori e thread di interrupt o gestori di interrupt e altri gestori di interrupt). Di solito provo a seguire alcune API comuni presenti in altri progetti, ma non ho trovato alcun esempio di coda simultanea che abbia emplace()funzione E supporti i 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 il ...Untilsuffisso - queste userebbero il timepoint invece della 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é in caso di modelli variadici gli argomenti "conosciuti" 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 (ad 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 di usare tale magia modello per uno scenario così semplice - fare tutte queste istanze ricorsive solo per ottenere l'ultimo argomento sembra un po 'eccessivo, specialmente quando visualizzo il compilatore di errori nel caso l'utente faccia qualcosa di sbagliato ...



Qual è la differenza tra la prima e la seconda versione? Si prega di evidenziare.
JBR Wilkinson,

1
Osservazione: non tutti conoscono POSIX abbastanza bene da essere disturbati dal posizionamento del tempo, ma tutti quelli che usano la tua interfaccia saranno frustrati dall'API incoerente. Io voto n. 2.
J Trana,

Risposte:


0

Come suggerito da una risposta che è stata eliminata (purtroppo) e dai commenti, ho seguito la riga "coerenza" (seconda variante presentata) - in tutte le funzioni "prova ... per" e "prova ... fino a" il timeout (durata o punto temporale) è il primo argomento.

Questo è il codice nella fase corrente - link

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.