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 |
另外其对于取址对齐有很高的要求,32位数据要求地址也是 2 byte 对齐,例子如下。
uint16_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]);