TI中文支持网
TI专业的中文技术问题搜集分享网站

DSP28335位寄存器问题

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

rookiecalf:

不能吧,确定没有其他的地方更改过,你把调试断点放在这个赋值句处单步调试的吗?

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

jian liu:

回复 rookiecalf:

问题本身出现概率很低,程序检查了N遍,断点也放过,测试主要放ESTOP0宏指令看程序有没有出错;

程序执行1s左右写一次AxisX_Move.Axis_Data.Status.StopMode=2,大概200-9000次必出现一次出错;

只要删除AxisX_Move.Axis_Data.Status.ErroStatus = sbuf这句,就不会出问题

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

rookiecalf:

回复 jian liu:

jian liu4

问题本身出现概率很低,程序检查了N遍,断点也放过,测试主要放ESTOP0宏指令看程序有没有出错;

程序执行1s左右写一次AxisX_Move.Axis_Data.Status.StopMode=2,大概200-9000次必出现一次出错;

只要删除AxisX_Move.Axis_Data.Status.ErroStatus = sbuf这句,就不会出问题

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

jian liu:

回复 rookiecalf:

直接在后面添加测试语句测试看不到,不知道为什么

AxisX_Move.Axis_Data.Status.StopMode,我把它改成AxisX_Move.Axis_Data.StopMode,Uint16格式,也就是不用位变量,所有的问题都消失了;

连续运行了3天,程序都没有出现过这个问题了?

定义StopMode位变量时都没有定义联合体,所以同样程序修改前不存在从其他地方操作导致AxisX_Move.Axis_Data.Status.StopMode变化的情况;所有怀疑是不是这个位变量操作过于频繁会出问题,请教TI工程师

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

rookiecalf:

回复 jian liu:

这边看不到你完整定义,应该还是你那里定义有错

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

jian liu:

回复 rookiecalf:

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;            Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;};struct Move_Data{    struct MoveSet_BITS Set;    int32 HomeLSpeed;     int32 HomeHSpeed;     int32 HomeAPls;       struct MoveStatus_BITS Status;    Uint16 SStopMode;    int32 AbsPos;        int32 CmdPos;       int32 Speed;     };union Axis_Move{    Uint16 Buffer[40];        struct Move_Data Axis_Data;};

union Axis_Move         AxisX_Move;

以上是完整的定义;红色位置程序会出错,将程序中所有红色的变量改为绿色的那个就没有问题了

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

rookiecalf:

回复 jian liu:

你的共同体和结构体用得有点怪,你的buffer数组是干嘛的?和后面的结构体是一个东西吗,我看着有点不像啊。

struct MoveStatus_BITS {    Uint16 RunStatus:1;     Uint16 ErroStatus:3;    Uint16 AccStatus:2;     Uint16 Dir:1;           Uint16 reserve1:1;        Uint16 StopMode:2;     Uint16 reserve:6;
};

定义一个位寄存器结构体,对其中某一位写操作,为什么会影响其他位的状态?

例如定义如下:

int16 sbuf=0;

…..sbuf处理函数

AxisX_Move.Axis_Data.Status.ErroStatus = sbuf;

执行上面这一句,会导致程序中AxisX_Move.Axis_Data.Status.StopMode写操作偶然不成功,这个是什么原因?具体情况:在中断中写AxisX_Move.Axis_Data.Status.StopMode=2,写成功了,因为执行AxisX_Move.Axis_Data.Status.ErroStatus = sbuf,导致再次读AxisX_Move.Axis_Data.Status.StopMode为0,非常奇怪

所有数据都是SRAM存储器操作

jian liu:

回复 rookiecalf:

buffer和结构体是一个联合体,这个没有问题,debug时看的出来;
buffer数据空间较大,仅仅用作扩展可能加入的结构体数据,buffer仅在上电初始化调用了一次全部清零,用buffer这种联合体也就是为了方便初始化数据

赞(0)
未经允许不得转载:TI中文支持网 » DSP28335位寄存器问题
分享到: 更多 (0)