stm32f103的位域赋值,却影响了整个字节。。大家帮忙看一下

2019-12-26 18:55发布

本帖最后由 WM_CH 于 2017-7-18 15:27 编辑

位域赋值问题.jpg (50 KB, 下载次数: 0) 下载附件 2017-7-18 15:18 上传

如图中的定义,和内存分布。
按说对位域赋值,只会影响位域变量 和 CHAR[0] 共同使用的内容,可是实验结果却是修改了CHAR[0]的非共用内容!!
代码如下:
  1.     tCAN.CHAR[0] = 0x58;
  2.     printf("%#x ", tCAN.CHAR[0]);
  3.     printf("%#x ", tCAN.BIT01);
  4.     printf("%#x ", tCAN.BIT23);
  5.    
  6.     tCAN.BITbit01 = 0x01;
  7.     printf("%#x ", tCAN.CHAR[0]);
  8.     printf("%#x ", tCAN.BIT01);
  9.     printf("%#x ", tCAN.BIT23);
复制代码

输出结果是
0x58
0
0x02

0x01
0x01
0


这里红 {MOD}部分可以看出,影响了整个CHAR[0]字节!!!这个是绝不可能的啊!这什么情况。。。
MDK里面用了一个关键字#pragma anon_union来使用匿名联合(如图中),这个会影响赋值操作?我只是瞎猜。。。





同样的做法,在电脑端用VS2010测试结果是
0x58
0
0x02

0x59
0x01
0x02


这里蓝 {MOD}部分可以看出,这才是正确的结果啊。。。







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
love_ourdev
1楼-- · 2019-12-28 18:07
WM_CH 发表于 2017-7-18 15:35
我的意思是说,修改位域那个变量,只会修改CHAR[0]所在的字节中,和位域变量共用的几个bit,
而不应该修 ...

IAR的结果是正确的,如下:

2017-07-20_132812.png (53.71 KB, 下载次数: 0)

下载附件

2017-7-20 13:28 上传

love_ourdev
2楼-- · 2019-12-28 23:15
本帖最后由 love_ourdev 于 2017-7-20 13:37 编辑

人生苦短,我用IAR
以前很多次程序不如意,都怀疑编译器;可惜每次都证明是我自己的错。
所以我对IAR的信任度是越来越高。MDK的问题我是不愿意去解决了。
MDK可谓是金玉(界面)其外,败絮(编译套件)其中。
guzhongqi
3楼-- · 2019-12-29 00:43
C语言的位域功能可移植性很差,不同编译器的结果不一样很正常。
但一般注意好大小端,不用的位全部用空位域占上,用起来还是比较爽的。
love_ourdev
4楼-- · 2019-12-29 02:21
 精彩回答 2  元偷偷看……
WM_CH
5楼-- · 2019-12-29 07:14
love_ourdev 发表于 2017-7-20 13:35
人生苦短,我用IAR
以前很多次程序不如意,都怀疑编译器;可惜每次都证明是我自己的错。
所以我对IA ...

原来是MDK的锅
不过还是把空位域补上比较好。
higeo
6楼-- · 2019-12-29 11:29
love_ourdev 发表于 2017-7-20 13:35
人生苦短,我用IAR
以前很多次程序不如意,都怀疑编译器;可惜每次都证明是我自己的错。
所以我对IA ...

大神给讲讲如何“金玉其外,败絮其中”的?!

一周热门 更多>