scfor123456 发表于 2020-1-2 16:38:32

仿真发现变量值与位值对应不上

变量是这样定义的:
struct DI_FUNC diSelectFunc;    // 是否有DI端子选择了相应的功能

struct DI_FUNC
{
    union DI_FUNC1f1;
    union DI_FUNC2f2;
};
struct DI_FUNC1_BITS
{
    Uint16 noFunc:1;                // 0
    Uint16 fwd:1;                   // 1
    Uint16 rev:1;                   // 2
    Uint16 tripleLineCtrl:1;      // 3
    Uint16 fwdJog:1;                // 4
    Uint16 revJog:1;                // 5
Uint16 closePwm:1;            // 6
Uint16 emergencyStop:1;         // 7
Uint16 errorReset:1;            // 8
Uint16 externalErrOpenIn:1;   // 9
    Uint16 up:1;                  // 10
    Uint16 down:1;                  // 11
Uint16 clearUpDownFrq:1;      // 12
    Uint16 localOrRemote:1;         // 13
Uint16 diOrComm:1;            // 14
    Uint16 multiSet:4;            // 15:18
Uint16 accDecTimeSrc:2;         // 19:20
    Uint16 runPause:1;            // 21
    Uint16 pidPauseI:1;             // 22
Uint16 pidPause:1;            // 23
Uint16 pidDirRev:1;             // 24
    Uint16 pidChg:1;                // 25
Uint16 rsvd1:5;   // 26:30
Uint16 frqOk:1;               // 31
};
union DI_FUNC1
{
    Uint32                  all;
    struct DI_FUNC1_BITS    bit;
};

仿真时diSelectFunc.f1.all和bit对不上,也不存在没有更新的问题,bit位变化时显示值会变化。
现在发现从bit15出现问题,比如说变量值第15位是1,但对应的bit位第15位却是0,很奇怪的现象。

mylovemcu 发表于 2020-1-2 18:59:48

数据长度不一致导致的联合体中all用的是32位的数据DI_FUNC1_BITS结构体中使用的是16位的数据

把uint16换成uint32应该就没问题了

mikecai 发表于 2020-1-3 09:05:29

联合体的变量要小心,大家共用内存结构单元,一个变了影响另一个。
设法将所有联合体变量改成结构体变量,如果变量值与位值对应上,那就是联合体的变量相互影响了

scfor123456 发表于 2020-1-3 09:07:23

mylovemcu 发表于 2020-1-2 18:59
数据长度不一致导致的联合体中all用的是32位的数据DI_FUNC1_BITS结构体中使用的是16位的数据

把uint16 ...

是这个问题,感谢
页: [1]
查看完整版本: 仿真发现变量值与位值对应不上