首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

新手:c难道不能这样位操作??

新手:c难道不能这样位操作??

对一个全局变量和一个局部变量位操作,简单的置1,不知道下面程序问题出在哪里? #include /* for EnableInterrupts macro */ #include /* include peripheral declarations */ #define BIT(a,b) (((vbitfield *)(a))->bit##b) typedef volatile struct{ volatile unsigned int bit0 : 1; volatile unsigned int bit1 : 1; volatile unsigned int bit2 : 1; volatile unsigned int bit3 : 1; volatile unsigned int bit4 : 1; volatile unsigned int bit5 : 1; volatile unsigned int bit6 : 1; volatile unsigned int bit7 : 1; } vbitfield; uchar flag; #define flag_bit7 BIT(flag,7) //定义变量flag的第七位 #define i_bit7 BIT(i,7) void main(void) { uchar i; DisableInterrupts; CONFIG1=0x01; CONFIG2=0x00; DDRA=0x02; PTAPUE=0x00; PTA=0x7f; DDRB=0x0f; PTB=0x00; DDRD=0xfb; PDCR=0; PTD=0xf8; i=0x00; i_bit7=1; flag=0x00; flag_bit7=1; while(1){ }; } 对该程序进行编译仿真后,发现c语言程序中(i_bit7=1)以及(flag_bit7=1)汇编出来的程序有了变化:都变为BSET 7,0x00 怎么地址都变为0x00了? 程序执行后结果就不对了,i=0,flag=0。 请问:对变量进行位操作不能这样进行吗?一般的方法是怎么样的? 谢谢!!!!
是不是被优化掉了
i,flag定义成volatile 型看看呢
定义volatile uchar i;
volatile uchar flag;
还是不行,还是不能执行相应位操作。
这是为什么啊,我用的是codewairrior3.1版本的。
拜托各位看一下,急着要用。
非常感谢!!
自己还是仿照自带的MC68HC908.H对各寄存器位的定义对变量重新定义了一下,这样才能执行位操作。
如果对变量定义一个确切的地址后,编译出来的代码是要少些,但不知道对其它方面是不是有什么不好的影响??
如果你对变量定义一个确切的地址后,那样你就要对你程序有很深的了解,特别是RAM区的。因为这样就缺少了灵活性!有时候会带来点麻烦。建议最好不要这样。让编译器自由分配!
Gulf
返回列表