C ++内部类的替代方法

山姆·哈马米

假设我正在为bcm2835 RPi芯片编写“设备树Blob”,但使用的是C ++文件,而不是.dts文件。目的是练习C ++和OS概念。

我希望不仅可以封装寄存器地址,还可以封装访问这些地址的函数,并且仅将顶级用途公开为API函数。

C++这个内部类中,可以像这样对一个大型BCM2835类:

//bcm2835.h
class BMC2835 : public ARMCpu
{
public:
    void ACKLedOn(void);
    void ACKLdOff(void);
    void ACKLedBlink(void);

    // I2C write to device (this would be called by the device driver)
    // It would ensure that I2C is setup, etc, etc
    void I2C_Device_Write(I2C_Device* device, uint8_t* buffer);
private:

    // Physical addresses for various peripheral register sets
    /// Base Physical Address of the BCM 2835 peripheral registers
    const uint32_t BCM2835_PERI_BASE       = 0x20000000;

    class GPIO()
    {
    private:
       /// Base Physical Address of the Pads registers
       const uint32_t BCM2835_GPIO_PADS    = (BCM2835_PERI_BASE + 0x100000)

       /// Sets the Function Select register for the given pin, which configures
       /// the pin as Input, Output or one of the 6 alternate functions.
       void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode);
    }

    class I2C()
    {
       private:
           const uint32_t BCM2835_CORE_CLK_HZ    = 250000000  ;///< 250 MHz
           // Register masks for BSC_C
           const uint32_t BCM2835_BSC_C_I2CEN    = 0x00008000;///< I2C Enable, 0 = disabled, 1 = enabled
           const uint32_t BCM2835_BSC_C_INTR     = 0x00000400;///< Interrupt on RX
           const uint32_t BCM2835_BSC_C_INTT     = 0x00000200;///< Interrupt on TX
           void bcm2835_i2c_begin(void);
           void bcm2835_i2c_write(uint8_t address, uint8* pbuffer);
    }
}

然后,我还可以为BCM2837创建一个类,该类是64位的,例如处理LED的方式非常不同。

//bcm2837.h
class BCM2837 : public ARMCpu
{
    public:
        // LED is now a very different Implementation with Mailbox
        // but exposed to Kernel as API
        void ACKLedOn(void);
        void ACKLdOff(void);
        void ACKLedBlink(void);
    ...
    ...
}

我确信这种方法存在很多问题。在一个似乎打扰我最多的是单级后,你包括像长度SPIUART等等,等等。

即使设计得ARMCpu很好并且是100%虚拟的(我宁愿避免在嵌入式系统中使用),每个CPU类仍然相当冗长,并且难以阅读和维护。

有没有一种方法可以更轻松地在C ++中实现这种类型的私有级别访问?

1201程序警报

将每个芯片放在其自己的.cpp文件中,并在该文件内(而不是在标头中)声明所有这些私有的内部事物。您可以将它们包装在匿名名称空间中,以防止它们暴露给链接器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章