お世話になります。そーすと申します。
初歩的な質問で大変恐縮なのですが、不明点についてご享受頂ければと思っております。
他人の記述したソースファイルを読んでいて不明な箇所がありました。
内容としては、iodefine.hのマクロを利用してモジュールコントロールレジスタAのMTUモジュールストップ状態を解除している、と思うのですが
以下の様な記述となっており、有効となるモジュールがどれになるのか、よくわかっておりません。
MSTP(MTU0) = 0; MSTP(MTU9) = 0;
●以下iodefine.hから抜粋↓↓↓↓↓↓ ※プロジェクト作成時に自動生成されるiodefine.hのを利用していると思われます。
#define __MSTP( x ) MSTP ## x#define _MSTP( x ) __MSTP( x )#define MSTP( x ) _MSTP( _ ## x )
#define MTU0 (*(volatile struct st_mtu0 *)0x88700)#define MTU1 (*(volatile struct st_mtu1 *)0x88780)#define MTU2 (*(volatile struct st_mtu2 *)0x88800)#define MTU3 (*(volatile struct st_mtu3 *)0x88600)#define MTU4 (*(volatile struct st_mtu4 *)0x88600)#define MTU5 (*(volatile struct st_mtu5 *)0x88880)#define MTU6 (*(volatile struct st_mtu0 *)0x88B00)#define MTU7 (*(volatile struct st_mtu1 *)0x88B80)#define MTU8 (*(volatile struct st_mtu2 *)0x88C00)#define MTU9 (*(volatile struct st_mtu3 *)0x88A00)#define MTU10 (*(volatile struct st_mtu4 *)0x88A00)#define MTU11 (*(volatile struct st_mtu5 *)0x88C80)
MSTPCRAには、MTUユニット0(MTU0~MTU5)またはMTUユニット1(MTU6~11)の2つのストップ状態解除を設定できるビットが存在するのは把握しているのですが
上記の様な記述をした場合、MTU0とMTU9のみストップ状態解除できたりするのか、あるいはMTUユニット単位の解除なのでMTU0~11まで全て解除されるのか
教えて頂ければと思っております。
経験が浅く、このマクロを使用した記述の仕方もあまり把握できておらず恐縮ですが
宜しくお願い致します。
わわいです
ここをきちんと読みましょう。そうすれば、
MSTP(MTU0) = 0;
ってのは、
MSTP_MTU0 = 0;
に展開されるってのがわかります。
あとは、
MSTP_MTU0
ってのはなにかiodefine.h で検索してみてください
わわいさんが書いていますが
MSTP(MTU0)はマクロ展開されるとMSTP_MTU0になります。MSTP_MTU0は別に定義されているので最終的にSYSTEM.MSTPCRA.BIT.MSTPA9 (RX72Mの場合) になります。
マクロで注意するのは##の記述です。
##xは引数のxをマクロ解析時に文字列として利用されます。MSTP( x )の引数xは _##xとなっている部分は_+xで指定した文字列になるので
MTU0を引数にすると_MSTP(_MTU0)になります。あとは残りを同じように展開するとわわいさんが書いているようになります。
わわい様、Shoji Yamamoto様
ご説明ありがとうございます。
恥ずかしながら、「##」が結合演算子であるという事すら理解していませんでした。
”##xは引数のxをマクロ解析時に文字列として利用される”ということも当然把握しておらず大変勉強になりました。
MSTP(MTU0) = 0; →MSTP_MTU0 = 0; →SYSTEM.MSTPCRA.BIT.MSTPA9 = 0;MSTP(MTU9) = 0; →MSTP_MTU9 = 0; →SYSTEM.MSTPCRA.BIT.MSTPA8 = 0;
MTUユニット0と1両方のストップ状態解除を指定する記述であると理解出来ました。
ありがとうございました。