嵌入式系统设计的最后知识点总结_第1页
嵌入式系统设计的最后知识点总结_第2页
嵌入式系统设计的最后知识点总结_第3页
嵌入式系统设计的最后知识点总结_第4页
嵌入式系统设计的最后知识点总结_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、系统概念1、 嵌入式系统的定义?以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。“嵌入”、“专用”、“计算机”2、 嵌入式系统的软、硬件组成?以及主要特点?软件:从底层到上层:bootloader等系统初始化引导程序、设备驱动层(包括驱动程序、板级支持包bsp等)、操作系统、用户应用程序。(底层为上层提供服务)开发软件:即集成开发环境(asemmbler&compiler&linker&debugger&loader)硬件组成:核心板+外围板+外设(核心板:微控制器(cpu和外设接口、外设控制器)、电源、时钟、复位、sdra

2、m、flash。外围板面向外围设备,一般是引脚的集合、电平转换电路。外围设备。),当然也可以将核心板和外围板放在一起。硬件特点:通常由嵌入式处理器和嵌入式外围设备组成,高度集成,常采用soc设计方法,对功耗、体积等有严格要求,定制性决定了它的可裁剪性,没有像计算机领域的垄断,解决方案不唯一。软件特点:采用交叉开发方式,系统软件层次分明,操作系统为用户程序提供标准api,提供图形接口和文件系统。用户调用系统服务,系统调用设备驱动从而操纵硬件。3、 嵌入式系统产品设计的基本流程?需求分析 功能性需求是系统的基本功能,如输入输出信号、操作方式等; 非功能性需求包括系统性能、成本、功耗、体积、重量等因

3、素。规格说明精确地反映客户的需求并且作为设计时必须明确遵循的要求。体系结构设计描述系统如何实现所述的功能和非功能需求,包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型等。软硬件设计基于体系结构,对系统的软件、硬件进行详细设计。系统集成把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进单元设计过程中的错误。系统测试对设计好的系统进行测试,看其是否满足规格说明书中给定的功能要求。4、 处理器及操作系统的选型主要考虑哪些方面? 操作系统本身所提供的开发工具。 操作系统向硬件接口移植难度。 操作系统的内存要求。 开发人员是否熟悉此操作系统及其提供的系统api。 操作系统是否提供硬

4、件的驱动程序,如网卡驱动程序等。 操作系统的是否具有可剪裁性。 操作系统是否具有实时性能。5、 交叉开发、交叉开发环境?为何需要交叉开发环境?在一台通用计算机(宿主机)上进行软件的编辑编译,然后下载到嵌入式设备(目标机)中运行调试的开发方式交叉开发环境一般由运行于宿主机上的交叉开发软件(assembler&compiler&linker&debugger&loader)、宿主机到目标机的调试通道组成需要交叉开发环境是因为目标机一般对体积、功耗等有严格限制,资源也面向应用,较为紧张,要求仅仅能流畅运行代码即可,而将用户开发软件(包括各种库、工具)放置在主机上,而且现在的集成开发环境提供了各种修改

5、好的功能库,用起来也方便。6、 嵌入式集成开发环境的主要功能?这是由其组成决定的。assembler将.c源代码汇编,compiler形成目标文件,linker根据链接描述文件将各个目标代码链接定位生成可执行代码。debugger有些交叉开发工具提供了仿真调试通道。loader可以将目标文件烧录进设备中(有时需要内部引导代码的配合)7、 嵌入式linux 开发主要流程?搭建开发环境-烧写bootloader-烧写内核-烧写根文件系统-烧写应用程序。开发环境:redhatlinux、下载相应的gcc 交叉编译器进行安装、配置开发主机(配置minicom和配置网络,minicom 软件的作用是作为

6、调试嵌入式开发板信息输出的监视器和键盘输入的工具,配置网络主要是配置ip地址、nfs 网络文件系统,需要关闭防火墙)烧写bootloader下载一些公开源代码的bootloader根据自己具体芯片进行移植修改。下载时,有些芯片没有内置引导装载程序,比如三星的arm7、arm9 系列芯片,这样就需要编写烧写开发板上flash 的烧写程序。或者网络上有免费下载的windows 下通过jtag 并口简易仿真器烧写arm 外围flash 芯片的程序。也有linux 下公开源代码的j-flash 程序。下载内核如果有专门针对你所使用的cpu 移植好的linux 操作系统那是再好不过,下载后再添加自己的特

