組み込みソフト開発に不可欠なread modify write

  • 2020.02.03
  • C
組み込みソフト開発に不可欠なread modify write

組み込みソフトは、各ペリフェラルデバイスのレジスタの値を操作することでハードウェアを制御し、様々な動作を実現します。

このとき、

  • あるレジスタの特定のbitだけ変更したい
  • あるレジスタの特定のフィールドだけ変更したい

というときがある。

例として、Xilinx のUART transmitterのコントロールレジスタを見てみます。

受信FIFOのリセットをしたいとき、コントロールレジスタの2bit目だけを1にセットし、その他のレジスタはそのままの値にしておく必要がある。

ここで、単純に0x02(0000_0010)と書き込むと2bit以外の他のbitは0にセットされてしまい、意図しない動作になってしまう。

ここでRead-Modify-Writeが登場する。

Read-Modify-Writeとは

特定のビットだけ操作するためには、

  1. レジスタの現在の値を読み取り(READ)
  2. 読み取った値の特定ビットを変更し(MODIFY)
  3. 変更後の値を書き込む(WRITE)

を行う。このことをRead Modify Write(リード モディファイ ライト)という。

例:特定のbitを1にする

例として、特定のbitを1にセットする関数を示す。

ここで、reg_read32()はモジュールのレジスタの値を読み出す関数とする。reg_write32()は書き込み。

Read
まず、reg_read32()addrで指定したレジスタの値を読み出す。

Modify
次に、読み出した値regvalに対してbitmaskで1が立っているbitを1にセットします。例えば、bitmaskに0x0020が入力された場合はregvalの6bit目が1にセットされる。

Write
最後に、addrregvalの値を書き込みします。

Cカテゴリの最新記事