看了看ICCAVR的库文件,谈几点感想
今天看到此帖:avr.com/bbs/dispbbs.asp?boardid=2&Id=30" rel="nofollow">[下载]ICCAVR库函数源程序 突然想去看看,于是到ICC的安装目录下,到include文件夹中看了看,感觉有些收获,故发此帖。
打开macros.h看到了一些宏定义:
BIT指令的来历:
#ifndef BIT
#define BIT(x)(1 << (x))
#endif
flash的来历:
#define flashconst/* IAR compatibility */
一直不明白在ICC中asm("nop"); _NOP(); NOP(); 是不是一样的,前者容易理解,是在C中嵌入汇编,可为什么后两者都能编译通过呢?看看在macros.h中的两条宏定义你就明白了:
#define NOP()asm("nop")
#define _NOP()asm("nop")
还有几条关于看门狗喂狗的和开总中断关总中断的:
#define WDR() asm("wdr") //喂狗
#define SEI()asm("sei") //开总中断
#define CLI()asm("cli") //关总中断
#define _WDR() asm("wdr")
#define _SEI()asm("sei")
#define _CLI()asm("cli")
明白了一些东西吗?
看看iom16v.h文件,你就可以明白PORTA|=(1<
#define PA7 7
也就是说编译时PA7是7,1<
听了上面解释你就明白这个什么意思了吧:
void usart_send(unsigned char da
{
while(!(UCSRA&BIT(UDRE)));
//将数据放入缓冲器,发送数据
UDR=da
}
以下是对USARA寄存器及寄存器内各个位的定义:
#define UCSRA(*(volatile unsigned char *)0x2B)
#define RXC 7
#define TXC 6
#define UDRE 5
#define FE 4
#define DOR 3
#define OVR 3 /*This definition differs from the databook*/
#define PE 2
#define U2X 1
#define MPCM 0
#define UDR(*(volatile unsigned char *)0x2C)
明白了吗?
谈一点题外话,是看到这些头文件开头都有的两句话有感说一说一些编程技巧,关于条件编译的吧.
以iom16v.h为例:
开始有这样两句话:
#ifndef __iom16v_h
#define __iom16v_h
…………
…内容…
…………
#endif
这样有一个好处就是不重复定义。
因此在我们编程时,可以用这种编程思想:
假如说吧:
我们要用到LCD1602的功能函数,而在这个LCD文件(取名为LCD1602.c)时又要用到延时函数(取名为delay.c),在主函数中我们也要用到delay.c,但你就会发现,如果在主函数中加入#include "LCD1602.c"后,再包含#include "delay.c"就会编译出错,说你重复定义`delay文件中的函数。因此我们可以这样:
在LCD1602.c中包含"delay.c"时这样写:
#ifndef _delay_c
#define _delay_c
#include "delay.c"
#endif
同样在主函数中包含延时时,也按这种方式写,就会避免重复包含同一个文件这个问题了。
可能有许多网友不明白条件编译,解释一下上面几句话吧:
#ifndef _delay_c//如果没有定义过_delay_c才对下面的语句进行编译,范围到#endif结束
#define _delay_c
#include "delay.c"
#endif
可能有些网友感觉自已可以运筹帷幄这个问题,但你想过没,如果你编的程序很大,而且经常相互包含文件呢?
以上仅为个人观点,不足与不妥及错误之处敬请广大网友批评指证!
评论