首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要实例化不同类/对象并在引导时确定的硬件插槽的设计模式

需要实例化不同类/对象并在引导时确定的硬件插槽的设计模式
EN

Stack Overflow用户
提问于 2020-01-04 02:08:17
回答 1查看 118关注 0票数 0

这是一个我正在为其设计程序的嵌入式定制电路板的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++中这样做,并将类作为联合的成员,然后以某种方式使其成为您确定插槽包含的类的类型?

还有其他的设计想法吗?

为了让别人更好地了解这个问题,还需要添加其他信息吗?

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2020-01-06 04:39:56

由于这是一个嵌入式系统,我想避免使用关键字“

”,但这并不是一成不变的。

您可以使用"placement new“和静态分配的内存缓冲区,其大小是所用类大小的最大值。类似于以下内容(see in online ide):

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59583317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档