C2000 DSP は、現代ではまさに唯一無二の16ビットバイトを採用しているので、メモリのアドレス指定が通常の CHAR_BIT == 8 とは異なる。この点は、プロトコル層のデータをゼロコピーで強制キャストするときに特に注意が必要だ。以前にも対応したことがあるのに、今日またこの問題に出くわして忘れていた。手動でテストし直す必要があったので、メモしておく。 U32 実際のメモリレイアウト C2000 0x87654321 4321 8765 通常の8ビットリトルエンディアン 0x87654321 21 43 65 87 浮動小数点値 実際のメモリレイアウト 対応するU32値 C2000 123.456 E979 42F6 0x42F6E979 通常の8ビットリトルエンディアン 123.456 79 E9 F6 42 0x42F6E979 また、C2000 はアドレスアライメントに対する要求が非常に高く、32ビットデータのアドレスも2バイトアライメントが必要だ。例は以下の通り。Cuint16_t buffer[8]; uint32_t t32; /* 以下两个实际上都会以 [0][1] 取内存转为 u32 */ // 在通常的CPU中,以下会以 [1][2] 取内存转 u32 t32 = *(uint32_t *)(& buffer[1]); // 在通常的CPU中,以下是 [0][1] 正确零拷贝取法 t32 = *(uint32_t *)(& buffer[0]); /* 以下两个则会以 [2][3] 取内存转为 u32 */ t32 = *(uint32_t *)(& buffer[3]); t32 = *(uint32_t *)(& buffer[2]);
C2000の特殊なメモリレイアウト
C2000 DSP は、現代ではまさに唯一無二の16ビットバイトを採用しているので、メモリのアドレス指定が通常の CHAR_BIT == 8 とは異なる。
この点は、プロトコル層のデータをゼロコピーで強制キャストするときに特に注意が必要だ。以前にも対応したことがあるのに、今日またこの問題に出くわして忘れていた。手動でテストし直す必要があったので、メモしておく。
また、C2000 はアドレスアライメントに対する要求が非常に高く、32ビットデータのアドレスも2バイトアライメントが必要だ。例は以下の通り。