在仅静态分配的IQueue自定义接口中封装RTOS Queue对象

时间:2018-10-18 02:21:12

标签: c++ architecture embedded freertos rtos

在基于嵌入式组件的系统中,我有一个自定义接口IQueue,它可以派生特定的系统实现,例如FreeRTOSQueue。

class IQueue { ... virtual void push(...) = 0; ... };
class FreeRTOSQueue : public IQueue { ... };

我只想使用静态分配,而IQueue无法做到这一点。由于它是基于组件的系统,因此我不想直接将FreeRTOSQueue实例化到系统类中。

理想的用法类似于以下代码,类似于FreeRTOS的用法。

class MyApplication {
public:
    ...

    IQueue queue;

    void init()
    {
        this->queue = this->kernel->createQueue(...);
    }
};

我可以将队列实例化为全局变量,并将其与内核实例和其他组件一起注入到类中,但这不是很好,因为队列不是系统元素,仅是该模块的元素。

我想听听有关使它简洁明了的最佳方法的体系结构建议。请记住,这是一个嵌入式系统。

obs .:如果您认为不可能,因为在某个时候我需要为特定的队列类分配一些内存,请随时指出。

谢谢

拉斐尔

2 个答案:

答案 0 :(得分:0)

我找到了适合我的解决方案,希望它可以帮助需要类似内容的任何人。

首先,我声明一个接口IQueue并向前声明一个Queue类型

class IQueue { ... virtual void push(...) = 0; ... };
class Queue;

然后,当我声明IKernel接口时,createQueue方法按值返回Queue对象

class IKernel { ... virtual Queue createQueue(...) = 0; ... };

对于实现,我声明了FreeRTOSQueue并从中继承了Queue类:

class FreeRTOSQueue : public IQueue { ... xQueueHandle handle; ... };
class Queue : public FreeRTOSQueue {};

FreeRTOSQueue将包含xQueueHandle,可以将其扩展为信号量。内核的createQueue实现将是:

class FreeRTOSKernel : public IKernel {
public:
    Queue createQueue(...)
    {
        Queue q;
        q.handle = xQueueCreate(...);
        return q;
    }
}

以及用法:

class MyApplication {
public:
    ...

    Queue queue;

    void init()
    {
        this->queue = this->kernel->createQueue(...);
    }
};

我仍在考虑将createQueue作为IQueue类上的“ init”方法移动,它认为这样会更干净。

答案 1 :(得分:0)

如果我理解正确,那么您所寻找的就是线程安全内存池: https://en.m.wikipedia.org/wiki/Memory_pool

搜索该术语会产生大量准确的设计和实现,包括Boost,它可以在任何操作系统上运行,而不仅仅是FreeRTOS