《单片机原理及基于单片机的嵌入式系统设计》蔡方凯电子教案_第1页
《单片机原理及基于单片机的嵌入式系统设计》蔡方凯电子教案_第2页
《单片机原理及基于单片机的嵌入式系统设计》蔡方凯电子教案_第3页
《单片机原理及基于单片机的嵌入式系统设计》蔡方凯电子教案_第4页
《单片机原理及基于单片机的嵌入式系统设计》蔡方凯电子教案_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第12章嵌入式单片机技术

C教程基础12.1 C51编程基础12.2 串行通信与定时程序12.3 嵌入式操作系统嵌入式51系列单片机的编程语言常用的有二种:汇编语言,C51语言。汇编语言的机器代码生成效率高但可读性不强,而C51语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言;而且C51语言还可以嵌入汇编来解决高时效性的代码编写问题。中大型的软件编写用C51语言的开发周期通常要小于汇编语言很多。

C语言的标识符用来标识源程序中某个对象名字。这些对象可以是函数、变量、数组、数据类型、存储方式、语句等。关键字是一类具有固定名称和特定含义的特殊标识符,有时又称为保留字。ANSIC标准一共规定了32个关健字,表12-1按用途列出了ANSIC标准的关键字。

12.1C51编程基础

12.1.1标志符与关键字

表12-1ANSIC标准的关键字

关键字用途说明auto存储器种类声明用以声明局部变量,默认什为此break程度语句退出最内层循环体case程度语句switch语句中的选择项char数据类型声明单字节整型或字符型const存储类型声明在程度执行中不可修改的变量值continue程度语句转向下一次循环default程序语句switch语句中的失败选择项do程度语句构成do...while循环结构double数据类型声明双精度浮点数else程度语句构成if...else选择结构enum数据类型声明枚举extern存储种类声明在其它程度模块中声明了的全局变量float数据类型声明单精度浮点数for程度语句构成for循环结构goto程度语句构成goto转移结构if程度语句构成if...else选择结构int数据种类声明基本整型数long数据种类声明长整型数register数据种类声明使用CPU内部寄存器的变量return程序语句函数返回short数据种类声明短整型数signed数据种类声明有符号数,二进制数的最高位为符号位sizeof运算符计算表达式或数据类型的字节数static数据种类声明静态变量struct数据种类声明结构类型数据switch程序语句构成switch选择结构typedef数据种类声明重新进行数据类型定义union数据种类声明联合类型数据unsigned数据种类声明无符号数据void数据种类声明无类型数据volatile数据种类声明声明该变量在程度执行中可被隐含的改变while程度语句构成while和...while循环结构C51编绎器除了支持ANSIC标准的关键字以外,还扩展了如表12-2所示的关键字:

表12-2C51编绎器的扩展关键字

关键字用途说明_at_地址定位为变量进行存储器绝对空间地址定位alien函数特殊声明用以声明与PL/M51兼容的函数bdata存储器类型声明可位寻址的8051内部数据存储器bit位变量声明声明一个位变量或位类型的函数code存储器类型声明8051程度存储器空间compact存储器模式指定使用8051外部分页寻址数据存储器空间data存储器类型声明直接寻址的8051内部数据存储器idata存储器类型声明间接寻址的8051内部数据存储器interrupt中断函数声明定义一个中断服务函数large存储器模式指定使用8051外部数据存储器空间pdata存储器类型声明分页寻址的8051外部数据存储器_priority_多任务优先声明规定RTX51或RTX51Tiny的任务优先级reentrant再入函数声明定义一个再入函数sbit位变量声明声明一个可位寻址变量sfr特殊功能寄存器声明声明一个8位的特殊功能寄存器sfr16特殊功能寄存器声明声明一个16位的特殊功能寄存器small存储器模式指定使用8051内部数据存储器空间_task_任务声明定义实时多任务函数usang寄存器组定义定义8051的工作寄存器组xdata存储器类型声明8051外部数据存储器针对51系列单片机各个可操作部分,C51编绎器定义了如表12-3所示的符号,编程时写出符号名,即可操作单片机对应的部分。

