AVR单片机C语言编译器_第1页
AVR单片机C语言编译器_第2页
AVR单片机C语言编译器_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AYR单片机C语言编译器Win-AVR是流行的GNU编译器在AVR平台上的移植。安装完毕后会在桌而上显现一下七 个快捷方式,它们的作用如下:Programmers Notepad源文件的编辑软件,可提供应用程序接口AVR InsightGDB Debug的前端工具,用于仿真调试TKInfoGNU超文本格式的图形扫瞄器,用于扫瞄齐种说明文档Avr-libc ManualAVR-GCC编译器的C语言函数库GNU Manuals OnlineGNU在线关心手册MFileMakefile编辑软件READMEWinAVR 的 readme 文件> IDE (Integrated Developme

2、nt Environment)集成开发环境> ICE (In Circuit Emulator) 在线仿真器> JTAG (Joint Test Action Group)联合测试行为组织> *.hex文件用来向单片机下载的16进制文件> *cof文件用来利用AVRstudio进行在线仿真和调试的文件 AVR COFF (AVR Studio 3.x) AVR “Extended” COFF (AVR Studio4.07+)*.hex和*.cof这两个文件不能由AVR-GCC本身生成,需要苴他辅助工具来完成这一步, 那个工具叫avr-objeopy。Makefile文

3、件确实是一个描述性质的文件,告知make各文件之间的依靠关系,不需要 扩展名。一样在MFile那个程序中生成对应的makefile文件,然后将它复制到PN源文件的文件 夹下,就能够进行make all的命令来实现对源文件的编译了。一样而言,makefile文件只需 要修改一下几个地点eMain file name (不要带扩展爼)和MCU type以及Default make target, 然后点file-save as储存到要编译的文件的文件夹下。C语言小总结> C语言的标识符是区分大小写的,标识符必须以字母或者下划线开头,下划线开头的标 识符一样是编译器定义的。> 一样而言,

4、假如不是需要使用负整数,尽量使用无符号数整数来表示,如此能够减少系 统处理符号的工作,从而提高程序的执行效率。> 凡是耳目运算符,都能够和赋值符一起组成复合赋值符,C语言中规泄可使用的10中 复合赋值运算符:&=;=;|=>逗号运算符是c语言的一种专门的运算符,其作用是将两个表达式连接起 来,C语言对两个表达式分别运算,并将后一个表达式的值作为逗号表达式 的值。运算优先级最低。例如:a=3*6,4*8;其结果为a=32;> C语言规左了六种关系运算符:<;<=;>;>=;=;!=其中前四个的优先级比较高,后 两个的优先级比较低。c语言规左的位运

