これまで、ポートやレジスタにアクセスするために以下のようにしてきました。
typedef struct tRegs { volatile unsigned int sourceReg; volatile unsigned int destinationReg; volatile unsigned int lengthReg; } Regs; Regs *dma1Reg = (Regs *)DMA1_BASE_ADDR; void func() { dmaReg->sourceReg = SOURCE_ADDR; }●質問1
これは、
typedef struct tRegs { unsigned int sourceReg; unsigned int destinationReg; unsigned int lengthReg; } Regs; volatile Regs *dma1Reg = (volatile Regs *)DMA1_BASE_ADDR; ‥‥としても同じでしょうか?
というのは、レジスタアクセス以外に
通常の変数としてもこのRegs構造体を使用したいのです。
Reg saveReg; void func2() { saveReg.sourceReg = SOURCE_ADDR2; }しかし、このときにvolatileによって毎回メモリアクセスすることになり
処理に遅延が発生するのではないかと懸念しています。
●質問2
質問1の結果次第ではありますが、構造体を入れ子関係にした場合、
例えば、
typedef struct tRegs { unsigned int sourceReg; unsigned int destinationReg; unsigned int lengthReg; } Regs; typedef struct tDMARegs { Regs DMA0; Regs DMA1; } DMARegs; volatile DMARegs *dmaRegs = (volatile Regs *)DMA_BASE_ADDR; ‥‥とした場合にRegsの要素にvolatileが有効になりますか?
よりよいコーディングをしたいものの知識が乏しく困っています。
よろしくお願いいたします。