表12-3C51特殊功能寄存器列表符号地址注释*ACCE0H累加器*BF0H乘法寄存器*PSWD0H程序状态字SP81H堆栈指针DPL82H数据存储器指针低8位DPH83H数据存储器指针高8位*IEA8H中断允许控制器*IPD8H中断优先控制器*P080H端口0*P190H端口1*P2A0H端口2*P3B0H端口3PCON87H电源控制及波特率选择*SCON98H串行口控制器SBUF99H串行数据缓冲器*TCON88H定时器控制TMOD89H定时器方式选择TL08AH定时器0低8位TL18BH定时器1低8位TH08CH定时器0低8位TH18DH定时器1高8位带*号的特殊功能寄存器都是可以位寻址的寄存器下面举举例说说明特特殊功功能寄寄存器器的操操作方方法。。例1,,欲将将单片片机P1口口的第第一根根口线线-DIP封装装单片片机第第一管管脚--设为为报警警输出出线,,低电电平报报警,,则在在程序序中首首先可可定义义:sbitBJ=P1^0;这就定定义了了一个个变量量BJ对应应P1口的的第一一根口口线,,sbit声明明变量量BJ是位位寻址址数据据类型型。需需要报报警时时,使使用语语句::BJ=0;即可令令单片片机P1口口的第第一根根口线线输出出低电电平,,完成成报警警。当当报警警完毕毕,需需要撤撤销报报警时时,使使用如如下语语句即即可恢恢复到到非报报警状状态::BJ=1;例2,,欲将将单片片机P1口口的第第五根根口线线至第第八根根口线线设置置为构构成宽宽度为为4位位的双双向数数据总总线,,使之之既可可以接接收数数据又又可以以发送送数据据,则则在程程序中中首先先可做做如下下定义义:sbitMT8880_D0=P1^4;//双双向向数据据总线线sbitMT8880_D1=P1^5;//双双向向数据据总线线sbitMT8880_D2=P1^6;//双双向向数据据总线线sbitMT8880_D3=P1^7;//双双向向数据据总线线收数据据时,,令各各口线线为高高,处处于监监听状状态::MT8880_D0=1;MT8880_D1=1;MT8880_D2=1;MT8880_D3=1;当有数数据来来时,,使用用如下下语句句判断断、接接收数数据::if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==0)Number_Key=0;if(MT8880_D3==0&MT8880_D2==0&MT8880_D1==0&MT8880_D0==1)Number_Key=1;…….用作输输出数数据时时,直直接写写口线线即可可:MT8880_D0=1;MT8880_D1=0;MT8880_D2=1;MT8880_D3=0;如把这这四根根口线线看作作二进进制输输出,,MT8880_D3是是高位位,则则输出出了0101,,相当当于十十进制制的5。当当然,,输出出前必必须保保证总总线上上的其其它设设备处处于监监听状状态,,即非非输出出状态态,否否则会会产生生冲突突,因因为总总线信信号是是“与与”的的关系系,比比如某某根数数据线线被任任一总总线设设备置置为逻逻辑0,则则在同同时其其它设设备无无法将将其置置为逻逻辑1。12.1.2数数据类类型C51有如如下数数据类类型::表12-4C51编绎绎器能能够识识别的的数据据类型型数据类型字符类型长度值域unsignedchar字符类型单字节0~255signedchar字符类型单字节-128~127unsignedint整型双字节0~65536unsignedint整型双字节-32768~32767unsignedlong长整型4字节0~4294967295signedlong长整型4字节-2147483648~2147483647float浮点型4字节±1.175494E-38~±3.4028223E+38*指针型1~3字节对象的地址bit位类型位0或1sfr特殊功能寄存器单字节0~255sfr1616位特殊功能寄存器双字节0~65536sbit可寻址位位0或1指针符符号"*":表表示方方法是是将"*"前面面冠以以数据据类型型的符符号,,如char*point1表表示point1是是一个个字符符型的的指针针变量量。下面给给出几几个例例子,,说明明定义义不同同数据据类型型变量量的操操作方方法。。例1,,定义义一个个布尔尔型变变量,,则有有:bitFLAG_BF;例2,,定义义一个个整型型变量量,则则有::intTime_DU;例3,,定义义一个个单字字节字字符型型变量量,则则有::unsignedcharLOCK_JS;例4,定义一一个字符型数数组,则可在在程序开头声声明:typedefunsignedcharNumber[20];这就声明了一一个长度为20字节的字字符型数组,,使用赋值语语句:Number[0]=10将值10填入入该数组第一一个字节。使使用赋值语句句:Number[1]=15将值15填入入该数组第二二个字节。使使用赋值语句句:MyVar==Number[3]将该数组的第第四个字节赋赋给变量MyVar。例5,欲定义义一个结构型型变量,则有有:structReadArray{unsignedcharNumber[20];intSerial[5];}READARRAY;给结构变量赋赋值可使用如如下语句:READARRAY.Number[0]=’a’;READARRAY.Number[1]=’b’;READARRAY.Number[2]=’c’;…READARRAY.Serial[3]=32;…12.1.3常量常量的值在程程序执行过程程中不能改变变。常量的数数据类型有整整型、浮点型型、字符型和和字符串型等等。分别说明明如下:1.整型常量整型常量就是是整型常数,可表示为:·十进制整数数:如12、、-5678、0等。·十六进制整整数:十六进进制数据以0x开头,数数据为0~9及a~f。。·长整数:在在数字后面加加一个字母L长整数,如如2048L、0123L、0xff00L等等。2.浮点型型常量浮点型常量有有十进制形式式和指数表示示形式。·十进制表示示形式又称为为定点表示形形式,由数字字和小数点组组成。如0.3141是是十进制数表表示形式的浮浮点型常量。。3.字符型型常量字符型常量是是单引号内的的字符,如'a','b'等。对于于不可显示的的控制字符,,可以在该字字符前面加一一个反斜杠"\"组成转转义字符。利利用转义字符符可以完成一一些特殊功能能和输出时的的格式控制。。常用转义字字符如表12-5所示。。表12-5常常用转义字符符表转义字符含义16进制数形式\0空字符(NULL)0x00\n换行符(LF)0x0A\r回车符(CR)0x0D\t水平制表符(HT)0x09\b退格符(BS)0x08\f换页符(FF)0x0C\'单引号0x27\"双引号0x22\\反斜杠0x5C4.字符串串型常量字符串型常量量由双引号““”内的字符符组成,如““ABCD””、“$1234”等都都是字符串常常量。当双引引号内的字符符个数为0时时,称为空串串常量。字符符串常量首尾尾的双引号是是界限符,当当需要表示双双引号字符串串时,可用双双引号转义字字符来表示为为:“\”““。C语言在在存储字符串串常量时,要要在字符串的的尾部加一个个转义字符\0作为该字字符串常量的的结束符。因因此不要将字字符常量与字字符串常量混混淆,如字符符常量’a‘‘与字符串常常量”a“是是不一样的。。为了某些编程程需要,常常常在程序开头头使用如下语语句定义常量量:#definePI3.14这样,在程序序中出现常量量PI时,编编译器会自动动用浮点数3.14代替替。12.1.4变量及其存存储模式变量是一种在在程序执行过过程中,其值值能够不断变变化的量。使使用一个变量量之前,必须须进行定义,,用一个标识识符作为变量量名并指出它它的数据类型型和存储格式式,以便编绎绎系统为它分分配相应的存存储单元。在在C51中对对变量进行定定义的格式如如下:[存储器种类类]数据类型型[存储器类类型]变量名名表其中,"存储储器种类"和和"存储器类类型"是可选选项。变量的的存储器种类类有四种:自自动(auto)、外部部(extern)、静静态(static)和和寄存器(register)。定定义变量时如如果省略存储储器种类选项项,则该变量量格式为自动动(auto)。定义一一个变量时,,C51编绎绎器允许说明明变量的存储储器类型。KeilC51编绎器对对于每个变量量可以准确地地赋予其存储储器类型,使使之能够在单单片机系统内内准确地定位位。表12-6列出了CC51编绎器器所能识别的的存储器类型型。表12-6C51编绎绎器所能识别别的存储器类类型存储器类型说明DATA直接寻址的片内数据存储器,访问速度最快BDATA可位寻址的片内数据存储器,允许位与字节混合访问IDATA间接访问的片内数据存储器,允许访问全部片内地址PDATA分页寻址的片外数据存储器,用MOVX@Ri指令访问XDATA片外数据存储器,用MOVX@DPTR指令访问CODE程序存储器,用MOVC@A+DPTR指令访问8051具有有一些特殊功功能寄存器,,如定时器方方式控制寄存存器TMOD、中断允许许控制寄存器器IE等。C51编绎器器扩充了关键键字sfr和和sfr16,以便在C语言源程序序中直接对特特殊功能寄存存器进行定义义。定义方法法如下:sfrP0=0x80;/*定义义I/O口P0,其地址址为0x80*/对于定时器T2,可采用用如下方法的的方法来定义义:sfr16T2=0xCC;/*定义TIMER2,其其地址为T2L=0xCC,T2H=0xCD*/T2为特殊功功能寄存器名名,等号后面面是它的低字字节地址,其其高字节地址址必须在物理理上直接位于于低字节之后后。访问特殊功能能寄存器中的的某位,用扩扩充关键字sbit,1.sbit位变量名=位地址这种方法将位位的绝对地址址赋给位变量量,位地址必必须位于0x80~0xFF之间。。例如:sbitY=0xD7;2.sbit位变量名=特殊功能寄寄存器名^位位位置当可位寻址位位位于特殊功功能寄存器中中时,可采用用这种方法。。"位位置"是一个0~7之间的常常数。例如::sfrPSW=0xD0;sbitCY=PSW^7;3.sbit位变量名=字节地址^位位置以一常数作为为基址,常常数在0x80~0xFF之间。"位位置"是是一个0~7之间的常数数。例如:sbitCY=0xD0^7;需要注意的是是,sbit是一个独立立的关键字,,不要将它与与关键字bit相混淆。。关键字bit是C51编绎器的一一种扩充数据据类型,用来来定义一个普普通位变量,,它的值是二二进制数的0或1。例如如:staticbitdirection_bit/*定义一个静静态位变量direction_bit*/12.1.5用typedef重新新定义数据类类型在C51语言言程序中,用用户还可以根根据自己的需需要对数据类类型重新定义义。其方法如如下:typedefintIntnew;/*定义Intnew为为新的整型数数据类型名*/Intnewi,j;/*将i,j定义为为Intnew型变量*/一般而言,用用typedef定义的的新数据类型型用大写字母母,以便与C语言中原有有的数据类型型相区别。12.1.6运算符与表表达式运算符是完成成某种特定运运算的符号,,表达式则是是由运算符及及运算对换所所组成的具有有特定含义的的式子。C语语言是一种表表达式语言,,在任意一个个表达式后面面加一个分号号";"就构构成了一个表表达式语句。。运算符按其在在表达式中所所起的作用,,可分为:赋赋值运算符、、算术运算符符、增量与减减量运算符、、关系运算符符、逻辑运算算符、位运算算符、复合运运算符、逗号号运算符、条条件运算符、、指针和地址址运算符、强强制类型转换换运算符和sizeof运算符等。。"="在C中中赋值运算符符,如,x=10。示例例如下:a=0xFF;//将常数十十六进制数FF赋于变量量aC51中的算算术运算符有有如下几个,,其中只有取取正值和取负负值运算符是是单目运算符符,其它是双双目运算符::+加或取正正值运算符-减或取负负值运算符*乘运算符符/除运算符符%取余运算算符如:a+b*(10-a),(x+9)/(y-a)两浮点数相除除,其结果为为浮点数,如如10.0/20.0所所得值为0.5,两个整整数相除时,,所得值就是是整数,如7/3,值为为2。C的运运算符有优先先级和结合性性,可用括号号"()"来来改变优先级级。12.2串行行通信与定时时程序下面给出1个个C51完整整程序,该例例子包含对定定时器、中断断和串行通信信的处理。该该程序运行在在AT89C51单片机机上,该单片片机安装在一一台下位机上上,该下位机机接收从PSTN公共电电话网传来的的数据,然后后存储转发给给PC机。。12.3嵌入入式操作系统统12.3.1嵌入式操作作系统简介提高开发效率率仅仅依靠编编程语言还不不够,应该要要建立自己的的开发平台。。嵌入式实时时操作系统((RTOS))就是一个很很好的嵌入式式软件的开发发平台。使用用RTOS是是大势所趋。。RTOS和一一般的操作系系统有何区别别?我们平时时熟悉的DOS、Windows、、Linux等操作系统统都是通用操操作系统,它它们针对的是是PC或是工工作站。为了了最大幅度地地兼容各种软软硬件产品,,通用操作系系统一般面面面俱到、体积积庞大。而RTOS很很不一样。嵌嵌入式系统中中的硬件资源源环境一般比比较苛刻,嵌嵌入式微处理理器和微控制制器的内存一一般都不大,,要在如此紧紧张的资源下下完成复杂的的功能,这就就要求嵌入式式系统软件必必须尽量的小小巧、稳定和和高效。目前广泛用于于各种嵌入式式智能设备的的嵌入式操作作系统有美国国加州的集成成系统公司推推出的pSOSystem,简称pSOS。pSOS是是高高性性能能、、模模块块化化的的OS,,针针对对嵌嵌入入式式微微处处理理器器量量身身打打造造。。该该系系统统提提供供了了多多任任务务处处理理环环境境。。pSOS采采用用模模块块化化体体系系结结构构,,包包括括一一个个实实时时多多任任务务核核心心和和一一系系列列软软件件部部件件、、连连接接库库。。系系统统中中的的每每个个部部分分都都是是封封闭闭式式的的,,相相互互之之间间既既独独立立又又密密切切协协作作。。开开发发人人员员可可以以根根据据不不同同的的应应用用需需求求来来制制定定操操作作系系统统的的功功能能和和所所需需要要的的内内存存大大小小。。pSOS的的主主要要组组成成部部分分有有::实实时时多多任任务务核核心心pSOS++、、TCP/IP协协议议堆堆栈栈pNA++、、远远程程过过程程调调用用库库pRPC++、、文文件件系系统统管管理理pHILE++、、ANSIC标标准准库库pREPC++、、调调试试功功能能模模块块pROBE++、、系系统统信信息息实实时时分分析析工工具具pMONT++等等等等。。pSOS有有如如下下特特征征::支支持持多多种种CPU和和驱驱动动器器硬硬件件产产品品;;集集成成了了网网络络技技术术,,对对TCP/IP协协议议支支持持;;多多处处理理器器支支持持;;文文件件系系统统支支持持包包括括ISO9660、、MS--DOS兼兼容容文文件件系系统统和和高高性性能能嵌嵌入入式式文文件件系系统统。。另外,WindowsCE.Net也是是一个应应用较广广泛的实实时嵌入入式操作作系统,,它是微微软第一一个能够够全面支支持中文文的WindowsCE操操作系统统,适用用于快速速构建新新一代内内存少体体积小的的智能设设备,WindowsCE.NET也为为构建智智能移动动设备的的开发人人员提供供了新一一代的功功能强大大嵌入式式系统平平台。WindowsCE.NET提供供了对无无线技术术的支持持,例如如蓝牙技技术和零零配置的的802.11,它还还提供了了全面的的多媒体体和Web浏览览体验。。WindowsCE.NET支支持各种种处理器器产品家家族,包包括x86、Xscale、、ARM、MIPS和和SH系系列。基于51单片机机的RTOS中中,有名名气的有有KeilC51所所带的RTXFull和RTXTiny,μμC/OSII。RTX51是一一个用于于8051系列列单片机机的多任任务实时时操作系系统。有有两个不不同的版版本可用用。RTX51Full使使用四个个任务优优先权完完成同时时存在时时间片轮轮转调度度和抢先先的任务务切换。。RTX51工工作在与与中断功功能相似似的状态态下,信信号和信信息可以以通过邮邮箱系统统在任务务之间互互相传递递。开发发者可以以从一存存储池中中分配和和释放内内存;可可以强迫迫一个任任务等待待中断、、超时,,或者是是从另一一个任务务或中断断发出信信号、信信息。RTX51Tiny是一个个RTX51的子集集,可以以很容易易地在没没有任何何外部存存储器的的单片8051系统上上运转;;它仅支支持时间间片轮转转任务切切换和使使用信号号进行任任务切换换,不支支持抢占占式的任任务切换换,不包包括消息息队列,,没有存存储器池池分配程程序。μC/OSII是著名名的、源源码公开开的实时时内核,,可用于于各类8位、16位和和32位位单片机机或DSP。从从μC/OS算算起,该该内核已已有10余年应应用史,,并在诸诸多领域域得到广广泛应用用。μC/OSII是是一个完完整、可可移植、、可固化化和可剪剪裁的占占先式实实时多任任务内核核。μC/OSII是是用ANSI的的C语言言编写的的,包含含一小部部分汇编编代码,,使之可可以供不不同架构构的微处处理器使使用。至至今,从从8位到到64位位,μC/OSII已已在超过过40种种不同架架构的微微处理器器上运行行。8051系列一一般只有有很少的的ROM和RAM,如如AT89C52只有有8KBFlash和256字字节RAM。但但RTX51Full自身身代码有有6K多字节节,且需需要大量量外部RAM,,不利于于学习。。RTXTiny虽虽然小((自身占占用900多字字节ROM),,但是任任务没有有优先级级和中断断管理,,无源代代码,不不实用,,也不利利于学习习。而μμC/OSII有源代代码,有有配套图图书,利利于学习习,但规规模太大大,又需需要大量量外部RAM,,而且所所有函数数都必须须是可重重入函数数,用在在8051系列列这类小小片内RAM的的单片机机上有点点勉强。。除了上述3种嵌入式式操作系统统,还有广广州周立功功公司开发发的SmallRTOS51,它使使用了RTX51Tiny的堆栈管管理机制,,并像μC/OSII一样是是抢占式的的。虽然它它为51系系列单片机机编写,但但比较容易易移植到其其他CPU上。目前前SmallRTOS51的所有版版本均可以以免费在任任何领域使使用。12.3.2实时嵌嵌入式操作作系统分析析所谓操作系系统,无非非就是处理理不同硬件件差异的接接口,或者者说隐蔽硬硬件,使用用户不必和和硬件打交交道,让应应用程序可可以在上面面操作。通通过由操作作系统提供供出来的系系统接口来来写应用程程序,无须须考虑硬件件问题。嵌入式操作作系统是将将所有程序序,包括操操作系统、、驱动程序序、应用程程序等程序序代码全部部都烧进一一个ROM里面执行行,操作系系统在其中中的角色比比较像函数数库。操作系统主主要负责三三件事:内内存管理、、任务管理理、外围资资源管理。。这三项机机制提供给给应用程序序开发者很很多的好处处,但是在在嵌入式系系统中并非非绝对必要要,如果系系统很简单单,可以根根本不用操操作系统,,但对复杂杂的应用程程序,有个个操作系统统帮忙会省省很多麻烦烦。嵌入式式操作系统统核心通常常很小,往往往只有4到20K。下面我我们来看看看这三项管管理机制。。内存管理简单方式内内存管理不不提供任何何内存管理理机制,但但也有好处处,用户自自行管理内内存,用错错了系统就就宕机了,,系统只维维护一个已已经配置的的空间的顶顶部指针。。位映像方式式内存管理理是将可以以使用的内内存总空间间分成固定定大小的块块,系统本本身维护一一个内存使使用位映像像来记录内内存的使用用方式。在在内存使用用位映像中中,每一个个位表示一一个64bytes大小内存存块的使用用情况,当当位等于0时表示已已经有人用用过了,当当位值等于于1时表示示没有分配配。标签边界内内存管理方方式中,系系统会维护护一个顶部部指针指向向可用的内内存块顶端端。当用户户要求分配配内存时,,如果申请请的空间比比较小,比比如要存放放某个运算算中的中间间变量,有有一个小空空间块可供供分配,该该小空间块块以位映像像方式来管管理。系统统先在小空空间寻找有有无可用内内存,若有有则分配,,若没有则则转到调用用顶端指针针指向的地地址去寻找找。如果用用户要求分分配的内存存空间大,,就直接利利用顶端指指针去寻找找可用的内内存块。内存分区((memorypartitionmethod))管理方式式是将内存存分成多个个区域,并并给每个区区域一个识识别码(ID),在在每个区域域中包含几几个大小相相等的区块块(block)。。当用户申申请内存时时,只要告告诉系统区区域识别码码,系统就就会从相应应的区域中中取出一块块可用的区区块给用户户。例如下下表所示::表12-7内存存分区表第几分区分区号区块数目块尺寸1-412501652100326-8315064945012810-165104K如果给定分分区号为2,现在在在第5分区区中的100个区块块还没有使使用的话,,就拿到3K左右内内存。任务管理实时嵌入式式操作系统统的核心内内容就是对对任务的调调度、管理理。多任务(Multitasking)在一个操作作系统内部部,内核[kernel]是最最核心的部部件。从表面上看看,允许用用户并发访访问计算机机。多个用用户似乎可可以并行执执行多个程程序。在操操作系统的的控制下,,每个正在在执行的程程序就是一一个任务。。如果一个个操作系统统能够以这这种方法执执行多个任任务,这就就叫做多任任务。多任务操作作系统的使使用可以简简化应用程程序的设计计:

