Renesas Synergy™

FAQ 105845 : CC32Rにおいて、ビットフィールドをアクセスするにはどうすればいいでしょうか?

Q: 質問

CC32Rにおいて、ビットフィールドをアクセスするにはどうすればいいでしょうか?


A: 回答

次のいずれかの方法でアクセスしてください。

  1. ビットフィールドを間接的にハーフワードアクセスにする方法(下記1.参照)
  2. ビットフィールドを用いず、マクロで実現する方法(下記2.参照)

※マクロで実現する方法のほうが比較的効率が良いコードになります。

  1. ビットフィールドを間接的にハーフワードアクセスにする方法
    /* ビットフィールドの宣言 */
    typedef union
    {
    unsigned long Word; /* ワードデータアクセス用 */
    struct
    {
    unsigned short dummy7bit :7; /* 予備(0固定)*/
    unsigned short b8 :1; /* ビットNo.8 */
    unsigned short b7 :1; /* ビットNo.7 */
    unsigned short b6 :1; /* ビットNo.6 */
    unsigned short b5 :1; /* ビットNo.5 */
    unsigned short b4 :1; /* ビットNo.4 */
    unsigned short b3 :1; /* ビットNo.3 */
    unsigned short b2 :1; /* ビットNo.2 */
    unsigned short b1 :1; /* ビットNo.1 */
    unsigned short b0 :1; /* ビットNo.0 */
    } Bit;
    } TypeP1;

    /* アドレスの宣言 */
    #define io_P1 (*(volatile TypeP1 *)0x00800100)

    /* ビットフィールドを間接的にアクセスする関数の例 */
    void
    foo1()
    {
    TypeP1 work;

    /* ビット No.8への書き込み */
    work.Word = io_P1.Word; /* ハーフワードで読出す為 */
    work.Bit.b8 = 0;
    io_P1.Word = work.Word; /* ハーフワードで書込む為 */

    /* ビット No.5への書き込み */
    work.Word = io_P1.Word; /* ハーフワードで読出す為 */
    work.Bit.b5 = 0;
    io_P1.Word = work.Word; /* ハーフワードで書込む為 */
    }


  2. マクロを用いる場合
    /* アドレスの宣言 */
    #define io_P2 (*(volatile unsigned short *) 0x00800200)

    /* 各ビットへのアクセス (予備ビットは常に0を書き込む) */
    #define SET_P2_B5(x) (io_P2=(io_P2 & 0x03DF)|(x)<<5)
    #define SET_P2_B8(x) (io_P2=(io_P2 & 0x02FF)|(x)<<8)


    /* マクロによるアクセス関数の例 */
    void
    foo2()
    {
    /* ビット No.8に0を書き込む */} SET_P2_B8(0);

    /* ビット No.5に0を書き込む */
    SET_P2_B5(0);
    }

[参考]
CC32Rでは、ビットフィールドを特定のサイズ (ハーフワードなど)でアクセスするようなコード生成をサポートしておりません。常に最小サイズでアクセスするようになっています。

 

 

適用製品

M32Rファミリ用C/C++コンパイラパッケージ [M3T-CC32R]
他にご質問がございましたら、リクエストを送信してください