这是一个我正在为其设计程序的嵌入式定制电路板的C++问题。如果有帮助,我们将运行freeRTOS。主板有3个物理插槽/接头。1个插槽/接头有20个引脚,可接受3个特定电路板中的1个,但将来可能会有更多电路板。另外两个插槽/插头有18个引脚,每个插脚可以容纳8个板中的1个,但将来可能会有更多的板。
电路板通常通过SPI进行通信,但有时需要手动调用GPIO(取决于所安装的电路板)。由于向后兼容性问题,通信方案无法标准化(我想不出来)。如果最终客户选择,插入这些插槽的主板必须能够插入其他不同的主板。
我有一个SPI类,它提供了基本的硬件SPI。我有一个slot类,它接受指向SPI对象的指针,并包含一些复位引脚和一些测试函数,以确定哪个板插入了哪个插槽。我实例化了3个此类slot对象,每个物理slot/header对应一个。
在确定了每个插槽包含的内容之后,我现在需要为每个板设计/创建/编写类,但我遇到了架构问题,至少在我看来是这样的。由于这是一个嵌入式系统,我希望避免使用关键字"new“,但这并不是一成不变的。
我的想法是,实例化每个电路板的副本,然后只使用检测到的3个,这在空间上是浪费的。
在我的脑海中,我在想,我的slot类可能应该有某种类型的空指针,它可以被设置为在我们确定它是什么板之后指向被实例化的对象。在这种情况下,我很确定我必须使用"new“。
我知道在C中有“联合”的概念,你可以创建某种自定义类型,它可以是几种类型中的任何一种。当您创建此类型的副本时,它会为联合中最大的成员分配足够的内存。您是否可以在C++中这样做,并将类作为联合的成员,然后以某种方式使其成为您确定插槽包含的类的类型?
还有其他的设计想法吗?
为了让别人更好地了解这个问题,还需要添加其他信息吗?
谢谢,
发布于 2020-01-06 04:39:56
由于这是一个嵌入式系统,我想避免使用关键字“
”,但这并不是一成不变的。
您可以使用"placement new“和静态分配的内存缓冲区,其大小是所用类大小的最大值。类似于以下内容(see in online ide):
#include <iostream>
class Base {
public:
Base() { std::cout << __FUNCTION__ << std::endl; }
virtual ~Base() { std::cout << __FUNCTION__ << std::endl; }
virtual void print(void) = 0;
};
class A : public Base {
public:
A(int i_) : i(i_) { std::cout << "\t" << __FUNCTION__ << " " << i << std::endl; }
virtual ~A() { std::cout << "\t" << __FUNCTION__ << " " << i << std::endl; }
virtual void print(void) { std::cout << "\t\t" << __FUNCTION__ << " " << i << std::endl; }
private:
int i;
};
class B : public Base {
public:
B(int i_, int j_) : i(i_), j(j_) { std::cout << "\t" << __FUNCTION__ << " " << i << " " << j << std::endl; }
virtual ~B() { std::cout << "\t" << __FUNCTION__ << " " << i << " " << j << std::endl; }
virtual void print(void) { std::cout << "\t\t" << __FUNCTION__ << " " << i << " " << j << std::endl; }
private:
int i;
int j;
};
#define SIZE_IN(class, type) ((sizeof(class)+sizeof(type)-1)/sizeof(type))
#define POOL_PLACE(class) uint8_t place_##class [ sizeof(class) ]
// Just for simple MAX() calculation
union pool_member_sizes
{
POOL_PLACE(A);
POOL_PLACE(B);
// class C, D, E, ...
};
// statically allocate pool memory for set of classes, one pool for each set
// choose required alignment by pool "type"
uint32_t pool[ SIZE_IN(pool_member_sizes, uint32_t) ];
Base *driver;
int main()
{
driver = new(pool) A(1);
driver->print();
driver->~Base();
driver = new(pool) B(2,3);
driver->print();
driver->~Base();
driver = new(pool) A(4);
driver->print();
driver->~Base();
}https://stackoverflow.com/questions/59583317
复制相似问题