1..

操作系系统的多任任务和任务务间通信的的机制允许许复杂的应应用程序被被分成一系系列更小的的和更多的的可以管理理的任务。。2.

程序序的划分让让软件测试试更容易,团队工工作分解,也有利于于代码复用用。3.

复杂杂的定时和和先后顺序序的细节可可以从应应用程序代代码中删删除。这成成为操作系系统的职责责。一个多任务务操作系统统可以使它它看起来好好像每个任任务并行执执行一样。。这可以下下面的示意意图来描述述。它显示示了有关时时间的3个个任务的执执行模式。。任务名用用颜色标注注出来,写写在左手边边。时间从从左到右增增加,相应应的颜色的的线条显显示该任务务在某个特特殊时间正正在执行。。上面的图图演示的的是用户所所觉察到的的并行执行行模式,下下面的图是是实际的多多任务执行行模式。图12-2图12-3所有可用的的任务都好好像在执行行,但实际际上在任何何一个时刻刻都只有一一个任务在在执行,其其它任务被被挂起,这这也就是时时分复用的的概念。调度调度器(scheduler)是内核核中负责决决定在某个个特殊时间间哪个任务务应该执行行的部分。。下图是内内核调度任任务的状态态转换图。。图12-4其中,停止止指任务已已经执行完完的状态;;就绪指任任务满足所所有启动条条件后进入入的状态,,挂起指当当该任务需需要等待某某一事件发发生。内核核可以在任任务的运行行期间,可可能会挂起起/恢复该该任务许多多次,之后后才能完成成该任务并并进入停止止状态。除了被RTOS内核核无意的挂挂起外,一一个任务还还可以自己己挂起自己己。如果一一个任务想想延迟一段段固定的时时间,或者者等待某个个资源可用用,或者等等待一个事事件出现(比如一个个键按下)。一个阻阻塞或者睡睡眠的任务务是不能执执行的,不不会为它分分配任何处处理时间。。图12-5上图中提到到的编号:1)

