嵌入式系统复习2012新.ppt_第1页
嵌入式系统复习2012新.ppt_第2页
嵌入式系统复习2012新.ppt_第3页
嵌入式系统复习2012新.ppt_第4页
嵌入式系统复习2012新.ppt_第5页
已阅读5页,还剩180页未读 继续免费阅读

下载本文档

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

文档简介

何为嵌入式系统,第1、2、3、4、5、8、12、13、14、23。,何为嵌入式系统,嵌入式系统,英文全称为Embeded System。 IEEE 的定义:嵌入式系统是“控制、监视或者辅助装置、机器和设备运行的装置”。 业界普遍采用的定义:嵌入式系统是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。,理解嵌入式系统,嵌入式系统是与应用紧密结合的,是面向用户、面向产品、面向应用的。 嵌入式系统是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 嵌入式系统可定制、可裁减。 嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中。 嵌入式系统本身不具备自主开发能力。,嵌入式系统的基本结构,嵌入式系统可以笼统地分为硬件和软件两部分。,嵌入式处理器,嵌入式微处理器EMPU 嵌入式微控制器MCU 嵌入式数字信号处理器EDSP 片上可编程系统SOPC,嵌入式系统的特点,嵌入式系统是与应用紧密结合的。 嵌入式系统具有很强的专用性,可定制、可裁减,且必须结合实际系统需求进行合理的裁减利用。 嵌入式系统是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。 嵌入式系统必须有采用专用的开发工具和环境才能进行开发。 嵌入式系统具有通用计算机的功能,但实现了小型化的体积和高的运行可靠性。 嵌入式系统需要根据不同的处理器来进行定制。,1.3 嵌入式操作系统,概述,计算机系统由硬件和软件组成,在发展初期没有操作系统这个概念,用户使用监控程序来使用计算机。随着计算机技术的发展,计算机系统的硬件、软件资源也愈来愈丰富,监控程序已不能适应计算机应用的要求。于是在六十年代中期监控程序又进一步发展形成了操作系统(Operating System)。发展到现在,广泛使用的有三种操作系统即多道批处理操作系统、分时操作系统以及实时操作系统。,1.3 嵌入式操作系统,概述,时 间 先 后,1.3 嵌入式操作系统,概述,监 控 程 序,操 作 系 统,实时操作系统,分时操作系统,多道批处理操作系统,时 间 先 后,实时操作系统是我们介绍的重点,1.3 嵌入式操作系统,实时操作系统的特点,IEEE 的实时UNIX分委会认为实时操作系统应具备以下的几点: 异步的事件响应 切换时间和中断延迟时间确定 优先级中断和调度 抢占式调度 内存锁定 连续文件 同步,1.3 嵌入式操作系统,实时操作系统的特点,总的来说实时操作系统是事件驱动的,能对来自外界的作用和信号在限定的时间范围内作出响应。它强调的是实时性、可靠性和灵活性, 与实时应用软件相结合成为有机的整体起着核心作用, 由它来管理和协调各项工作,为应用软件提供良好的运行软件环境及开发环境。 从实时系统的应用特点来看实时操作系统可以分为两种:一般实时操作系统和嵌入式实时操作系统。,1.3 嵌入式操作系统,实时操作系统的特点,一般实时操作系统应用于实时处理系统的上位机和实时查询系统等实时性较弱的实时系统,并且提供了开发、调试、运用一致的环境。 嵌入式实时操作系统应用于实时性要求高的实时控制系统,而且应用程序的开发过程是通过交叉开发来完成的,即开发环境与运行环境是不一致。嵌入式实时操作系统具有规模小(一般在几K几十K 内)、可固化使用实时性强(在毫秒或微秒数量级上)的特点 。,基本概念,中断服务程序处理异步事件,这部分可以看成前台行为,前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务程序来保证的。,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为,后台也可以叫做任务级。这种系统在处理的及时性上比实际可以做到的要差。,前后台系统,1.3 嵌入式操作系统,基本概念,操作系统是计算机中最基本的程序。操作系统负责计算机系统中全部软硬资源的分配与回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件平台。,操作系统,1.3 嵌入式操作系统,基本概念,实时操作系统是一段在嵌入式系统启动后首先执行的背景程序,用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。在RTOS支持的系统中, 每个任务均有一个优先级,RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。,实时操作系统(RTOS),1.3 嵌入式操作系统,基本概念,代码的临界区也称为临界区,指处理时不可分割的代码,运行这些代码不允许被打断。一旦这部分代码开始执行,则不允许任何中断打入(这不是绝对的,如果中断不调用任何包含临界区的代码,也不访问任何临界区使用的共享资源,这个中断可能可以执行)。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。,代码的临界区,1.3 嵌入式操作系统,基本概念,程序运行时可使用的软、硬件环境统称为资源。资源可以是输入输出设备,例如打印机、键盘、显示器。资源也可以是一个变量、一个结构或一个数组等。,资源,1.3 嵌入式操作系统,基本概念,可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥。,共享资源,访问共享资源之前申请信号量,其它任务访问受阻 而不能使用共享资源,得到允许后,才能使用共享资源,1.3 嵌入式操作系统,基本概念,一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全属于该程序自己。实时应用程序的设计过程,包括如何把问题分割成多个任务,每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。,任务,1.3 嵌入式操作系统,基本概念,当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自已的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄予存器,并开始下一个任务的运行。这个过程就称为任务切换。这个过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。,任务切换,1.3 嵌入式操作系统,基本概念,多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通信。内核提供的基本服务是任务切换。使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核需要消耗一定的系统资源,比如25的CPU运行时间、RAM和ROM等。 内核提供必不可少的系统服务,如信号量、消息队列、延时等。,内核,1.3 嵌入式操作系统,基本概念,调度是内核的主要职责之一。调度就是决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程序的不同被赋予一定的优先级。基于优先级的调度法指CPU总是让处在就绪态的优先级最高的任务先运行。然而究竟何时让高优先级任务掌握CPU的使用权,有两种不同的情况,这要看用的是什么类型的内核,是非占先式的还是占先式的内核。,调度,1.3 嵌入式操作系统,基本概念,非占先式内核要求每个任务自我放弃CPU 的所有权。非占先式调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。,非占先式内核,1.3 嵌入式操作系统,基本概念,当系统响应时间很重要时,要使用占先式内核。因此绝大多数商业上销售的实时内核都是占先式内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。,占先式内核,1.3 嵌入式操作系统,基本概念,任务的优先级是表示任务被调度的优先程度。每个任务都具有优先级。任务越重要,赋予的优先级应越高,越容易被调度而进入运行态。,任务优先级,1.3 嵌入式操作系统,基本概念,中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被识别,CPU保存部分(或全部)上下文即部分或全部寄存器的值,跳转到专门的子程序,称为中断服务子程序(ISR)。中断服务子程序做事件处理,处理完成后,程序回到: 1. 在前后台系统中,程序回到后台程序; 2. 对非占先式内核而言,程序回到被中断了的任务; 3. 对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。,中断,1.3 嵌入式操作系统,基本概念,中断,1.3 嵌入式操作系统,基本概念,时钟节拍是特定的周期性中断。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同应用,一般在10ms到200ms之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。时钟节拍率越快,系统的额外开销就越大。,时钟节拍,1.3 嵌入式操作系统,使用实时操作系统的必要性,嵌入式实时操作系统在目前的嵌入式应用中用得越来越广泛,尤其在功能复杂、系统庞大的应用中显得愈来愈重要。在嵌入式应用中,只有把CPU嵌入到系统中,同时又把操作系统嵌入进去,才是真正的计算机嵌入式应用。使用实时操作系统主要有以下几个因素: 嵌入式实时操作系统提高了系统的可靠性。 提高了开发效率,缩短了开发周期。 嵌入式实时操作系统充分发挥了32位CPU的多任务潜力。,1.3 嵌入式操作系统,实时操作系统的优缺点,优点:在嵌入式实时操作系统环境下开发实时应用程序使程序的设计和扩展变得容易,不需要大的改动就可以增加新的功能。通过将应用程序分割成若干独立的任务模块,使应用程序的设计过程大为简化;而且对实时性要求苛刻的事件都得到了快速、可靠的处理。通过有效的系统服务,嵌入式实时操作系统使得系统资源得到更好的利用。 缺点:但是,使用嵌入式实时操作系统还需要额外的ROM/RAM开销,25%的CPU额外负荷,以及内核的费用。,What is uC/OS?,u: Micro C:control uC/OS : 适合于小的、控制器的操作系统 小巧 公开源代码,详细的注解 可剥夺实时内核 可移植性强 多任务 确定性,The Story of uC/OS,美国人Jean Labrosse 1992年编写的 商业软件的昂贵 应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年uC/OS-II,目前的版本uC/OS-II V2.51 www.uCOS-II.com,概要,内核结构-任务以及调度机制 任务间通信 uC/OS的移植 在PC机上运行uC/OS,任务task,典型的一个无限循环。 void mytask(void *pdata) for (;) do something; waiting; do something; 支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小 系统占用了两个任务,空闲任务和统计任务。,任务的数据结构任务控制块,任务控制块 OS_tcb,包括 任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。 所有的任务控制块分为两条链表,空闲链表和使用链表。,任务控制块结构,Struct os_tcb OS_STK *OSTCBStkPtr; struct os_tcb *OSTCBNext; struct os_tcb *OSTCBprev; OS_EVENT *OSTCBEventPtr; void *OSTCBMsg; INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX, OSTCBY, OSTCBBitX, OSTCBBitY; OS_TCB,任务的状态,任务的状态 OSTCBStat,运行,就绪,等待,挂起 可以有多个准备就绪的任务,但一个时刻只有一个任务可以运行,OSHighRdy,任务的调度-OSSched,uC/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。 uC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。,任务的调度,就绪任务表:用于存贮每个任务的就绪状态标志。由两个变量组成: OSRedyGrp:8位,每位表示一组(8个)任务中是否有就绪的任务。 OSRdyTbl:位图方式表示某个任务是否就绪。,就绪状态标志,Bit 0 in OSRdyGrp is 1 when any bit in OSRdyTbl0 is 1. Bit 1 in OSRdyGrp is 1 when any bit in OSRdyTbl1 is 1. Bit 2 in OSRdyGrp is 1 when any bit in OSRdyTbl2 is 1. Bit 3 in OSRdyGrp is 1 when any bit in OSRdyTbl3 is 1. Bit 4 in OSRdyGrp is 1 when any bit in OSRdyTbl4 is 1. Bit 5 in OSRdyGrp is 1 when any bit in OSRdyTbl5 is 1. Bit 6 in OSRdyGrp is 1 when any bit in OSRdyTbl6 is 1. Bit 7 in OSRdyGrp is 1 when any bit in OSRdyTbl7 is 1.,根据优先级找到任务在就绪任务表中的位置,根据优先级确定就绪表,假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0x02; OSRdyTbl1 |=0x10; 而优先级为21的任务就绪21=10 101b,则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0x04; OSRdyTbl2 |=0x20;,根据优先级确定就绪表,从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值 先计算好存在数组OSMapTbl7中,也就是: OSMapTbl0 =20=0x1; OSMapTbl1 =21=0x2; OSMapTbl7 =27=0x80;,根据优先级确定就绪表,利用OSMapTbl,通过任务的识别号-优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为: OSRdyGrp |=OSMapTblprio3; OSRdyTblprio3 |=OSMapTblprio ,根据就绪表确定最高优先级(1),两个关键: 优先级数分解为高三位和低三位分别确定; 高优先级有着小的优先级号 ;,根据就绪表确定最高优先级(2),通过OSRdyGrp值确定高3位,假设为0x24=100 100b, - OSRdyTbl2 和OSRdyTbl5,高优先级为2 通过OSRdyTbl2的值来确定低3位, 假设为0x12=010 010b ,-第2个和第5个任务,取高优先级第2个 -17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的 High3 =OSUnMapTblOSRdyGrp; Low3 =OSUnMapTblOSRdyTblHigh3; Prio =(Hign33)+Low3; ?为什么频繁的使用查表法 ?请问OSUnMapTbl的来历;,INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 ;,任务间通信手段,提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护 OSSchedLock( )禁止调度保护任务级的共享资源。 提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块ECB,所有的通信信号都被看成是事件(event), 一个称为事件控制块(ECB, Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下: 程序4.5 ECB的结构如下 - typedef struct void *OSEventPtr; /*指向消息或消息队列的指针*/ INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任务列表*/ INT16U OSEventCnt; /*计数器(当事件是信号量时)*/ INT8U OSEventType; /*事件类型:信号量、邮箱等*/ INT8U OSEventGrp; /*等待任务组*/ OS_EVENT; 与TCB类似的结构,使用两个链表,空闲链表与使用链表,信号量semaphore,uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制, 也可以是其他整数。 系统通过OSSemPend( )和OSSemPost( )来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,中断与时钟节拍,我们知道:当发生中断时,首先应保护现场,将CPU寄存器入栈,再处理中断函数,然后恢复现场,将CPU寄存器出栈,最后执行中断返回iret(x86)指令实现中断返回。 uC/OS中提供了OSIntEnter() 和OSIntExit() 告诉内核进入了中断状态。OSIntNesting 时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,多任务的启动,首先创建任务 最后调用OSStart开始多任务调度 void main( ) OSInit( ); OSTaskcreat( ) OSStart(); ,任务的格式,每个任务不能占用全部CPU的资源 需要有等待,或延时等系统调用 典型的一个无限循环。 void mytask(void *pdata) for (;) do something; waiting; do something; ,揭开神秘的面纱任务调度全程追踪,For example1 创建2个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级 void Task1(void) void Task2(void) while(1) while(1) blinkled1(); blinkled2(); Task1Data+; Task2Data+; OSTimeDly(25); OSTimeDly(50); ,void main() sysinit(); OSInit (); OSTaskCreate ( Task1, (void *) ,void OSStart (void) INT8U y, x; if (OSRunning = FALSE) 判断是否没有启动内核 y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); 找到优先级最高的准备就绪任务 OSPrioCur = OSPrioHighRdy; 当前运行任务优先级 OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; 根据任务优先级找到任务 OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); 让优先级最高的任务运行起来 ,OSStartHighRdy: bl OSTaskSwHook 用户自定义函数 把OSRunning设为1 li r0,1 lis r11,OSRunningha stb r0,OSRunningl(r11) 获取准备运行的任务TCB指针 lis r11,OSTCBHighRdyha lwz r11,OSTCBHighRdyl(r11) 设置当前运行任务TCB lis r12,OSTCBCurha stw r11,OSTCBCurl(r12) 获取新的任务的堆栈指针 lwz r1,0(r11) 恢复新任务的上下文 lwz r2,XR2(r1) . rfi,void OSTimeDly (INT16U ticks) if (ticks 0) 确保tick大于0 OS_ENTER_CRITICAL(); 进入临界段代码 if (OSRdyTblOSTCBCur-OSTCBY 调度下一个任务开始运行 ,void OSSched (void) INT8U y; OS_ENTER_CRITICAL(); if (OSLockNesting | OSIntNesting) = 0) 调度锁,或者处于中断状态禁止调度 y = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly); 获取准备就绪组里最高优先级的任务 if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; 设置运行任务为最高优先级任务 OSCtxSwCtr+; OS_TASK_SW(); 执行上下文切换 OS_EXIT_CRITICAL(); ,OS_TASK_SW 任务的上下文切换,通过sc系统调用指令完成 保护当前任务的现场 恢复新任务的现场 执行中断返回指令 开始执行新的任务,什么也不做的空闲任务,只是为了消耗CPU的时间片 void OSTaskIdle ( ) for (;) OS_ENTER_CRITICAL(); OSIdleCtr+; OS_EXIT_CRITICAL(); ,void OSTimeTick (void) OS_TCB *ptcb; ptcb = OSTCBList; -OSTCB链表指针 while (ptcb-OSTCBPrio != OS_IDLE_PRIO) 看是不是空闲任务,空闲任务是最后的任务 if (ptcb-OSTCBDly != 0) 是否延时 if (-ptcb-OSTCBDly = 0) 延时减一,看是否延时结束 if (!(ptcb-OSTCBStat 变量加一,记录系统启动以来的时钟滴答数 ,OSTimeTick( void ),时间,任务一,任务二,OSStart,Time Tick,Time Tick,1,25,50,Time Tick,空闲任务,总结,不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。 每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。,uC/OS的移植,代码分为三部分: 与CPU无关的内核代码,包括os_core.c, os_mbox.c,os_mem.c, os_q.c, os_sem.c, os_task.c, os_time.c, ucos_ii.c,ucos_ii.h; 与应用相关的设置头文件,包括: os_cfg.h, include.h; 处理器相关的代码,包括:os_cpu.h, os_cpu_a.asm, os_cpu.c.c。,移植要点,定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。 定义函数OS_TASK_SW执行任务切换。 定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。 定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。 定义函数OSTickISR。 定义OSTaskStkInit来初始化任务的堆栈。,uC/OS的改进,固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核 在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。 系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改 可以加上文件系统和TCP/IP协议栈,学习uC/OS的步骤,学习与研究uC/OS的起点:在PC上执行uC/OS ,环境:TC编译环境,新建一个工程 应用程序设计:消费者与生产者经典问题。 源代码阅读 移植:DSP,单片机,ARM Cortex-M3 体系结构,1. ARM介绍 2. ARM Cortex-M3处理器内核概述 3. Cortex-M3模块的内部方框图 4. 编程模式,5. 内部寄存器 6. 系统异常(中断) 7. 嵌套向量中断控制器(NVIC) 8. 存储器保护单元(MPU),2.1 ARM简介,ARM公司简介,ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。 公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。,2.1 ARM简介,常用ARM处理器系列,ARM公司开发了很多系列的ARM处理器核,目前最新的系列是Cortex,而ARM6核以及更早的系列已经很罕见了。当前应用比较多的ARM处理器核系列有:,2.1 ARM简介,2.1 ARM简介,ARM7系列简介,ARM7TDMI是ARM公司1995年推出的第一个处理器,也是目前用量最多的一个内核。 该系列包括ARM7TDMI、ARM7TDMI-S、带有高速缓存处理器宏单元的ARM720T和扩充了Jazelle的ARM7EJ-S。该系列处理器提供Thumb 16位压缩指令集和EmbededICE软件调试方式,适用于更大规模的SoC设计中。 ARM7系列广泛应用于多媒体和嵌入式设备,包括Internet设备、网络和调制解调器设备,以及移动电话、PDA等无线设备。,2.1 ARM简介,ARM9系列于1997年问世,该系列包括ARM9TDMI、ARM920T和带有高速缓存处理器宏单元的ARM940T。除了兼容ARM7系列,而且能够更加灵活的设计。 ARM9系列主要应用于引擎管理、仪器仪表、安全系统和机顶盒等领域。,ARM9系列简介,2.1 ARM简介,该系列为含有DSP指令集的综合处理器,包括ARM926EJ-S、带有高速缓存处理器宏单元的ARM966E-S/ARM946E-S。其内核在ARM7处理器内核的基础上使用了Jazelle增强技术,该技术支持一种新的Java操作状态,允许在硬件中执行Java字节码。 ARM9E系列主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。,ARM9E系列简介,2.1 ARM简介,ARM10E系列简介,该系列包括ARM1020E和ARM1020E处理器核,其核心在于使用向量浮点(VFP)单元VFP10提供高性能的浮点解决方案,从而极大提高了处理器的整型和浮点运算性能。 可以用于视频游戏机和高性能打印机等场合。,2.1 ARM简介,Xscale简介,Intel Xscale微控制器则提供全性能、高性价比、低功耗的解决方案,支持16位Thumb指令并集成数字信号处理(DSP)指令。 主要应用于手提式通讯和消费电子类设备。,2.1 ARM简介,ARM Cortex系列简介,基于ARMv7版本的ARM Cortex系列产品由A、R、M三个系列组成,具体分类延续了一直以来ARM面向具体应用设计CPU的思路。,ARM Cortex,2.1 ARM简介,CortexTM-A8处理器简介,该处理器是ARM公司所开发的基于ARMv7架构的首款应用级处理器,其特色是运用了可增加代码密度和加强性能的技术、可支持多媒体以及信号处理能力的NEONTM技术、以及能够支持Java和其他文字代码语言的提前和即时编译的JazelleRTC技术。 众多先进的技术使其适用于家电以及电子行业等各种高端的应用领域。,2.1 ARM简介,CortexTM-R4处理器简介,该处理器是首款基于ARMv7架构的高级嵌入式处理器,其主要目标为产量巨大的高级嵌入式应用系统,如硬盘,喷墨式打印机,以及汽车安全系统等等。,CortexTM-R4F处理器简介,该处理器在CortexTM-R4处理器的基础上加入了代码错误校正(ECC)技术,浮点运算单元(FPU)以及DMA综合配置的能力,增强了处理器在存储器保护单元、缓存、紧密耦合存储器、DMA访问以及调试方面的能力。,2.1 ARM简介,CortexTM-M3处理器简介,该处理器是首款基于ARMv7-M架构的处理器,采用了纯Thumb2指令的执行方式,具有极高的运算能力和中断响应能力。 Cortex-M3主要应用于汽车车身系统,工业控制系统和无线网络等对功耗和成本敏感的嵌入式应用领域。目前最便宜的基于该内核的ARM单片机售价为1美元。,2.2 Cortex-M3内核概述,功耗低 具有门数目少 (价格低) 调试成本低 中断延迟短 中断响应快速且支持多级中断嵌套 处理器采用先进的ARMv7-M架构,Cortex-M3特点,处理器内核 嵌套向量中断控制器(NVIC) 存储器保护单元(MPU) 总线接口 低成本调试解决方案,Cortex-M3处理器由以下组件整合,2.2 Cortex-M3内核概述,ARMv7-M:Thumb-2 ISA子集,包含所有基本的16位和32位Thumb-2指令 。 只有SP是分组的 ,寄存器集比ARM7简单 。 硬件除法指令,SDIV和UDIV(Thumb-2指令) 。 处理模式(handler mode)和线程模式(thread mode) Thumb状态和调试状态 可中断-可继续(interruptible-continued)LDM/STM,PUSH/POP,实现低中断延迟。 自动保存和恢复处理器状态,可以实现低延迟地进入和退出中断服务程序(ISR)。 支持8位、16位和32位等非对齐访问。,处理器内核。特点:门数目少,中断延迟短。,2.2 Cortex-M3内核概述,外部中断可配置为1240个 。 优先级位可配置为18位 。 中断优先级可动态地重新配置。 优先级分组。分为占先中断等级和非占先中断等级。 支持末尾连锁(tail-chaining)和迟来(late arrival)中断。这样,在两个中断之间没有多余的状态保存和状态恢复指令的情况下,使能背对背中断(back-to-back interrupt)处理。 处理器状态在进入中断时自动保存,中断退出时自动恢复,不需要多余的指令。,嵌套向量中断控制器(NVIC)。它与处理器内核紧密结合实现低延迟中断处理。,2.2 Cortex-M3内核概述,8个存储器区。 子区禁止功能(SRD),实现对存储器区的有效使用。 可使能背景区,执行默认的存储器映射属性。,存储器保护单元(MPU)。MPU功能可选,用于对存储器进行保护 。,2.2 Cortex-M3内核概述,AHBLite ICode、DCode和系统总线接口 APB专用外设总线(PPB)接口 Bit band支持,bit-band的原子写和读访问。 存储器访问对齐。 写缓冲区,用于缓冲写数据。,内部总线接口,2.2 Cortex-M3内核概述,当内核正在运行、被中止、或处于复位状态时,能对系统中包括Cortex-M3寄存器组在内的所有存储器和寄存器进行调试访问。 串行线(SW-DP)或JTAG(JTAG-DP)调试访问,或两种都包括。 Flash修补和断点单元(FPB),实现断点和代码修补。 数据观察点和触发单元(DWT),实现观察点,触发资源和系统分析(system profiling)。 仪表跟踪宏单元(ITM),支持对printf类型的调试。 跟踪端口的接口单元(TPIU),用来连接跟踪端口分析仪。 可选的嵌入式跟踪宏单元(ETM),实现指令跟踪。,低成本调试解决方案,与ARM7TDMI性能大比拼,ARM7TDMI的苦恼,执行效率高,代码密度低,ARM指令,执行效率低,代码密度高,Thumb指令,鱼与熊掌不可兼得。 两者之间的切换相当的麻烦。,优化体系架构,内核基于哈佛结构, 指令和数据可以从存储 器中同时读取,对多个 操作可以并行执行,加 快了应用程序执行速度。 与ARM7TDMI相比, 比Thumb指令每兆赫的 效率提高70%,比ARM 指令提高35%,Dhrystone相关测试的性能值,1.25DMIPS,0.95DMIPS,优化指令系统,由于Tumb-2 指令是 Thumb指令的扩展,16 位和32位指令共存于同 一模式下,复杂性大幅 下降,代码密度和性能 均得到提高。 具有位操作能力,在 汽车应用中表现出色, 在DFT等DSP运算法则的 应用中非常有用。,相关测试的代码大小,带分支预测的3级流水线,Cortex-M3 的流水线分为3级,分别为:,取指,译码,执行,在译码时进行分支预测,遇跳转 指令也不会打断流水线,PC值总是指向正在去取指的指令,三级流水线结构的指令执行顺序,周期2,周期1,周期3,周期4,处理器执行一条指令的三个阶段,三级流水线结构的指令执行顺序,周期2,周期1,周期3,周期4,处理器执行一条指令的三个阶段,三级流水线结构的指令执行顺序,周期2,周期1,周期3,周期4,处理器执行一条指令的三个阶段,三级流水线结构的指令执行顺序,周期2,周期1,周期3,周期4,处理器执行一条指令的三个阶段,ARM7不带分支预测的3级流水线推演过程,MOV R0, #00 ADDS R0, R0, #1 CMP R0, #0x7D0 BNE 0x00000202 BX 0X00000300 LDR R1, #00 MOV R2, #20,0x0200 0x0202 0x0204 0x0208 0x020A 0X020C 0x0300,地址,指令,取指,译码,执行,执行时遇跳转 指令则清空流 水线,Cortex-M3带分支预测的3级流水线推演过程,MOV R0, #00 ADDS R0, R0, #1 CMP R0, #0x7D0 BNE 0x00000202 BX 0X00000300 LDR R1, #00 MOV R2, #20,0x0200 0x0202 0x0204 0x0208 0x020A 0X020C 0x0300,地址,指令,取指,译码,执行,因为带分支预测,跳转 指令在译码时就被识别, 取指时流水线自动加载跳转后地址的指令。,APSR的Z=0,APSR的Z!=0,2.2 Cortex-M3内核概述,内核功耗与ARM7TDMI的对比,2.3 Cortex-M3模块的内部方框图,ARM Cortex-M3 体系结构,1. ARM介绍 2. ARM Cortex-M3处理器内核概述 3. Cortex-M3模块的内部方框图 4. 编程模式,5. 内部寄存器 6. 系统异常(中断) 7. 嵌套向量中断控制器(NVIC) 8. 存储器保护单元(MPU),特权访问和用户访问,处理模式,线程模式,特权访问,用户访问,始终特权访问,2.4 Cortex-M3的编程模式,特权执行可以访问所有资源。 非特权执行时对有些资源的访问受到限制或不允许访问。 如部分指令的使用 (设置FAULTMASK和PRIMASK的CPS指令 ) 对系统控制空间(SCS)的大部分寄存器的访问。,特权访问和用户访问(非特权访问)的区别,用户访问,特权访问,2.4 Cortex-M3的编程模式,1. 线程模式,Cortex-M3处理器支持两种工作模式: 线程模式和处理模式,2.处理模式,在复位时处理器进入线程模式,异常返回时处理器进入线程模式,特权和用户(非特权)代码能够在线程模式下运行,出现异常时处理器进入处理模式,在处理模式中,所有代码都是特权访问的,2.4 Cortex-M3的编程模式,线程模式 特权访问,复位,处理模式 特权访问,异常,线程模式 用户访问,异常,异常退出,CONTROL0 = 1,CONTROL0 = 0,MSR指令置位 CONTROL0,CONTROL0,1,0,特权访问和用户访问的切换,控制寄存器的第0位,在处理模式下,通过MSR指令清零CONTROL0, 退出处理模式进入线程模式时切换到特权访问 。 MRS R0 CONTROL ORR R0, R0, #0x01 MSR CONTROL R0,在处理模式下,通过MSR指令置位CONTROL0, 退出处理模式进入线程模式时切换到用户访问 。 在线程模式特权访问下,通过MSR指令置位CONTROL0,即可由特权访问进入用户访问 。 MOV R0 #0X00 MSR CONTROL R0,2.4 Cortex-M3的编程模式,主堆栈和进程堆栈,2.4 Cortex-M3的编程模式,Cortex-M3内核有两个堆栈指针:MSP和PSP,主堆栈和进程堆栈,结束复位后,所有代码都使用主堆栈,所有异常都使用主堆栈,异常处理程序(例如SVC)可以通过改变其在退出时使用的EXC_RETURN值来改变线程模式使用的堆栈。,在线程模式中,使用MSR指令对CONTROL1执行写操作也可以从主堆栈切换到进程堆栈。,堆栈指针r13是分组寄存器,在SP_main和SP_process之间切换。在任何时候,进程堆栈和主堆栈中只有一个是可见的,由r13指示。,2.4 Cortex-M3的编程模式,通过异常进行堆栈切换,线程模式 主堆栈,复位,处理模式 主堆栈,产生异常,线程模式 进程堆栈,产生异常,异常退出,EXC_RETURN3:0 = 0b1101,EXC_RETURN3:0 = 0b1001,2.4 Cortex-M3的编程模式,通过MSR指令修改CONTROL1进行堆栈切换,线程模式 主堆栈,线程模式 进程堆栈,CONTROL1,1,0,控制寄存器的第1位,一般通过中断返回进行堆栈切换,MSR指令切换用的极少。,三种执行模式的比较,前后台系统主堆栈压栈过程,数据,数据,栈顶,栈底,0x20000400,0x200003FC,0x200003F8,数据,地址,数据增长方向,在KEIL REALVIEW 和CROSS编译器 下,堆栈增长都为 满递减,SP,主堆栈,前后台系统主堆栈压栈过程,数据,数据,栈底,数据,地址,数据增长方向,在KEIL REALVIEW 和CROSS编译器 下,堆栈增长都为 满递减,产生中断,主堆栈,SP,0x20000400,0x200003FC,0x200003F8,硬件自动 压栈,前后台系统主堆栈出栈过程,数据,数据,栈底,数据,地址,退出中断,主堆栈,通用寄存器,0x20000400,0x200003FC,0x200003F8,SP,SP,SP,SP,SP,SP,SP,XPSR,PC,LR,R12,R3,R2,R1,R0,R1,R0,SP,SP,R2,XPSR,PC,LR,R12

温馨提示

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

评论

0/150

提交评论