你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
scfor123456 提问时间:2020-1-2 16:38 /
变量是这样定义的:
struct DI_FUNC diSelectFunc;    // 是否有DI端子选择了相应的功能

struct DI_FUNC
{
    union DI_FUNC1  f1;
    union DI_FUNC2  f2;
};
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,很奇怪的现象。

微信图片_20200102162739.png
收藏 评论3 发布时间:2020-1-2 16:38

举报

3个回答
mylovemcu 回答时间:2020-1-2 18:59:48
数据长度不一致导致的  联合体中all用的是32位的数据  DI_FUNC1_BITS结构体中使用的是16位的数据

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

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

慎微 回答时间: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 ...

是这个问题,感谢

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版