AVR单片机C语言编译器 下载本文

AVR单片机C语言编译器

Win-AVR是流行的GNU编译器在AVR平台上的移植。安装完毕后会在桌面上出现一下七个快捷方式,它们的作用如下:

Programmers Notepad AVR Insight TKInfo Avr-libc Manual GNU Manuals Online MFile README

? IDE (Integrated Development Environment)集成开发环境 ? ICE (In Circuit Emulator) 在线仿真器

? JTAG (Joint Test Action Group) 联合测试行为组织

? *.hex 文件用来向单片机下载的16进制文件

? *.cof文件用来利用AVRstudio进行在线仿真和调试的文件

? AVR COFF(AVR Studio 3.x)

? AVR “Extended” COFF(AVR Studio 4.07+)

*.hex和*.cof这两个文件不能由AVR-GCC本身生成,需要其他辅助工具来完成这一步,这个工具叫avr-objcopy。

Makefile文件就是一个描述性质的文件,告知make各文件之间的依赖关系,不需要扩展名。

一般在MFile这个程序中生成对应的makefile文件,然后将它复制到PN源文件的文件夹下,就可以进行make all的命令来实现对源文件的编译了。一般而言,makefile文件只需要修改一下几个地方。Main file name (不要带扩展名)和MCU type 以及Default make target,然后点file-》save as保存到要编译的文件的文件夹下。

C语言小总结

? C语言的标识符是区分大小写的,标识符必须以字母或者下划线开头,下划线开头的标

识符一般是编译器定义的。

? 一般而言,如果不是需要使用负整数,尽量使用无符号数整数来表示,这样可以减少系

统处理符号的工作,从而提高程序的执行效率。

? 凡是耳目运算符,都可以和赋值符一起组成复合赋值符,C语言中规定可使用的10中

复合赋值运算符:+=;-=;*=;/=;%=;<<=;>>=;&=;^=;|=

? 逗号运算符是C语言的一种特殊的运算符,其作用是将两个表达式连接起

源文件的编辑软件,可提供应用程序接口 GDB Debug的前端工具,用于仿真调试 GNU超文本格式的图形浏览器,用于浏览各种说明文档 AVR-GCC编译器的C语言函数库 GNU在线帮助手册 Makefile编辑软件 WinAVR的readme文件 来,C语言对两个表达式分别计算,并将后一个表达式的值作为逗号表达式的值。运算优先级最低。例如:a=3*6,4*8;其结果为a=32;

? C语言规定了六种关系运算符:<;<=;>;>=;==;!=其中前四个的优先级比较高,后

两个的优先级比较低。

? C语言规定的位运算共有一下几种: & 按位与 | 按位或

^ 按位异或 (XOR) 1^0=1 1^1=0 ~ 取反 << 左移 >> 右移

位翻转:令其和一个相应位为1,其他位位0的常量做异或运算。

位置一:令其和一个相应位为1,其他为为0的常量做或运算。PORTA|=(1<<7) 位置零:令其和一个相应位为0,其他位为1的常量做与运算。PORTA&=~(1<<7) ? 一般的变量和数组均存储在系统的RAM中,AVR-GCC还支持存储在ROM的数组和

字符串,该字符串使用PROGMEM关键字进行声明。如:

Const char str[ ] PROGMEM =”hello” ; // 声明了一个存储在ROM中的字符串 ? 字符串是不能在程序中用赋值符直接赋值的,但可以借助循环语句,一个变量一个变量

的进行拷贝,如下: char a[5]=”hello” ; char b[5]; b=a; /*这样的操作是非法的*/ for(i=0;i<5;i++) { b[i]=a[i]; } //利用循环语句一个变量一个变量的拷贝 ? 函数的声明用于函数的定义部分在函数实际调用之后,声明的格式如下(必须加分号): 函数返回值类型 函数名称(类型名 形式参数1,类型名 形式参数2,……); 例如:int add(int var1,int var2); ? 指针变量存储的是地址数据,因此通过指针操作,程序可以对内存等系统中编址的设备

进行控制,尤其是对经常要对外部设备进行操作的单片机系统就显得非常重要。C语言里,字符串相当于一个字符型数组,作为一个数组,当然能够和指针建立联系,因此,字符串也能够用指针变量实现。 例如: char string1[ ]=”GNU” ; Char *string2=”GNU” ; 事实上,二者的声明在本质上是一样的,在第二行的声明中,C语言同样要为string2开辟一个4个变量的存储区域。但是用指针方式操作字符串更加灵活,这是因为只要给字符串开辟了足够的空间,字符串指针就可以在需要的时候赋值。 例如: char string1[ ]=”GNU” ; char string2[4]; char string3[4]; string2[4]=”GNU”; //错误,不能给数组赋值一个字符串 string3=”GNU”; //正确,按照指针方式赋值

函数指针:函数生成代码时也具有地址,因此也可以定义函数指针,定义形式如下:

函数返回值数据类型 (*函数指针标识符)(); 函数指针的引用形式为: (*函数指针标识符)(实参列表) 例如: int test(int status); //声明一个函数 int main(void) { int (*p) ( ); //声明一个函数指针 p=test; //令p指向test函数 (*p)(0x0098); //调用指针指向的函数 …… return 0; } 指针数组:如果一个数组里面的元素是指针,则该数组就是指针数组,其声明形式为:

数据类型 *数组名[常量表达式]

例如: int *array[10]; //声明了含有10各整型指针的指针数组 指针数组可以用来存储字符串,在字符串之间的长度相差很大时可以使用最小的内存。如果使用二维字符数组进行存储,则数组的宽度必须与最长的字符串相同。

例如: char *string[ ]={“hello”,” it is a dog”,” this”}; //存储了三个字符串 ? C与与语言可以构造以下四种数据类型:

? 结构体:将一些变量组合在一起,作为一个整体进行使用,用于表达某种逻辑关系 ? 共同体:几种不同的数据类型共用一片地址

? 枚举类型:规定变量的取值只有有限的情况,不能取其他值 ? 用户自定义类型:用户对已有的类型赋予新的类型标识符

? 结构体: struct 结构体名 { 数据类型 成员1; 数据类型 成员2; ………… 数据类型 成员n; }机构体变量名;