在基于嵌入式组件的系统中,我有一个自定义接口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 .:如果您认为不可能,因为在某个时候我需要为特定的队列类分配一些内存,请随时指出。
谢谢
拉斐尔
答案 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