OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11021|回复: 9

对于位域定义的一个小技巧 与 大家分享一下

[复制链接]

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
发表于 2013-1-28 20:55:06 | 显示全部楼层 |阅读模式
typedef struct
{
 unsigned char b0:1;
 unsigned char b1:1;
 unsigned char b2:1;
 unsigned char b3:1;
 unsigned char b4:1;
 unsigned char b5:1;
 unsigned char b6:1;
 unsigned char b7:1;
}REG8_TypeDef;

typedef struct
{
 unsigned short b0:1;
 unsigned short b1:1;
 unsigned short b2:1;
 unsigned short b3:1;
 unsigned short b4:1;
 unsigned short b5:1;
 unsigned short b6:1;
 unsigned short b7:1;
 unsigned short b8:1;
 unsigned short b9:1;
 unsigned short b10:1;
 unsigned short b11:1;
 unsigned short b12:1;
 unsigned short b13:1;
 unsigned short b14:1;
 unsigned short b15:1;
}REG16_TypeDef;

typedef struct
{
 unsigned long b0:1;
 unsigned long b1:1;
 unsigned long b2:1;
 unsigned long b3:1;
 unsigned long b4:1;
 unsigned long b5:1;
 unsigned long b6:1;
 unsigned long b7:1;
 unsigned long b8:1;
 unsigned long b9:1;
 unsigned long b10:1;
 unsigned long b11:1;
 unsigned long b12:1;
 unsigned long b13:1;
 unsigned long b14:1;
 unsigned long b15:1;
 unsigned long b16:1;
 unsigned long b17:1;
 unsigned long b18:1;
 unsigned long b19:1;
 unsigned long b20:1;
 unsigned long b21:1;
 unsigned long b22:1;
 unsigned long b23:1;
 unsigned long b24:1;
 unsigned long b25:1;
 unsigned long b26:1;
 unsigned long b27:1;
 unsigned long b28:1;
 unsigned long b29:1;
 unsigned long b30:1;
 unsigned long b31:1;
}REG32_TypeDef;
//定义位域:R32(GPIOA->ODR)b0=1等同于GPIOA->ODR的bit0置1
#define R8(reg)  ((volatile REG8_TypeDef*)&(reg))->
#define R16(reg) ((volatile REG16_TypeDef*)&(reg))->
#define R32(reg) ((volatile REG32_TypeDef*)&(reg))->

感觉是不是很好用呢?同理在其他单片机上也可以这样定义。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-1-28 21:44:58 | 显示全部楼层
C/C++ 标准上并没有对MSB和LSB的定义顺序的严格定义,比如在其它的平台或者编译器可能是
typedef struct
{
 unsigned char b7:1;        // b7 定义在前
 unsigned char b6:1;
 unsigned char b5:1;
 unsigned char b4:1;
 unsigned char b3:1;
 unsigned char b2:1;
 unsigned char b1:1;
 unsigned char b0:1;
}REG8_TypeDef;
https://github.com/roxma
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
 楼主| 发表于 2013-1-28 23:32:06 | 显示全部楼层
回复【2楼】Pony279:

C/C++ 标准上并没有对MSB和LSB的定义顺序的严格定义,比如在其它的平台或者编译器可能是
typedef struct
{
 unsigned char b7:1;        // b7 定义在前
 unsigned char b6:1;
 unsigned char b5:1;
 unsigned char b4:1;
 unsigned char b3:1;
 unsigned char b2:1;
 unsigned char b1:1;
 unsigned char b0:1;
}REG8_TypeDef;

---------------------------------
谢谢补充,不过Keil和IAR好像都是低地址在前,呵呵
回复 支持 反对

使用道具 举报

9

主题

147

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2012-11-7
在线时间
35 小时
发表于 2013-1-29 10:32:51 | 显示全部楼层
回复【楼主位】whjambo:
---------------------------------
位段好像必须是int,uint等类型,不能是char型吧,
我也想用这种方法定义位变量,不过还没有理清楚该怎么对应,希望大家指点一下
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
 楼主| 发表于 2013-1-31 13:31:00 | 显示全部楼层
回复【4楼】jswd:
---------------------------------
那要看你定义的位域是几位的,8位:unsigned char,16位:unsigned short,32位:unsigned long,
64位(一般用不到):unsigned long long。
至于为什么用short 不用int,是因为不同单片机编译器的int类型不一样,对于8位单片机如avr一般int是16位,但是ARM一般int是32位的,但是short是统一的16位,不会发生兼容问题。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-1-31 13:37:40 | 显示全部楼层
回复【5楼】whjambo:
---------------------------------
C语言标准里有 uint8_t, uint16_t, uint32_t ...  这才是跨平台的。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-1-31 13:58:40 | 显示全部楼层
回复【2楼】Pony279:
---------------------------------
这个跟大端模式和小端模式的设置有关
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2013-1-31 14:12:08 | 显示全部楼层
回复【7楼】aleda303:
---------------------------------
现在的编译器普遍是这样实现的,不过我没有在C/C++标准上找到这样的规定。所以不要指望这样的代码能很好的在不同编译器之间使用。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-1-31 14:18:21 | 显示全部楼层
回复【8楼】Pony279:
---------------------------------
嗯 ,实在不行可以 强制指定,
回复 支持 反对

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-9-5 16:59:27 | 显示全部楼层
这个定义的类型能用static修饰吗?我定义了一个局部静态的变量导致系统崩溃,无解。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 05:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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