2017-12-29 8 views
3

私はbcm2835 RPiチップの "Device Tree Blob"を書いていますが、C++ファイルでは.dtsファイルではなく書き込んでいます。その目的は、C++とOSの概念を実践することです。C++の内部クラスに代わって

登録アドレスだけでなく、それらにアクセスする機能をカプセル化して、API機能としてトップレベルの用途だけを公開したいと考えています。

//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); 
    } 
} 

をそして私はまた、64ビットであり、非常に異なったため、LED扱いBCM2837のためのクラスを持つことができます。

C++では、これはそうのように一つの大きなBCM2835クラスの内部クラスとすることもできます例。

//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、などのようなものが含まれた後、単一のクラスの長さで、最も私を気にするようだ1など

ARMCpuは、私はむしろ避けることになるだけでなくdesigendであると(100%仮想た場合でも組み込みの場合)、各CPUクラスはかなり長く、読み込みと保守が困難です。

C++でこの種のプライベートレベルのアクセスを実現する方法はありますか?

+1

うわー、このボードはC++をサポートしていますか? – Jarkid

+1

それは面白いです!はい? –

+0

母、私は冗談を言っていません。私はボードのほとんどがCのみをサポートしていると思ったので...あなたの返事をありがとう。 – Jarkid

答えて

3

各チップを独自の.cppファイルに入れ、そのファイル内の(ヘッダーではなく)その内部のものをすべて宣言します。リンカーに公開されないように、匿名の名前空間でそれらをラップすることができます。

+0

私はそれが大好き!ありがとう! –

関連する問題