gpt4 book ai didi

c++ - 传递外围对象以用作嵌入式系统中的类成员

转载 作者:搜寻专家 更新时间:2023-10-31 01:28:34 25 4
gpt4 key购买 nike

在使用 C++(例如,使用 MBED)进行嵌入式编程时,我经常为 I2C 或串行等设备外围设备全局声明对象,这些对象通常为您为特定应用程序使用该设备的引脚获取参数:

I2C i2c(SDA_1, SCL_1);
Serial my_serial(D7, D8);

如何正确地将这些对象传递给其他类?我想在我的平台级代码中保留所有应用程序特定信息,理想情况下应用程序中的每个类都应该使用这些对象的相同实例,但我似乎无法正确设置构造函数语法以便外围对象可以在声明时传递到类中,然后用作该类中的成员对象。

示例:我在 main.cpp 文件中全局声明了一个设备外围设备:

I2C i2c(SDA_1, SCL_1);

我需要在我的应用程序中使用的几个对象中使用这个 i2c 外设,例如 ThingController。这是我尝试使用指针传递这些对象:

事物 Controller .h

class ThingController {
public:
ThingController(I2C *i2c);
void init();
void run();
private:
I2C my_i2c;

事物 Controller .cpp

Editor::Editor(I2C *i2c)
{
my_i2c = *i2c;

为此,我在头文件中得到“类 I2C 不存在默认构造函数”,这意味着它只是试图创建该类的新实例。如果我尝试按值传递,我会得到同样的结果。

这样做的语法是什么?或者,就我的想法而言,我是否偏离了?我无法在网上找到与我遇到的问题类似的任何其他内容,考虑到如果我想在我的应用程序中使用类,我需要多频繁地执行此确切任务,这让我觉得很奇怪。是否每个人都只是通过大量特定于应用程序的引脚列表,然后为每个类创建这些硬件外围设备的新实例?或者其他方法?

最佳答案

您已将成员my_i2c 声明为I2C实例,这意味着它的默认构造函数将在 的构造函数中调用>ThingController 如果您不自己调用它。因为它没有 default constructor ,您收到此错误。

您需要做的就是使实例成员成为一个引用(或指针)而不是一个值,如下所示:

class ThingController {
public:
ThingController(I2C& i2c);
void init();
void run();
private:
I2C& my_i2c;
}

Editor::Editor(I2C& i2c) :
my_i2c(i2c)
{
}

您可以使用指针而不是引用,但在这种情况下,引用的语义更适合您的情况 - 您希望将其初始化一次而不更改它。

阅读 constructors and member initialiser syntax 是个好主意涵盖了所有这些。

Does everyone just pass through massive lists of application specific pins and then make new instances of these hardware peripherals for every class? Or another approach?

不,那将是一个非常糟糕的主意。 :) I2C 和 SPI 等外设应该有一个单例包装类,它允许您序列化访问。如果您传入了引脚定义并创建了 I2C 类的多个实例(例如),您最终可能会有代码的两个不同部分同时尝试访问外设,并导致各种问题奇怪且难以调试的问题。上面的方法很好,你还想看看在 I2C 类上添加互斥锁和锁定/解锁方法。

关于c++ - 传递外围对象以用作嵌入式系统中的类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51887789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com