打印

使用结构体遇到的问题

[复制链接]
697|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
FIFO, ui, AC, AD, nex
本帖最后由 星夜的雨 于 2019-8-24 20:12 编辑

     
第一张图是给fifo->buf 和 fifo->size 赋值,fifo->buf目前指的是空,先不管这个,因为他和fifo->size出现的问题一样。给fifo->size赋值后,在仿真模式下,看到这个值是1000(0x3e8,RAM地址0x0003)
单步调试(再看第二张图),给fifo->free赋值,赋值后发现 fifo->size的值发生了改变。

这个是我定义的结构体
typedef struct
{
    char *buf;   //
    uint16_t size;        //
    uint16_t free;        //fifo空余
    uint16_t write_next_add;
    uint16_t read_next_add;

}FIFO;



哪位大佬可以解释一下为什么会这样,谢谢

149595d61256706012.png (498.58 KB )

149595d61256706012.png

152355d6125818332f.png (544.87 KB )

152355d6125818332f.png

使用特权

评论回复

相关帖子

沙发
tianxj01| | 2019-8-27 08:50 | 只看该作者
结构体总长度不够,则内部成员共用空间,而不是连续平铺,当然造成赋值后者改变前者。
这里只是把1281(0X0501)的高位推到了buf原来的高位,就让 0x03E8(1000)变成0x05E8(1512)。

使用特权

评论回复
板凳
tianxj01| | 2019-8-27 09:02 | 只看该作者
本帖最后由 tianxj01 于 2019-8-27 09:09 编辑

其实,我们利用这个特点,经常这样干:
把结构体长度定义为16位,然后下面是内部成员
{
uint16_t BUF_ALL;
uint8_t BUF_H;
uint8_t BUF_L;
}ADC_COVE_OUT;

这样,只需要分2次读入ADC结果高低位,BUF_ALL 就自动是一个完整的16位ADC结果,而不需要再这样运算:ADC_COVE_OUT=BUF_H<<8+BUF_L;  节省时间,减少代码,提高效率。
还有浮点数的EEPROM存储,因为EEPROM存储必须是8为操作,则我们是这样做的
union
        {
                float  CS5463_V;
                struct
                        {
                                u8 AC_V[4];                        
                        };
        };
整体的,CS5463_V,就是一个完全可以自由操作的浮点数。
而如果对这个浮点数进行EEPROM存储,则只需要对数组AC_V[4]进行存储即可。

使用特权

评论回复
地板
HappyXue| | 2019-8-27 16:20 | 只看该作者
本帖最后由 HappyXue 于 2019-8-27 16:26 编辑

根据楼主代码,首先看到的一个问题就是fifo定义的是指针类型,但没看到在哪初始化,看你指向地址0处,估计没初始化过,可能是个空指针。
至于楼主的疑问,由于代码太少,看不出原因。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