7、定硬件的驱动程序,进行调试修改。下载根文件系统从 下载使用busybox 软件进行功能裁减,产生一个最基本的根文件系统。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs 、genromfs 等工具产生烧写映象文件。(文件系统就是把你硬盘上数据按照一定格式组织成一棵树。数据块对应名称。删了它就相当于把硬盘格式化了。根文件系统就是出了内核以外,所有的系统文件存储的地方。之所以成为根,是因为有根才能成生长成树,是其它文件的最终挂载点。我们要明白根文件系统和内核是完全独立的两个部分,它是内核启动时所mount的第一个文件系统,里面有内核启动所必须的数据,不然

8、就退出启动文件系统这种机制有利于用户和操作系统的交互。数据块对应名称。尽管是 linux 的核心,但文件却是用户与操作系统交互所采用的主要工具,尤其是linux。)下载用户程序可以下载到根文件系统中,有的应用程序不使用根文件系统,而是直接将应用程序和内核设计在一起,这有点类似于ucos-ii的方式。8、 嵌入式linux 开发环境中配置nfs服务的目的?可以使不同机器、不同操作系统之间通过网络共享文件,像访问本地文件一样访问远端系统上的文件,在开发阶段,主机制作基于nfs的文件系统,制定开放目录,开放对象的ip范围,将目录挂载到嵌入式设备后,嵌入式设备可以方便地访问、修改主机主机文件。9、 硬

9、件重定向?上课的时候老师举得printf()是个很好的例子,重定向程序是面向编译环境中的连接器的,是用户自己定义的c库函数,有了它,在程序连接时连接器会连接用户自己编写的c库中的功能函数而不是标准c库。相当于将标准c库进行了一次移植。从主机环境到实际运行环境的移植。比如:本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了uart端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到uart端口上去了。相当于实现类似的功能,但是底层的驱动变了。10、你认为一名好的嵌入式系统设计专业学生,应具备哪些能力?如何培养和提高这些能力?专业技能

10、:微机原理的知识,即知道微处理器的工作过程、工作原理,对51单片机、x86t体系、arm体系的架构有一定的认识、。电路知识,虽然在系统设计中,硬件只占30%的工作量,而且随着系统复杂度的提高,对硬件的关心越来越少,但是对电路的了解程度会限制你代码的优化,是有寄存器编程不了解底层电路根本编不出程序来,而且在硬件出现问题的时候,要有能力准确判断。操作系统,随着arm在嵌入式系统中占据主导地位,单片机已经退出复杂应用,操作系统引入了嵌入式系统设计中,在操作系统提供的平台上做开发,对操作系统功能、使用、层次组成的理解的重要性不言而喻。算法与数学,这关系着软件代码的优化实现,在高层次的编程中,算法结构和

11、数学知识将发挥很大的作用。控制理论,因为嵌入式系统实现的最主要的功能就是智能控制,对控制思想、控制算法、控制理论的理解有一定的重要性。专业思维:对嵌入式软硬件层次相当了解;对开发环境及其原理开发流程有一定的认识;计算思维:将计算思想、能力贯穿于“需选改用学”,解决计算问题,一切归于二进制。职业病思维:用嵌入式系统的思维去分析生活中遇到的设备,如果能分析明白或者做出推测,将是一件很开心的事情。“编码”思想:其实整个计算机世界,都体现着一种“编码”思想,人如何与机器交互、器件之间如何交互、通信双方如何定义通信协议,这都体现着编码的思想。管理的思维:因为在复杂的计算机系统也是人设计得,各模块的工作协