5、算共有一下几种:&按位与I 按位或A按位异或(XOR) lAO=l lAl=O取反«左移»右移位翻转:令其和一个相应位为1,其他位位0的常量做异或运算。位宜一:令其和一个相应位为1,其他为为0的常量做或运算。PORTAI= (1«7)位置零:令其和一个相应位为0,其他位为1的常量做与运算。PORTA&= (1«7) 一样的变疑和数组均储备在系统的RAM中,AVR-GCC还支持储备在ROM的数组和 字符串,该字符串使用PROGMEM关键字进行声明。如:Const char str( PROGMEM ="hcllo" ;

6、/ 声明了一个储备在 ROM 中的字符串字符串是不能在程序中用赋值符直截了当赋值的,但能够借助循环语句,一个变量一个 变量的进行拷贝,如下:char a5=" hello"char b5;b=a;/*如此的操作是非法的*/for(i=0;i<5;i+)bi=ai;/利用循环语句一个变量一个变量的拷贝函数的声明用于函数的立义部分在函数实际调用之后,声明的格式如下(必须加分号): 函数返回值类型 函数爼称(类型名形式参数1,类型名形式参数2,);_ 例如:int add (int varl ,int var2);指针变量储备的是地址数据,因此通过指针操作,程序能够对内存等

7、系统中编址的设备 进行操纵,专门是对经常要对外部设备进行操作的单片机系统就显得专门重要。C语言 里,字符串相当于一个字符型数组,作为一个数组,因此能够和指针建立联系,因此, 字符串也能够用指针变量实现。例如:char string 1=”GNU”;Char string2=MGNU,*;事实上,二者的声明在本质上是一样的,在第二行的声明中,C语言同样要为string2 开创一个4个变量的储备区域。然而用指针方式操作字符串更加灵活,这是因为只要给 字符串开创了足够的空间,字符串指针就能够在需要的时候赋值。例如:char string 1=”GNU“;char string24;char stri

8、ng34;s(ring24="GNU"/错误,不能给数组赋值一个字符串string3=“GNU“:/正确,按照指针方式赋值函数指针:函数生成代码时也具有地址,因此也能够宦义函数指针,泄义形式如下: 函数返回值数据类型(函数指针标识符)();函数指针的引用形式为:(水函数指针标识符)(实参列表)例如:int test(int status); int main(void)/声明一个函数iint (*p)(); p=test; (*p)(0x0098);声明一个函数指针 令p指向test函数 调用指针指向的函数return 0; 指针数组:假如一个数组里而的元素是指针,则该数组

9、确实是指针数组,其声明形式为: 数据类型水数组名常量表达式例如:int *array10; 声明了含有10各整型指针的指针数组指针数组能够用来储备字符串,在字符串Z间的长度相差大时能够使用最小的内存。假 如使用二维字符数组进行储备,则数组的宽度必须与最长的字符串相同。例如:char *string =helloV it is a dog:' this J; 储备了三个字符串> c与与语言能够构造以下四种数据类型: 结构体:将一些变量组合在一起,作为一个整体进行使用,用于表达某种逻借关系 共同体:几种不同的数据类型共用一片地址 枚举类型:规左变量的取值只有有限的情形,不能取英他值

10、用户自宦义类型:用户对已有的类型给予新的类型标识符> 结构体:struct结构体名数据类型成员1:数据类型成员厶数据类型成员m 机构体变量名;例如:struct studentchar name|20;char sex;float score;struct student student 1,student!,student3 10;*student4; student l.score=95.5;(student 1 .namc)= iaoli" /给结构体变量的成员赋值 student l.sex=,M>student4=&student2;studcnt4-&

11、gt;sex=,M,;studcnt3l.sex=,M,;studcnt3 2 . score=95.5;共同体:共同体的所有成员都占有相同的空间,共同体占用的空间的大小等于共同体内 占用空间最大的变量所占用的空间。共同体类型声明形式如下:union共同体夕】数据类型成员名1:数据类型成员名2: 数据类型成员名m;共同体的变虽声明形式为:union共同体名共同体变虽名共同体变量引用的形式为:共同体变量名成员;注意共同体的数据是储备在一个储备空间的,因此共同体变量所储备的值等于最后一次 对共同体变量所赋的值。不能对共同体变量名赋值,也不能在立义共同体变疑时对其初始化,对共同体的操作必 须指明其成

12、员。不能把共同体变戢作为函数的参数和返回值。例如:union length_unionUnitl6_t word;Unit8j byte2J; length;定义了一个共同体,有两个成员,一个是16位的无符号整数,另外一个是一个包含两个无符号8位整数的数组,二者共用储备空间。在上例中,假如按照lcngth_iinion.vord来操作时,则作为一个16位无符号整数,假如 作为length_union.byte0和length_union.byte 1 作,则访问的是该储备空间的低位字 节和高位字节。> 枚举类型假如变量只有几个可能的取值,则能够用枚举类型表示该变量。枚举类型左义形式为:

13、enum枚举类型标识符枚举列表;枚举变量的泄义为:enum枚举类型枚举变量需:例如:;C语言将枚举类型中的枚举元素定义为常量,因此枚举元素是有值的,C语言自动按照 值的顺序定义值为0, 1, 2,,枚举元素的值能够改变enum colorred=5,green.blue;/red 代表 5,后而的未定值依次加一例如::enum color ert;crt=red;crt=2;错误crt=(enuni color)2;/将枚举元素中的值为2的元素赋值给ert变虽:,强制转换。枚举变量的賦值必须用枚举元素,假如直截了当用整数赋值是不行的,必须采纳强制转 换。> 用户自定义类型用户能够对已存在

14、的C语言类型需重新进行泄义,从而方便使用,用戸定义类型一样 为: typedef类型名标识符使用这些自定义类型是,必须包含inttypes.h头文件。例如:#include <inttypes.h>typedef signed char int8_t八位有符号数 (无分号)typedef unsigned char uint8_t/八位无符号数> 预处理C语言的预处理功能要紧有一下三方而: 宏定义 文件包含 条件编译>宏定义宏妃义的作用是用指左的标识符代表一个字符串,宏能够参数,也能够不带参数,不 带参数的宏定义的一样形式为:#define标识符字符串带参数的宏左义声明

15、形式为:#define宏名(参数表)字符串例如:define S(a.b) a*b定义了一个带参数的宏int main(void) (int i;i=S(5,6);该语句与i=5*6完全一样return 0:> 文件包含文件包含的作用是将一个文件的内容包括到另一个文件之中,文件包含的形式为: include “文件名“include <文件名第一种第一在当前文件的所在名目中查找包含的文件,假如找不到再到系统指泄的包含 文件的爼目去查找,第二种则直截了当在系统指左的包含需目中去查找,一样为了保险起见, 尽量使用双引号形式的include指令。> 条件编译条件编译能够依照用户左义

16、的不同条件,选择使用不同的语句,这在编写可移植的程序 时专门有用。条件编译有以下几种形式: 第一种#ifdcf标识符程序段1#else程序段2#endif该语句的作用是,假如在此语句前用“#define标识符”泄义了标识符,则只在程序中 包含程序段1,否则只包含程序段2. 第二种#ifndef标识符程序段1#else程序段2#endif该语句的作用是,假如在此语句前没有用“#define标识符”泄义了标识符,则只在程 序中包含程序段1,否则只包含程序段2 第三种#if表达式程序段1#else程序段2#endif该语句的作用是,假如表达式的值为真,则值在程序中包含程序段1,否则,若表达式 的值为

17、0,则只在程序中包含程序段2.> AVR-LIBC的中断处理函数关于不同的编译器有不同的方法处理中断,这是因为C语言的目标确实是与处理器的细 节无关,因此每个编译器的作者都不得不使用自己的方法为编译器添加对中断的支持。在AVR-LIBC的环境中,中断向量表差不多预先固左指向具有特定名字的函数,这些函 数用来执行中断操作。使用这些专门爼字的函数可在相应中断发生时被调用。AVR丄IBC中,对中断处理函数进行了封装,通过使用两个参数的宏INTERRUPT () 和SIGNAL (),程序可正确的处理不同的中断操作。include "avr/signal.h"INTERRUP

18、T (SIG.ADC)/用户代码或者为include "avr/signal.h”SIGNAL (SIG_ADC)/用户代码> 全局中断标志操作函数:#define sei() _asmvolatile"sei":)使用中断处理函数,必须加入下而的包含语句:include <avr/intermpt.h>sei();设置全局中断标志位承诺全局中断#define cli() _asmvolatile_("cli":)使用中断处理函数,必须加入下而的包含语句:include <avr/internipt.h>cli();淸晰全局中断标志位来禁止全局中断上面的两个函数实际上只生成一条汇编指令,可不能增加用户程序的负担。>使用算术运算函数avr-libc提供了算术运算函数,使用数学的数学运算函数请在程序的头部加入包含语句:include "math.h”为了使用数学运算函数,需要链接库libm.a,通常该库是不链接到用户的程序中的, 为了链接库,请在口己的GCC编译选项的结尾加入-lm选项。即用PN打开makefile文 件的第 130 行,MATH_LIB= lm >专门功能寄存器的操作方式:在单片

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论