ARM Cortex-M4 CPU といくつかの周辺機器を含む組み込みシステムに取り組んでいます。ペリフェラルの 1 つには、CPU 側から (AHB バス経由で) アクセスできる SRAM のブロックが含まれていますが、アクセスはワード サイズのトランザクション (LDR を使用) である必要があります。バイトトランザクション(LDRB)を行うと例外が発生します。
私のコードでは、そのメモリ内の配列から値を読み取り、それをローカル変数に割り当てています。宣言は次のようになります。
typedef enum
{
eType0 = 0,
eType1 = 1,
} type_t;
type_t arr_type;
uint32_t *array = BUF_ADDR; // array on periph. memory
uint32_t offset = 0;
arr_type = (type_t) array[offset]; // exception!
このコードを実行すると、メモリの読み取り時に例外が発生します。この割り当てによってアセンブリ コードが生成されることがあります。
LDRB R1, [R2, R3, LSL #2]; // R2=array, R3=offset
これは、括弧を追加して式を明示的にキャストした場合でも当てはまります。
type = (uint32_t) (array[offset]);
これを解決する方法は、代わりにarr_type
asを宣言することでした。さて、コードは次のとおりです。uint32_t
type_t
LDR R1, [R2, R3, LSL #2];
これは予想される動作ですか?array
括弧とキャスト (ポインターの自然な型でない場合) により、コンパイラーは生成され、LDR
命令されると思います。したがって、これはバグのように見えます。