Черга повідомлень для RTOS для мікроконтролерів


10

Я зараз пишу RTOS для мікроконтролерів. Вся справа написана на C ++ 11 - якщо хтось зацікавлений, а посилання на сховище знаходиться внизу.

В даний час я пишу клас, який є простою чергою даних для передачі об'єктів між потоками (або між обробниками переривань і потоками або обробниками переривань та іншими обробниками переривань). Зазвичай я намагаюся слідувати деяким загальним API, знайденим в інших проектах, але я не знайшов жодного прикладу паралельної черги, яка має emplace()функцію ТА підтримує таймаути.

Моя загальна "проблема" полягає в тому, що я не можу визначитися між цими двома інтерфейсами:

( std::chrono::duration<Rep, Period>це шаблонний тип, я опускаю шаблону шаблону для ясності)

Перша версія:

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

Друга версія:

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

(буде другий набір цих функцій із ...Untilсуфіксом - вони використовуватимуть часову точку замість тривалості)

Перша версія дотримується "загального стилю" розміщення тайм-ауту в якості останнього параметра (приклади - черги повідомлень POSIX std::condition_variable, прості черги в будь-якому RTOS для мікроконтролерів). Проблема полягає в тому, що неможливо мати цей аргумент тайм-ауту як останній для функції tryEmplaceFor (), тому що у випадку різних варіантів шаблонів "відомі" аргументи повинні бути першими (*). Отже, друга версія є "послідовною" - всі функції з таймаутом мають тайм-аут як перший аргумент. Цей варіант має очевидну проблему, ймовірно, перший приклад використання тайм-ауту як першого аргументу такої функціональності.

Який інтерфейс краще би обслуговував ОС:

  • встановлений стандарт наявності тайм-ауту в якості останнього аргументу (за винятком tryEmplaceFor()і tryEmplaceUntil()- де це повинен бути перший аргумент (*))?
  • послідовність - вважаєте за краще тайм-аут бути першим аргументом?

(*) - Я знаю , що технічно я міг мати тайм - аут в якості останнього аргументу для tryEmplaceFor()і tryEmplaceUntil(), але я не хотів би використовувати такий шаблон магію для такого простого сценарію - робити всю цю рекурсивну інстанціацій тільки , щоб отримати останній аргумент здається трохи зайвої, особливо коли я візуалізую компілятор помилок, якщо користувач робить щось не так ...



Яка різниця між першою та другою версіями? Будь ласка, виділіть.
JBRWilkinson

1
Спостереження: не всі знають POSIX досить добре, щоб заважати розміщенню часу, але всі, хто використовує ваш інтерфейс, будуть розчаровані непослідовним API. Я голосую №2.
J Trana

Відповіді:


0

Як було запропоновано у відповіді, яку було видалено (на жаль) та коментарями, я дотримувався рядка "узгодженість" (другий представлений варіант) - у всіх функціях "спробувати ... Для" та "спробувати ... Поки" функціонує тайм-аут (тривалість або точка часу) - перший аргумент.

Це код на поточному етапі - посилання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.