This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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存储器操作

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

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

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

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

  • jian liu4 说:

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

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

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

    建议你在AxisX_Move.Axis_Data.Status.ErroStatus = sbuf后添加测试语句,看看是不是这边的赋值影响到的

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

    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;
    };
    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;

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

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

  • buffer和结构体是一个联合体,这个没有问题,debug时看的出来; buffer数据空间较大,仅仅用作扩展可能加入的结构体数据,buffer仅在上电初始化调用了一次全部清零,用buffer这种联合体也就是为了方便初始化数据
  • 这样的话,还真看不出哪里有问题了。关键你的这个BUG不好稳定重现。