打印

关于IAR AVR位域使用的疑问!

[复制链接]
4983|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
okay007|  楼主 | 2010-12-19 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
IAR的位域可以这样定义:
#include<iom16.h>
union
{
  unsigned char t;
  struct
  {  unsigned char  t_bit0:1,
t_bit1:1,
t_bit2:1,
t_bit3:1,
t_bit4:1,
t_bit5:1,
t_bit6:1,
t_bit7:1;
  };
};
void main(void)
{
  t_bit0=1; //访问变量t的位  
  t_bit0=~t_bit0;
  PORTB=t; //直接访问变量t  
  t=0;
}
但是我有个问题:   
1:为什么里面只定义共用体和位域,不定义共用体变量?   

试了一下只有在IAR中可以,并且IAR中的头文件就是这样用的。  
是IAR进行了扩展?  
如果这样IAR也太不标准了吧?CVAVR扩充了bit变量都说它不标准,那IAR呢?  
请哪位解释一下

相关帖子

沙发
ayb_ice| | 2010-12-20 09:09 | 只看该作者
这里只声明了一个类型,并非具体的变量
应该不可以直接使用

使用特权

评论回复
板凳
yewuyi| | 2010-12-20 09:21 | 只看该作者
1、t_bit1~t_bit7前面缺少unsigned char关键字,请补齐它,否则即使勉强在这个编译器中可用,也不具备通用性。
2、有一些编译器可以识别这种用法,如果你在代码区引用了其中一个符号名,它就会自动开辟一个RAM字节使用,但肯定的是:这只是编译器不作严格规范审查,进行所谓人性化操作的一部分,显然是不符合规范的,也不具备通用性。
3、做代码操作工,就应该按照代码操作工的SOP来工作,SOP就是严格的规范文件。

使用特权

评论回复
地板
okay007|  楼主 | 2010-12-21 08:15 | 只看该作者
这不是我的发明:
IAR中的官方头文件就是这样用的,
例如:可以打开IAR的iom16.h就可以看到。
t_bit1~t_bit7前面不要unsigned char的,楼上朋友没有仔细看。

使用特权

评论回复
5
yewuyi| | 2010-12-21 08:33 | 只看该作者
这不是我的发明:
IAR中的官方头文件就是这样用的,
例如:可以打开IAR的iom16.h就可以看到。
t_bit1~t_bit7前面不要unsigned char的,楼上朋友没有仔细看。 ...
okay007 发表于 2010-12-21 08:15


你没有理解我的意思,我的意思是:这个写法即使IAR能认,但为了保持代码的通用性,最好还是加上,否则代码移植到其他编译器上的时候就会出问题。

IAR自己的头文件只用在自己的系统内,它怎么规定都可以,它不需要和别的通用。

使用特权

评论回复
6
STM32W108| | 2010-12-21 10:13 | 只看该作者
本帖最后由 STM32W108 于 2010-12-21 10:31 编辑

#define uint8_bits_def(x) union \
{\
  unsigned char x;\
  struct\
   {\
     unsigned char x##_Bit0:1;\
     unsigned char x##_Bit1:1;\
     unsigned char x##_Bit2:1;\
     unsigned char x##_Bit3:1;\
     unsigned char x##_Bit4:1;\
     unsigned char x##_Bit5:1;\
     unsigned char x##_Bit6:1;\
     unsigned char x##_Bit7:1;\
   };\
}

void mian()
{
  uint8_bits_def(x);  //定义一个字节变量x,并且x有8个位   
  
  x=0;                 //对x整体赋值   
  x_Bit0=1;            //x的第0位写1
  x_Bit0=0;            //x的第0位写0
  x_Bit0=!x_Bit0;      //x的第0位取反
}

以上代码在VC2008上编译通过。

使用特权

评论回复
7
STM32W108| | 2010-12-21 10:29 | 只看该作者
本帖最后由 STM32W108 于 2010-12-21 10:34 编辑

更通用的写法是:

#typedef union
{
                 unsigned char Byte;
     struct {
        unsigned char Bit0:1;
        unsigned char Bit1:1;
        unsigned char Bit2:1;
        unsigned char Bit3:1;
        unsigned char Bit4:1;
        unsigned char Bit5:1;
        unsigned char Bit6:1;
        unsigned char Bit7:1;
       };
}bitfield8;
void main(void)
{
  bitfield8 x;
  x.Bit0=1;
  x.Bit0=~x.Bit0;
  x.Byte=0;
}

使用特权

评论回复
8
okay007|  楼主 | 2010-12-21 17:55 | 只看该作者
结贴了!
其实我更想要楼主位的写法,这样才更像Keil和 CVAVR的位变量的写法。
7楼更通用的写法标准C都支持吧!,不是我想要的。这样定义的位变量感觉总是怪怪的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

31

帖子

2

粉丝