任务务1正在运运行;2)

t2时刻,内内核挂起任任务1;3)

紧接接着,恢复复/开始执执行任务2;4)

任务务2正在执执行,它工工作于独占占访问方式式,它锁定定一个处理理器外设;;5)

t3时刻,内内核挂起任任务2;6)

紧接接着,恢复复任务3;;7)

任务务3试图访访问同样的的处理器外外设,发现现它被锁定定,任务3不能继续续,所以自自己挂起自自己;8)

内核核恢复任务务1;9)

接下下来,任务务2在9处处执行。它它完成了对对处理器外外设的访问问,所以解解锁它;10)再再下来,任任务3在10处执行行。它发现现现在可以以访问处理理器外设了了,于是开开始执行,,直到被内内核挂起。。调度策略是是调度器用用来决定哪哪个任务在在哪个时间间点执行的的算法,也也常被称为为排程算法法。一个非非实时多用用户系统的的策略很可可能分配给给每个任务务一个"公公平"的处处理器时间间片,即采采用均分的的原则。用用在实时系系统/嵌入入式系统的的策略会更更复杂,一一般都属于于先占式优优先权调度度策略,就就是先抢先先赢再加上上优先权排排列来改善善。普遍有有四种方式式,我们分分别讨论如如下:FCFS((firstcomefirstservicescheduling))策略,在在该策略下下,最先提提出服务要要求的执行行线程会最最先分配到到CPU资资源,直到到结束或自自动放弃。。PFS(priorityfirstscheduling)策略根根据任务的的优先权来来决定分配配CPU资资源的先后后,若是优优先权相同同,则采用用FCFS调度策略略来决定任任务的先后后顺序。RRS((round-robinscheduling))策策略略将将就就绪绪状状态态的的任任务务当当作作一一个个环环状状任任务务,,将将其其放放入入循循环环队队列列中中处处理理,,每每一一个个执执行行线线程程具具有有一一个个时时间间片片的的值值,,以以记记录录可可以以使使用用CPU多多少少时时间间,,每每一一次次时时间间中中断断跑跑起起来来,,时时间间片片值值就就减减一一,,当当时时间间片片值值用用完完之之后后,,就就会会切切换换到到另另外外一一个个任任务务。。PFRRS((priorityfirstwithroundscheduling))就就是是PFS加加上上RRS,,优优先先权权有有高高低低的的时时候候,,采采用用PFS,,若若优优先先权权相相同同,,则则采采用用RRS轮轮流流执执行行。。执行行调调度度策策略略呢呢可可以以在在每每一一个个时时间间中中断断的的时时候候,,每每一一个个标标记记((tick))开开始始运运行行的的时时候候执执行行,,但但这这样样太太频频繁繁;;也也可可以以在在一一个个任任务务执执行行完完((即即时时间间片片值值为为零零))的的时时候候执执行行调调度度策策略略;;另另外外,,还还有有调调用用exit、、sleep、、waitevent、、giveupCPU等等时时候候,,都都会会去去执执行行调调度度策策略略。。实时时调调度度下面面的的图图演演示示多多任任务务是是如如何何被被时时实实操操作作系系统统调调度度的的。。假假设设RTOS自自己己已已经经建建立立了了一一个个空空闲闲任任务务idletask,,它它只只在在没没有有其其他他任任务务执执行行的的时时候候才才被被执执行行。。RTOSidletask总总是是处处于于可可以以执执行行的的状状态态((它它不不会会因因为为等等待待外外设设资资源源而而被被阻阻塞塞,而而是是处处于于一一种种随随时时待待命命的的状状态态)),,通通常常空空闲闲任任务务就就是是检检查查整整个个系系统统还还有有哪哪些些资资源源应应该该回回收收或或是是该该做做些些默默认认的的系系统统动动作作。。图12-6下面面来来看看看看上上图图所所示示的的多多任任务务实实时时调调度度过过程程::1.初初始始状状态态,,定定时时器器控控制制任任务务vControlTask和和处处理理鼠鼠标标任任务务vMouseHandlerTask都都不不能能被被执执行行,,vControlTask等等待待合合适适的的时时间间开开始始新新的的控控制制循循环环,,vMouseHandlerTask等等待待鼠鼠标标按按下下。。处处理理器器时时间间分分配配给给RTOS的的idletask。。2.在在t1时时刻刻,,一一个个鼠鼠标标键键按按下下,,事事件件发发生生,,VMouseHandlerTask任任务务现现在在可可以以执执行行,,它它比比RTOS的的idletask有有更更高高的的优优先先级级,,所所以以处处理理器器分分配配时时间间给给它它。。3.在在t2时时刻,,vMouseHandlerTask已已经完完成了了对按按键的的处理理,并并更新新了显显示输输出。。它不不能继继续,,直到到下一一次鼠鼠标键键被按按下,,所以以必须须挂起起它自自己。。RTOSidletask被恢恢复执执行。。4.在在t3时时刻,,一个个定时时器事事件预预示可可以执执行下下一个个控制制循环环了。。VControlTask现在在可以以执行行,作作为最最高优优先级级的任任务被被立刻刻分配配到处处理器器时间间。5.在在t3和和t4之间间,当当vControlTask任务务还在在执行行的时时候,,一个个鼠标标键按按下。。MouseHandlerTask不能能被执执行,,因为为它没没有vControlTask的的优先先级高高。不不能分分配到到任何何处理理器时时间。。6.在在t4时时刻,,vControlTask完成成了控控制循循环的的处理理,不不能够够重新新开始始,直直到下下一个个时间间事件件出现现,所所以它它自己己挂起起自己己。而而vMouseHandlerTask现现在是是最高高优先先级的的任务务,可可以运运行了了,所所以,,为了了处理理先前前的鼠鼠标键键输入入事件件,分分配到到了处处理器器时间间。7.在在t5时时刻,,鼠标标键已已经被被处理理。VMouseHandlerTask为了了等待待下一一个鼠鼠标键键事件件,挂挂起自自己。。现在在,两两个任任务再再度不不能执执行。。RTOSidletask分配配到时时间。。8.在在t5和和t6之间间,一一个定定时器器事件件被处处理,,但是是没有有更多多的鼠鼠标事事件出出现。。9.下下一一个鼠鼠标键键按下下出现现在t6时时刻,,但在在vMouseHandlerTask完完成处处理键键之前前,一一个定定时器器事件件出现现了。。现在在两个个任务务都能能被执执行,,而vControlTask比比vMouseHandlerTask有有更更多的的优先先级,,所以以vMouseHandlerTask在在它完完成处处理键键盘之之前就就被挂挂起了了。VControlTask分分配到到处理理器时时间。。10.在在t8时刻刻,vControlTask完完成处处理控控制循循环,,挂起起自己己以等等待下下一个个事件件。VMouseHandlerTask再次次成为为最高高优先先级的的任务务,能能够运运行,,所以以分配配到处处理器器时间间,从从而鼠鼠标键键按下下事件件处理理能够够完成成。11.在在t9时刻刻,vMouseHandlerTask已经经完成成了对对按键键的处处理,,并更更新了了显示示输出出。它它不能能继续续,直直到下下一次次鼠标标键被被按下下,所所以必必须挂挂起它它自己己。RTOSidletask又又被恢恢复执执行。。系统时时钟节节拍中中断系统时时钟节节拍中中断是是一种种任务务间切切换的的方法法,一一般称称之为为RTOS的TICK((标记记),一般般用tickcount变变量来来度量量时间间。定定时器器中断断(RTOStickinterrupt)用用严严格的的时间间精度度来增增加tickcount,,允许许实时时内核核用一一个指指定的的定时时器中中断频频率精精度来来测量量时间间。每每次tickcount增增加后后,实实时内内核检检查查现在在是否否解除除阻塞塞或者者唤醒醒一个个任务务。一一个比比被中中断的的任务务有更更

温馨提示

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

评论

0/150

提交评论