风过空庭,字句正徐来。
关于关于本站关于我给我点钱
更多时间线友链文件服务wiki
联系写留言发邮件GitHub
© 2024-2026 yono. | RSS 订阅 | 站点地图 | | Stay hungry. Stay foolish.
Powered by Mix Space&
白い
.
| 粤 ICP 备2024284785号-1 |
正在被0人看爆
且听风定,再看句成。

C2000 的特殊内存排布

w30w
AI·GEN

关键洞察

C2000 的特殊内存排布

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • 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]);