12、调无处不散发着管理的思想,把系统调用抽象为人事安排,将变得很有爱。要相信你要你想到的解决问题的方法(算法),肯定能编出来。要相信,真理肯定是存在的,你还没有到遇到未解之谜的程度,即只要是问题就能解决,遇到需要反复测试的时候,不能气馁,也许只是哪个知识点理解的有偏颇,离真理只有一步之遥。从历史看起、从总体看起:用历史的眼光和谦虚但不自卑的态度看待复杂的系统和知识,这样一切就都简单又好理解。认识指导实践,实践反作用认识。管理的思想。个人品质:不悲不喜:在嵌入式开发过程中,会有一个又一个问题出现,不要因为一个问题的解决和搁置而悲喜,更大的喜剧在前方,也许更大的悲剧也在酝酿。勇于钻研:对解决问题有强烈

13、的向往,有征服的渴望。所以一些很恬淡的人往往不会成为it行业的精英。并从中找到成就感、存在感乐在其中:俗话说兴趣是最好的老师,拿欣赏的眼光看待内核的管理思想、看待精妙的算法、看待精密的电路设计,你会发现一切都美好起来。要会学习:有强大的学习能力,要会查资料、会聊天、会推测。用“学道”的思维去学习一切知识,抓住本质,老子说,为学日益,为道日损,损之又损,以至于无为,无为而无不为。,最复杂的科学,也能用最朴素的话解释。用历史的眼光、用总体的眼光去学习。耐得住寂寞还得有兴趣爱好。有时会比较枯燥和辛苦,除了对专业的兴趣之外,最好能有些调节生活的兴趣爱好,比如唱歌、画画、旅行、摄影、健身等等。如何提高?

14、因为嵌入式系统设计所涉及的知识面相当广,微机原理知识、电路知识、接口知识、操作系统、甚至是控制理论、数学计算等等,所以单单学习知识点的话,会很枯燥而且提高很慢,一切以应用为中心,在做项目中成长,加深理解,边学变做,把解决问题当做学习的目标。找若干良师益友,他们能带给你好的影响,包括做项目和做人,在与他们的交流共事中你可以迅速提高。大量的阅读,开阔眼界,了解当前行业的发展状况,大量阅览一些典型系统的设计,所谓书到用时方很少是很有道理的。学一些跟专业相关的知识,如数据库、网站设计等,不但能在设计系统时打开思维,还可以给it男换个口味,陶冶一下情操。arm体系结构11、 arm硬件电路最小系统组成?

