嵌入式系统的基本概念教学资料.doc
Good is good, but better carries it.精益求精,善益求善。嵌入式系统的基本概念-第一讲嵌入式系统的基本概念嵌入式系统的几个重要特征(1)系统内核小由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多。()专用性强嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植。即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全不同的概念。()系统精简嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。()高实时性OS这是嵌入式软件的基本要求,而且软件要求固态存储,以提高速度。软件代码要求高质量和高可靠性、实时性。(5)嵌入式软件开发走向标准化嵌入式系统的应用程序可以没有操作系统直接在芯片上运行。为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS(RealTimeOperatingSystem)开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。(6)嵌入式系统开发需要开发工具和环境这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。开发时往往有主机和目标机的概念,主机用于程序的开发,目标机作为最后的执行机,开发时需要交替结合进行。嵌入式系统与PC之间的区别*嵌入式系统一般是专用系统,而PC是通用计算平台*嵌入式系统的资源比PC少得多*嵌入式系统软件故障带来的后果比PC机大得多*嵌入式系统一般采用实时操作系统*嵌入式系统大都有成本、功耗的要求*嵌入式系统得到多种微处理体系的支持*嵌入式系统需要专用的开发工具嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器微处理器、存储器及外设器件和IO端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为;而操作系统控制着应用程序编程与硬件的交互作用。嵌入式系统的核心是嵌入式微处理器。嵌入式微处理器一般就具备以下4个特点1)对实时多任务有很强的支持能力,能完成多任务并且有较短的中断响应时间,从而使内部的代码和实时内核心的执行时间减少到最低限度。2)具有功能很强的存储区保护功能。这是由于嵌入式系统的软件结构已模块化,而为了避免在软件模块之间出现错误的交叉作用,需要设计强大的存储区保护功能,同时也有利于软件诊断。3)可扩展的处理器结构,以能最迅速地开展出满足应用的最高性能的嵌入式微处理器。4)嵌入式微处理器必须功耗很低,尤其是用于便携式的无线及移动的计算和通信设备中靠电池供电的嵌入式系统更是如此,如需要功耗只有mW甚至W级。嵌入式处理器嵌入式处理器是嵌入式系统的核心,是控制、辅助系统运行的硬件单元。位、位单片机,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和RISCCISC:复杂指令集(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/OSII2.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编译器能产生可重入代码在程序中可以打开或者关闭中断处理器支持中断,并且能产生定时中断(通常在101000Hz之间)处理器支承能够容纳一定量数据的硬件堆栈*处理器有将堆栈指针和其他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处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。二、嵌入式LinuxLinux的特点-Linux系统是层次结构且内核完全开放强大的网络支持功能Linux具备一整套开发工具链Linux具有广泛的硬件支持特性同步跟踪快遵循通用国际标准,便于程序的移植Linux的结构嵌入式Linux嵌入式Linux(EmbeddedLinux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。RTLinuxµCLinuxLinux作为嵌入式应用的缺点首先linux最初设计为通用操作系统,其目标是追求整体最佳性能,所以不能很好处理实时任务;其次,如何精简linux适用于嵌入式环境也是一个难题。嵌入式linux的研究内容嵌入式linux内核技术嵌入式库技术开发环境技术嵌入式应用BIOS和bootloader启动加载程序设备驱动技术图形界面技术几种嵌入式LinuxHardhatlinuxHardhatLinux是由MontaVista公司开发产品,是目前最具影响力嵌入式Linux。MontaVista通过直接修改内核来扩充linux内核的实时性。RTlinuxRTlinux是FSMLabs16开发的硬实时嵌入式linux。RTlinux使用双内核结构;在底层使用一个硬实时内核,linux作为该内核的空闲任务;当有实时任务时,通过硬实时内核调度该任务;没有其他任务时,则运行普通linux。uClinuxuClinux是针对无mmu微控制领域而设计的Linux系统。u是希腊字母表示”小”,C是controller表示控制器。uClinux和标准linux最大的区别是内存管理上,标准linux利用CPU硬件的支持实现虚拟内存机制,而uClinux采用实存储器管理策略。华恒公司的龙珠开发板采用uclinux.µClinuxuCLinux是一个完全符合GNU/GPL公约的项目,完全开放代码,现由Lineo公司支持维护。英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uCLinux就是Micro-Control-Linux,字面上的理解就是“微控制领域中的Linux系统”。它专门针对没有MMU的CPU,并专为嵌入式系统做了许多小型化的工作,已支持前面提到的多款CPU。内存管理uClinux同标准Linux的最大区别就在于内存管理,标准Linux使用的虚拟存储器技术 标准Linux是针对有内存管理单元的处理器设计的。虚拟地址被送到内存管理单元(MMU),把虚拟地址映射为物理地址。采用分页的方式来载入进程。实际存储器分割为相同大小的页面。虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。它的实现基于局部性原理,当一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的那些部分页面装入内存运行(copy-on-write),其余暂时留在硬盘上程序运行时如果它所要访问的页已存在,则程序继续运行,如果发现不存在的页,操作系统将产生一个页失效异常,导致操作系统把需要运行的部分加载到内存中。必要时操作系统还可以把不需要的内存页交换到磁盘上。 通过赋予每个任务不同的虚拟-物理地址转换映射(页表),还可支持不同任务之间的保护、共享等。对于多进程管理当处理器进行进程切换并执行一个新任务时,一个重要部分就是为新任务切换页表。标准Linux系统的内存管理功能 可以运行只加载了部分的程序,缩短了程序启动的时间运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序可以使多个程序同时驻留在内存中提高CPU的利用率可以运行重定位程序。即程序可以方于内存中的任何一处,而且可以在执行过程中移动写机器无关的代码。程序不必事先约定机器的配置情况减轻程序员分配和管理内存资源的负担可以进行程序代码共享提供内存保护,进程不能以非授权方式访问或修改页面,内核保护单个进程的数据和代码以防止其它进程修改它们。否则,用户程序可能会偶然(或恶意)的破坏内核或其它用户程序代价:内存管理需要地址转换表和其他一些数据结构,留给程序的内存减少了。地址转换增加了每条指令的执行时间,而对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时,系统处理失效的磁盘I/O操作极耗时间。针对NOMMU的特殊处理uClinux针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术,但出现简单和尽量靠拢标准Linux得需要,uClinux仍然沿用标准Linux的分页内存管理结构,系统在启动时把实际存储器进行分页,但实际上采用的是实存储器管理策略。uClinux系统对于内存的访问是直接的,(它对地址的访问不需要经过MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护(这实际上是很多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转换表)。一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。由于程序加载地址与预期(ld文件中指出的)通常都不相同,这样relocation过程就是必须的。磁盘交换空间无法使用的,系统执行时如果缺少内存将无法通过磁盘交换来得到改善。对开发人员提出的更高要求从易用性来说,uClinux的内存管理实际上是一种倒退,退回了到了UNIX早期或是Dos系统时代。开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少的内存。由于应用程序加载时必须分配连续的地址空间,而针对可连续地址分配内存大小是受限的,开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常。从内存的访问角度来看,开发人员的权利增大了(开发人员在编程时可以访问任意的地址空间),但与此同时系统的安全性也大为下降。从嵌入式设备实现的功能来看,嵌入式设备通常在某一特定的环境下运行,只要实现特定的功能,其功能相对简单,内存管理的要求完全可以由开发人员考虑。内核加载方式uCLinux的内核有两种可选的运行方式:可以在flash上直接运行,也可以加载到内存中运行。后者可以减少内存需要。Flash运行方式(XIP):把内核的可执行映像烧写到flash上,系统启动时从flash的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的方法。内核加载方式:把内核的压缩文件存放在flash上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快(RAM的存取速率要比Flash高)。根(root)文件系统uCLinux系统采用romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。空间的节约来自于两个方面:首先内核支持romfs文件系统比支持ext2文件系统需要更少的代码;其次romfs文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。Romfs文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟ram盘/JFFS的方法进行处理(ram盘将采用ext2文件系统)。第三讲嵌入式微处理器体系结构嵌入式微处理器分类(1)、嵌入式微控制器嵌入式微控制器的典型代表是单片机,这种位的电子器件目前在嵌入式设备中仍然有着极其广泛的应用。(2)、嵌入式DSP处理器(3)、嵌入式微处理器MPU嵌入式微处理器是由通用计算机中的CPU演变而来的。与计算机处理器不同的是,在实际嵌入式应用中,只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,这样就以最低的功耗和资源实现嵌入式应用的特殊要求。(4)、嵌入式片上系统(SystemOnChip)SoC是追求产品系统最大包容的集成器件,SOC最大的特点是成功实现了软硬件无缝结合,直接在处理器片内嵌入操作系统的代码模块。运用VHDL等硬件描述语言不需要再像传统的系统设计一样,绘制庞大复杂的电路板,一点点的连接焊制,只需要使用精确的语言,综合时序设计直接在器件库中调用各种通用处理器的标准,然后通过仿真之后就可以直接交付芯片厂商进行生产。ARM汇编指令ARM体系结构的主要特征大量的寄存器,都可用于多种用途;Load-Store体系结构3地址指令(两个源操作数寄存器和结果寄存器独立设定)每条指令都条件执行包含非常强大的多寄存器Load和Store指令能在单时钟周期执行的单条指令内完成一项普通的移位操作和一项普通的ALU操作能过协处理器指令集来扩展ARM指令集,包括在编程模式下增加了新的寄存器和数据类型在Thumb体系结构中以高密度16位压缩形式表示指令集ARM有三种类型的数据指令1) 数据处理指令:这类指令只能使用和改变寄存器中的值2)数据传送指令:这类指令把存储器中的值拷贝寄存器(Load)或把寄存器的值拷贝到存储器中(Store)3)控制流指令:一般指令在执行时使用存储于连续的存储器地址中的指令。控制流指令使执行切换到不同的地址。切换是永久的或保存返回地址以恢复原来的执行顺序,或者陷入系统代码。ARMJTAG调试几种常用的调试方法指令集模拟器一种利用PC机端的仿真开发软件模拟调试的方法。驻留监控软件驻留监控程序运行在目标板上,PC机端调试软件可通过并口、串口、网口与之交互,以完成程序执行、存储器及寄存器读写、断点设置等任务JTAG仿真器通过ARM芯片的JTAG边界扫描口与ARM核进行通信,不占用目标板的资源,是目前使用最广泛的调试手段在线仿真器使用仿真头代替目标板上的CPU,可以完全仿真ARM芯片的行为。但结构较复杂,价格昂贵,通常用于ARM硬件开发中宿主机调试器宿主机调试器通过固定的协议控制下位机(协议转换器)。比如,SDT中通过Angel协议或者第三方调试器所提供的协议宿主机调试器只发送宏观的命令,比如:程序运行、终止。读些内存、ARM寄存器等通讯的介质可以是串口、并口、以太网、USB等JTAG与Angel*JTAG调试:协议转换器解释上位机传送过来的命令,通过JTAG控制ARM执行。*Angel调试:协议转换器可以直接做为目标板的Firmware的一部分。直接执行从宿主机传送过来的调试命令;并回送相应的数据。*Angel可以节省专门的JTAG仿真器,但是,它需要软件,或者是嵌入式操作系统的支持,做不到完全的实时仿真。而JTAG仿真是通过硬件和控制ARM的EmbeddedICE实现的,可以做到实时仿真。什么是JTAG?*JTAG是JointTestActionGroup的缩写;是IEEE1149.1标准*JTAG的建立使得集成电路固定在PCB上,只通过边界扫描便可以被测试*在ARM7TDMI处理器中,可以通过JTAG直接控制ARM的内部总线,IO口等信息,从而达到调试的目的JTAG的典型接口*TMS:测试模式选择(TestModeSelect),通过TMS信号控制JTAG状态机的状态*TCK:JTAG的时钟信号TDI:数据输入信号*TDO:数据输出信号*nTRST:JTAG复位信号,复位JTAG的状态机和内部的宏单元(Macrocell)ARM7TDMI中断点的设置*设置EmbeddedICE的两个watchpoint单元主要包括:地址、数据、控制信号等*当一个(或者两个)watchpoint中的地址(也可以包括数据)和ARM所执行的当前的指令相同的时候,ARM就从运行状态进入Debug状态断点的类型*硬件断点:在ARM中直接设定watchpoint中的地址,当ARM运行到制定的地址时,就进入Debug状态*软件断点:改变存储器中的ARM指令为一个特殊的数据X(ARM的未定义指令),同时,设置watchpoint中的断点数据也为X,当ARM把X数据作为指令读入的时候,ARM就进入Debug状态硬件断点和软件断点的优缺点*硬件断点:数目受EmbeddedICE中的Watchpoint数目的限制;但是,可以在任何地方设置断点*软件断点:数目不受限制,但是,软件断点是通过替换系统的断点地址的指令实现的,所以,软件断点只能在可写的存储器的地址中设置(比如:RAM),而不能在ROM(比如:Flash)中设置第四讲嵌入式软件的移植移植的概念和目的*移植:程序或应用软件从一个系统平台移动另一个系统平台,其功能、结构、执行结果保持不变。*移植的目的:1、硬件平台的升级2、实现软件重用3、实现软件/硬件并行设计*移植的要求:1、移植对象具有硬件无关性2、移植对象具有系统无关性3、移植对象采用标准语言编程嵌入式操作系统的移植C/OS-II1C/OS-II的软硬件体系结构2C/OS-II的移植需要满足以下要求(1)处理器的C编译器可以产生可重入代码;(2)可以使用C调用进入和退出CriticalCode(临界区代码);(3)处理器必须支持硬件中断,并且需要一个定时中断源;(4)处理器需要能够容纳一定数据的硬件堆栈;(5)处理器需要有能够在CPU寄存器与内存和堆栈交换数据的指令。打开/关闭中断在µCOS-II中,可以通过:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或