前些天在别人的Blog上看到:avr中,位域数据结构来操作的效率比移位(1<<n)要高,我还信以为真。今天测试了一下才发现效果是一样的(没有仔细研究汇编代码,就时编译的字节数一样多)
测试环境:winavr2005
用官方库移位的代码:
#include <avr/io.h>
void main(void)
{
PORTA=0xff;
PORTA&=~(1<<PA0);
}
位域结构定义的代码:
typedef unsigned char byte;
typedef union
{
byte Byte;
struct
{
byte BIT0 :1;
byte BIT1 :1;
byte BIT2 :1;
byte BIT3 :1;
byte BIT4 :1;
byte BIT5 :1;
byte BIT6 :1;
byte BIT7 :1;
}Bits;
}PORTASTR;
//#define PORT (*((volatile PORTASTR *) (&PORTA)))
#define PORT (*((volatile PORTASTR *) (0x3b)))
#define PORTA PORT.Byte
#define PORTA_BIT0 PORT.Bits.BIT0
#define PORTA_BIT1 PORT.Bits.BIT1
#define PORTA_BIT2 PORT.Bits.BIT2
#define PORTA_BIT3 PORT.Bits.BIT3
#define PORTA_BIT4 PORT.Bits.BIT4
#define PORTA_BIT5 PORT.Bits.BIT5
#define PORTA_BIT6 PORT.Bits.BIT6
#define PORTA_BIT7 PORT.Bits.BIT7
void main(void)
{
PORTA=0xff;
PORTA_BIT0=0;
}
编译结果:都时一样的162字节
Device: atmega16
Program: 162 bytes (1.0% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
-------- end --------
> Process Exit Code: 0
结论:实践才是真理啊
文章评论(0条评论)
登录后参与讨论