【问题标题】:How to design the class for communicating with different modules如何设计与不同模块通信的类
【发布时间】:2021-06-25 14:28:44
【问题描述】:

我有一块微控制器板,上面有不同的子模块。每个模块都有一个地址和可以寻址的不同寄存器。 例如:

GPIO module
-Address 0x1212
-Registers:
--InputRegister
--OutputRegister

PLL module
-Address 0x2342
-Registers:
--PhaseRegister
--ErrorRegister
--LockedInRegister

这些子模块可以通过 UART 消息进行控制,其中包含地址、寄存器和要写入的值。
我需要实现一个类来与微控制器和模块进行通信。 最简单的方法是实现这样的函数:

void send_message(int address, int parameter, int value) {
...
}

但是可以向不存在的随机地址或不属于所选模块的寄存器发出写入。

我的想法是为模块实现一个基类,并为每个子模块派生一个类,如下所示

但是如何正确声明可用的寄存器呢? 如何以适当的方式实施?

【问题讨论】:

  • send_message() 中的parameter 是寄存器类型吗?

标签: c++ class


【解决方案1】:

公共继承是可用的最强关系(除了友谊),如果在编译时知道信息,您可以使用模板获得松散耦合的代码:

#include <iostream>
template<int address, int reg>
struct Module
{
    static constexpr int address_ = address;
    static constexpr int register_ = reg;
};

typedef Module<10, 100> Input;
typedef Module<10, 1000> Output;
typedef Module<20, 100> Phase;
typedef Module<20, 1000> Error;
typedef Module<20, 10000> LockedIn;

template<class Module>
void send_message(int value) 
{
    std::cout << "using address: " << Module::address_ << " at register " <<    Module::register_ << " with value: " << value << std::endl;
}

int main()
{
    send_message<Input>(-100);
    send_message<Output>(-100);
    send_message<Phase>(-100);
    send_message<Error>(-100);
    send_message<LockedIn>(-100);
}

请注意,不可能发送无效的寄存器/地址对(假设开头的 typedef 没有错误)。

在微控制器类中,您可以添加一个方法,将客户端调用转换为正确的 send_message 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多