Bit manipulations good practices

后端 未结 7 540
情书的邮戳
情书的邮戳 2021-02-03 20:28

As a beginner C programmer, I am wondering, what would be the best easy-to-read and easy-to-understand solution for setting control bits in a device. Are there any standards

7条回答
  •  挽巷
    挽巷 (楼主)
    2021-02-03 20:57

    Modern C compilers handle trivial inline functions just fine – without overhead. I’d make all of the abstractions functions, so that the user doesn’t need to manipulate any bits or integers, and is unlikely to abuse the implementation details.

    You can of course use constants and not functions for implementation details, but the API should be functions. This also allows using macros instead of functions if you’re using an ancient compiler.

    For example:

    #include 
    #include 
    
    typedef union DmaBase {
      volatile uint8_t u8[32];
    } DmaBase;
    static inline DmaBase *const dma1__base(void) { return (void*)0x12340000; }
    
    // instead of DMA_CONTROL_OFFS
    static inline volatile uint8_t *dma_CONTROL(DmaBase *base) { return &(base->u8[12]); }
    // instead of constants etc
    static inline uint8_t dma__BYTE(void) { return 0x01; }
    
    inline bool dma_BYTE(DmaBase *base) { return *dma_CONTROL(base) & dma__BYTE(); }
    inline void dma_set_BYTE(DmaBase *base, bool val) {
      if (val) *dma_CONTROL(base) |= dma__BYTE();
      else *dma_CONTROL(base) &= ~dma__BYTE();
    }
    inline bool dma1_BYTE(void) { return dma_BYTE(dma1__base()); }
    inline void dma1_set_BYTE(bool val) { dma_set_BYTE(dma1__base(), val); }
    

    Such code should be machine generated: I use gsl (of 0mq fame) to generate those based on a template and some XML input listing the details of the registers.

提交回复
热议问题