硬汉嵌入式论坛

 找回密码
 立即注册
查看: 363|回复: 6
收起左侧

[STM32H7] 分享 MDK AC6 位域在线仿真解析异常

[复制链接]

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2025-12-3 15:05:55 | 显示全部楼层 |阅读模式
本帖最后由 大家伙好 于 2025-12-3 16:07 编辑

现象:
[C] 纯文本查看 复制代码
typedef struct
{
    union // 切换相关
    {
        uint16_t ledAll;
        struct
        {
            uint16_t run         : 1;       // LED1 运行  bit0 
            uint16_t tx          : 1;       // LED2 通讯
            uint16_t xj          : 1;       // LED3 相间故障
            uint16_t jd          : 1;       // LED4 接地故障
            uint16_t rev         : 12;
        }ledAll_bit;
    };
} led_ctrl_type;



通过烧录器在线仿真时,watch窗口无法查看单个位域内的值,
uint16_t bitfiled被解析为ushort
ushort.png

解决方案,在魔术棒内增加编译选项
强制 DWARF 版本:-gdwarf-3(将调试信息标准从 DWARF 4/5 降级为 DWARF 3,匹配 Keil 调试器的解析能力)
魔术棒.png



更改后watch显示正常
调整后.png












评分

参与人数 1金币 +2 收起 理由
fxyc87 + 2 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
发表于 2025-12-3 16:29:57 | 显示全部楼层
谢谢楼主分享,MDK自带的elf解析 DWARF5,有些情况确实一般,特别是GCC生成的elf。
回复

使用道具 举报

7

主题

364

回帖

385

积分

高级会员

积分
385
发表于 2025-12-3 17:24:05 | 显示全部楼层
挺实用,标记
回复

使用道具 举报

7

主题

364

回帖

385

积分

高级会员

积分
385
发表于 2025-12-3 17:25:45 | 显示全部楼层
我几乎不用这种位方式,感觉生成的代码很大
因为用宏的方式再统一给寄存器赋值也很方便
这种用位赋一次值生成的汇编就有好多代码,一个寄存器你位变量赋了十来次,生成的代码就有几百行了。
回复

使用道具 举报

0

主题

54

回帖

54

积分

初级会员

积分
54
发表于 2025-12-3 17:44:05 | 显示全部楼层
6666666666
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2025-12-3 19:05:59 | 显示全部楼层
fxyc87 发表于 2025-12-3 17:25
我几乎不用这种位方式,感觉生成的代码很大
因为用宏的方式再统一给寄存器赋值也很方便
这种用位赋一次值 ...

实际用的时候也很少直接对位赋值,
更多的时候是方便调试和阅读。
回复

使用道具 举报

9

主题

44

回帖

71

积分

初级会员

积分
71
发表于 5 天前 | 显示全部楼层
Mark下,还没遇见过这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-1-10 07:55 , Processed in 0.055778 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表