質問: 0 のように、アドレス値からキャスティングを行い、値を入力したいです。 個人の事情で正直、経験者からすると上記のコードが正しいとは言えないと思いますが、 ヘッダーファイルなどやdefineで定義したアドレス値から上記の構造体にアクセスできるでしょうか? できたら、お手本と簡単な宣言とアクセスの仕方、 演習のため確認できたコンパイラなど教えてほしいです。 どうか何卒ご教授の方お願いします。 なんでもいいので返信お願いします。 では
回答: それは普通に行われてることで、間違いでもなんでも無いです。 たとえば、Renesas のRXマイコンのメーカ提供の周辺デバイスアドレ定義ファイルは以下のようになっています (一部抜粋) ``` iodefine.h #define AD (*(volatile struct st_ad __evenaccess *)0x89800) #define BSC (*(volatile struct st_bsc __evenaccess *)0x81300) #define CAN0 (*(volatile struct st_can __evenaccess *)0x90200) #define CAN1 (*(volatile struct st_can __evenaccess *)0x91200) #define CAN2 (*(volatile struct st_can __evenaccess *)0x92200) #define CMT (*(volatile struct st_cmt __evenaccess *)0x88000) #define CMT0 (*(volatile struct st_cmt0 __evenaccess *)0x88002) #define CMT1 (*(volatile struct st_cmt0 __evenaccess *)0x88008) #define CMT2 (*(volatile struct st_cmt0 __evenaccess *)0x88012) #define CMT3 (*(volatile struct st_cmt0 __evenaccess *)0x88018) #define CRC (*(volatile struct st_crc __evenaccess *)0x88280) ``` これでたとえば、 CAN0.CTLR.BIT.CANM = 0; と、レジスタにアクセスできます 追記 キーワード __evenaccess というのはルネサスコンパイラ特有のキーワードで、 > > 変数宣言時に拡張機能の__evenaccess修飾子を付加すれば、宣言した型のサイズでアクセスする命令を出力します。 > > > というものだそうです。