TMS320F28379D浮点数内存格式问题

字节序

小端:低字节放低地址空间,高字节放高地址空间,小端模式符合读取、理解习惯,大部分MCU、X64 CPU都采用小端

大端:高字节放低地址空间,低字节放高地址空间,大端模式符合书写、拼读、传输习惯,比如网络字节序一般使用大端模式

代码

测试浮点数的存储格式

typedef union {
    float DataFloat;
    uint16_t DataUint16[2];
    unsigned char DataUint8[4];
} FloatUnion;

void main(void)
{
    FloatUnion fu;
    fu.DataFloat = 123.456f;
    uint16_t val1 = fu.DataUint16[0];
    uint16_t val2 = fu.DataUint16[1];
    unsigned char val3 = fu.DataUint8[0];
    unsigned char val4 = fu.DataUint8[1];
    unsigned char val5 = fu.DataUint8[2];
    unsigned char val6 = fu.DataUint8[3];
    
}

测试

调试查看Memory Brownser,16-Bit Hex格式下对应的数据从低到高:0xF979 0x42F6

在这里插入图片描述
对应的结果是0x42F6E979(高字节放高地址空间),按 IEEE 754 单精度浮点格式还原:

  • 符号位(1位)0
    • 0 表示正数,1 表示负数。
  • 指数位(8位)10000101
    • 十进制值:133(无符号整数),对应的指数为133 - 127 = 6。
  • 尾数位(23位)11101101110100101111001
    • 隐含前导的 1.(即实际尾数为 1.11101101110100101111001)。

计算结果跟123.456f吻合

1.11101101110100101111001 ≈ 1.929000139
1.929000139 × 2^6 = 1.929000139 × 64 ≈ 123.456

可以看到uint16_t能还原原始的数据内容,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)

在这里插入图片描述

unsigned char不行,第一个索引是59769(0xE979),第二个索引是17142(0x42F6)2、3索引对应的数据都是0

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另外unsigned char直接赋值也会有问题,很明显第三、四个DataUnit8是取到后面的内存去了

在这里插入图片描述

总结

  • DSP TMS320F28379D使用小端模式存储数据
  • 不能简单用4个unsigned char理解float,但可以用2个uint16_t理解float,用指针强转的朋友留意!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下里巴人hywing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值