これまで、ポートやレジスタにアクセスするために以下のようにしてきました。
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が有効になりますか?よりよいコーディングをしたいものの知識が乏しく困っています。
よろしくお願いいたします。