15、微控制器(例如2410,cpu+外设接口/外设控制器)电源、时钟、复位、存储器(sdram/flash(nor8位、nand8 16 32位) flash:存放操作系统、用户程序等需要掉电后保存的数据 sdram:系统运行的主要区域,系统及用户数据及堆栈,都在这个区域。有时启动模式选择有时需要jtag:对芯片内所有部件进行访问,通过该接口对系统调试、编程12、 arm处理器的主要工作模式?arm的7种处理器模式(不同的模式下有自己的行为准则)usr;正常程序执行模式fiq;支持高速数据传送和通道处理irq;用于通用中断的处理。管理(svc);操作系统保护模式中止未定义系统除了usr之外,其它6

16、种又称为特权模式。6中种除了系统模式又称为异常模式(即处理异常时的工作模式)。在软件控制下可以改变模式(即改变cpsr相应),外部中断或异常处理也引起模式变化,用户模式下不能改变模式。13、核心寄存器的作用:r13通常用作堆栈指针,称为sp,被初始化为多个模式下的堆栈。r14用作子程序连接寄存器lr,中断异常或执行bl时得到pc即r15的备份。cpsr程序状态寄存器,32位只用12位,所有模式下均可见。spsr保存程序状态寄存器,即发生异常时对cpsr进行保存,保存当前状态。5个异常模式下均有各自的spsr。14、 arm处理器的启动过程?首先,看一下,arm启动时的硬件机制,上电产生复位异常

17、,cpu强制pc为0x00000000,执行复位异常处理函数,接下来就相当于执行了strartup.s的功能。是给用户程序执行给以合适的工作环境,设置中断向量表、堆栈、时钟、完成内存拷贝等,相当于startup.s或者bootloader的前端代码,是开机执行的程序。.拿2410的启动代码举例,它启动cpu的过程是:1、在起始地址分配中断向量表即中断处理函数(cpu要求的),以为向量空间只有4字节,所以一般只是一个跳转指令,去别处执行。在跳到复位异常之后,关闭中断,关闭看门狗。/2、之后初始化存储器系统3、初始多个模式下的堆栈(模式切换时,硬件给sp置位)/4、初始化有特殊要求的外围设备,如l

18、ed灯、看门狗5、初始化用户的执行环境(在flash中运行太慢了,把代码整体搬迁到ram中)/6、切换处理器的工作模式7、调用主程序15、当正常的程序执行流程发生暂时的停止时,称之为异常对异常的处理有优先级,处理异常需要跳转至异常模式。并根据异常向量跳转至响应的子程序(执行之前必须保存现场),即异常出现后强制跳转至固定的存储器地址执行。异常是比中断更大的概念。arm有7种异常。包括复位 管理模式 0x00000000软中断swi 管理模式 0x00000008irq irq模式 0x00000018fiq fiq模式 0x0000001c还包括预取中止、数据中止、未定义。(异常出现时,异常模式

19、分组的r14和spsr用于保存下一条程序地址和cpsr。异常返回时,spsr-cpsr,r14-pc)在启动代码中首先就是设置所谓的异常向量表,也就是在指定的位置放置异常处理程序(一般是跳转指令)。异常发生时,cpu会根据规定强制置pc,恰好去执行我们设置好的跳转指令,接着执行服务程序。异常处理流程:(硬件机制,只做这些,跟代码无关。)1、根据异常类型,强制设置cpsr的运行模式位 2、在切换到的异常模式下,在当前的链接寄存器lr (r14)中保存上个模式的pc值-4,以便程序在处理异常返回时能从正确的位置重新开始执行 3、将上一个模式的cpsr复制到当前异常模式的spsr中(注意1与2、3的

20、矛盾,不能独立执行,但是是硬件实现的,无关代码)4、强制pc。然后就到了执行代码的时候从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。异常返回流程:(有指令)1、将lr寄存器中的值减去相应的偏移量(对于irq/fiq是4)送到pc中2.、将 spsr 复制回 cpsr(注意1与2的矛盾,不能独立执行,用一条带的指令执行,怎么着都是一条)3、清除禁止中断标志,如果它被设置成使能4、所有修改过的用户寄存器必须从处理程序的保护堆栈中恢复(即出栈)。对中断嵌套的处理:注意:1、 保存在lr中的pc值,和该值返回时的处理过程。当irq异常中断产生时,程序计数器pc的值已经更新,它指

21、向当前指令后面第3条指令(对于arm指令,它指向当前指令地址加12字节的位置;当irq异常中断产生时,处理器将值(pc-4)保存到irq异常模式下的寄存器lr_irq中,它指向当前指令之后的第2条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4有两种返回机制:1、 当返回地址保存在当前异常模式的r14时使用其中一种机制2、 当返回地址保存在堆栈时使用另一种机制(进中断的时候保存的)。 1、 subs pc,r14_fiq ,#4 (不同模式有不同的指令,返回pc的同时返回cpsr,一条指令实现)2、 sub lr,lr,#4 stmfd r13!,r0,r4-r12,lr

22、;将寄存器列表中的寄存器r0,r4到r12,lr存入堆栈。 ldmfd r13!,r0,r4-r12,pc ;将堆栈内容恢复到寄存器r0,r4到r12,pc,同时spsr复制到cpsr 为可选后缀,当指令为ldm且寄存器列表中包含r15,选用该后缀时表示:除了正常的数据传送之外,还将spsr复制到cpsr,一条指令实现。代码指令分析:areainit,code,readonly;代码段init、只读code32;32位arm指令集ldrr0,next1;给r0赋地址值bxr0;程序跳,并将处理器切换到thumb工作状态code16;16位thumb指令集nextldrr3,0x3ff给r3赋值

23、end16、高级语言和汇编语言函数间的相互调用(应该会考) :汇编调用c:import main;通知编译器该标号为一个外部标号area init,code,readonly;定义一个代码段entry;定义程序的入口点ldrr0,=0x3ff0000;初始化系统配置寄存器ldrr1,=0xe7ffff80strr1,r0ldrsp,=0x3fe1000;初始化用户堆栈blmain;跳转到main()函数处的c/c+代码执行end;标识汇编程序的结束 以上的程序段完成一些简单的初始化,然后跳转到main()函数所标识的c/c 代码处执行主要的任务,此处的main仅为一个标号,也可使用其他名称。1

24、7、程序代码段的组成分析、例如:标注下面程序各条语句中的含义area init , code , readonly ;已定义代码段entry;程序入口ldr r0, =0x3ff5000;r0赋寄存器地址值ldr r1, 0x0f;要给寄存器赋的值str r1,r0;赋值ldr r0, =0x3ff5008ldr r1, 0x01str r1,r0;给另一个寄存器赋值的过程bl proc;跳转至标号为proc的程序出执行:proc:mov pc, lr /将lr保存的程序指针返回,即跳到bl下一句接着执行:end2410设计18、 阐述cpu、外设、外设控制器、时序、寄存器的相互关系?cpu与

25、外设控制器构成微处理器,微处理器在核心板(最小系统)上发挥作用,将引脚集合成外设接口加上电平转换等就是外围板,外设通过外围板连接至外设控制器。cpu通过寄存器编程控制外设控制器产生时序控制外设。若是没有外设控制器,则需要cpu自己产生时序来与外设交互,这种时序相当于一种约定好的意思表示,相当于“语言”或者“通信协议”,例如若是2410与一个带有iic接口的器件通信,只需要连接起来,对iic进行寄存器编程,控制它们之间的工作模式,可能收发数据就变成了在中断中读写寄存器操作,屏蔽了iic规定的通信细节。若是51单片机要与iic通信的话,就复杂多了,首先要仔细阅读iic的协议,不容丝毫差错,然后用i

26、o口模拟时序,cpu的工作量很大。19、 寄存器编程的本质?如何获取寄存器的配置?寄存器编程的本质是cpu控制外设寄存器工作模式的方法。可以想象寄存器的每一位肯定是外设控制器功能模块中的一个个“开关”,给某一位赋值0或者1,就相当于使能或关闭某一个功能。20、2410最小电路设计?(晶振选择、启动选择、数据宽度)与一般的arm系统相同,都需要微处理器、电源、晶振、复位、存储器(flash、sdram)、jtag接口等,具体情况如下:(需要对om0和om1配置电平以决定启动方式,对om2和om3配置电平以决定时钟源。)电源设计:处理器用1.8v,rtc给时钟模块供电1.8v,存储器和普通io用3

27、.3v,adc模块用3.3v,可见最小系统最少要用3.3和1.8两种直流稳压。课程实验中电源电压5v,分别用lm1085稳压3.3v,用as1117稳压1.8v。晶振设计2410的时钟控制逻辑可以产生系统所需要的时钟,包括cpu的fclk,和ahb总线的hclk,apb的pclk。内部有两个锁相环pll,mpll提供前三个,upll给usb提供48mhz的时钟。主时钟源(upll和mpll的时钟源)可以选择是来自外部时钟还是外部晶振,这是由om2和om3的管脚确定的,可以om2和om3同时接低电平,选择外部晶振,12m晶振加上15pf起振电容(经过锁相环倍频可以达到203m)。复位电路设计可以

28、在nreset端设计像51单片机那样的阻容复位电路,但为了稳定,可以使用复位芯片如max811或imp811。jtag接口设计有20针和14针两种jtag接口。存储器设计2410有自己的存储器控制器,并且规定了哪些bank空间是ram哪些是flash,存储器芯片严格按照datasheet上的要求和标明的引脚连接方式与存储器控制器的存储器接口相连就可以,控制器会根据地址产生读写存储器芯片的时序,完成存取数据的操作。21、2410nor和nand启动过程分析?nor flash:读取速度高、而擦写速度低,容量小,价格高,地址线和数据线分开,采用sram接口。nand flash :读速度不如nor

29、flash 但是擦写速度高,容量大,价格低,有取代硬盘的趋势,但是地址线和数据复用,需要程序配合才能读写数据。可以通过跳线设置时从nand flash启动还是从nor flash启动。nand启动的优势:便宜、容量大。但是读写逻辑不能用硬件产生,也就是没办法接到bank空间里,必须有程序配合才能读写(有专门的控制器接口,肯定要寄存器编程加上程序配合才能读写,没有pc的根正苗红),所以理论上它是不可以用来启动系统的,因为那之前什么程序都没有,要想读写它必须是系统装载完了而且有程序了。但是三星采用了sram映射解决了这个问题,下面就是这个过程:电路中使om1和om0都接低电平,从nand flas

30、h中启动。(2410有nand flash控制器,连接nand flash芯片,产生读写时序)在该模式下,2410的前4kb地址空间对应一个名字叫做“起步石”的sram,系统启动时,自动将nand flash的前4kb数据加载到起步石中,然后系统自动执行这些启动引导代码,cpu从内部ram的0x00000000位置开始启动。这个过程不需要程序干涉。也就是类似于startup.s的功能,初始化异常向量表、堆栈、将nand flash中的代码(有代码支持喽)拷贝到sdram中运行。nor flash 采用的的是sram接口,可以直接到存储器控制器上,arm内核产生的时序能对其读写。将bank0上接

31、上norflash芯片。上电产生复位异常后会自动从nor flash中启动。22、 s3c2410的中断处理流程?首先应该明确2410与arm内核的异常处理系统的角色,根据之前的arm异常处理流程,我们清楚明了了哪些是cpu的硬件机制。2410通过中断控制器允许以优先级的方式将几十个中断源共同用一个irq。一个中断申请提出后,irq异常发生,切换模式、保存cpsr、保存pc,然后跳转到handleirq函数,然后跳转到isrirq(这只是一个大概流程,也许会定义更多的跳转)根据中断源向量表的首地址和偏移量寄存器找出到底是哪个中断发生了。然后跳转到相应的中断处理函数,比如跳到串口中断,还可以根据

32、挂起位(即中断标志位)再次判断到底是接收中断还是发送完成中断。也就是说2410处理流程除了arm对异常的响应是硬件机制外,其余的都是代码实现的。我们在编程的时候没有写的话,那也是编译器加进去的。2410对嵌套的处理比起2410的处理流程不同的是,因为有了中断控制器,这就是实现高优先级嵌套的硬件基础,因为每一次进入异常模式用户都会保存环境,这就是中断嵌套的软件基础。cpu的异常处理机制总是那些,很明确的。我正在执行一个中断服务程序,然后再次发生异常,保存,跳转(cpu)、再次判断是哪个中断,进去之后压栈,运行另一个中断的服务程序,运行完返回,这是就是返回到上一个中断了。上一个中断运行完,一返回就

33、是返回发生异常前的状态。23、 s3c2410的串口、端口、外部中断、ad等及寄存器的编程能力(会读datasheet、会编程、作业、实验的相关代码)arm的汇编语言程序.ppt仔细阅读datasheet,记住寄存器的赋值指令。ldr r0,=gphconldr r1,=0x2afaaastr r1,r024、 时钟、看门狗的相关概念时钟为整个系统提供同步脉冲,像人的脉搏一样。看门狗:其实是一个计数器,当它计数溢出的时候,会使系统复位,所以它的作用是防止系统死机。打开看门狗之后,当代码跑飞或者陷入死循环之后,就不能喂狗,也就是不能清除计数值,那么它就会使系统重启。vivi25、 什么是boot

34、loaderbootloader,为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于pc机的bios。 bootloader在系统中的位置通常固化在硬件上的某个固态存储设备上,加电后自启动。bootloader功能初始化,给cpu合适的工作环境(相当于startup.s),以便为最终调用操作系统内核或用户应用程序境。加载内核下载内核或者根文件系统。bootloader操作模式 有启动加载和下载两种模式。启动加载模式是 bootloader的正常工作模式,在嵌入式产品发布的时侯,bootloader必须工作在这种模式下。即初始化cpu的工作环境之后,将内核如ram执行。下载模式:目标机上

35、的bootloader将通过串口连接或网络连接等通信手段从主机下载文件。主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被bootloader保存到目标机的ram中,然后再被 bootloader写到目标机上的flash 类固态存储设备中。bootloader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用到这种工作模式。bootloader启动过程上电之后,先启动cpu即执行startup.s类似功能代码(配置中断、初始化堆栈、拷贝代码等),然后进行加载内核的准备1、至少初始化一个串口,以便向终端用户反馈数据。2、检测系统内存映射,哪些是可用的r

36、am?在这一步之后,将检测外部按键,有按键按下将进入下载模式,没有按键的话将执行下面的步骤,加载内核:3、将kenel和根文件系统从flash调入ram4、为内核启动设置参数5、调用内核。ucos_ii26、 概念分析可重入函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,(关中断、只用局部变量、用互斥型信号量可以使函数变成可重入的)互斥任务在处理共享数据时的排它性,以避免竞争和数据的破坏。也就是任务在某一个时间段独占共享资源,在释放之前别的任务没有该资源的运行权。满足互斥条件的方法

37、:1、关中断:最简便快捷的办法,即处理共享资源属于临界区代码。2、使用测试并置位指令3、禁止做任务切换4、利用信号量 ,其中2和4的道理是相似的,标志位。死锁死锁也称作抱死,指两个任务无限期地互相等待对方控制着的资源,不然都不会执行。两个任务都是“你不给我,我就不给你”的心态。最简单的防止发生死锁的方法是让每个任务都:先得到全部需要的资源再做下一步的工作。一般内核会允许在申请信号量时定义申请超时。剥夺型与不可剥夺型内核即占先式还是非占先式。不可剥夺:合作型内核,即除非自己主动放弃cpu的运行权,不然没办法被切换。不知道什么时候最高优先级的任务才能拿到cpu的控制权,完全取决于应用程序什么时候释

38、放cpu。(顾名思义:每个任务不会被其它任务剥夺去,除非中断的到来,即便如此,当中断结束后,还是会回到原来被中断的程序,而不会切换到具有高优先级的任务中去。)可剥夺:最高优先级的任务一旦就绪,总能得到cpu的控制权。可以被挂起,可以再中断退出时失去对cpu的运行权。使用占先式内核时,应用程序不应直接使用不可重入型函数非占先式内核的一个特点是几乎不需要使用信号量保护共享数据。运行着的任务占有cpu,而不必担心被别的任务抢占,什么时候释放,自己说了算。可剥夺型的内核是实时系统所必须的。即实时不在于立即,而在于可预测性,高优先级得到cpu的时刻是可以预测的。进程上下文是进程运行寄存器环境的总和:对a

39、rm而言,ro-r12,lr,pc,cpsr,spsr。stmfdsp!, pc; save pcstmfdsp!, lr; save lrstmfdsp!, r0-r12; save registers and ret addressmrsr4, cpsrstmfdsp!, r4; save current psrmrsr4, spsrstmfdsp!, r4; save spsr27、实时系统本质是:可预测性28、内核的相关知识初始化:osint();系统初始化,创建系统任务、创建链表,等待将tcb赋值后放进去。启动:osstart(); 就是将就绪的状态的任务中找到优先级最高的出栈运行,

40、调用osstarthighrdy()。(在启动之前要调用os_taskcreat()规定一创建就进入就绪态(初始化就绪态表)它一定是对tcb赋值(调用tcbinit)放到链表里,从空闲链表头取一个链表,放在使用链表里。)任务组成:任务由三个部分构成1、任务控制块tcb,保存着任务的所有属性,可以说内核对任务的管理就是对tcb的管理。它包含了一个任务的前一个任务、后一个任务、指向任务代码的指针、指向任务堆栈的指针、任务优先级、任务状态、延时值等等。对任务的控制都是通过访问任务控制块来实现的。2、任务栈保存任务的工作环境。3、任务代码。状态:任务(无限循环代码)的五个状态:休眠态:没有加入运行队列

41、。挂起态(waiting,等待,最复杂,有很多种情况),在等待满足运行条件,如一个信号量、 或者延时结束等。就绪态(ready):具备运行的一切条件,等待切换,只是有更高级的任务占据着cpu。运行态:正在占用cpu的运行权被中断态。五种状态间的转换在课件中的图里说的比较清楚。注意:一个任务在运行态时被挂起时清除就绪态,变成挂起态。而被占先时则虽然不运行但保持就绪态。任务的调度(占先式,就绪表)ucos的就绪表实现:就绪表的实现依靠两个变量一张表实现:os_rdy_tbl7(8个8位数)和os_rdy_grp。osmaptbl相当于掩码表。由优先级找到对应位:64个优先级最高6位。高三位右移三位

42、,确定grp,即在第几行,低三位,找到行中的某位。如优先级12,001100,则第1行,第4个单元(从0开始计数,这个转换由osmaptbl掩码表完成),实现的代码如下:osrdygrp |=osmaptblprio3; (行标)osrdytblprio3 |=osmaptblprio & 0x07;(由低三位找到行,由高三位找到列)有对应位找到优先级:另一种巧妙的查表算法。任务的切换:就是有更高优先级的任务处于就绪态,需要让其得到cpu的运行权,我们所要做的就是保存当前任务的上下文(进行压栈操作),保存当前的tcb,根据优先级找到要运行任务的tcb地址,切换当前堆栈,将堆栈中保存的内容弹出,

43、并运行。优先级管理:共有64任务,每个任务都有一个优先级,0-63,数字越大,优先级越低。中断退出(sourcecode)29、相关任务管理、时间管理内核代码分析30、移植代码分析:任务调度函数void os_sched (void) /*os_core.c中*/ int8u y; os_enter_critical(); 临界区代码,关中断 if (oslocknesting =0)&(osintnesting= 0) 没有任务切换上锁,且是任务级切换 y = osunmaptblosrdygrp;获得最高优先级的高三位 ospriohighrdy = (int8u)(y ostcbstkptr; 将r4,r3,r2及r1从新堆栈中弹出; 执行中断返回指令;任务级切换函数汇编代码void os_task_sw(void) /任务:保存当前任务上下文,装入新任务上下文 /;perform a context switch.;on entry, ostcbcur and ospriocur hold the current tcb and priority;and ostcbhighrdy and ospriohighrdy contain

温馨提示

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

评论

0/150

提交评论