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这种联合体也就是为了方便初始化数据