0

http://lxr.free-electrons.com/source/arch/arm/include/asm/io.h?v=3.1;a=armの Linux kerel コードで以下のコードを見つけました。

#define __raw_readl(a)          (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))

私はそれを理解することができません。それはどのように機能しますか。マップされたデバイスメモリからいくつかのバイトを読み取っていたことは知っていますが、それがどのように機能するのか理解できませんか?

4

1 に答える 1

1

次の方法で動作するようです。

  1. を呼び出して__chk_io_ptr(a)、使用可能なメモリを確認します
  2. unsigned intポインタを逆参照してメモリから読み取ります。

このマクロを次のように使用するとします。

unsigned int data = __raw_readl(a);

プリプロセッサによって、次のものに置き換えられます。

unsigned int data =  (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a));

dataそのため、 が指す保存unsigned long値のコンマ演算子の結果としてa

EDIT:__chk_io_ptr(a)これによるマクロのようです

#define __chk_io_ptr(x) (void)0

それは実際には何もしません。

于 2013-08-21T09:12:01.130 に答える