メモリマップレジスタを読み書きするベアメタルプログラム(ドライバ)があります。 例えば:メモリアクセス(MISRA 2008)を扱うときにポインタからキャスト整数への回避に最適な方法
void foo_read(uint64_t reg_base, uint32_t *out_value)
{
*out = READREG(reg_base + FOO_REG_OFFSET);
}
- reg_baseがFOO_REG_OFFSETがレジスタ(
#define FOO_REG_OFFSET 0x00000123
)からオフセットされているメモリマップされたデバイスのベースアドレス(64ビット アドレス) - あります。レジスタ "foo"は32ビット "ワイド"です。
READREGは次のように定義されています。
#define READREG(address) (*(uint32_t*)(address))
あなたはMISRA 2008ポインタ(5-2-7/5-2-8であるにunsigned long long型からキャストに満足していない推測できるとおり報告)。私の質問は、メモリにアクセスしてMISRAの警告を取り除く最良の/適切な方法は何ですか?ポインタにキャストする前にuintptr_tにキャストしようとしましたが、This didn't helpです。
ありがとうございます。
かなり明白な質問です。 reg_base'は実際にはポインタなので、 'uint8_t *'と入力してみてください。 – hidefromkgb
@hidefromkgb:または 'uint32_t *'、 'reg_base'が本当に整数である必要があるのなら、なぜ' uintptr_t'ではなく 'uint64_t'を使うのですか? (MISRAはおそらくそれを好まないでしょうが、 'intptr_t'や' uintptr_t'はポインタ値を保持する整数にとって最も論理的な型です)。 –
@KeithThompson、wouldn \ 't' uint32_t * 'FOO_REG_OFFSETに4を掛けます。 'reg_base'に追加しますか? – hidefromkgb