用于微控制器的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()and的最后一个参数tryEmplaceUntil(),但我宁愿避免在这种简单的情况下使用这种模板魔术-为了获得最后一个参数而进行所有这些递归实例化似乎有点过头了,特别是当我可视化如果用户做错事情时编译器将产生的错误...



第一版和第二版有什么区别?请突出显示。
JBR威尔金森2014年

1
观察:并不是每个人都对POSIX足够了解,以至于会被时间困扰,但是使用接口的每个人都会因API不一致而感到沮丧。我投票#2。
J特拉纳2014年

Answers:


0

根据已删除的答案(不幸的是)和注释的建议,我遵循“一致性”行(第二个出现的变体)-在所有“ try ... For”和“ try ... Until”函数中,超时(持续时间或时间点)是第一个参数。

这是当前阶段的代码- 链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.