bitfield.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * FILE     bitfield.h
  3.  *
  4.  * Version  1.1
  5.  * Author   Copyright (c) Marc A. Viredaz, 1998
  6.  *          DEC Western Research Laboratory, Palo Alto, CA
  7.  * Date     April 1998 (April 1997)
  8.  * System   Advanced RISC Machine (ARM)
  9.  * Language C or ARM Assembly
  10.  * Purpose  Definition of macros to operate on bit fields.
  11.  */
  12. #ifndef __BITFIELD_H
  13. #define __BITFIELD_H
  14. #ifndef __ASSEMBLY__
  15. #define UData(Data) ((unsigned long) (Data))
  16. #else
  17. #define UData(Data) (Data)
  18. #endif
  19. /*
  20.  * MACRO: Fld
  21.  *
  22.  * Purpose
  23.  *    The macro "Fld" encodes a bit field, given its size and its shift value
  24.  *    with respect to bit 0.
  25.  *
  26.  * Note
  27.  *    A more intuitive way to encode bit fields would have been to use their
  28.  *    mask. However, extracting size and shift value information from a bit
  29.  *    field's mask is cumbersome and might break the assembler (255-character
  30.  *    line-size limit).
  31.  *
  32.  * Input
  33.  *    Size       Size of the bit field, in number of bits.
  34.  *    Shft       Shift value of the bit field with respect to bit 0.
  35.  *
  36.  * Output
  37.  *    Fld        Encoded bit field.
  38.  */
  39. #define Fld(Size, Shft) (((Size) << 16) + (Shft))
  40. /*
  41.  * MACROS: FSize, FShft, FMsk, FAlnMsk, F1stBit
  42.  *
  43.  * Purpose
  44.  *    The macros "FSize", "FShft", "FMsk", "FAlnMsk", and "F1stBit" return
  45.  *    the size, shift value, mask, aligned mask, and first bit of a
  46.  *    bit field.
  47.  *
  48.  * Input
  49.  *    Field      Encoded bit field (using the macro "Fld").
  50.  *
  51.  * Output
  52.  *    FSize      Size of the bit field, in number of bits.
  53.  *    FShft      Shift value of the bit field with respect to bit 0.
  54.  *    FMsk       Mask for the bit field.
  55.  *    FAlnMsk    Mask for the bit field, aligned on bit 0.
  56.  *    F1stBit    First bit of the bit field.
  57.  */
  58. #define FSize(Field) ((Field) >> 16)
  59. #define FShft(Field) ((Field) & 0x0000FFFF)
  60. #define FMsk(Field) (((UData (1) << FSize (Field)) - 1) << FShft (Field))
  61. #define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1)
  62. #define F1stBit(Field) (UData (1) << FShft (Field))
  63. #define FClrBit(Data, Bit) (Data = (Data & ~(Bit)))
  64. #define FClrFld(Data, Field) (Data = (Data & ~FMsk(Field)))
  65. /*
  66.  * MACRO: FInsrt
  67.  *
  68.  * Purpose
  69.  *    The macro "FInsrt" inserts a value into a bit field by shifting the
  70.  *    former appropriately.
  71.  *
  72.  * Input
  73.  *    Value      Bit-field value.
  74.  *    Field      Encoded bit field (using the macro "Fld").
  75.  *
  76.  * Output
  77.  *    FInsrt     Bit-field value positioned appropriately.
  78.  */
  79. #define FInsrt(Value, Field) 
  80.                  (UData (Value) << FShft (Field))
  81. /*
  82.  * MACRO: FExtr
  83.  *
  84.  * Purpose
  85.  *    The macro "FExtr" extracts the value of a bit field by masking and
  86.  *    shifting it appropriately.
  87.  *
  88.  * Input
  89.  *    Data       Data containing the bit-field to be extracted.
  90.  *    Field      Encoded bit field (using the macro "Fld").
  91.  *
  92.  * Output
  93.  *    FExtr      Bit-field value.
  94.  */
  95. #define FExtr(Data, Field) 
  96.                  ((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
  97. #endif /* __BITFIELD_H */