C语言的嵌入式编程.ppt
《C语言的嵌入式编程.ppt》由会员分享,可在线阅读,更多相关《C语言的嵌入式编程.ppt(55页珍藏版)》请在三一办公上搜索。
1、MC9S12XS单片机原理及嵌入式系统开发,合肥工业大学张 阳,吴 晔,滕 勤 Email:,TEL:,,第4章 C语言的嵌入式编程,编程语言的选择 C语言编程元素 C程序编译器与交叉编译器 CODEWARRIOR软件简介,前言,本章首先通过编程语言的选择问题介绍C语言编程的优点,然后讨论C语言进行程序设计时涉及的一些问题,并简要介绍了Freescale公司的单片机开发工具 CodeWarrior的使用方法。,4.1 编程语言的选择,为了确定嵌入式系统合适的编程语言,需要了解以下问题:计算机(如微控制器、微处理器或DSP芯片等)只接受“机器码”(即目标代码)指令。如果严格定义,机器码才是计算机
2、的语言,而不是程序员使用的其他语言。但如果由程序员去解释机器码,则工作量是非常巨大的,而且也容易出错,是不可行的。所有的软件,例如汇编语言、C语言、C+语言、Java语言等,为了能够被计算机执行,最终都必须翻译成机器码。嵌入式处理器的功能有限且内存有限,所以编程语言必须具有高效率。为嵌入式系统编程,经常需要对硬件进行底层访问操作,这意味着至少要能够读写特定的存储器地址。,4.1 编程语言的选择,当然,语言的选择问题还有一些并非技术方面的考虑:如果每个项目开发都从头编写代码,显然软件程序员是不乐意的。编程语言必须能够支持创建灵活方便的库,这样同类的项目可以重用那些经过充分测试的代码模块。当使用新
3、的处理器或升级处理器时,整个代码系统移植到新系统应该是可行的,并且工作量尽可能少。语言的选择应该具有通用性。这样才能保证比较容易产生更多的有经验的开发人员,而且开发人员也容易获得相关设计实例以及编程实践信息。随着系统和处理器的不断升级,程序代码往往需要经常进行维护。好的程序代码应该是容易被理解的,而且并不仅仅容易被开发者理解,同时程序代码的维护、升级也应该非常便利。,4.1 编程语言的选择,C语言的特性如下:它属于“中级语言”,不仅具有“高级语言”的特征(如支持函数和模块),还有“低级语言”的特性(可以通过指针访问硬件);编程效率很高;十分流行且容易理解;即使是PC程序员,以前只使用过Java
4、或C+语言,也能够很快理解C语言的语法和编程方法;每一个嵌入式处理器(从8位到32位或以上)都有良好且得到充分验证的C编译器;容易找到C语言编程经验的开发人员;容易找到有关资料、培训课程及相关网站等技术支持。,4.2 C语言编程元素,4.2.1 全局变量和局部变量,变量是程序运行时在内存中存放数据的一个存储空间。对嵌入式系统来说,它是RAM或ROM(甚至是处理器的寄存器)上的存储单元。全局变量是为整个程序定义的,在程序运行中始终有效。用全局变量传递参数,是参数传递的常用方法。局部变量是在某个函数内部声明的变量,它只能被该函数访问。在嵌入式系统中,局部变量通常位于堆栈中。全局变量和局部变量的区别
5、取决于在程序中的什么位置声明它。全局变量必须在函数外部声明,而局部变量则必须在一个函数内部声明。由于程序是固化在ROM中的,而不是下载到RAM中的。除非在应用程序运行开始后向RAM中下载什么,RAM中的内容在开机时是随机的。这就要求在用C语言开发嵌入式应用程序时不要使用初始化变量。当希望在多个源文件中共享变量时,需要确保定义和声明的一致性。最好的安排是在某个相关的.c文件中定义,然后在.h头文件中进行外部声明,在需要使用的时候,只要包含对应的头文件即可。定义变量的.c文件也应该包含该头文件,以便编译器检查定义和声明的一致性。,4.2 C语言编程元素,4.2.2 头文件,通常在一个程序的开始部分
6、进行头文件包含操作。头文件通常包括常量定义、变量定义、宏定义和函数声明等,程序员可以在自己的程序中嵌入它们。内嵌库中最常见的头文件是标准输入/输出文件(stdio.h),该头文件包含用于输出信息和接收用户键盘输入的函数声明。在很多情况下,出于特定系统要求,程序员通常需要创建自己的头文件,并将它们包含在程序中。要包含一个头文件,必须在程序的开始部分使用编译预处理指令#include。,4.2 C语言编程元素,4.2.3 编译预处理,1用于包含文件的#include指令 任何C程序首先都要包含那些准备使用的头文件和源文件,include是一个用于包含某个文件内容的预处理指令。以下给出可以被包含的文
7、件:包含代码文件:这些文件是已经存在的代码文件。包含常量数据文件:这些文件是代码文件,可以有扩展名.const。包含字符串数据文件:这些文件是包含字符串的文件,可以带扩展名.string、.str或者.txt。包含初始数据文件:这些文件用于嵌入式系统掩模只读存储器的初始或默认数据,启动程序运行后会被复制到RAM当中,可以具有扩展名.init。包含基本变量文件:这些文件是存储在RAM中的全局或者局部静态变量文件,因为它们不具有初始(默认的)值,所谓静态的意思是变量只有一个普通的变量地址实例,这些基本变量都被存储在以.bss为扩展名的文件中。包含头文件:这是一个预处理指令,目的是要包含一组源文件的
8、内容(代码或者数据)。它们都是某个特定模块的文件。头文件的扩展名为.h。,4.2 C语言编程元素,4.2.3 编译预处理,2宏定义#define指令 语言中允许用一个标识符来表示一个字符串,称为宏。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏代换或宏展开。宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。,4.2 C语言编程元素,4.2.3 编译预处理,2宏定义#define指令 对于宏定义再做以下几点说明:宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符
9、,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也会一起置换的。宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束,如果要终止其作用域可使用#undef命令。,4.2 C语言编程元素,4.2.3 编译预处理,3条件编译指令 条件编译指令包括#if、#ifdef、#ifndef、#else、#elif和#endif。这些指令用于根据某个表达式有条件的编译一部分代码。可以仅在程序开发过程中利用这些指令来编译部分调试代码。指令#if和#endif用于选择性地编译某段代码。#if
10、后的表达式值为TURE或FALSE。如果是TRUE,#if和#endif之间的所有代码将被编译;否则,这些代码将被忽略。#else和#elif指令可以用于更灵活选择编译功能,它们也必须同#if和#endif一起使用。,4.2 C语言编程元素,4.2.4 数据类型,4.2 C语言编程元素,4.2.4 数据类型,在声明变量的时候,可以规定变量的访问/存储类型,C语言有6个访问/存储关键字:extern、auto、static、register、const和volatile。extern说明该变量在另一个目标代码文件中声明和定义过。这些变量可以被所有函数访问。auto是默认的存储类型,在一个代码块内
11、(或在一个函数头部作为参量)声明的变量,无论有没有访问/存储关键字auto,都属于自动存储类。该类具有自动存储时期、代码块的作用域和空链接,如果未初始化,它的值是不确定的。在S12单片机中,这种类型的变量存放在栈中。一旦某个函数(一段程序)结束任务,这些用auto声明的变量将从栈中清除,不再有效。另外,只有声明这种变量的函数才有权访问该变量。,4.2 C语言编程元素,4.2.4 数据类型,static存储类型与auto类型类似,但它存储在RAM中而不是栈中,因此它在程序运行的整个过程中都有效。在C语言中,关键字static有三个明显的作用:在函数体,一个被声明为静态的变量在这一函数被调用过程中
12、维持其值不变;在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外的函数访问,它是一个本地的全局变量;在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,也就是说,这个函数被限制在声明它的模块的本地范围内使用。register声明的变量表明要求编译器使用(如果可能)微处理器中的一个寄存器来存放该变量。使用微处理器的寄存器存储一个变量可以减少总线访问存储单元的时间、加速程序的运行。因此,若某个变量在程序中需要经常访问,可以考虑这种存储类型。如果某个变量的值在程序运行中保持不变,则可以用const类型来声明它,该变量通常存放在ROM中。一个const
13、变量必须由程序员初始化。有的程序员认为“const意味着常数”,这种说法其实有一些问题,有一种理解认为const意味着“只读”,这种理解更准确。,4.2 C语言编程元素,4.2.4 数据类型,const有以下作用:关键字const的作用是为给读代码的人员传达非常有用的信息,实际上,声明一个参数为常量是为了说明这个参数的应用目的;为优化器提供一些附加的信息,使用关键字const也许能产生更紧凑的代码;合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改,简而言之,这样可以减少bug的出现。有关const的所有用法,建议读者参考Dan Saks的文章“c
14、onst T vs.T const”。volatile访问类型表示它所声明的变量值在程序运行中可能不经过相关指令就发生变化。在S12单片机中,当某个变量的值被硬件输入端口改变时,这些变量应该用volatile声明。,4.2 C语言编程元素,4.2.5 运算符,4.2 C语言编程元素,4.2.5 运算符,4.2 C语言编程元素,4.2.6 指针,指针是存放其他变量地址的变量。例如,一个字符型变量指针存放的是该字符变量的地址。声明一个指针变量的格式与声明一个变量的格式相同,只是在变量名前加一个*运算符。指针在C语言中的另一个重要应用是动态内存分配。动态内存分配与我们见到的其他内存分配方式不同,区别
15、在于动态内存分配的存储单元在程序的运行过程中才确定。这些分配的内存通常来自RAM中未被使用的部分,我们称这一部分为堆。动态内存分配常常用在不知道RAM的大小又想充分利用RAM的资源的情况下。动态内存分配的两个主要函数是malloc()和free()。malloc()函数用于分配内存空间,而free()用于释放被分配的内存空间。在嵌入式系统中程序设计中,程序员经常面临者要求去访问某特定的内存位置的情况。此时可以利用指针方便的实现这个要求。,4.2 C语言编程元素,4.2.7 条件语句、循环语句及无限循环语句,1条件语句 条件语句在程序中会经常多次使用。如果某个定义的条件能够被满足,那么执行紧跟在
16、条件语句之后的大括号内的语句(或者不带大括号的语句),否则程序会转到下一条语句或者转到另一组语句中执行。条件语句可以分为if语句和switch语句两大类。,4.2 C语言编程元素,4.2.7 条件语句、循环语句及无限循环语句,2循环语句 C语言有三种不同的循环结构:for循环、while循环和do-while循环。for循环的开头包含一条初始化语句、一个循环条件判断和一条更新语句。在更新语句后是一组指令组成的循环体,这组指令在循环条件满足之前重复执行。while循环与for循环类似,都是重复执行循环体内的指令,但它在while后只有一个循环终止条件。do-while循环基本上和while循环完
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 嵌入式 编程
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6503942.html