嵌入式系统的基本概念.docx
《嵌入式系统的基本概念.docx》由会员分享,可在线阅读,更多相关《嵌入式系统的基本概念.docx(27页珍藏版)》请在冰豆网上搜索。
嵌入式系统的基本概念
第一讲嵌入式系统的基本概念
嵌入式系统的几个重要特征
(1)系统内核小
由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多。
(2)专用性强
嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植。
即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。
同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全不同的概念。
(3)系统精简
嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。
(4)高实时性OS
这是嵌入式软件的基本要求,而且软件要求固态存储,以提高速度。
软件代码要求高质量和高可靠性、实时性。
(5)嵌入式软件开发走向标准化
嵌入式系统的应用程序可以没有操作系统直接在芯片上运行。
为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS(Real-TimeOperatingSystem)开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。
(6)嵌入式系统开发需要开发工具和环境
这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。
开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。
嵌入式系统与PC之间的区别
*嵌入式系统一般是专用系统,而PC是通用计算平台
*嵌入式系统的资源比PC少得多*嵌入式系统软件故障带来的后果比PC机大得多
*嵌入式系统一般采用实时操作系统*嵌入式系统大都有成本、功耗的要求
*嵌入式系统得到多种微处理体系的支持*嵌入式系统需要专用的开发工具
嵌入式系统一般指非PC系统,它包括硬件和软件两部分。
硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等。
软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。
有时设计人员把这两种软件组合在一起。
应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。
嵌入式系统的核心是嵌入式微处理器。
嵌入式微处理器一般就具备以下4个特点
1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。
2)具有功能很强的存储区保护功能。
这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。
3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。
4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至μW级。
嵌入式处理器
嵌入式处理器是嵌入式系统的核心,是控制、辅助系统运行的硬件单元。
4位、8位单片机,16位、32位、64位嵌入式CPU。
实时操作系统
实时操作系统是嵌入式系统目前最主要的组成部分。
实时性需要调度一切可利用的资源完成实时控制任务。
-系统响应时间(Systemresponsetime):
系统发出处理要求,到系统给出应答信号的时间。
-任务切换时间(Context-switchingtime):
任务之间切换而使用的时间。
-中断延迟(Interruptlatency):
计算机接收到中断信号到操作系统作出响应,并完成切换转入中断服务程序的时间。
硬件基础
冯·诺依曼体系结构
指令的执行周期T
取指令(InstructionFetch):
TF2)指令译码(InstructionDecode):
TD3)执行指令(InstructionExecute):
TE4)存储(Storage):
TS每条指令的执行周期:
T=TF+TD+TE+TS
冯·诺依曼体系的特点
1)数据与指令都存储在存储器中2)被大多数计算机所采用
3)ARM7——冯诺依曼体系
哈佛体系结构
哈佛体系结构的特点
1)程序存储器与数据存储器分开2)提供了较大的数存储器带宽3)适合于数字信号处理4)大多数DSP都是哈佛结构5)ARM9是哈佛结构
CISC和RISC
CISC:
复杂指令集(ComplexInstructionSetComputer)具有大量的指令和寻址方式•8/2原则:
80%的程序只使用20%的指令•大多数程序只使用少量的指令就能够运行。
RISC:
精简指令集(ReducedInstructionSetComputer)•在通道中只包含最有用的指令•确保数据通道快速执行每一条指令•使CPU硬件结构设计变得更为简单
CISC与RISC的数据通道
影响CPU性能的因素:
流水线技术、超标量执行、高速缓存
流水线技术:
几个指令可以并行执行
提高了CPU的运行效率
内部信息流要求通畅流动
超标量执行:
超标量CPU采用多条流水线结构
高速缓存(CACHE)
1、为什么采用高速缓存
微处理器的时钟频率比内存速度提高快得多,高速缓存可以提高内存的平均性能。
2、高速缓存的工作原理
高速缓存是一种小型、快速的存储器,它保存部分主存内容的拷贝。
总线和总线桥
存储器系统
RAM:
随机存取存储器,SRAM:
静态随机存储器,DRAM:
动态随机存储器
1)RAM比DRAM快2)SRAM比DRAM耗电多
3)DRAM存储密度比SRAM高得多4)DRM需要周期性刷新
ROM:
只读存储器FLASH:
闪存
1)SRAM2)DRAM
输入输出接口
1)I/O2)A/D、D/A3)键盘4)LCD5)存储器接口6)设备接口
嵌入式操作系统
1操作系统的分类
顺序执行系统:
系统内只含有一个程序,独占CPU的运行时间,按语句顺序执行该程序,直至执行完毕,另一程序才能启动运行。
如DOS操作系统。
分时操作系统:
系统内同时可以有多个程序运行,把CPU的时间分按顺序分成若干片,每个时间片内执行不同的程序。
如UNIX
实时操作系统:
系统内有多个程序运行,每个程序有不同的优先级,只有最高优先级的任务才能占有CPU的控制权。
按实时性分类
●具有强实时特点的嵌入式操作系统●具有弱实特点的嵌入式操作系统●没有实时特点的嵌入式操作系统
1.强实时系统,其系统响应时间在毫秒或微秒级(数控机床);
2.一航实时系统,其系统响应时间在毫秒-几秒的数量级上,其实时性的要求比强实时系统要差一些(电子菜谱的查询)。
3.弱实时系统,其系统响应时间约为数十秒或更长(工程机械)。
按软件结构分类
(1).循环轮询系统:
(PollingLoop)最简单的软件结构是循环轮询,程序依次检查系统的每一个输入条件,一旦条件成立就进行相应的处理。
Initialize()While(true){if(condition_1)action_1();if(condition_2)action_2();……if(condition_n)acition_n();}
(2).事件驱动系统:
(Event-Drivensystem)
事件驱动系统是能对外部事件直接响应的系统。
它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。
应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。
中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。
后台也可以叫做任务级,前台也叫中断级。
例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。
从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。
前后台系统(后台循环、前台中断)
2嵌入式实时操作系统
实时操作系统的特点:
1、多任务休眠、就绪、运行、挂起、被中断
一个任务,也称作一个线程,是一个简单的运行程序。
每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。
多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。
CPU只有一个,轮番服务于一系列任务中的某一个。
多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。
在实际应用中,多任务的最大特点是,开发人员可以将很复杂的应用程序层次化-综合实验(时钟、位图、USB、KEY)。
2任务的事件驱动
3、中断与中断优先级
4、同步与异步
一系列时间相关事件称为同步事件,驱动的任务为同步任务随机发生的事件称为异步事件,驱动的任务为异步任务,如中断
5、资源与临界资源
程序进行时可使用的软硬件环境称为资源,2个以上任务可同时访问的共享资源称为临界资源。
任何任务所占用的实体都可称为资源。
资源可以是输入输出设备,例如打印机、键盘、显示器,资源也可以是一个变量、一个结构或一个数组等。
6、容错与安全
容错:
当系统软、硬件发生故障时,系统仍能正常运转,完成预定的任务或某些重要的不允许间断的任务。
包括系统自论断、自恢复、自动切换等功能。
安全性:
是指系统对自身文件和用户文件的存取合法性的控制。
如口令、加密。
实时系统的评价指标
实时系统是面向具体应用,对外来事件在限定时间内能做出反应的系统。
限定时间的范围很广可以从微秒级(如信号处理)到分级(如联机查询系统)。
在实时系统中主要有三个指标来衡量系统的实时性,即响应时间(ResponseTime)、生存时间(SurvivalTime)、吞吐量(Throughput)。
*响应时间(ResponseTime):
是计算机识别一个外部事件到作出响应的时间,在控制应用中它是最重要的指标,如果事件不能及时的处理,系统可能就会崩溃。
*生存时间(SurvivalTime):
是数据有效等待时间,在这段时间里数据是有效的。
*吞吐量(Throughput):
是在一给定时间内(秒),系统可以处理的事件总数。
例如通讯控制器用每秒钟处理的字符数来表示吞吐量,吞吐量是平均响应时间的倒数。
系统内核
多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通信。
内核提供的基本服务是任务切换。
内核本身也增加了应用程序的额外负荷,代码空间增加ROM用量,内核本身的数据结构增加了RAM的用量。
内核本身对CPU的占用时间一般在2到5个百分点之间。
调度
这是操作系统的主要职责之一,它决定该轮到哪个任务运行了。
往往调度是基于优先级的,根据其重要不同被赋予任务不同的优先级。
CPU总是让处在就绪态的优先级最高的任务先运行。
何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是非占先式的还是占先式的内核。
任务优先级
每个任务都有其优先级(priority),静态优先级和动态优先级。
应用程序执行过程中诸任务优先级不变,则称之为静态优先级。
在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。
应用程序执行过程中,如果任务的优先级是可变的,则称之为动态优先级.
非占先式与占先式
非占先式(non-preemptive)
非占先式调度法也称作合作型多任务(cooperativemultitasking),各个任务彼此合作共享一个CPU。
中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。
但中断服务以后控制权还是回到原来被中断了的那个任务,直到改任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。
非占先式内核的一个特点是几乎不需要使用信号量保护共享数据。
运行着的任务占有CPU,而不必担心被别的任务抢占。
非占先式内核的最大缺陷在于其响应高优先级的任务慢,任务已经进入就绪态,但还不能运行,也许要等很时间,直到当前运行着的任务释放CPU。
内核的任务级响应时间是不确定的,不知道什么时候最高优先级的任务才能拿到CPU的控制权,完全取决于应用程序什么时候释放CPU。
占先式(preemptive)
当系统响应时间很重要时,要使用占先式(preemptive)内核。
最高优先级的任务一旦就绪,总能得到CPU的控制权。
当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
使用占先式内核时,应用程序不应直接使用不可重入型函数。
如果调入可重入型函数时,低优先级的任务CPU的使用权被高优先级任务剥夺,不可重入型函数中的数据有可能被破坏。
可重入型函数
可以被一个以上的任务调用,而不必担心数据的破坏。
可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。
可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。
一个不可重入型函数的例子
intTemp;
Voidswap(int*x,int*y)
{
Temp=*x;
*X=*Y;
*y=Temp;
}
一个可重入型函数的例子
Voidswap(int*x,int*y)
{intTemp;Temp=*x;
*X=*Y;
*y=Temp;
}
代码的临界区
代码的临界区也称为临界区,指处理时不可分割的代码。
一旦这部分代码开始执行,则不允许任何中断打入。
在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断(在任务切换时,地址、指令、数据等寄存器堆栈保护)。
第二讲实时嵌入式操作系统分析
嵌入式实时操作系统µC/OS
µC/OS的性能特点
*公开源代码
*可移植性(Portable)绝大部分µC/OS-II的源码是用移植性很强的ANSIC写的。
和微处理器硬件相关的那部分是用汇编语言写的。
汇编语言写的部分已经压到最低限度,使得µC/OS-II便于移植到其他微处理器上。
µC/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。
*可固化(ROMable)µC/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),µC/OS-II可以嵌入到读者的产品中成为产品的一部分。
可裁剪(Scalable)可以只使用µC/OS-II中应用程序需要的那些系统服务。
也就是说某产品可以只使用很少几个µC/OS-II调用,而另一个产品则使用了几乎所有µC/OS-II的功能,这样可以减少产品中的µC/OS-II所需的存储器空间(RAM和ROM)。
这种可剪裁性是靠条件编译实现的。
多任务µC/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。
应用程序最多可以有56个任务可确定性全部µC/OS-II的函数调用与服务的执行时间具有可确定性。
任务栈每个任务有自己单独的栈,µC/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。
*系统服务µC/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。
*中断管理中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。
稳定性与可靠性
µC/OS的内核结构
任务task
典型的一个无限循环。
voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}µC/OS–II2.5版本支持64个任务,每个任务一个特定的优先级。
优先级越高,数字越小系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO-0。
建立任务
*Useoneoftwoservices
*OSTaskCreate()
*OSTaskCreateExtended()
任务控制块OS_TCB
*任务控制块OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。
*所有的任务控制块分为两条链表,空闲链表和使用链表。
任务的调度--OSSched
µC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。
µC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:
查找准备就绪的最高优先级的任务并进行上下文切换。
µC/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。
任务切换
*将被挂起的任务寄存器入栈
*将较高优先级任务的寄存器出栈
任务间通信手段
µC/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。
提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护OSSchedLock()禁止调度保护任务级的共享资源。
提供了经典操作系统任务间通信方法:
信号量、邮箱、消息队列,事件标志。
信号量semaphore
*信号量在多任务系统中用于:
控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。
*uC/OS中信号量由两部分组成:
信号量的计数值和等待该信号任务的等待任务表。
信号量的计数值可以为二进制,也可以是其他整数。
*系统通过OSSemPend()和OSSemPost()来支持信号量的两种原子操作P()和V()。
P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。
中断与时钟节拍
*我们知道:
当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。
*uC/OS中提供了OSIntEnter()和OSIntExit()告诉内核进入了中断状态。
OSIntNesting
*时钟节拍是一种特殊的中断,操作系统的心脏。
首先32位的整数OSTime加一。
对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。
多任务的启动
*首先创建任务
*最后调用OSStart开始多任务调度
voidmain()
{OSInit();
OSTaskcreat()
OSStart();
}
任务的格式
*每个任务不能占用全部CPU的资源需要有等待,或延时等系统调用典型的一个无限循环。
voidmytask(void*pdata){for(;;){dosomething;waiting;dosomething;}}
OS_TASK_SW任务的上下文切换
*通过sc系统调用指令完成保护当前任务的现场
*恢复新任务的现场执行中断返回指令开始执行新的任务
总结
*不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。
*每个任务有自己的堆栈空间。
内核对任务的占先式调度不会干扰每个任务的总的运行结果。
µCOS-II在ARM7上的移植
所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。
µCOS-II的主要代码都是由标准的C语言写成的,移植方便。
移植µCOS-II满足的条件
*处理器的C编译器能产生可重入代码在程序中可以打开或者关闭中断处理器支持中断,并且能产生定时中断(通常在10—1000Hz之间)处理器支承能够容纳一定量数据的硬件堆栈
*处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令
可重入的代码
可重入的代码指的是一段代码(比如:
一个函数)可以被多个任务同时调用,而不必担心会破坏数据。
也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。
程序1:
可重入型函数
voidswap(int*x,int*y){inttemp;
temp=*x;
*x=*y;
*y=temp;}
程序2:
非可重入型函数inttemp;voidswap(int*x,int*y){temp=*x;*x=*y;*y=temp;}
打开/关闭中断
在µCOS-II中,可以通过:
OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。
这需要处理器的支持。
在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
处理器支持中断并且能产生定时中断
µCOS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。
ARM7TDMI的处理器上可以产生定时器中断。
本系统工作在60MHz的主频下,定时器的中断的频率为1000Hz。
也就是系统的响应时间为1ms。
处理器支持硬件堆栈
µCOS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。
所以,寄存器的入栈和出栈是µCOS-II多任务调度的基础。
ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。
二、嵌入式Linux
Linux的特点
Linux系统是层次结构且内核完全开放强大的网络支持功能Linux具备一整套开发工具链Linux具有广泛的硬件支持特性同步跟踪快遵循通用国际标准,便于程序的移植Linux的结构
嵌入式Linux
嵌入式Linux(EmbeddedLinux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。
嵌入式Linux的开发和研究是目前操作系统领域的一个热点。
RTLinux
µCLinux
……
Linux作为嵌入式应用的缺点
首先linux最初设计为通用操作系统,其目标是追求整体最佳性能,所以不能很好处理实时任务;
其次,如何精简linux适用于嵌入式环境也是一个难题。
嵌入式linux的研究内容
嵌入式linux内核技术嵌入式库技术开发环境技术嵌入式应用BIOS和bootloader启动加载程序设备驱动技术图形界面技术
几种嵌入式Linux
HardhatlinuxHardhatLinux是由MontaVista公司开发产品,是目前最具影响力嵌入式Linux。
MontaVista通过直接修改内核来扩充linux内核的实时性。
RTlinuxRTlinux是FSMLabs[16]开发的硬实时嵌入式linux。
RTlinux使用双内核结构;在底层使用一个硬实时内核,linux作为该内核的空闲任务;当有实时任务时,通过硬实时内核调度该任务;没有其他任务时,则运行普通linux。
uClinuxuClinux是针对无mmu微控制领域而设计的Linux系统。
u是希腊字母表示”小”,C是controller表示控制器。
uClinux和标准linux最大的区别是内存管理上,标准linux利用CPU硬件的支持实现虚拟内存机制,而uClinux采用实存储器管理策略。
华恒公司的龙珠开发板采用uclinux.
µClinux
uCLinux是一个完全符合GNU/GPL公约的项目