第一篇:嵌入式复习总结
一:嵌入式系统概述 1嵌入式定义
2嵌入式与通用计算机
A.嵌入式系统具有应用针对性
B.嵌入式系统硬件一般对扩展能力要求不高
C.嵌入式一般采用专门针对嵌入式应用设计的处理器 D.嵌入式不一定有操作系统 E.嵌入式一般有实时性要求
F.嵌入式一般有较高的成本控制要求 G.嵌入式系统软件一般有固化的要求
H.嵌入式系统软件一般采用交叉开发的模式
I.嵌入式在体积,功耗,可靠性和环境适应性上一般有特殊要求 J.嵌入式标准化程度不高 3嵌入式系统的组成
嵌入式系统包括硬件和软件两个组成部分
嵌入式系统硬件部分一嵌入式处理器为核心,扩展存储器和外部设备控制器 嵌入式系统软件运行在硬件平台之上,硬件抽象层向下管理硬件资源,向上为操作系统提供一个虚拟硬件平台,是操作系统支持多硬件平台的关键 4嵌入式的分类
A.按处理器位宽分类 B.按有无操作系统
C.按实时性(硬实时:一定,软实时:从统计角度)D.按应用分类
二:嵌入式处理器 1嵌入式处理器的原理
A.嵌入式的指令系统(一条完整的指令包括操作码和操作数)B.嵌入式处理器的类型
根据结构可分为哈弗结构(数据指令分开存储,使用两套彼此独立的存储总线,故可以同时访问程序和指令)和冯诺依曼结构(程序指令和数据采用统一的存储器,寻址不能同时进行)根据指令格式的不同可以分为复杂指令计算机处理器(CISC)和精简指令计算机处理器(RISC)RISC的最大特点是指令长度固定,指令种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计高性能的流水线。
RISC还有特点(1)芯片面积小(2)开发时间段(3)性能高 C.嵌入式处理器的结构(1)运算器
包括算数逻辑单元,累加器,暂存器及标志寄存器等(2)控制器
指令寄存器,指令译码器,逻辑控制电路(3)寄存器阵列及连接各部分的内部总线 D.大端方式和小端方式
E.影响嵌入式处理器性能的因素(1)主频
(2)指令效率与单指令执行所需要的时间(3)处理器的字长(4)内存总线速度(5)高缓存设计
(6)CPU的系统构架 2.嵌入式处理器的分类(1)嵌入式微处理器(2)嵌入式微控制器(3)嵌入式DSP(4)嵌入式片上系统 3.嵌入式处理器的特点
(1)嵌入式处理器种类繁多,功能多样且性能跨度大(2)嵌入式处理器功耗低
(3)提供灵活的地址空间寻址能力(4)支持灵活的功耗控制
(5)功能密集,提供丰富的外部接口 4.8051单片机
(1)采用哈弗结构,除了一个8位处理器核心外,还集成了中断控制器,RAM,ROM,定时器和通用异步收发器。(2)主要特征:
5ARM处理器及实例 A.ARM处理器片内总线
6嵌入式X86处理器及实例 7DSP处理器及实例
实际应用中有两种形式:一:一种是作为主处理器的协处理器,,,8SOC处理器及实例
9:嵌入式处理器的选择
10:嵌入式处理器的JTAG调试接口 它在嵌入式开发过程中的重要作用 A.硬件基本功能的测试 B.软件下载 C.软件调试 D.Flash烧写
三:嵌入式系统总线
1:计算机总线的基本概念
2嵌入式系统总线的特点 A.机械结构上的差别
B.嵌入式系统对总线标准功能的补充 3:ISA总线原理
ISA总线最初是IMB公司为PC机制定的总线标准,采用8位数据宽度,能寻址1MB的地址空间。1984年IBM推出PC/AT系统,ISA从8位扩充到16位,地址线从20扩充到24条,可寻址空间达到16MB,16位ISA总线时钟频率为8MHz,峰值数据传输速率为8MB/S。A:ISA总线信号(1)地址信号(2)数据信号(3)总线命令信号(4)时序控制信号(5)DMA相关信号(6)中断相关信号
(7)总线数据宽度控制信号(8)其他信号 4:PCI总线原理
在嵌入式中以PC/104,CompactPCI,miniPCI等形式出现 A:pci总线的特点(1)高性能
(2)资源丰富且成本低(3)易于使用(4)可扩展性好(5)支持不同的平台 B:PCI总线信号(1)系统信号
(2)地址与数据信号(3)接口控制信号(4)总线仲裁信号(5)错误告信号(6)中断信号(7)附加信号
(8)64位总线扩展信号(9)JTAG边界扫描信号 C:PCI设备的配置空间
PCI配置空间是PCI设备上一组256字节的特殊功能寄存器,用于存储与设备相关的信息,计算机系统根据配置空间实现对PCI总线设备的管理。(1)配置空间的功能与组织(2)设备标识
(3)设备控制寄存器(4)设备状态寄存器(5)基址地址寄存器 5:PC/104系列总线标准
6:CompactPCI总线
CompactPCI是PCI总线的另一种工业版本,采用Eurocard结构标准,主要应用在工业,军事,电信等行业。除了兼容桌面PCI总线所有的硬件和软件资源外,还有一个重要特点——支持热插拔,该技术对实现高可靠的计算机系统至关重要。四:嵌入式系统常见电路
系统复位与电源监控,I2C总线,实时时钟和RS-232串行接口是嵌入式系统最常见的四种基本电路
1系统复位与电源监控 A.复位有四种类型(1)上电自动复位(2)手动复位(3)看门狗复位
看门狗是一种定时器,必须由软件定期对该定时器进行清零,否则计时器到期将产生系统复位信号,看门狗可以使系统在软件崩溃/死机后自动复位。(4)系统异常复位
B.复位与电源管理控制器
为了产生更可靠的系统复位,可以用专用复位管理控制器如MAX705 2I2C总线原理
I2C是一种简单的只有两条信号线的串行总线,在嵌入式中应用很广泛,尽管简单,她仍然能支持多主设备,并且具有总线仲裁的功能。3.实时时钟 4.RS-232接口 RS-232串行接口是实现计算机与计算机以及计算机与外围设备连接的一种简单且成本低的方法,除了实现一般的数据通信外,在系统调试中还常用于实现程序下载和系统控制台的功能。
RS-232接口支持全双工传输方式,可同时收,发数据,接受方的接收比特率与发送方必须相同。
是串行接口,采用负逻辑。第五章:嵌入式系统存储器 1静态随机存储器
SRAM容量小,成本高,在PC机中已经不作为主存使用,但他的接口简单,在嵌入式系统中还有很多应用,常与单片机,DSP等处理器配套使用。比如
IDT7146静态RAM存储器 2双端口存储器(DPRAM)双端口RAM是一种很特殊的存储器,有两套读写端口,可以同时被两个处理器访问,在嵌入式系统中常用于实现两个处理期间的紧耦合数据通信,相当于一个共享存储区。3同步动态随机存储器(DRAM)DRAM容量大,成本低,在嵌入式系统应用很广泛 4NOR Flash Flash是嵌入式系统中常用的一类非易失性存储器分为NOR flash和NAND flash两类 5NAND flash 广泛应用于手机,PDA,数码相机,MP3播放器等 6串行EEPROM 小型价格低廉的EEPROM可作为flash的替代品
六嵌入式系统引导程序
引导程序是计算机系统上电或复位后,实现系统初始化,将系统引入一个可运行的状态,并将操作系统加载到系统RAM中运行的程序。1.PC机中的引导程序
BIOS的主要功能是为计算机提供最底层,最直接的硬件设置和控制,包括硬件初始化,上电自测试,I/O设备管理,中断服务,引导加载操作系统等。
BIOS并不直接加载操作系统,而是加载操作系统引导程序,再把执行权交给引导程序,由引导程序继续完成操作系统的后续加载任务。2.嵌入式系统中的引导程序 典型的嵌入式系统中,软件分为4个部分:引导程序,操作系统内核,文件系统和应用程序。应用程序和操作系统内核之间可能包括嵌入式图形用户界面。
在有操作系统的嵌入式计算机中,引导程序是必备的软件,完成上电初始化,加载操作系统并最终启动应用系统,在嵌入式系统中,通常由引导程序独立完成硬件初始化,上电自测试及操作系统加载启动等任务。A.嵌入式系统引导程序的主要功能(1)硬件初始化
(2)加载启动嵌入式操作系统(3)提供人机交互命令
(4)支持目标机与开发机之间的通信(5)支持FLASH烧写
B.引导程序有两种模式:启动加载模式和下载模式,系统的最终用户只关心启动加载模式,而下载模式对系统的开发与维护有很重要的作用。3.嵌入式系统引导程序的启动过程
A.引导程序的执行过程可分为两个阶段:阶段1和阶段2.阶段1完成硬件初始化,工作模式设置等与硬件平台密切相关的操作,该阶段的程序代码一般用汇编语言编写,阶段2完成一些相对高级,复杂的功能,如通信,文件下载,FLASH烧写,该阶段的程序代码一般由C语言实现。B.阶段1(1)硬件设备初始化
(2)为加载引导程序的阶段2代码准备RAM空间(3)将阶段2二进制代码复制到RAM空间中(4)设置好堆栈指针(5)执行阶段2程序代码 C.阶段2(1)其他硬件设备的初始化(2)检测系统内存映射
(3)将操作系统内核映像及文件系统映像从FLASH读取到系统RAM中(4)为内核设置启动参数(5)调用内核 4.U-Boot 是一种应用广泛的嵌入式引导程序 七嵌入式操作系统
嵌入式实时操作系统具有模块化,可移植,可定制,高实时,高可靠等特点。,1概述 A.与桌面 操作系统相比,嵌入式操作系统一下特点:(1)模块化,可定制(2)实时性强(3)资源占用少(4)稳定性要求高(5)代码有固化要求
(6)具有良好的硬件适应性,便于移植 2.嵌入式操作系统硬件抽象层 3嵌入式操作系统实时性 A.实时系统具有以下特点
(1)实时系统具有复杂的约束性(2)实时任务的执行具有可预测性(3)实时系统具有高可靠性的要求(4)实时系统需要与外部环境进行交互(5)实时系统需要满足一定的峰值负荷要求 B.嵌入式系统实时性 C.裸机中的实时软件设计 D.嵌入式实时操作系统
(1)通用操作系统与嵌入式操作系统差异 a.任务调度策略不同 b.内存管理方式不同 c.中断处理方式不同
d.共享资源的互斥访问机制不同
e.系统调用和系统内部操作的时间开销有差别 f.系统的可重入性 g.辅助工具
(2)实时操作系统的一些要求 a.直接访问存储 b.高速缓存
(3)评价实时操作系统的方面 a.任务调度机制 b.内存管理 c.最小内存开销
d.中断禁止时间与中断延迟时间 e.任务切换时间 4.嵌入式Linux A.嵌入式Linux的特点(1)支持多硬件平台(2)高效稳定的系统内核(3)开放源码,软件丰富(4)完善的开发工具(5)完善的网络通信(6)支持多种文件系统(7)支持多种图形用户界面 B.常见的嵌入式Linux操作系统(1)RTLinux(2)uCLinux(3)EOSunx和Midnux(4)
第二篇:嵌入式复习总结a4
一、嵌入式系统基本知识
1、什么是嵌入式系统、分层结构:根据IEEE(国际电气和电子工程师协会)的定义:嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”,此定义是从应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置;一般定义:“以应用为中心、以计算机技术为基础、软件硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”;微机学会的定义:嵌入式系统是以嵌入式应用为目的的计算机系统。可分为系统级、板级、片级(系统级:各种类型的工控器、PC104模块;板级:各种类型的带CPU的主板及OEM产品;片级:各种以单片机、DSP、微处理器为核心的产品)。分层结构:嵌入式系统:硬件、驱动、操作系统、中间件、应用。
2、嵌入式系统与单片机、PC系统的区别:(单片机与嵌入式系统比较,一般没有操作系统,就没有办法同时运行多个任务,单片机总是运行单个任务)目前嵌入式系统的主流是以32位嵌入式微处理器为核心的硬件设计和基于实时操作系统(RTOS)的软件设计;单片机系统多为4位、8位、16位机,不适合运行操作系统,难以进行复杂的运算及处理功能;嵌入式系统强调基于平台的设计、软硬件协同设计,单片机大多采用软硬件流水设计;嵌入式系统设计的核心是软件设计(占70%左右的工作量),单片机系统软硬件设计所占比例基本相同;单片机学习一般从硬件入手,从硬件体系结构、汇编语言到硬件设计、软件设计;嵌入式系统学习可以从软件入手,从应用层编程到操作系统移植、硬件平台设计较好,按单片机设计的学习流程较难掌握。嵌入式系统与pc系统区别:嵌入式系统一般是专用系统,而PC是通用计算平台;嵌入式系统的资源比PC少得多;嵌入式系统软件故障带来的后果比PC机大得多;嵌入式系统一般采用实时操作系统;嵌入式系统大都有成本、功耗的要求;嵌入式系统得到多种微处理体系的支持;嵌入式系统需要专用的开发工具。
3、常见的嵌入式操作系统有哪些?可分为商用型和免费型。免费型:实时操作系统在价格方面具有优势,目前主要有Linux和μC/OS,稳定性与服务性存在挑战。Linux:是开放源码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾;Linux的内核小、功能强大、运行稳定、系统健壮、效率高,易于定制剪裁,在价格上极具竞争力;Linux不仅支持x86 CPU,还可以支持其他数十种CPU芯片。嵌入式Linux是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。主要有RTLinux和CLinux。商用型:实时操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。VxWorks,是一种嵌入式实时操作系统,具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域牢牢占据着一席之地。特点是:可靠性、实时性和可裁减性;它支持多种处理器,如x86、i960、Sun Sparc、Motorola MC68xxx、MIPS、POWER PC等。Windows CE 3.0:一种针对小容量、移动式、智能化、32位、连接设备的模块化实时嵌入式操作系统;针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台,WindowsCE嵌入但不够实时,属于软实时操作系统;由于其Windows背景,界面比较统一认可;操作系统的基本内核需要至少200K的ROM。
4、嵌入式系统的特点:(1)系统内核小:由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限;(2)专用性强:嵌入式系统个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植;即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改;针对不同的任务,往往需要对系统进行较大更改,这种修改和通用软件的“升级”是完全不同的概念;(3)系统精简:嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全;(4)高实时性OS:这是嵌入式软件的基本要求,而且软件要求固态存储,以提高速度。软件代码要求高质量和高可靠性、实时性;(5)嵌入式软件开发走向标准化:嵌入式系统的应用程序可以没有操作系统直接在芯片上运行。为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量;(6)嵌入式系统需要开发工具和环境:其本身不具备自主开发能力,即使设计完成以后,用户通常也是不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。
二、嵌入式系统的设计原则及开发方法:
1、软硬件协同设计概念:基于体系结构,对系统的软件、硬件进行详细设计,为了缩短产品开发周期,设计往往是并行的(既是先从逻辑入手,设计出功能模块,最后再区分是由硬件还是软件来实现该功能)。举例:SOC系统:嵌入式片上系统,结合许多功能区块,将功能坐在一个芯片上,微处理器核心是通信接口单元等。SOC是追求产品系统最大包容的集成器件,最大特点是成功实现了软硬件无缝结合,直接在处理器片内嵌入操作系统的代码模块,运用VHDL等硬件描述语言,不需要像传统系统设计一样,绘制庞大复杂的电路板,一点一点的连接焊制,只需使用精确的语言,综合时序设计,直接在器件库中调用各种通用处理器标准,通过仿真后,可交付芯片厂家进行生产。
2、项目开发生命周期:(识别需求-提出解决方案-执行项目-结束项目)。系统开发步骤:系统需求分析(规格说明书):确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。系统的需求一般分功能性需求和非功能性需求两方面。功能性需求是系统的基本功能,如输入输出信号、操作方式等;非功能需求包括系统性能、成本、功耗、体积、重量等因素。体系结构设计:描述系统如何实现所述的功能和非功能需求,包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型等。一个好的体系结构是设计成功与否的关键。硬件/软件协同设计:基于体系结构,对系统的软件、硬件进行详细设计。为了缩短产品开发周期,设计往往是并行的。
系统集成:把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进单元设计过程中的错误。系统测试:对设计好的系统进行测试,看其是否满足规格说明书中给定的功能要求。
三、ARM处理器体系结构:
1、冯·诺依曼体系结构:程序和数据共用一个存储空间,CPU无法同时访问程序和数据;哈佛体系结构:程序和数据分开存放,CPU可以同时访问程序存储器和数据存储器。(2)CISC:复杂指令集,具有大量的指令和寻址方式;8/2原则:80%的程序只使用20%的指令;大多数程序只使用少量的指令就能够运行。RISC:精简指令集,在通道中只包含最有用的指令;确保数据通道快速执行每一条指令;使CPU硬件结构设计变得更为简单。(3)体系结构与处理器的区别:知识产权核(IP核):电路或核是设计好并经过验证的集成电路功能单元;IP复用意味着设计代价降低(时间,价格);ARM体系结构是知识产权,是IP核的一种,并不是某一具体的芯片,而微处理器一般指与RAM、ROM等硬件固化在一起的某一类芯片。(4)IP核的种类:Soft Cores(“code”)(软核):HDL语言描述;灵活度高,可修改;与工艺独立,可根据具体的加工工艺重新综合;IP很难保护。Firm cores(“code+structure”)(固核):逻辑综合后的描述,与工艺相关。Hard cores(“physical”)(硬核):物理综合后的描述,准备流片,包含工艺相关的布局和时序信息,IP很容易保护,多数的处理器和存储器。
2、ARM的七种基本工作模式:User用户模式:非特权模式,大部分任务执行在这种模式*正常程序执行的模式;FIQ快速中断模式:当一个高优先级(fast)中断产生时将会进入这种模式*高速数据传输和通道处理;IRQ外部中断模式:当一个低优先级(normal)中断产生时将会进入这种模式*通常的中断处理;Supervisor管理模式:当复位或软中断指令执行时将会进入这种模式*供操作系统使用的一种保护模式;Abort数据访问中止模式: 当存取异常时将会进入这种模式*虚拟存储及存储保护;Undef未定义指令中止模式: 当执行未定义指令时会进入这种模式*软件仿真硬件协处理器;System系统模式: 使用和User模式相同寄存器集的特权模式,特权级的操作系统任务。注意:模式之间的转换实际上是寄存器组之间的切换,当使用某种寄存器组,就进入了某种相应的工作模式。(1)寄存器组织(37 寄存器):31 个通用32位寄存器,包括未分组寄器R0-R7、分组寄存器R8-R14、程序计数器PC(R15);6 个状态寄存器。15个通用寄存器(R0 to R14), 以及1或者2个状态寄存器和程序计数器在任何时候都是可以访问的;可访问的寄存器取决于处理器的模式;其它寄存器的状态在支持IRQ, FIQ, 管理员, 中止和未定义模式处理时被切换。*FIR要求速度要快,故其专用的寄存器最多。(2)R0 到 R15 可以直接访问;R0 到 R14 是通用寄存器;R13: 堆栈指针(sp)(通常);每种处理器模式都有单独的堆栈;R14: 链接寄存器(lr);R15 包含程序计数器(PC);CPSR:当前程序状态寄存器,包括代码标志状态和当前模式位;5个SPSRs(程序状态保存寄存器):当异常发生时保存CPSR状态;SPSR和CPSR的功能是:保存ALU当前操作信息、控制允许和禁止中断、设置处理器操作模式。(3)程序状态寄存器:*条件位:N = 1-结果为负,0-结果为正或0;Z = 1-结果为0,0-结果不为0;C =1-进位,0-借位;V =1-结果溢出,0结果没溢出。*中断禁止位:I=1:禁止IRQ;F=1:禁止FIQ。*T Bit:仅ARM xT架构支持;T = 0:处理器处于ARM状态;T=1:处理器处于Thumb状态。*Mode位(处理器模式位):0b10000 User;0b10001 FIQ;0b10010 IRQ;0b10011 Supervisor;0b10111 Abort;0b11011 Undefined;0b11111 System。(4)程序指针PC(r15):当处理器执行在ARM状态:所有指令 32 bits 宽;所有指令必须 word 对齐;所以 pc值由bits [31:2]决定, bits [1:0] 未定义(所以指令不能halfword / byte对齐)。当处理器执行在Thumb状态:所有指令 16 bits 宽;所有指令必须 halfword 对齐;所以 pc值由bits [31:1]决定, bits [0] 未定义(所以指令不能 byte对齐)。
3、ARM的异常:(1)异常定义:内部或外部中断源产生并引起处理器处理一个事件,如外部中断或试图执行未定义指令都会引起异常。处理异常之前必须保留处理器的状态。(2)异常的类型:复位RESET:当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常的处理程序处执行;DABT数据中止:若处理器数据访问指令地址不存在或该地址不允许当前指令访问,产生异常;FIQ快速中断请求:当快速中断请求引脚有效,且CPSR中F=0,产生异常;IRQ外部中断请求:当外部中断请求引脚有效,且且CPSR中I=0;PABT指令预取中止:若预取指令地址不存在或该地址不允许当前的指令访问,存储器向处理器发出中止信号,但是只有当取指的指令被执行时,才产生异常;UDEF未定义指令:当处理器或协处理器遇到不能处理的指令时产生该异常,可利用该机制进行软件仿真;SWI软件中断:由执行SWI指令产生,用于用户模式下的程序调用特权操作指令,利用该异常机制实现系统功能调用。(3)异常处理过程(只能在ARM态执行,若进入异常前是Thumb态,进入异常后转为ARM态,返回后自动进入Thumb):当异常产生时,处理器执行以下动作:改变处理器状态进入 ARM 态;改变处理器模式进入相应的异常模式;保存返回地址到 LR_
IF
5、ARM状态和Thumb状态关系:在程序的执行过程中,微处理器可以随时地在两种工作状态之间切换且不影响处理器的工作模式和相应寄存器的内容。Thumb状态是ARM状态的一个映射,最终也要映射成ARM指令来执行,但字长较小,提高空间利用率,低功耗,节省代码空间,用于便捷设备,不能用于异常模式;ARM微处理器在开始执行代码时,应该处于ARM态。进入Thumb态操作:当操作数寄存器的状态位为1时,执行BX指令,从ARM态进入Thumb态。当处于Thumb态时发生异常,则异常返回时,自动切换回到Thumb态。进入ARM态操作:当操作数寄存器的状态位为0时,执行BX指令进入ARM态。此外当进行异常处理时,把PC指针放入异常模式链接寄存器R14中,并从异常向量地址开始执行程序,也能切换到ARM态;Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集。
四、ARM指令集:
1、ARM编程模型:(1)3级指令流水线技术:几个指令可以并行执行,提高了CPU的运行效率;内部信息流要求通畅流动(为了增加处理器指令流速度,提高运行效率);允许多个操作同时处理,比逐条指令执行要快;PC指向正被取指的指令,而非正在执行的指令。(2)存储器模式:大端模式(字数据的高位字节存储在低地址中,字数据的低字节则存放在高地址中)和小端模式。(3)数据和指令类型:ARM采用32位架构;ARM约定:字节8位,半字16位,字32位;大部分ARM核提供ARM指令集和Thumb指令集(T变种);Jazelle 核支持Java bytecode(J变种,4TEJ),所有指令8位宽,处理器执行字存取,一次取4条指令。
2、指令结构:采用冯•诺依曼体系结构,需要把指令从存储器加载到寄存器,没有专门的IO指令,故存在load/store结构——从存储器中读某个值,操作完后再将其放回存储器中。指令分类:a.数据处理指令–使用和改变寄存器的值;b.数据传送指令–把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store);c.控制流指令 :分支、分支和链接, 保存返回的地址,以恢复最先的次序、陷入系统代码。
3、ARM与Thumb指令的关系:(1)Thumb指令的特点:Thumb 指令的长度为 16 位,是针对代码密度问题而提出的;所有的 Thumb 指令和编程模型与ARM指令和编程模型相对应;Thumb 子程序和 ARM 子程序就可以互相调用;Thumb 指令集中的操作数和指令地址仍为32 位 ;大多数的 Thumb指令是无条件执行的,而几乎所有的 ARM 指令都是有条件执行的;Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令集而不支持ARM指令集。(2)Thumb 指令与ARM 指令的时间效率和空间效率关系 :Thumb 代码所需的存储空间约为ARM 代码的60%~70%;Thumb 代码使用的指令数比ARM 代码多约30%~40%;若使用32 位的存储器,ARM 代码比Thumb 代码快约40%;若使用16 位的存储器,Thumb 代码比ARM 代码快约40%~50%;与ARM 代码相比较,使用Thumb 代码,存储器的功耗会降低约30%。
五、典型的ARM核芯片结构:
1、LPC2000系列处理器结构:LPC2000系列微控制器将ARM7TDMI配置为小端模式;内部存储器包括无等待SRAM和Flash;系统功能包括维持芯片工作的一些基本功能,如系统时钟、复位等;向量中断控制器(VIC)可减少中断响应时间,最多可管理32个中断请求;外部存储器控制器(EMC)支持4个BANK的外部SRAM和Flash,每个BANK最大16MB;I2C串行接口为标准I2C总线接口,支持最大速度400KB;具有两个完全独立的SPI控制器;具有两个UART接口,均包含16字节的接受/发送FIFO,内置波特率发生器,UART1具调制解调接口功能;LPC2119/2129/2290/2292包含CAN总线接口;看门狗定时器;通用IO,可受5V电压,每个IO口可独立设置为输入输出模式;PWMO脉宽调制器,可灵活设置,以适应不同的场合,单边沿/双边沿输出方式,频率、占空比可调;实时时钟,具可编程积存时钟分频器,以适应不同的晶振频率。
2、LPC处理器的启动过程:一般在32位ARM应用系统中,大多数采用C语言进行软件编程,但是在运行应用代码前需要进行系统初始化,常用一汇编文件做启动代码,它可以实现异常向量表定义、堆栈初始化、系统变量初始化、地址重映射等操作。
3、时钟编程方法
4、存储器映射控制原理:用于控制地址范围为0x0000-0x0037存储区域的重新映射,该区域存放着异常向量表,发生异常时,程序总是跳转到地址为0x0000-0x0037的对应入口处,而实际异常向量表可能存在内部Flash、SRAM、Boot Block,为了让运行在不同存储器空间的程序对异常进行控制,可通过存储器映射控制,将位于不同存储空间的异常向量表重新映射到固定地址0x0000-0x0037处,以实现异常向量表的来源控制,通过设置存储器映射控制寄存器的值来实现。流程:内核产生的地址0x0000-0x0037,经过地址转换器后,映射到物理存储器的地址空间(0x80000000-0x80000037(外部存储器)/0x7FFFE000-0x7FFFE037(Boot Block)/0x40000000-0x40000037(内部SRAM)/0x00000000-0x00000037(内部Flash))。
5、存储器加速模块MAM
6、外部存储器控制器(EMC):EMC模块为AHB系统总线和外部存储器件之间提供了一个接口;EMC支持4个独立配置的存储器组,每个最大支持16MB,支持字节定位读取。
7、GPIO:特性:可独立控制每个GPIO的方向(输入、输出模式);可独立设置每个GPIO的输出状态;所有GPIO复位后,默认为输入态。IOxPIN[0-31]: GPIO引脚值;IOxDIR[0-31]:
方向控制位,写入1-输出,0-输入; IOxSET[0-31]: 输出置位,写入1-高电平,0-无效;IOxCLR[0-31]:写入1-清零,0-无效。示例:设置P0.0输出高电平代码:PINSEL0 &=0xFFFFFFFC;//设置引脚连接模块,P0.0为GPIO IO0DIR |=0x00000001;IO0SET=0x00000001;
8、UART0
六、实时操作系统概念及操作系统原理:
1、概念:(1)实时系统:(指任务要求在限定时间内完成)如果逻辑和时序出现偏差将会引起严重后果的系统。(2)软实时系统:系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。(3)硬实时系统:各任务不仅要执行无误而且要做到准时。(4)前后台系统:或超循环系统,应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为。后台也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务来保证的。(5)代码的临界段:也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。(6)资源:任何为任务所占用的实体都可称为资源。资源可以是输入输出设备或一个变量,结构,数组等。(7)共享资源:可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥。(8)多任务:多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实时应用中,多任务化的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更容易设计与维护。(9)任务状态:典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中。挂起状态也可以叫做等待事件态WAITING,指该任务在等待,等待某一事件的发生,(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。(10)任务切换:当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区,也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。(11)内核:多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。(12)调度:是内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。(13)不可剥夺型内核:要求每个任务自我放弃CPU的所有权。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。优点是响应中断快;几乎不需要使用信号量保护共享数据。缺陷在于其响应时间,高优先级的任务已经进入就绪态,但还不能运行,要等,也许要等很长时间,直到当前运行着的任务释放CPU。无法保证系统的实时性。(14)可剥夺型内核:最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。保证了系统的实时性。(15)可重入型函数:可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要予以保护。(16)时间片轮番调度法:当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度,然后切换给另一个任务。(17)任务优先级:是表示任务被调度的优先程度。每个任务都有其优先级。任务越重要,赋予的优先级应越高。(18)静态优先级:应用程序执行过程中诸任务优先级不变,在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。(19)动态优先级:应用程序执行过程中,任务的优先级是可变的,实时内核应当避免出现优先级反转问题。(20)优先级反转:优先级高和优先级低的任务在运行时,由于共享资源的占用问题,而出现的优先级反转问题,即在执行过程中,优先级高的任务反而要等优先级低的任务先运行完后,释放共享资源,才能运行。纠正的方法:提高正在使用共享资源的任务的优先级,但耗费CPU时间;内核能自动变换任务的优先级,称优先级继承,但是UCOSII不支持。(21)任务优先级分配:单调执行率调度法RMS:基于哪个任务执行的次数最频繁,执行最频繁的任务优先级最高(22)任务互斥:实现任务间通讯最简便到办法是使用共享数据结构,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。与共享资源打交道时,使之满足互斥条件最一般的方法有:关中断;使用测试并置位指令TAS;禁止做任务切换;利用信号量。(23)信号量:信号量实际上是一种约定机制,用于:控制共享资源的使用权(满足互斥条件);标志某事件的发生;使两个任务的行为同步。注意:信号,只取两个值0和1的信号量;计数器型,值有多种形式。对信号量只能实施三种操作:初始化(INITIALIZE),也可称作建立(CREATE);等信号(WAIT)也可称作挂起(PEND);给信号(SIGNAL)或发信号(POST)。信号量初始化时要给信号量赋初值,等待信号量的任务表(Waiting list)应清为空。P/V操作:P操作既是减1操作,任务执行等待(WAIT)操作,有可能执行P操作;V操作既是加1操作,任务以发信号操作(SIGNAL)释放信号量。(24)死锁:也称作抱死,指两个任务无限期地互相等待对方控制着的资源。最简单的防止发生死锁的方法是让每个任务都:先得到全部需要的资源再做下一步的工作;用同样的顺序去申请多个资源;释放资源时使用相反的顺序。(25)同步:可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。单向同步:任务与中断服务之间/两任务之间;双向同步:两任务之间可以用信号量同步它们的行为,两个任务需要互相等待对方执行,等待自身所需的事件发生(信号量),同步执行。(26)任务间的通讯:有时很需要任务间的或中断服务与任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。用全程变量时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量(如前面提到的那样)。(27)消息邮箱:通过内核服务可以给任务发送消息。典型的消息邮箱也称作交换消息,是用一个指针型变量,通过内核服务,一个任务或一个中断服务程序可以把一则消息(即一个指针)放到邮箱里去。同样,一个或多个任务可以通过内核服务接收这则消息。发送消息的任务和接收消息的任务约定,该指针指向的内容就是那则消息。内核一般提供以下邮箱服务:邮箱内消息的内容初始化,邮箱里最初可以有,也可以没有消息;将消息放入邮箱(POST);等待有消息进入邮箱(PEND);如果邮箱内有消息,就接受这则消息。如果邮箱里没有消息,则任务并不被挂起(ACCEPT),用返回代码表示调用结果,是收到了消息还是没有收到消息。消息邮箱也可以当作只取两个值的信号量来用。邮箱里有消息,表示资源可以使用,而空邮箱表示资源已被其它任务占用。(28)消息队列:消息队列用于给任务发消息。消息队列实际上是邮箱阵列。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO)。然而μC/OS-Ⅱ也允许使用后进先出方式(LIFO)。内核提供的消息队列服务如下:消息队列初始化。队列初始化时总是清为空;放一则消息到队列中去(Post);等待一则消息的到来(Pend);如果队列中有消息则任务可以得到消息,但如果此时队列为空,内核并不将该任务挂起(Accept)。如果有消息,则消息从队列中取走。没有消息则用特别的返回代码通知调用者,队列中没有消息。
2、任务的组成:代码、TCB、私有堆栈。一个任务通常是一个无限的循环,绝不会返回的,但可通过调用函数自我删除,也可建立新任务。
3、OS的内核原理:(1)任务状态图(任务状态的切换过程):睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理,把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。
正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态。正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。当所有的任务都在等待事件发生或等待延迟时间结束,μC/OS-Ⅱ执行空闲任务(idle task),执行OSTaskIdle()函数。(2)局部结构——任务控制块TCB:一旦任务建立了,任务控制块OS_TCBs将被赋值。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。实际上,任务状态的改变就是修改TCB的过程,OS_TCBs全部驻留在RAM中。任务建立的时候,OS_TCBs就被初始化了。
应用程序中可以有的最多任务数(OS_MAX_TASKS)是在文件OS_CFG.H中定义的。这个最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs的数目。将OS_MAX_TASKS的数目设置为用户应用程序实际需要的任务数可以减小RAM的需求量。所有的任务控制块OS_TCBs都是放在任务控制块列表数组OSTCBTbl[]中的。μC/OS-Ⅱ分配给系统任务OS_N_SYS_TASKS若干个任务控制块,供其内部使用。目前,一个用于空闲任务,另一个用于任务统计。在μC/OS-Ⅱ初始化的时候,所有任务控制块OS_TCBs
被链接成单向空任务链表。当任务一旦建立,空任务控制块指针OSTCBFreeList指向的任务控制块便赋给了该任务,然后OSTCBFreeList的值调整为指向下链表中下一个空的任务控制块。一旦任务被删除,任务控制块就还给空任务链表。(3)全局结构——就绪表:将任务放入就绪表程序清单: OSRdyGrp |= OSMapTbl[prio >> 3];OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间。程序清单:从就绪表中删除一个任务
if((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07])== 0)OSRdyGrp &= ~OSMapTbl[prio >> 3];
程序清单:找出进入就绪态的优先级最高的任务
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];prio =(y << 3)+ x;
以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。算法理解:预先根据结构,先算好屏蔽字,做好准备,再利用二进制的特点,将优先级与查表得出的屏蔽字进行逻辑操作,得出xy值,再对就绪表的相应位进行置位或清零操作,完成对就绪表的修改。利用屏蔽字是为了提高查找就绪表的速度。4)任务调度算法 void OSSched(void){
INT8U y;OS_ENTER_CRITICAL();
if((OSLockNesting | OSIntNesting)== 0){
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy =(INT8U)((y << 3)+ OSUnMapTbl[OSRdyTbl[y]]);
if(OSPrioHighRdy!= OSPrioCur)
{
OSTCBHighRdy= TCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OS_TASK_SW();
}
} OS_EXIT_CRITICAL();}
μC/OS-Ⅱ任务调度所花的时间是常数,与应用程序中建立的任务数无关。
4、空闲任务(Idle Task):μC/OS-Ⅱ总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。空闲任务[OSTaskIdle()]永远设为最低优先级。空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。空闲任务不可能被应用软件删除,但可以通过时间中断唤醒其他任务进入就绪态后,退出空闲任务。
5、统计任务:提供运行时间统计的任务,叫做OSTaskStat(),如果用户将系统定义常数OS_TASK_STAT_EN设为1,这个任务就会建立。一旦得到了允许,OSTaskStat()每秒钟运行一次,计算当前的CPU利用率。注意:在调用系统启动函数OSStart()之前,用户初始代码必须先建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立应用程序中的其它任务。
6、μC/OS-Ⅱ初始化:μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构。OSInit()建立空闲任务idle task,统计任务OSTaskStat()并且让其进入就绪态。以上两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。还初始化了4个空数据结构缓冲区:空任务控制块缓冲区、空事件表、空队列表、空存储区。先做好准备,目的是为了保证CPU的运行速度。注意:初始化后数据结构:包括就绪表、优先级表、空闲任务和统计任务TCB、及其各自私有堆栈。
4、μC/OS-Ⅱ的启动:程序清单初始化和启动μC/OS-Ⅱ: void main(void){
OSInit();/* 初始化uC/OS-II
*/..通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;..OSStart();/* 开始多任务调度!OSStart()永远不会返回 */}
5、任务数据结构:void YourTask(void *pdata){ for(;;){
/* 用户代码 */ 调用µC/OS-Ⅱ的服务例程之一: OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */ } } 或void YourTask(void *pdata){
/* 用户代码 */ OSTaskDel(OS_PRIO_SELF);}
6、事件控制块ECB:一个数据结构(类似TCB),包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。分为OSEventGrp/OSEventTbl两个变量。任务调度算法也和TCB相似。
程序清单:将一个任务插入到事件的等待任务列表中
pevent->OSEventGrp |= OSMapTbl[prio >> 3];pevent->OSEventTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
其中,prio是任务的优先级,pevent是指向事件控制块的指针。该算法的原理:任务优先级的最低3位决定了该任务在相应的.OSEventTbl[]中的位置,紧接着的3位则决定了该任务优先级在.OSEventTbl[]中的字节索引。该算法中用到的查找表OSMapTbl[]一般在ROM中实现。(1)在µC/OS-II中,事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定。在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化。因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中。(2)对于事件控制块进行的一些通用操作包括:初始化一个事件控制块;使一个任务进入就绪态;使一个任务进入等待该事件的状态;因为等待超时而使一个任务进入就绪态。为了避免代码重复和减短程代码长度,µC/OS-II将上面的操作用4个系统函数实现,它们是:OSEventWaitListInit(),OSEventTaskRdy(),OSEventWait()和OSEventTO()。
7、µC/OS-II系统多任务的意义:多任务使事件简单化,任务与任务之间的关系使松耦合而不是紧耦合,每个任务只要考虑当前事件,而不需考虑全局事件,全局事件由操作系统来考虑,利用操作系统的一些通讯机制,将多个任务联系起来共同完成一个功能,同时采用多人机制,OS可以同时运行多个应用程序,提高了CPU的使用效率。
8、操作系统在嵌入式系统中的地位:操作系统在嵌入式系统中扮演管理者的角色,主要任务使完成多任务之间的调度和同步,同时也是上层应用软件和底层硬件的接口,负责全部软硬件资源的分配和回收、控制与协调等并发活动。同时嵌入式实时操作系统提高了系统的可靠性;提高了开发效率,缩短了开发周期,嵌入式RTOS充分发挥了32位CPU的多任务潜力。
9、文件系统:(定义)处理文件的操作系统的部分称为文件系统.是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用。功能:文件的构造、命名、存取、保护等。(2)基于NAND FLASH的嵌入式文件系统:FLASH读写的特点:必须以Page为单位进行读写;写之前必须先擦除原有内容;擦除操作必须对Block进行,即一次至少擦除一个Block的内容。针对这种情况,将Flash的一个Page定为1个扇区,将其1个Block,32个扇区定为一个簇,这样,簇的容量刚好为512*32=16K,满足FAT16对簇大小的要求。(3)FLASH文件系统的要求:掉电安全、平均使用、高效垃圾回收、低空间消耗:指文件系统管理结构在FLASH存储器上的空间消耗,该空间用于FS建立,而不能用于实际数据的存储,可以提高有用数据的存储空间。(4)FLASH文件系统的分类:集中管理文件系统、线性文件系统、日志文件系统。(5)几种开源文件系统:TFS(Tiny File System):线性结构的文件系统,优点:TFS提供了掉电安全机制和垃圾回收机制。需要额外的辅助空间,用于垃圾回收时的文件缓存和过程状态,如果出现终止,系统根据辅助空间的信息进行文件系统的恢复。缺点:文件的插入、剪切和个性需要较大的运行开销,即使是很小的修改,也要求将整个文件重写。JFFS:主要针对NOR型Flash存储器设计,提供了掉电安全,平均使用等特性,是基于Linux,由于遵循GPL开放源代码,易实现移植。日志文件系统;提供了更好的崩溃、掉电安全保护;jffs2支持对flash的均匀磨损;在扇区级别上执行闪存擦除/写/读操作功能较好;文件系统接近满时,JFFS2 会大大放慢运行速度——垃圾收集。Nand上yaffs文件系统的优势:专门为Nand flash设计的日志文件系统;jffs/jffs2不适合大容量的Nand flash;jffs的日志通过jffs_node建立在RAM中,占用RAM空间:对于128MB的Nand大概需要4MB的空间来维护节点;启动的时候需要扫描日志节点,不适合大容量的Nand flash;FAT系统没有日志。(6)
NAND和NOR——性能比较:NOR和NAND是现在市场上两种主要的非易失闪存技术。NOR的读速度比NAND稍快一些;NAND的写入速度比NOR快很多;NAND的擦除速度远比NOR的快;大多数写入操作需要先进行擦除操作;NAND的擦除单元更小,相应的擦除电路更少。接口差别:NOR flash带有SRAM接口,线性寻址,可以很容易地存取其内部的每一个字节;NAND flash使用复用接口和控制IO多次寻址存取数据;NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作易于取代硬盘等类似的块设备。容量和成本:NAND flash生产过程更为简单,成本低;常见的NOR flash为128KB~16MB,而NANDflash通常有8~128MB;NOR主要应用在代码存储介质中,NAND适合于数据存储;NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。可靠性和耐用性:在NAND中每块的最大擦写次数是100万次,而NOR的擦写次数是10万次;位交换的问题NAND flash中更突出,需要ECC纠错;NAND flash中坏块随机分布,需要通过软件标定——产品量产的问题。(7)FAT:FAT32容量:位数,32位;最大簇数目,268,453,456;每簇大小4KB-32KB;最大磁盘容量,2^41(2T)。FAT文件系统基本结构:保留区 Reserved region,存放引导记录,BIOS信息等;FAT 区,FAT信息列表(12/16/32 bits);根目录区,目录信息列表(32 bytes);文件和目录区,存放簇信息。典型FLASH文件系统的结构:系统记录-文件分配表-文件登记表-数据区域。文件系统的操作流程:打开文件OpenOSFile-操作文件ReadOSFile/WriteOSFile-关闭文件CloseOSFile。
10、GUI技术:GUI的定义:Graphics User Interface, 是指计算机与其使用者之间的图形化对话接口。GUI的主要特征:——Windows,采用窗口界面,每个窗口是用户或系统的一个工作区域。一个屏幕上可以有多个窗口。——Icons,采用形象化的图标或图符,易于操作者理解与操作。——Menu,采用菜单,可供用户选择的功能提示。——Pointing Devices,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。嵌入式GUI的特点:体积小;功能强;图形算法简洁、快速,占用系统资源少;可靠性高;模块结构,便于移植和定制。MiniGUI:支持 GB2312 与 BIG5 字集;支持多种格式字体,例如:TrueType、Adobe Type1等;GUI函数(MoveTo、LineTo、FillBox、Rectangle、Circle、TextOut、DrawText..等)。
11、C/OS的性能特点:公开源代码;可移植性(Portable),绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 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)。这种可剪裁性是靠条件编译实现的;占先式(Preemptive);多任务,C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务;可确定性,全部C/OS-II的函数调用与服务的执行时间具有可确定性;任务栈,每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求;系统服务,C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等;中断管理,中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层;稳定性与可靠性。相关系统函数:
OS_ENTER_CRITICAL()进入临界区,关中断 OSTaskResume(INT8U prio);恢复任务 OS_EXIT_CRITICAL()退出临界区,开中断 OSTaskQurery();获得有关任务的信息 OSInit()系统初始化 OSTaskSuspend(INT8U prio);挂起任务,只能通过OSStart()可启动多任务,运行进入就绪态的优先级最高的任务 OSTaskResume()来恢复 OSIntEnter()时间: OSIntExit()OSTimeDly();任务延时一定的时钟节拍 OSSchedLock()给任务调度上锁 OSTimeDlyHMSM();任务延时一定毫秒、秒、分、小时 OSSchedUnlock()给任务调度解锁 OSTimeDlyResume();取消延时,若原先任务调用延时函数,OSTaskIdle()该函数可让任务进入就绪态,而不必等到等待期满 任务: OSTimeGet()/OSTimeSet();系统时钟获取和设置 OSTaskDel(INT8U prio);非空闲任务删除,使被删除任务返回OSTimeTick();时钟节拍函数 并处于休眠态,释放TCB 信号量 OSTaskCreat(*task)(void *pd), void *pdata, OS_STK *ptos, OSSemCreat(void *addr, INT32U nblks ,INT32U blksize, INT8U INT8U prio);建立任务4个参数,不能由中断服务来建立任务 *err);建立一个信号量 OSTaskCreatExt();上述的扩展版,更为灵活,9个参数 OSSemPend();等待一个信号量 OSTaskChangPrio()改变任务优先级,不改变任务状态 OSSemPost();发送一个信号量
OSSemAcccept();无等待地请求一个信号量,若信号量暂时无OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata)效,也可以让任务简单返回而不是进入睡眠状态 消息队列 OSSemQurery();查询一个信号量的当前状态 OSQCreat(); 邮箱(函数意义同上)OSQPost();先进先出原则 OSMBoxCreat(void *msg)OSQPend()OSMBoxPost(OS_EVENT *pevent, void *msg)
OSQPostFront();后进先出原则 OSMBoxAcccept(OS_EVENT *pevent)
OSQFlush();清空一个消息队列 OSMBoxPend(OS_EVENT *pevent, INT16U timeout, int8u OSQAcccept();
OSQQurery()*err);
与FLASH存储器的接口函数:
块擦除:unsignde char Erase_Cluster(unsigned int cluster)页写入:int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)页读出:Void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)文件系统相关接口函数:
初始化文件系统:Void initOSFile(char filename[],U32 OpenMode)读文件到缓冲区:U32ReadOSFile(FILE *pfile,U8 *Read Buffer, U32 n Readbyte)把缓冲区内容写入文件:U32WriteOSFile(FILE *pfile,U8 *Write Buffer, U32 n Writebyte)关闭文件,释放缓冲区:Void CloseOSFile(FILE *pfile)常见API函数: 数据队列:
QueueCreat();建立数据队列 QueueSize();获取队列共可以存储数据的数目 QueueWriteFront();先进先出方式发送数据 串口驱动: QueueWrite();以后进先出方式发送数据 UART0Init();初始化UART0 QueueRead();获取队列中的数据 UART0Putch();发送一个字节 QueueFlush();清空队列 UART0Write();发送多个字节 QueueNData();获取队列中已存储的数据的数目 UART0Getch();接受一个字节 调制解调器模块
I2C: ModemInit();初始化
GetModemState();获取Modem状态 I2CInit();
I2CWrite();
I2CRead();
SPI: ModemWrite();通过Modem发送多个字节数据
ModemGetch();从Modem获取一个字节数据 SPIInit();初始化 ModemDiaUp();通过Modem拨号 GetSPI Flag();获取SPI状态 ModemDiaDown();挂断Modem SPIStart();开始访问SPI SPIRW();通过SPI发送并接受一个数据
SPIEND();访问SPI结束
为了保证系统实时性,UCOII采用了哪些策略?答:占先式内核、准备工作、就绪表机制。
2、你认为设计嵌入式操作系统对硬件是否有要求?硬件支持软件,如果CPU,没有定时器,OS时间片管理就无法实现;Linux的虚拟内存功能,ARM上没有该存储器,就无法运行Linux。
3、UCOSII操作系统的就绪表用何种机制保证其实时性不受任务个数的限制?UCOSII是占先式实时多任务内核,优先级最高的任务准备就绪则拥有CPU的所有权,开始投入运行;不支持时间片轮转法,每个任务优先级是唯一的,查找准备就绪的最高优先级的任务并执行上下文切换;UCOSII任务调度所花的时间为常数,与应用程序中建立的任务数无关。
消息机制对于多任务系统的意义?使两个任务独立性增强,耦合比较松散。P(s){if(s<1)wait();s--}
V(s){s++;} 嵌入式系统的软/硬件框架:硬件层、驱动层、OS层、中间层和应用层。
第三篇:嵌入式期末复习总结整理
《嵌入式整理提纲》——YOYO左转
题型:
1、选择题:20分
2、填空题:20分
3、判断题:8分
4、简答题:16分
5、程序分析题:20分
6、编程题16分
第一章
1、嵌入式系统的定义:
根据IEEE的定义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”。国内定义:以应用为中心,以计算机技术为基础,软硬件可裁,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
2、嵌入式系统的组成:
嵌入式系统装置由嵌入式计算机系统和执行装置组成。嵌入式计算机系统由硬件层、中间层、系统软件层和应用软件层组成。(分层结构)
3、立即数(第二操作数)合法性,选择题:将一个32位数右移偶数位可以得到小于255的数为合法,否则为不合法。例如:
0x6a0=0000 0000 0000 0000 0000 0110 1010 0000 右移4位==> 0000 0000 0000 0000 0000 0000 0110 1010 = 0x6a 小于255,所以合法 0x1a600=0000 0000 0000 0001 1010 0110 0000 0000 无论右移多少偶数位,所得的数仍然大于255,所以不合法
0x16c00=0000 0000 0000 0001 0110 1100 0000 0000 右移10位==> 0000 0000 0000 0000 0000 0000 0101 1011 =0x5b小于255,所以合法
4、全称:
AMBA: Advanced Microcontroller Bus Architecture 高级微控制器总线 ARM: Advanced RISC Machine
CISC: Complex Instruction Set Computer复杂指令集系统 RISC: Reduced Instruction Set Computer精简指令集系统 RTOS: Real-time Operation System 实时多任务操作系统 FAT: File Allocation Table 文件分配表系统
UCOS: Micro Controller Operation System 微控制器操作系统
片上系统:System On Chip,SOC 知识产权核:Intellectual Property Core,IP Core IP软核:Soft IP Core IP硬核:Hard IP Core IP固核:Firm IP Core
5、嵌入式微处理器的体系结构可以采用冯*诺依曼体系结构或哈佛体系结构;指令系统可以选用精简指令集系统RISC(Reduced Instruction Set Computer)和复杂指令集系统 《嵌入式整理提纲》——YOYO左转
CISC(Complex Instruction Set Computer)。
6、Cache是一种容量小、速度快的存储器阵列,可分为数据Cache、指令Cache或混合Cache。
7、硬件层和软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board Support Package,BSP)
8、一般可以将嵌入式处理器分为4类:嵌入式微处理器MPU、嵌入式微控制器MCU、嵌入式DSP处理器和嵌入式片上系统SOC。
9、DSP处理器是专门用于信号处理方面的处理器。在数字滤波、FFT、频谱分析等领域获得了大规模应用。
10、硬实时系统和软实时系统的实现区别主要是在选择调度算法上。选择基于优先级调度的算法足以满足软实时系统的需求,而且可以提供高速的响应和大的系统吞吐量;而对硬实时系统来说,需要使用的算法就应该是调度方式简单,反应速度快的实时调度算法。
第二章
1、冯*诺依曼体系结构:程序和数据公用一个存储空间,程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置。
哈佛体系结构:是一种将程序指令存储和数据存储分开的体系结构,两者都独立编址。
2、复杂指令集计算机CISC和精简指令集计算机RISC
3、对于多于一个字节类型的数据,在存储器中有2种存放方式:
小端字节顺序存储法:低字节数据存放在内存低地址处,高字节数据存放在内存高地址处; 大端字节顺序存储法:高字节数据存放在内存低地址处,低字节数据存放在内存高地址处。
《嵌入式整理提纲》——YOYO左转
4、无操作系统的嵌入式软件实现方式:循环轮转和前后台系统。循环轮转方式:
优点:简单、直观、开销小、可预测;
缺点:过于简单,无法处理异步事件,缺乏并发处理能力。前后台系统:在循环轮转方式的基础上,增加了中断处理功能。
5、嵌入式系统按响应时间的敏感程度可分为实时操作系统和非实时操作系统。实时操作系统可分成硬实时系统和软实时系统。
6、嵌入式操作系统的几个重要概念(书P42 了解)
7、免费型实时操作系统:嵌入式Linux和uC/OS。
第三章
1、ARM(Advanced RISC Machine)是一种32位微处理器体系结构。
版本ARMv1:ARM1 版本ARMv2:ARM2、ARM3
2、PC的值:当前指令地址+8
3、指令集可以是以下任一种
bits 长(ARM状态)16 bits 长(Thumb 状态)
4、进入Thumb状态:当操作数寄存器的状态位为1时,执行BX指令,使微处理器从ARM状态切换到Thumb状态;
进入ARM状态:当操作数寄存器的状态位为0时,执行BX指令,使微处理器从Thumb状态切换到ARM状态;
5、ARM寄存器组织(P76-P80 了解)
6、ARM处理器支持7种运行模式
用户模式(特权模式)
快速中断模式 外部中断模式
管理模式
数据访问终止模式
系统模式(特权模式)
《嵌入式整理提纲》——YOYO左转
未定义指令中止模式
7、异常发生时,ARM对异常作出的响应:
①保存返回地址到 LR_
8、异常优先级:复位(最高)、未定义指令(最低)
9、掌握ARM指令(课本P86)
10、ARM指令的寻址方式7种(课本P89重点掌握)
11、C语言与汇编语言混合编程(课本P101,PPT重点)
12、Bootloader的功能:
Bootloader是操作系统内核运行之前的一段小程序。通过这段小程序,初始化最基本的硬件设备并建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader包含两个阶段,阶段一即Boot阶段具有引导功能,初始化硬件配置,通常用汇编语言编写;阶段二即Load阶段完成加载功能,即将操作系统映像文件从ROM中加载到RAM,并将控制权交给操作系统,通常用C语言编写。
第四章
1、uC/OS :Micro Controller Operation System 微控制器操作系统
2、uC/OS-II主要特点:公开源代码、可移植性好、可固化、可剪裁、抢占式内核、多任务、可确定性、任务栈、稳定性与可靠性。(了解)
3、uC/OS-II中一个任务叫一个线程;其管理任务达64个,用户可用有56个;ID号越大,等级数越低;uC/OS-II总是运行进入就绪态优先级最高的任务。
4、任务调度(课本P120-123重点)
5、uC/OS-II的初始化函数编写 OSInit()
6、uC/OS-II的任务通信机制(P130-P132)
uC/OS-II定义了一个事件控制块ECB来进行任务间的信号传递; uC/OS-II提供了3种任务通信机制:信号量、邮箱、消息队列。
7、uCOS-II移植的基本要求:
1)处理器的C编译器能产生可重入代码 2)在程序中可以打开或关闭中断
3)处理器支持中断,并且能产生定时中断 4)处理器支持硬件堆栈
5)处理器有将堆栈指针和入栈、出栈的指令
8、可重入式函数:指一段代码可用被多个任务同时调用,而不必担心会破坏数据。
9、堆栈增长方向设置:
OS_STK_GROWTH为0表示堆栈从下往上增长; OS_STK_GROWTH为1表示堆栈从上往下增长;
《嵌入式整理提纲》——YOYO左转
第五章
1、三星公司推出S3C2410A处理器,基于ARM920T,采用高级微控制器总线新型总线结构。
2、S3C2410A处理器内核供电1.8V/2V、外存储器和外部I/O供电为3.3V;4通道DMA;3通道UART;117个通用I/O口和24通道外部中断源。
3、给出晶振,算CPU时钟,有公式(书本P146,找例题做)
fclkfinMDIV8PDIV22SDIV
例如:外部晶振为12MHz MPLLCON=0x62 02 2 其中MDIV=0x62=98,PDIV=0x02=2,SDIV=0x2=2 fclk12M*(988)(22)*2212M*1064*479.5MHz
4、S3C2410A处理器启动2级引导方式(书本P147 了解)
5、存储器系统的层次,设备从上而下,异常变得速度更慢,访问频率更小,容量更大,并且每个字节的造价也更加便宜。(书本 P148)
6、S3C2410A存储系统特征(书本P151 了解)
第六章
1、建立文件系统(P197-201)
2、根据32字节目录项结构,判断是目录还是文件,是文件的话,写出文件名(包括后缀XXX.XX)
其中从高位数,第12字节中的bit4是目录,bit5是文件(相应位置1就为什么)
其中前8字节为文件名,第9到第11字节为文件后缀,记得后缀前加点。
简答题
(一)两种无操作系统的嵌入式软件体系结构及其特点:
第一种是循环轮转方式,优点是简单,直观,开销小,可预测,缺点是过于简单,缺乏并行处理异步事件的能力。
第二种是前后台方式,前台是中断服务程序,负责处理异步事件,后台是无限循环,负责软 《嵌入式整理提纲》——YOYO左转
硬件资源的分配、管理以及任务的调度。前后台通过同步信号或数据进行交互。
(二)嵌入式应用软件的开发方式:
在宿主机上建立开发环境,进行应用程序编码和交叉编译,然后在宿主机和目标机之间建立连接,将应用程序下载到目标机上进行交叉调试。经过调试和优化,最后将应用程序固化到目标机中实际运行。
(三)RISC体系结构的特点: ①一个大而统一的寄存器文件
②Load/Store结构,数据处理的操作只针对寄存器的内容,而不是直接对存储器进行操作。③简单的寻址模式,所有装载/保存的地址都只由寄存器内容和指令域决定。④统一和固定长度的指令域,简化了指令的译码。⑤使用流水线降低指令寻址周期。
(四)异常发生时,ARM对异常作出的响应: ①保存返回地址到 LR_
(五)Bootloader的功能:
Bootloader是操作系统内核运行之前的一段小程序。通过这段小程序,初始化最基本的硬件设备并建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。Bootloader包含两个阶段,阶段一即Boot阶段具有引导功能,初始化硬件配置,通常用汇编语言编写;阶段二即Load阶段完成加载功能,即将操作系统映像文件从ROM中加载到RAM,并将控制权交给操作系统,通常用C语言编写。
(六)Nand Flash和Nor Flash在性能上的区别: 1)NOR的读速度比NAND稍快一些 2)NAND的写入速度比NOR快很多。《嵌入式整理提纲》——YOYO左转
3)NAND的4ms擦除速度远比NOR的5s快。4)大多数写入操作需要先进行擦除操作。
5)NAND的擦除单元更小,相应的擦除电路更少。
(七)可剥夺和任务切换的概念:
任务切换:当多任务内核决定运行另外的任务时,它将任务的当前状态,即CPU寄存器中的全部内容,保存在任务的堆栈中。入栈工作完成以后,把将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。
可剥夺:CPU总是运行就绪条件下优先级最高的任务。
(八)uCOS-II移植的基本要求:
1)处理器的C编译器能产生可重入代码 2)在程序中可以打开或关闭中断
3)处理器支持中断,并且能产生定时中断 4)处理器支持硬件堆栈
5)处理器有堆栈指针和入栈、出栈的指令
编程:
1、流水灯;
2、串口;
3、信号量;
4、Nand Flash 《嵌入式整理提纲》——YOYO左转
#include
OS_STK
static void App1(void *pdata);static void App2(void *pdata);static void printf_task_info(INT8U i);
void main(int argc, char *argv[]){
}
void App1(void *pdata){
pdata=pdata;{
OS_Printf(“nat time %d:n”,(INT8U)(OSTime/100));OS_Printf(“this is app1, prio=%un”,OSPrioCur);
while(TRUE)OSInit();
/* Initialize “uC/OS-II”*/ OSTaskCreate(App1,NULL,(OS_STK *)&App1Stk[TASK_STK_SIZE-1],(INT8U)10);//任务1等级为10 NULL,(OS_STK *)&App2Stk[TASK_STK_SIZE-1],(INT8U)5);//任务2的等级为5,比任务1高 App1Stk[TASK_STK_SIZE];OS_STK
App2Stk[TASK_STK_SIZE];
OSTaskCreate(App2,OSStart();
/* Start multitasking */
OSTimeDlyHMSM(0, 0, 3, 0);
/* waiting for 3s */
} }
void App2(void *pdata){
INT8U i;INT8U err;INT8U pname[10]=“task one”;pdata=pdata;{ OS_Printf(“at time %d:n”,(INT8U)(OSTime/100));
while(TRUE)
《嵌入式整理提纲》——YOYO左转
}
OS_Printf(“this is app2, prio=%un”,OSPrioCur);OSTimeDlyHMSM(0, 0, 4, 0);
OS_Printf(“nat time %d:n”,(INT8U)(OSTime/100));OS_Printf(“set name then suspend task onen”);OSTaskSuspend(10);OSTimeDlyHMSM(0, 0, 4, 0);
OS_Printf(“nat time %d:n”,(INT8U)(OSTime/100));OS_Printf(“Resume the task onenn”);OSTaskResume(10);OSTimeDlyHMSM(0, 0, 4, 0);OS_Printf(“nat time %d:n”,(INT8U)(OSTime/100));OS_Printf(“Delete the task onenn”);if(i=OSTaskDel(10)!= 0){
} getchar();printf(“OSTaskDel()err, the err NO is %dn”,i);return;
}
第四篇:嵌入式系统复习总结
嵌入式系统复习总结
一、嵌入式系统的概述
1.嵌入式系统的定义:嵌入到对象中的专业计算机 2.三大特点:嵌入型、专业性、计算机系统 3.组成:软件、硬件
4.结构层次:应用程序、嵌入式系统实时操作系统,硬件抽象层、嵌入式系统硬件工作平台
5.分类:MCU、EMPU、DSP、CPLDFPGA、SoC
二、51单片机
1.单片机的特点:体积小、控制功能强、可靠性高、易扩展易产品化、性能价格比高、需要开发装置
2.51单片机的组成:CPU、64KB数据存储器、4KB程序存储器、两个16位定时计数器、5个中断源、P0~P3 4个并行IO口、4个串行
3存储其结构特点:内、外数据存储器,内、外程序存储器 程序存储器,内外统一编制,地址重合区由EA决定,EA=1访问外部,EA=0访问内部,内部数据存储器:00H~20H由32个寄存器组成,每八个一组,21H~2FH位寻址区,30H~FFH用户存储区,内外存储地址有指令区分MOVSMOV SFR特殊功能寄存器:ACC、B、SP、DPTR、PSW、IO宿存器 4.CPU时序电路:振荡周期(1)、状态周期(2)、机器周期(12)、指令周期、CPU访问指令时两次读指令,访问外部程序存储器是ALE两次有效,S1P2S4P2,4.单片机的引脚功能:PSEN,ALEPROG,EA 5.输入输出口结构:p0准双向口,每位可带8个LSTTTL负载,输出需要上拉电阻(准双向原因:作为输出口,要给锁存器1,屏蔽两个二极管)
p1、p2均为准双向口,带四个负载,p1也需要上拉电阻,p2自带电阻,p2控制信号为1时输出高八位地址 p3每个位有特殊定义 6.单片机的寻址方式:
直接寻址:SFR寻址均为直接寻址
寄存器寻址:乘法指令中B寄存器为寄存器寻 立即数寻址:
寄存器间接寻址:R0,R1 变址寻址:注意PC变址不改变PC值,DPTR变址可以随意到任意位置取数
相对变址寻址:调转指令 位寻址 7.单片机指令:(1)数据传送类指令:MOVMOVXMOVC,XCHXCHDSWAP,PUSHPOP(2)数据传送类指令:
ADDADDCINC,SUBBDEC,MUL(低位A,高位B),DIV(商A,余数B)
(3)逻辑类指令:
ANL,ORL,XRL, RL,RR,RLC,RRC, CPL(按位取反),CLR(请位)
(4)转移类指令
AJMP,LJMP,SJMP,JMP.JZ.JNZ,CJNE,CJE,DJNZ(5)位转移指令
JC rel ;若CY=1,则PC ←PC+ 2 + rel ;若CY=0,则PC ←PC+ 2 JNC rel ;若CY=0,则PC ←PC+ 2 + rel ;若CY=1,则PC ←PC+ 2 JB bit,rel ;若(bit)=1,则PC ←PC+ 3 + rel ;若(bit)=0,则PC ←PC+ 3 JNB bit,rel ;若(bit)=0,则PC ←PC+ 3 + rel ;若(bit)=1,则PC ←PC+ 3 JBC bit,rel ;若(bit)=1,则PC ←PC+ 3 + rel,bit←0 ;若(bit)=0,则PC ←PC+ 3 8.程序设计:
冒泡法,BCD转2进制,2进制转BCD,ASCALL转2进制 9.伪指令:ORG,EQU 10.中断系统
两个外部中断INT0、1,两个定时器中断TI0、TI1,串口中断
中断系统的组成:TCON,SCON,IE,IP
中断响应的条件:
有中断请求; EA=1;
IE相应的中断位为1;CPU执行指令最后一个周期;
CPU没有执行同级或者更高级的中断指令; CPU不执行RET,RETI或者读取IEIP的指令
中断响应的过程:
①置位相应的优先级状态触发器,清除相应的中断请求标志(TI和RI除外);
②由硬件自动生成一条长调用指令LCALL,将断点地址(当前PC值)压入堆栈加以保护;
③将中断入口地址装入PC,使程序转向执行中断服务程序。中断响应时间为3~8个机器周期
中断相应返回时: 将优先状态触发器置0; 将返回地址送至PC返回
定时器中断自动清除标志位 外部中断:
(1)电平触发外部清除,或者软件清除(2)边缘触发自动清除 串行口中断软件清除
10.定时器中断:TCON,80H设置(T0低位,T1高位)
工作方式0:13位计数TH位高八位TL低五位表示低五位,工作方式1:16位计数
工作方式2:8位计数,TL方初值,TH计数
工作方式3: TL0不变可做定时计数,用T0的一套,TH0只能定时用T1的一套。T1为方式3时不工作 11.利用定时中断溢出编程
(1)产生方波信号(方波信号的嵌套)
①设置TMOD控制字,确定工作方式;
②计算计数初值并装入计数值寄存器TH0(1)、TL0(1); ③若使用中断系统,则开中断EA=
1、ET0或ET1=1; ④启动定时器/计数器工作(置TR0或TR1)。(2)外部中断的扩展(查询方式,将初值设置为最大)
禁止中断;JBC 12.串行口波特率的计算
方式0:固有频率的12分之一
方式1、3:与三相同与T
1fOSC2SMOD的益处时间有关 32122nx 方式2:固有频率的64分之一
三、ARM单片机
(1)两种工作状态:ARM状态(32位)、THUM状态(16位)
工作状态的切换:BX RN 寄存器最后一位是0切换ABM状态,最后一位是1切换到THUM状态
(2)七种工作模式:用户模式、系统模式、管理模式、外部中断模式、快速中断模式、未定义指令模式、数据访问中止模式
后五个属于“异常模式”,后六属于“特权模式”
(3)ARM7的流水式作业:取指——译码——执行
采用冯诺依曼存储结构 ARM9流水式作业:取指——译码——执行——访存——回写 采用哈佛结构
(4)存储其结构(37个寄存器)
31个通用寄存器、6个标志位寄存器 1.R0~R7八个通用寄存器(7种模式通用)2.R8~R12前六种公用,最后一种自己用一组 3.R13:堆栈指针
R14:子程序连接寄存器(子程序调用时自动将下一条地址送给R14),这两个寄存器用户模式、系统模式公用一组,异常模式每种各一组 4.R15,:PC计数器
5.CPSR:程序状态寄存器 N.V.C.Z.Q.I.F.T.M4~M0 6.SPSR:程序状态备用寄存器,调用子程序将当前CPSR复制给SPSR,用户模式与系统模式没有,异常模式每种一组。
(5)存储类型;
数据类型三种:8位字节、16位半字、32位字
指令类型:16位THUM、32位ARM 大端格式:与正常存储方式相反
小端格式:高字节对应高地址,低字节对应低地址(6)多级存储形式:寄存器组、片上RAM、CASHE、主存储器
(7)异常:(其中异常模式类似于中断)1.种类:按优先级排列
复位、数据中止、FIQ、IRQ、指令预取终止、未定义指令终止、SWI(软件中止)2.异常的相应过程:
保护返回地址:将下一条地址复制到LR子程序连接寄存器中;
保护当前状态寄存器的值:复制CPSR至将要执行模式的SPSR;
强行设置异常模式下CPSR的值;
强制PC从中断向量地址取出指令执行;
可以设置中断禁止位;
3.中断的返回
将返回的值写入PC中
恢复CPSR的值
清除冲断禁止位
4.异常返回地址的确定(LR 在复制时已自动减4)
(1)软件中止:直接返回(2)未定义指令:直接返回
(3)FIQ、IRQ、指令预取中止:均减四返回
(4)数据中止:减八返回
(8)寻址方式
立即寻址:MOV R0, #0xFF00(8位位图)寄存器寻址:MOV R2, R3 寄存器移位寻址:MOV R0, R1, LSL#4(6种类型的移位操作)
寄存器间接寻址:LDR R1,[R2] 变址寻址:LDR R0, [R1,#8](前变址寻址);
LDR R0, [R1,#8]!(自动变址寻址); LDR R0, [R1], #2(后变址寻址)
堆栈寻址:STMFD SP!, {R4-R7, LR}(4种类型的堆栈操作)块复制寻址:LDMIA R1!,{R2-R4,R5}(4种块复制寻址操作)
相对寻址:BL SUBR(9)指令集: 数据传送:MOV、MVN 算术运算:ADD、ADC、SUB、SBC、RSB、RSC、MUL、MLA、UMULL、UMLAL、SMULL、SMLAL 逻辑运算:AND、ORR、EOR、BIC 比较和测试:CMP、CMN ARM程序状态访问指令:MSR ARM存储器访问指令
单一数据:LDR、STR、LDRB、STRB 批量数据:LDM、STM(IA、IB、DA、DB)数据交换:SWP ARM分支指令:B、BL、BX(10)伪指令与程序设计 1.伪指令
ADR:小范围加载指令,将相对偏移量加载到某个寄存器中,只能用一条指令来实现,若不能用一条指令来实现则编译错误
ADRL:中范围加载指令,将PC的相对偏移量加载到某个寄存器中,必须用两条指令来实现,LDR:将某个32位偏移量加载到寄存器中
声明变量:
全局变量:GBLA,GBLL,GBLS 局部变量:LCLA,LCLL,LCLS 变量赋值:SETA,SETL,SETS 声明寄存器列表:RLIST 数据定义伪指令:DCB DCDU DCWU 分配一块字节内存单元伪操作SPACE(%)格式:标号 SPACE expr 或 标号 % expr 声明数据缓冲池(文字池)伪操作LTORG 格式: LTORG 段指示伪操作AREA 格式:AREA 段名 {,属性1} {,属性2}… 程序入口伪操作ENTRY 格式:ENTRY(11)基本ATPCS规则
1.子程序调用过程中寄存器的使用规则
子程序间通过寄存器R0~R3来传递参数
在子程序中,使用寄存器R4~R11来保存局部变量 寄存器R12用作子程序内部调用的scratch寄存器 寄存器R13用作数据栈指针,记作sp或SP 寄存器R14用作链接寄存器,记作lr或LR 寄存器R15是程序计数器,记作pc或PC。2.数据栈的使用规则;
数据栈为满递减FD类型,并对数据栈的操作是8字节对齐的
3.参数的传递规则。
(a)参数个数可变的子程序参数传递规则
(b)参数个数固定的子程序参数传递规则(c)子程序结果返回规则
四、存储器与接口技术
1.SRAM:静态随机访问存储
(1)组成:地址线、数据线、读写控制、片选信号线(2)工作原理:读写均先输送地址,在进行数据的输入和输出
(3)SRAM与CPU的链接: 2.DRAM:
有行地址和列地址,工作时有地址锁存器,先输送行地址在输送列地址,选中单元后输送单元,读数据时需要刷新电路
3.SDRAM:与SRAM相比多了同步时钟信号,同时增添了BLOCK,地址分行地址、列地址,也需要刷新电路,BLOCK为最大读写单元,引脚BA选择块儿 4.FLASH:
(1)NOR FLASH:存储容量绞小,读速度较快,采用线性寻址,可直接找到存储位置
(2)HAND FLASH:存储密度大,写入和擦除速度较快,有BLOCK存储单元,有块儿地址,页地址,页内地址,数据地址线复用,传送地址需要四个周期
5.MCS-51单片机
P0口作为地址线低八位和数据线,所以需要地址锁存器,p0口分时复用,由ALE管理,P2输出地址高八位,PSEN接程序存储器使能端OE 进行存储其扩展时可用与门或者先选来链接存储器片选信号进行扩展。
链接程序存储器数据存储器复用时,将PSEN 与RD相与和选通相连连 6.ARM(S3C2410)存储机制:
(1)与SRAM、DRAM相连(2)高速存储机制:CASHE(3)NMUI 接口设计:
(1)HAND FLASH启动:将地址前4KB 的代码作为启动代码
(2)ROM启动: 可选择16位或者32位的存储器,通过M1、M0进行选择 在与存储器进行连接时,注意地址线,若存储器为8位直接位位对应,16位是错开一位,32位时错开两位 7.接口 1.RS-232C 信号电平与逻辑
RS-232C信号采用负逻辑,即以+12V电平视为逻辑“0”,-12V电平视为逻辑“1”
串行接口电路中需要在TTL标准与RS-232C标准之间进行电平转换 2.SPI接口
总线定义及信号线构成 传输技术:同步、全双工
SPI采用同步、全双工串行传输技术,也称为同步串行总线接口;SPI总线(Serial Peripheral Interface)称为串行外围设备接口 3.USB 总线定义及信号线构成,半双工传输 三种设备Host、Device和HUB USB(Universal Serial Bus)即通用串行总线,主要用于PC与外围设备互连。USB的输出特性是差分驱动、支持半双工方式,接收采用差分接收 USB体系结构中包括三种设备 Host(即主控制器)Device(设备)
HUB(集线器,也是设备)4.I2C总线
总线定义及信号线构成,信号线连接方式 总线仲裁
I2C总线定义了两根传输线:SDA(串行数据)和SCL(串行时钟),都是双向传输线,通过电阻上拉到正电源,总线空闲时都是高电平5.I2S总线
总线定义及信号线构成 数据传输格式
I2S总线(Inter-IC Sound Bus集成电路内置音频总线 串行数据高位MSB在先,发送器和接收器可以有不同的字长无论有多少位有效数据,最高位MSB总是出现在IISLRCK变化后的第二个IISCLK脉冲处。MSB位置固定,LSB位置取决于字长。这就使得接收端与发送端可以不同的有效位数。如果接收端能处理的有效位数少于发送端的,则可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端的,则剩余低位自行补0。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错位
第五篇:嵌入式复习总结
一、嵌入式系统基本知识
1、什么是嵌入式系统、分层结构:根据IEEE(国际电气和电子工程师协会)的定义:嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置”,此定义是从应用上考虑的,嵌入式系统是软件和硬件的综合体,还可以涵盖机电等附属装置;一般定义:“以应用为中心、以计算机技术为基础、软件硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”;微机学会的定义:嵌入式系统是以嵌入式应用为目的的计算机系统。可分为系统级、板级、片级(系统级:各种类型的工控器、PC104模块;板级:各种类型的带CPU的主板及OEM产品;片级:各种以单片机、DSP、微处理器为核心的产品)。分层结构:嵌入式系统:硬件、驱动、操作系统、中间件、应用。
2、嵌入式系统与单片机、PC系统的区别:(单片机与嵌入式系统比较,一般没有操作系统,就没有办法同时运行多个任务,单片机总是运行单个任务)目前嵌入式系统的主流是以32位嵌入式微处理器为核心的硬件设计和基于实时操作系统(RTOS)的软件设计;单片机系统多为4位、8位、16位机,不适合运行操作系统,难以进行复杂的运算及处理功能;嵌入式系统强调基于平台的设计、软硬件协同设计,单片机大多采用软硬件流水设计;嵌入式系统设计的核心是软件设计(占70%左右的工作量),单片机系统软硬件设计所占比例基本相同;单片机学习一般从硬件入手,从硬件体系结构、汇编语言到硬件设计、软件设计;嵌入式系统学习可以从软件入手,从应用层编程到操作系统移植、硬件平台设计较好,按单片机设计的学习流程较难掌握。嵌入式系统与pc系统区别:嵌入式系统一般是专用系统,而PC是通用计算平台;嵌入式系统的资源比PC少得多;嵌入式系统软件故障带来的后果比PC机大得多;嵌入式系统一般采用实时操作系统;嵌入式系统大都有成本、功耗的要求;嵌入式系统得到多种微处理体系的支持;嵌入式系统需要专用的开发工具。
3、常见的嵌入式操作系统有哪些?可分为商用型和免费型。免费型:实时操作系统在价格方面具有优势,目前主要有Linux和μC/OS,稳定性与服务性存在挑战。Linux:是开放源码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾;Linux的内核小、功能强大、运行稳定、系统健壮、效率高,易于定制剪裁,在价格上极具竞争力;Linux不仅支持x86 CPU,还可以支持其他数十种CPU芯片。嵌入式Linux是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。主要有RTLinux和CLinux。商用型:实时操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、Palm OS等。VxWorks,是一种嵌入式实时操作系统,具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域牢牢占据着一席之地。特点是:可靠性、实时性和可裁减性;它支持多种处理器,如x86、i960、Sun Sparc、Motorola MC68xxx、MIPS、POWER PC等。Windows CE 3.0:一种针对小容量、移动式、智能化、32位、连接设备的模块化实时嵌入式操作系统;针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台,WindowsCE嵌入但不够实时,属于软实时操作系统;由于其Windows背景,界面比较统一认可;操作系统的基本内核需要至少200K的ROM。
4、嵌入式系统的特点:(1)系统内核小:由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限;(2)专用性强:嵌入式系统个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植;即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改;针对不同的任务,往往需要对系统进行较大更改,这种修改和通用软件的“升级”是完全不同的概念;(3)系统精简:嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全;(4)高实时性OS:这是嵌入式软件的基本要求,而且软件要求固态存储,以提高速度。软件代码要求高质量和高可靠性、实时性;(5)嵌入式软件开发走向标准化:嵌入式系统的应用程序可以没有操作系统直接在芯片上运行。为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量;(6)嵌入式系统需要开发工具和环境:其本身不具备自主开发能力,即使设计完成以后,用户通常也是不能对其中的程序功能进行修改,必须有一套开发工具和环境才能进行开发。
二、嵌入式系统的设计原则及开发方法:
1、软硬件协同设计概念:基于体系结构,对系统的软件、硬件进行详细设计,为了缩短产品开发周期,设计往往是并行的(既是先从逻辑入手,设计出功能模块,最后再区分是由硬件还是软件来实现该功能)。举例:SOC系统:嵌入式片上系统,结合许多功能区块,将功能坐在一个芯片上,微处理器核心是通信接口单元等。SOC是追求产品系统最大包容的集成器件,最大特点是成功实现了软硬件无缝结合,直接在处理器片内嵌入操作系统的代码模块,运用VHDL等硬件描述语言,不需要像传统系统设计一样,绘制庞大复杂的电路板,一点一点的连接焊制,只需使用精确的语言,综合时序设计,直接在器件库中调用各种通用处理器标准,通过仿真后,可交付芯片厂家进行生产。
2、项目开发生命周期:(识别需求-提出解决方案-执行项目-结束项目)。系统开发步骤:系统需求分析(规格说明书):确定设计任务和目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。系统的需求一般分功能性需求和非功能性需求两方面。功能性需求是系统的基本功能,如输入输出信号、操作方式等;非功能需求包括系统性能、成本、功耗、体积、重量等因素。体系结构设计:描述系统如何实现所述的功能和非功能需求,包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型等。一个好的体系结构是设计成功与否的关键。硬件/软件协同设计:基于体系结构,对系统的软件、硬件进行详细设计。为了缩短产品开发周期,设计往往是并行的。系统集成:把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进单元设计过程中的错误。系统测试:对设计好的系统进行测试,看其是否满足规格说明书中给定的功能要求。
三、ARM处理器体系结构:
1、冯·诺依曼体系结构:程序和数据共用一个存储空间,CPU无法同时访问程序和数据;哈佛体系结构:程序和数据分开存放,CPU可以同时访问程序存储器和数据存储器。(2)CISC:复杂指令集,具有大量的指令和寻址方式;8/2原则:80%的程序只使用20%的指令;大多数程序只使用少量的指令就能够运行。RISC:精简指令集,在通道中只包含最有用的指令;确保数据通道快速执行每一条指令;使CPU硬件结构设计变得更为简单。(3)体系结构与处理器的区别:知识产权核(IP核):电路或核是设计好并经过验证的集成电路功能单元;IP复用意味着设计代价降低(时间,价格);ARM体系结构是知识产权,是IP核的一种,并不是某一具体的芯片,而微处理器一般指与RAM、ROM等硬件固化在一起的某一类芯片。(4)IP核的种类:Soft Cores(“code”)(软核):HDL语言描述;灵活度高,可修改;与工艺独立,可根据具体的加工工艺重新综合;IP很难保护。Firm cores(“code+structure”)(固核):逻辑综合后的描述,与工艺相关。Hard cores(“physical”)(硬核):物理综合后的描述,准备流片,包含工艺相关的布局和时序信息,IP很容易保护,多数的处理器和存储器。
2、ARM的七种基本工作模式:User用户模式:非特权模式,大部分任务执行在这种模式*正常程序执行的模式;FIQ快速中断模式:当一个高优先级(fast)中断产生时将会进入这种模式*高速数据传输和通道处理;IRQ外部中断模式:当一个低优先级(normal)中断产生时将会进入这种模式*通常的中断处理;Supervisor管理模式:当复位或软中断指令执行时将会进入这种模式*供操作系统使用的一种保护模式;Abort数据访问中止模式: 当存取异常时将会进入这种模式*虚拟存储及存储保护;Undef未定义指令中止模式: 当执行未定义指令时会进入这种模式*软件仿真硬件协处理器;System系统模式: 使用和User模式相同寄存器集的特权模式,特权级的操作系统任务。注意:模式之间的转换实际上是寄存器组之间的切换,当使用某种寄存器组,就进入了某种相应的工作模式。(1)寄存器组织(37 寄存器):31 个通用32位寄存器,包括未分组寄器R0-R7、分组寄存器R8-R14、程序计数器PC(R15);6 个状态寄存器。15个通用寄存器(R0 to R14), 以及1或者2个状态寄存器和程序计数器在任何时候都是可以访问的;可访问的寄存器取决于处理器的模式;其它寄存器的状态在支持IRQ, FIQ, 管理员, 中止和未定义模式处理时被切换。*FIR要求速度要快,故其专用的寄存器最多。(2)R0 到 R15 可以直接访问;R0 到 R14 是通用寄存器;R13: 堆栈指针(sp)(通常);每种处理器模式都有单独的堆栈;R14: 链接寄存器(lr);R15 包含程序计数器(PC);CPSR:当前程序状态寄存器,包括代码标志状态和当前模式位;5个SPSRs(程序状态保存寄存器):当异常发生时保存CPSR状态;SPSR和CPSR的功能是:保存ALU当前操作信息、控制允许和禁止中断、设置处理器操作模式。(3)程序状态寄存器:*条件位:N = 1-结果为负,0-结果为正或0;Z = 1-结果为0,0-结果不为0;C =1-进位,0-借位;V =1-结果溢出,0结果没溢出。*中断禁止位:I=1:禁止IRQ;F=1:禁止FIQ。*T Bit:仅ARM xT架构支持;T = 0:处理器处于ARM状态;T=1:处理器处于Thumb状态。*Mode位(处理器模式位):0b10000 User;0b10001 FIQ;0b10010 IRQ;0b10011 Supervisor;0b10111 Abort;0b11011 Undefined;0b11111 System。(4)程序指针PC(r15):当处理器执行在ARM状态:所有指令 32 bits 宽;所有指令必须 word 对齐;所以 pc值由bits [31:2]决定, bits [1:0] 未定义(所以指令不能halfword / byte对齐)。当处理器执行在Thumb状态:所有指令 16 bits 宽;所有指令必须 halfword 对齐;所以 pc值由bits [31:1]决定, bits [0] 未定义(所以指令不能 byte对齐)。
3、ARM的异常:(1)异常定义:内部或外部中断源产生并引起处理器处理一个事件,如外部中断或试图执行未定义指令都会引起异常。处理异常之前必须保留处理器的状态。(2)异常的类型:复位RESET:当处理器的复位电平有效时,产生复位异常,程序跳转到复位异常的处理程序处执行;DABT数据中止:若处理器数据访问指令地址不存在或该地址不允许当前指令访问,产生异常;FIQ快速中断请求:当快速中断请求引脚有效,且CPSR中F=0,产生异常;IRQ外部中断请求:当外部中断请求引脚有效,且且CPSR中I=0;PABT指令预取中止:若预取指令地址不存在或该地址不允许当前的指令访问,存储器向处理器发出中止信号,但是只有当取指的指令被执行时,才产生异常;UDEF未定义指令:当处理器或协处理器遇到不能处理的指令时产生该异常,可利用该机制进行软件仿真;SWI软件中断:由执行SWI指令产生,用于用户模式下的程序调用特权操作指令,利用该异常机制实现系统功能调用。(3)异常处理过程(只能在ARM态执行,若进入异常前是Thumb态,进入异常后转为ARM态,返回后自动进入Thumb):当异常产生时,处理器执行以下动作:改变处理器状态进入 ARM 态;改变处理器模式进入相应的异常模式;保存返回地址到 LR_
5、ARM状态和Thumb状态关系:在程序的执行过程中,微处理器可以随时地在两种工作状态之间切换且不影响处理器的工作模式和相应寄存器的内容。Thumb状态是ARM状态的一个映射,最终也要映射成ARM指令来执行,但字长较小,提高空间利用率,低功耗,节省代码空间,用于便捷设备,不能用于异常模式;ARM微处理器在开始执行代码时,应该处于ARM态。进入Thumb态操作:当操作数寄存器的状态位为1时,执行BX指令,从ARM态进入Thumb态。当处于Thumb态时发生异常,则异常返回时,自动切换回到Thumb态。进入ARM态操作:当操作数寄存器的状态位为0时,执行BX指令进入ARM态。此外当进行异常处理时,把PC指针放入异常模式链接寄存器R14中,并从异常向量地址开始执行程序,也能切换到ARM态;Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集。
四、ARM指令集:
1、ARM编程模型:(1)3级指令流水线技术:几个指令可以并行执行,提高了CPU的运行效率;内部信息流要求通畅流动(为了增加处理器指令流速度,提高运行效率);允许多个操作同时处理,比逐条指令执行要快;PC指向正被取指的指令,而非正在执行的指令。(2)存储器模式:大端模式(字数据的高位字节存储在低地址中,字数据的低字节则存放在高地址中)和小端模式。(3)数据和指令类型:ARM采用32位架构;ARM约定:字节8位,半字16位,字32位;大部分ARM核提供ARM指令集和Thumb指令集(T变种);Jazelle 核支持Java bytecode(J变种,4TEJ),所有指令8位宽,处理器执行字存取,一次取4条指令。
2、指令结构:采用冯•诺依曼体系结构,需要把指令从存储器加载到寄存器,没有专门的IO指令,故存在load/store结构——从存储器中读某个值,操作完后再将其放回存储器中。指令分类:a.数据处理指令–使用和改变寄存器的值;b.数据传送指令–把存储器的值拷贝到寄存器中(load)or 把寄存器中的值拷贝到存储器中(store);c.控制流指令 :分支、分支和链接, 保存返回的地址,以恢复最先的次序、陷入系统代码。
3、ARM与Thumb指令的关系:(1)Thumb指令的特点:Thumb 指令的长度为 16 位,是针对代码密度问题而提出的;所有的 Thumb 指令和编程模型与ARM指令和编程模型相对应;Thumb 子程序和 ARM 子程序就可以互相调用;Thumb 指令集中的操作数和指令地址仍为32 位 ;大多数的 Thumb指令是无条件执行的,而几乎所有的 ARM 指令都是有条件执行的;Thumb不是一个完整的体系结构,不能指望处理器只执行Thumb指令集而不支持ARM指令集。(2)Thumb 指令与ARM 指令的时间效率和空间效率关系 :Thumb 代码所需的存储空间约为ARM 代码的60%~70%;Thumb 代码使用的指令数比ARM 代码多约30%~40%;若使用32 位的存储器,ARM 代码比Thumb 代码快约40%;若使用16 位的存储器,Thumb 代码比ARM 代码快约40%~50%;与ARM 代码相比较,使用Thumb 代码,存储器的功耗会降低约30%。
五、典型的ARM核芯片结构:
1、LPC2000系列处理器结构:LPC2000系列微控制器将ARM7TDMI配置为小端模式;内部存储器包括无等待SRAM和Flash;系统功能包括维持芯片工作的一些基本功能,如系统时钟、复位等;向量中断控制器(VIC)可减少中断响应时间,最多可管理32个中断请求;外部存储器控制器(EMC)支持4个BANK的外部SRAM和Flash,每个BANK最大16MB;I2C串行接口为标准I2C总线接口,支持最大速度400KB;具有两个完全独立的SPI控制器;具有两个UART接口,均包含16字节的接受/发送FIFO,内置波特率发生器,UART1具调制解调接口功能;LPC2119/2129/2290/2292包含CAN总线接口;看门狗定时器;通用IO,可受5V电压,每个IO口可独立设置为输入输出模式;PWMO脉宽调制器,可灵活设置,以适应不同的场合,单边沿/双边沿输出方式,频率、占空比可调;实时时钟,具可编程积存时钟分频器,以适应不同的晶振频率。
2、LPC处理器的启动过程:一般在32位ARM应用系统中,大多数采用C语言进行软件编程,但是在运行应用代码前需要进行系统初始化,常用一汇编文件做启动代码,它可以实现异常向量表定义、堆栈初始化、系统变量初始化、地址重映射等操作。
3、时钟编程方法:
4、存储器映射控制原理:用于控制地址范围为0x0000-0x0037存储区域的重新映射,该区域存放着异常向量表,发生异常时,程序总是跳转到地址为0x0000-0x0037的对应入口处,而实际异常向量表可能存在内部Flash、SRAM、Boot Block,为了让运行在不同存储器空间的程序对异常进行控制,可通过存储器映射控制,将位于不同存储空间的异常向量表重新映射到固定地址0x0000-0x0037处,以实现异常向量表的来源控制,通过设置存储器映射控制寄存器的值来实现。流程:内核产生的地址0x0000-0x0037,经过地址转换器后,映射到物理存储器的地址空间(0x80000000-0x80000037(外部存储器)/0x7FFFE000-0x7FFFE037(Boot Block)/0x40000000-0x40000037(内部SRAM)/0x00000000-0x00000037(内部Flash))。
5、存储器加速模块MAM:
6、外部存储器控制器(EMC):EMC模块为AHB系统总线和外部存储器件之间提供了一个接口;EMC支持4个独立配置的存储器组,每个最大支持16MB,支持字节定位读取。
7、GPIO:特性:可独立控制每个GPIO的方向(输入、输出模式);可独立设置每个GPIO的输出状态;所有GPIO复位后,默认为输入态。IOxPIN[0-31]: GPIO引脚值;IOxDIR[0-31]:方向控制位,写入1-输出,0-输入; IOxSET[0-31]: 输出置位,写入1-高电平,0-无效;IOxCLR[0-31]:写入1-清零,0-无效。示例:设置P0.0输出高电平代码:PINSEL0 &=0xFFFFFFFC;//设置引脚连接模块,P0.0为GPIO IO0DIR |=0x00000001;IO0SET=0x00000001;
8、UART0
六、实时操作系统概念及操作系统原理:
1、概念:(1)实时系统:(指任务要求在限定时间内完成)如果逻辑和时序出现偏差将会引起严重后果的系统。(2)软实时系统:系统的宗旨是使各个任务运行得越快越好,并不要求限定某一任务必须在多长时间内完成。(3)硬实时系统:各任务不仅要执行无误而且要做到准时。(4)前后台系统:或超循环系统,应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为。后台也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作一定是靠中断服务来保证的。(5)代码的临界段:也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。(6)资源:任何为任务所占用的实体都可称为资源。资源可以是输入输出设备或一个变量,结构,数组等。(7)共享资源:可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥。(8)多任务:多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换、调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实时应用中,多任务化的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更容易设计与维护。(9)任务状态:典型地、每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中。挂起状态也可以叫做等待事件态WAITING,指该任务在等待,等待某一事件的发生,(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来或等待超时信号的到来以结束目前的等待,等等)。最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。(10)任务切换:当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区,也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。(11)内核:多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。(12)调度:是内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。每个任务根据其重要程度的不同被赋予一定的优先级。基于优先级的调度法指,CPU总是让处在就绪态的优先级最高的任务先运行。(13)不可剥夺型内核:要求每个任务自我放弃CPU的所有权。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。优点是响应中断快;几乎不需要使用信号量保护共享数据。缺陷在于其响应时间,高优先级的任务已经进入就绪态,但还不能运行,要等,也许要等很长时间,直到当前运行着的任务释放CPU。无法保证系统的实时性。(14)可剥夺型内核:最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。保证了系统的实时性。(15)可重入型函数:可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用局部变量,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要予以保护。可重入型函数的例子:void strcpy(char *dest, char *src){
while(*dest++ = *src++){;} *dest=NUL;}
不可重入型函数的例子:int Temp;
void swap(int *x, int *y){ Temp= *x;*x = *y;*y=Temp;}
使用以下技术之一即可使Swap()函数具有可重入性:把Temp定义为局部变量;调用Swap()函数之前关中断,调动后再开中断;用信号量禁止该函数在使用过程中被再次调用。如果中断发生在Swap()函数调用之前或调用之后,两个任务中的X,Y值都会是正确的。(16)时间片轮番调度法:当两个或两个以上任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度,然后切换给另一个任务。(17)任务优先级:是表示任务被调度的优先程度。每个任务都有其优先级。任务越重要,赋予的优先级应越高。(18)静态优先级:应用程序执行过程中诸任务优先级不变,在静态优先级系统中,诸任务以及它们的时间约束在程序编译时是已知的。(19)动态优先级:应用程序执行过程中,任务的优先级是可变的,实时内核应当避免出现优先级反转问题。(20)优先级反转:优先级高和优先级低的任务在运行时,由于共享资源的占用问题,而出现的优先级反转问题,即在执行过程中,优先级高的任务反而要等优先级低的任务先运行完后,释放共享资源,才能运行。纠正的方法:提高正在使用共享资源的任务的优先级,但耗费CPU时间;内核能自动变换任务的优先级,称优先级继承,但是UCOSII不支持。(21)任务优先级分配:单调执行率调度法RMS:基于哪个任务执行的次数最频繁,执行最频繁的任务优先级最高(22)任务互斥:实现任务间通讯最简便到办法是使用共享数据结构,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。与共享资源打交道时,使之满足互斥条件最一般的方法有:关中断;使用测试并置位指令TAS;禁止做任务切换;利用信号量。(23)信号量:信号量实际上是一种约定机制,用于:控制共享资源的使用权(满足互斥条件);标志某事件的发生;使两个任务的行为同步。注意:信号,只取两个值0和1的信号量;计数器型,值有多种形式。对信号量只能实施三种操作:初始化(INITIALIZE),也可称作建立(CREATE);等信号(WAIT)也可称作挂起(PEND);给信号(SIGNAL)或发信号(POST)。信号量初始化时要给信号量赋初值,等待信号量的任务表(Waiting list)应清为空。P/V操作:P操作既是减1操作,任务执行等待(WAIT)操作,有可能执行P操作;V操作既是加1操作,任务以发信号操作(SIGNAL)释放信号量。(24)死锁:也称作抱死,指两个任务无限期地互相等待对方控制着的资源。最简单的防止发生死锁的方法是让每个任务都:先得到全部需要的资源再做下一步的工作;用同样的顺序去申请多个资源;释放资源时使用相反的顺序。(25)同步:可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。单向同步:任务与中断服务之间/两任务之间;双向同步:两任务之间可以用信号量同步它们的行为,两个任务需要互相等待对方执行,等待自身所需的事件发生(信号量),同步执行。(26)任务间的通讯:有时很需要任务间的或中断服务与任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。用全程变量时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量(如前面提到的那样)。(27)消息邮箱:通过内核服务可以给任务发送消息。典型的消息邮箱也称作交换消息,是用一个指针型变量,通过内核服务,一个任务或一个中断服务程序可以把一则消息(即一个指针)放到邮箱里去。同样,一个或多个任务可以通过内核服务接收这则消息。发送消息的任务和接收消息的任务约定,该指针指向的内容就是那则消息。内核一般提供以下邮箱服务:邮箱内消息的内容初始化,邮箱里最初可以有,也可以没有消息;将消息放入邮箱(POST);等待有消息进入邮箱(PEND);如果邮箱内有消息,就接受这则消息。如果邮箱里没有消息,则任务并不被挂起(ACCEPT),用返回代码表示调用结果,是收到了消息还是没有收到消息。消息邮箱也可以当作只取两个值的信号量来用。邮箱里有消息,表示资源可以使用,而空邮箱表示资源已被其它任务占用。(28)消息队列:消息队列用于给任务发消息。消息队列实际上是邮箱阵列。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入消息队列的消息,即先进先出原则(FIFO)。然而μC/OS-Ⅱ也允许使用后进先出方式(LIFO)。内核提供的消息队列服务如下:消息队列初始化。队列初始化时总是清为空;放一则消息到队列中去(Post);等待一则消息的到来(Pend);如果队列中有消息则任务可以得到消息,但如果此时队列为空,内核并不将该任务挂起(Accept)。如果有消息,则消息从队列中取走。没有消息则用特别的返回代码通知调用者,队列中没有消息。
2、任务的组成:代码、TCB、私有堆栈。一个任务通常是一个无限的循环,绝不会返回的,但可通过调用函数自我删除,也可建立新任务。
3、OS的内核原理:(1)任务状态图(任务状态的切换过程):睡眠态(DORMANT)指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理,把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。当任务一旦建立,这个任务就进入就绪态准备运行。任务的建立可以是在多任务运行开始之前,也可以是动态地被一个运行着的任务建立。如果一个任务是被另一个任务建立的,而这个任务的优先级高于建立它的那个任务,则这个刚刚建立的任务将立即得到CPU的控制权。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。就绪的任务只有当所有优先级高于这个任务的任务转为等待状态,或者是被删除了,才能进入运行态。正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。等待的时间过去以后,系统服务函数OSTimeTick()使延迟了的任务进入就绪态。正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。当任务因等待事件被挂起(Pend),下一个优先级最高的任务立即得到了CPU的控制权。当事件发生了,被挂起的任务进入就绪态。事件发生的报告可能来自另一个任务,也可能来自中断服务子程序。正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断服务态(ISR)。响应中断时,正在执行的任务被挂起,中断服务子程序控制了CPU的使用权。中断服务子程序可能会报告一个或多个事件的发生,而使一个或多个任务进入就绪态。在这种情况下,从中断服务子程序返回之前,μC/OS-Ⅱ要判定,被中断的任务是否还是就绪态任务中优先级最高的。如果中断服务子程序使一个优先级更高的任务进入了就绪态,则新进入就绪态的这个优先级更高的任务将得以运行,否则原来被中断了的任务才能继续运行。当所有的任务都在等待事件发生或等待延迟时间结束,μC/OS-Ⅱ执行空闲任务(idle task),执行OSTaskIdle()函数。(2)局部结构——任务控制块TCB:一旦任务建立了,任务控制块OS_TCBs将被赋值。任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。实际上,任务状态的改变就是修改TCB的过程,OS_TCBs全部驻留在RAM中。任务建立的时候,OS_TCBs就被初始化了。应用程序中可以有的最多任务数(OS_MAX_TASKS)是在文件OS_CFG.H中定义的。这个最多任务数也是μC/OS-Ⅱ分配给用户程序的最多任务控制块OS_TCBs的数目。将OS_MAX_TASKS的数目设置为用户应用程序实际需要的任务数可以减小RAM的需求量。所有的任务控制块OS_TCBs都是放在任务控制块列表数组OSTCBTbl[]中的。μC/OS-Ⅱ分配给系统任务OS_N_SYS_TASKS若干个任务控制块,供其内部使用。目前,一个用于空闲任务,另一个用于任务统计。在μC/OS-Ⅱ初始化的时候,所有任务控制块OS_TCBs被链接成单向空任务链表。当任务一旦建立,空任务控制块指针OSTCBFreeList指向的任务控制块便赋给了该任务,然后OSTCBFreeList的值调整为指向下链表中下一个空的任务控制块。一旦任务被删除,任务控制块就还给空任务链表。(3)全局结构——就绪表:将任务放入就绪表程序清单: OSRdyGrp |= OSMapTbl[prio >> 3];
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间。程序清单:从就绪表中删除一个任务
if((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07])== 0)OSRdyGrp &= ~OSMapTbl[prio >> 3];
程序清单:找出进入就绪态的优先级最高的任务
y = OSUnMapTbl[OSRdyGrp];x = OSUnMapTbl[OSRdyTbl[y]];
prio =(y << 3)+ x;以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。算法理解:预先根据结构,先算好屏蔽字,做好准备,再利用二进制的特点,将优先级与查表得出的屏蔽字进行逻辑操作,得出xy值,再对就绪表的相应位进行置位或清零操作,完成对就绪表的修改。利用屏蔽字是为了提高查找就绪表的速度。4)任务调度算法:void OSSched(void){ INT8U y;OS_ENTER_CRITICAL();
if((OSLockNesting | OSIntNesting)== 0){ y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy =(INT8U)((y << 3)+ OSUnMapTbl[OSRdyTbl[y]]);if(OSPrioHighRdy!= OSPrioCur){
OSTCBHighRdy= TCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OS_TASK_SW();} } OS_EXIT_CRITICAL();}
μC/OS-Ⅱ任务调度所花的时间是常数,与应用程序中建立的任务数无关。
4、空闲任务(Idle Task):μC/OS-Ⅱ总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。空闲任务[OSTaskIdle()]永远设为最低优先级。空闲任务OSTaskIdle()什么也不做,只是在不停地给一个32位的名叫OSIdleCtr的计数器加1,统计任务使用这个计数器以确定现行应用软件实际消耗的CPU时间。空闲任务不可能被应用软件删除,但可以通过时间中断唤醒其他任务进入就绪态后,退出空闲任务。
5、统计任务:提供运行时间统计的任务,叫做OSTaskStat(),如果用户将系统定义常数OS_TASK_STAT_EN设为1,这个任务就会建立。一旦得到了允许,OSTaskStat()每秒钟运行一次,计算当前的CPU利用率。注意:在调用系统启动函数OSStart()之前,用户初始代码必须先建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立应用程序中的其它任务。
6、μC/OS-Ⅱ初始化:μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构。OSInit()建立空闲任务idle task,统计任务OSTaskStat()并且让其进入就绪态。以上两个任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。还初始化了4个空数据结构缓冲区:空任务控制块缓冲区、空事件表、空队列表、空存储区。先做好准备,目的是为了保证CPU的运行速度。注意:初始化后数据结构:包括就绪表、优先级表、空闲任务和统计任务TCB、及其各自私有堆栈。
7、μC/OS-Ⅱ的启动:程序清单初始化和启动μC/OS-Ⅱ: void main(void){ OSInit();/* 初始化uC/OS-II */..通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;..OSStart();/* 开始多任务调度!OSStart()永远不会返回 */}
8、任务数据结构:void YourTask(void *pdata){ for(;;){ /* 用户代码 */ 调用µC/OS-Ⅱ的服务例程之一: OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/* 用户代码 */ } } 或void YourTask(void *pdata){ /* 用户代码 */ OSTaskDel(OS_PRIO_SELF);}
9、事件控制块ECB:一个数据结构(类似TCB),包含了事件本身的定义,如用于信号量的计数器,用于指向邮箱的指针,以及指向消息队列的指针数组等,还定义了等待该事件的所有任务的列表。分为OSEventGrp/OSEventTbl两个变量。任务调度算法也和TCB相似。程序清单:将一个任务插入到事件的等待任务列表中 pevent->OSEventGrp |= OSMapTbl[prio >> 3];pevent->OSEventTbl[prio >> 3] |= OSMapTbl[prio & 0x07];其中,prio是任务的优先级,pevent是指向事件控制块的指针。
该算法的原理:任务优先级的最低3位决定了该任务在相应的.OSEventTbl[]中的位置,紧接着的3位则决定了该任务优先级在.OSEventTbl[]中的字节索引。该算法中用到的查找表OSMapTbl[]一般在ROM中实现。(1)在µC/OS-II中,事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定。在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化。因为信号量、邮箱和消息队列一旦建立就不能删除,所以事件控制块也不能放回到空闲事件控制块链表中。(2)对于事件控制块进行的一些通用操作包括:初始化一个事件控制块;使一个任务进入就绪态;使一个任务进入等待该事件的状态;因为等待超时而使一个任务进入就绪态。为了避免代码重复和减短程代码长度,µC/OS-II将上面的操作用4个系统函数实现,它们是:OSEventWaitListInit(),OSEventTaskRdy(),OSEventWait()和OSEventTO()。
10、µC/OS-II系统多任务的意义:多任务使事件简单化,任务与任务之间的关系使松耦合而不是紧耦合,每个任务只要考虑当前事件,而不需考虑全局事件,全局事件由操作系统来考虑,利用操作系统的一些通讯机制,将多个任务联系起来共同完成一个功能,同时采用多人机制,OS可以同时运行多个应用程序,提高了CPU的使用效率。
11、操作系统在嵌入式系统中的地位:操作系统在嵌入式系统中扮演管理者的角色,主要任务使完成多任务之间的调度和同步,同时也是上层应用软件和底层硬件的接口,负责全部软硬件资源的分配和回收、控制与协调等并发活动。同时嵌入式实时操作系统提高了系统的可靠性;提高了开发效率,缩短了开发周期,嵌入式RTOS充分发挥了32位CPU的多任务潜力。
12、文件系统:(定义)处理文件的操作系统的部分称为文件系统.是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用。功能:文件的构造、命名、存取、保护等。(2)基于NAND FLASH的嵌入式文件系统:FLASH读写的特点:必须以Page为单位进行读写;写之前必须先擦除原有内容;擦除操作必须对Block进行,即一次至少擦除一个Block的内容。针对这种情况,将Flash的一个Page定为1个扇区,将其1个Block,32个扇区定为一个簇,这样,簇的容量刚好为512*32=16K,满足FAT16对簇大小的要求。(3)FLASH文件系统的要求:掉电安全、平均使用、高效垃圾回收、低空间消耗:指文件系统管理结构在FLASH存储器上的空间消耗,该空间用于FS建立,而不能用于实际数据的存储,可以提高有用数据的存储空间。(4)FLASH文件系统的分类:集中管理文件系统、线性文件系统、日志文件系统。(5)几种开源文件系统:TFS(Tiny File System):线性结构的文件系统,优点:TFS提供了掉电安全机制和垃圾回收机制。需要额外的辅助空间,用于垃圾回收时的文件缓存和过程状态,如果出现终止,系统根据辅助空间的信息进行文件系统的恢复。缺点:文件的插入、剪切和个性需要较大的运行开销,即使是很小的修改,也要求将整个文件重写。JFFS:主要针对NOR型Flash存储器设计,提供了掉电安全,平均使用等特性,是基于Linux,由于遵循GPL开放源代码,易实现移植。日志文件系统;提供了更好的崩溃、掉电安全保护;jffs2支持对flash的均匀磨损;在扇区级别上执行闪存擦除/写/读操作功能较好;文件系统接近满时,JFFS2 会大大放慢运行速度——垃圾收集。Nand上yaffs文件系统的优势:专门为Nand flash设计的日志文件系统;jffs/jffs2不适合大容量的Nand flash;jffs的日志通过jffs_node建立在RAM中,占用RAM空间:对于128MB的Nand大概需要4MB的空间来维护节点;启动的时候需要扫描日志节点,不适合大容量的Nand flash;FAT系统没有日志。(6)NAND和NOR——性能比较:NOR和NAND是现在市场上两种主要的非易失闪存技术。NOR的读速度比NAND稍快一些;NAND的写入速度比NOR快很多;NAND的擦除速度远比NOR的快;大多数写入操作需要先进行擦除操作;NAND的擦除单元更小,相应的擦除电路更少。接口差别:NOR flash带有SRAM接口,线性寻址,可以很容易地存取其内部的每一个字节;NAND flash使用复用接口和控制IO多次寻址存取数据;NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作易于取代硬盘等类似的块设备。容量和成本:NAND flash生产过程更为简单,成本低;常见的NOR flash为128KB~16MB,而NANDflash通常有8~128MB;NOR主要应用在代码存储介质中,NAND适合于数据存储;NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。可靠性和耐用性:在NAND中每块的最大擦写次数是100万次,而NOR的擦写次数是10万次;位交换的问题NAND flash中更突出,需要ECC纠错;NAND flash中坏块随机分布,需要通过软件标定——产品量产的问题。(7)FAT:FAT32容量:位数,32位;最大簇数目,268,453,456;每簇大小4KB-32KB;最大磁盘容量,2^41(2T)。FAT文件系统基本结构:保留区 Reserved region,存放引导记录,BIOS信息等;FAT 区,FAT信息列表(12/16/32 bits);根目录区,目录信息列表(32 bytes);文件和目录区,存放簇信息。典型FLASH文件系统的结构:系统记录-文件分配表-文件登记表-数据区域。文件系统的操作流程:打开文件OpenOSFile-操作文件ReadOSFile/WriteOSFile-关闭文件CloseOSFile。
13、GUI技术:GUI的定义:Graphics User Interface, 是指计算机与其使用者之间的图形化对话接口。GUI的主要特征:——Windows,采用窗口界面,每个窗口是用户或系统的一个工作区域。一个屏幕上可以有多个窗口。——Icons,采用形象化的图标或图符,易于操作者理解与操作。——Menu,采用菜单,可供用户选择的功能提示。——Pointing Devices,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。嵌入式GUI的特点:体积小;功能强;图形算法简洁、快速,占用系统资源少;可靠性高;模块结构,便于移植和定制。MiniGUI:支持 GB2312 与 BIG5 字集;支持多种格式字体,例如:TrueType、Adobe Type1等;GUI函数(MoveTo、LineTo、FillBox、Rectangle、Circle、TextOut、DrawText..等)。
14、C/OS的性能特点:公开源代码;可移植性(Portable),绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 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)。这种可剪裁性是靠条件编译实现的;占先式(Preemptive);多任务,C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务;可确定性,全部C/OS-II的函数调用与服务的执行时间具有可确定性;任务栈,每个任务有自己单独的栈,C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求;系统服务,C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等;中断管理,中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层;稳定性与可靠性。相关系统函数: OS_ENTER_CRITICAL();进入临界区,关中断 OS_EXIT_CRITICAL();退出临界区,开中断 OSInit();系统初始化 OSStart();可启动多任务,运行进入就绪态的优先级最高的任务 OSIntEnter()OSIntExit()OSSchedLock();给任务调度上锁 OSSchedUnlock();给任务调度解锁 OSTaskIdle()任务: OSTaskDel(INT8U prio);非空闲任务删除,使被删除任务返回并处于休眠态,释放TCB OSTaskCreat(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);建立任务4个参数,不能由中断服务来建立任务 OSTaskCreatExt();上述的扩展版,更为灵活,9个参数 OSTaskChangPrio()改变任务优先级,不改变任务状态 OSTaskResume(INT8U prio);恢复任务 OSTaskQurery();获得有关任务的信息 OSTaskSuspend(INT8U prio);挂起任务,只能通过OSTaskResume()来恢复 时间: OSTimeDly();任务延时一定的时钟节拍 OSTimeDlyHMSM();任务延时一定毫秒、秒、分、小时 OSTimeDlyResume();取消延时,若原先任务调用延时函数,该函数可让任务进入就绪态,而不必等到等待期满 OSTimeGet()/OSTimeSet();系统时钟获取和设置 OSTimeTick();时钟节拍函数 信号量 OSSemCreat(void *addr, INT32U nblks ,INT32U blksize, INT8U *err);建立一个信号量 OSSemPend();等待一个信号量 OSSemPost();发送一个信号量 OSSemAcccept();无等待地请求一个信号量,若信号量暂时无效,也可以让任务简单返回而不是进入睡眠状态 OSSemQurery();查询一个信号量的当前状态 邮箱(函数意义同上)OSMBoxCreat(void *msg); OSMBoxPost(OS_EVENT *pevent, void *msg); OSMBoxAcccept(OS_EVENT *pevent); OSMBoxPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);OSMboxQuery(OS_EVENT *pevent, OS_MBOX_DATA *pdata)消息队列 OSQCreat(); OSQPost();先进先出原则 OSQPend()OSQPostFront();后进先出原则 OSQFlush();清空一个消息队列 OSQAcccept(); OSQQurery()与FLASH存储器的接口函数: 块擦除:unsignde char Erase_Cluster(unsigned int cluster)页写入:int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)页读出:Void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
文件系统相关接口函数: 初始化文件系统:Void
initOSFile(char filename[],U32 OpenMode)
读文件到缓冲区:U32ReadOSFile(FILE *pfile,U8 *Read Buffer, U32 n Readbyte)把缓冲区内容写入文件:U32WriteOSFile(FILE *pfile,U8 *Write Buffer, U32 n Writebyte)
关闭文件,释放缓冲区:Void CloseOSFile(FILE *pfile)常见API函数:
数据队列:
QueueCreat();建立数据队列
QueueWriteFront();先进先出方式发送数据 QueueWrite();以后进先出方式发送数据 QueueRead();获取队列中的数据 QueueFlush();清空队列
QueueNData();获取队列中已存储的数据的数目 QueueSize();获取队列共可以存储数据的数目 串口驱动:
UART0Init();初始化UART0 UART0Putch();发送一个字节 UART0Write();发送多个字节 UART0Getch();接受一个字节 调制解调器模块
ModemInit();初始化
GetModemState();获取Modem状态
ModemWrite();通过Modem发送多个字节数据 ModemGetch();从Modem获取一个字节数据 ModemDiaUp();通过Modem拨号 ModemDiaDown();挂断Modem I2C:
I2CInit(); I2CWrite(); I2CRead(); SPI:
SPIInit();初始化
GetSPI Flag();获取SPI状态 SPIStart();开始访问SPI
SPIRW();通过SPI发送并接受一个数据 SPIEND();访问SPI结束
1、为了保证系统实时性,UCOII采用了哪些策略。答:占先式内核、准备工作、就绪表机制。
2、你认为设计嵌入式操作系统对硬件是否有要求?硬件支持软件,如果CPU,没有定时器,OS时间片管理就无法实现;Linux的虚拟内存功能,ARM上没有该存储器,就无法运行Linux。
3、UCOSII操作系统的就绪表用何种机制保证其实时性不受任务个数的限制?UCOSII是占先式实时多任务内核,优先级最高的任务准备就绪则拥有CPU的所有权,开始投入运行;不支持时间片轮转法,ARM指令集:数据处理指令:
算术操作:ADD r0, r1, r2 ;r0 := r1 + r2 ADC r0, r1, r2 ;r0 := r1 + r2 + C SUB r0, r1, r2 ;r0 := r1r2 + C1
按位逻辑操作: AND r0, r1, r2 ;r0 := r1 and r2 ORR r0, r1, r2 ;r0 := r1 or r2
EOR r0, r1, r2 ; r0 := r1 xor r2
BIC r0, r1, r2 ;r0 := r1 and(not)r2
比较操作: CMP r1, r2 ; r1-r2,并根据结果更改CPDR中条件标志位 CMN r1, r2 ;r1 + r2,并根据结果更改CPDR中条件标志位 TST r1, r2 ; r1 and r2,并根据结果更改CPDR中条件标志位 TEQ r1, r2 ; r1 xor r2,并根据结果更改CPDR中条件标志位 寄存器移位: MOV r0, r2 ;r0 := r2 MVN r0, r2 ;r0 := not r2
立即数操作: ADD r3, r3, #3 ;r3 := r3 + 3 AND r8, r7, #&ff ;r8 := r7[7:0] & for hex
移位寄存器操作数:ADD r3, r2, r1, LSL #3 ;r3 := r2 + 8 x r1
ADD r5, r5, r3, LSL r2 ;r5 := r5 + 2rx r3
移位操作:LSR/LSL逻辑移位 ASR不等于LSR;LSR=ASL算术移位 ROR 不带进位循环右移,RRX带进位循环右移
乘法:(1)32位 MUL r4, r3, r2 ;r4 := [r3 x r2]<31:0> MLA r4, r3, r2, r1 ;r4 := [r3 x r2 + r1] <31:0>
最低 32-bits 置于结果寄存器中,其余被忽略;不支持第二立即操作数;结果寄存器与源寄存器必须不同。
(2)64位 SMULL RO,R1,R2,R3;R0=(R2*R3)的低32位 R1=(R2*R3)的高32位 SMLAL R0,R1,R2,R3;R0=(R2*R3)的低32位+R0 R1=(R2*R3)的高32位+R1
UMULL和UMLAL 指令同上,不过是64位的无符号数乘法和乘加指令 单指令传送(LDR, STR):
LDR r0, [r1, #4] ;r0 := mem32[r1 +4] 基址+偏移量寻址
LDR r0, [r1, #4]!; r0 := mem32[r1 + 4];r1 := r1 + 4自动变址寻址 LDR r0, [r1], #4 ;r0 := mem32[r1];r1 := r1 + 4后变址寻址 LDR r0, [r1] ; r0 := mem32[r1] 寄存器间接寻址 STR r0, [r1] ; mem32[r1] := r0 寄存器间接寻址
LDRB r0, [r1] ; r0 := mem8[r1] 字节传送,寄存器间接寻址 示例:COPY:ADR r1, TABLE1;r1 points to TABLE1 ADR r2, TABLE2;r2 points to TABLE2 LOOP: LDR r0, [r1] 另外:LDR r0, [r1], #4 STR r0, [r2] STR r0, [r2], #4 ADD r1, r1, #4 ADD r2, r2, #4
多数据传送指令(LDM, STM):使用于:堆栈;上下文切换: 保存或重新存储工作寄存器;块拷贝:在主存储器中移动大数据块。
LDMIA r1, {r0, r2, r5} ;r0 := mem32[r1];r2 := mem32[r1 + 4];
r5 := mem32[r1 + 8]
IA:每次传送后地址加1;IB:传送前地址加1; DA:传送后地址减1;DB:传送前地址减1。
单数据交换(SWAP):在寄存器和外部存储器之间交换字节或字。
条件执行:所有ARM指令都可以条件执行,执行与否取决于CPSR中的N/Z/C/V标志位,所有Thumb指令都可以解压称全部条件指令;同时以上指令后加“S”后结果影响CPSR中的条件标志位。控制和分支指令:分支和分支连接:跳到希望的指令中;保存当前的PC并返回(with ‘L’ bit)。分支和交换:跳到期望的指令中与指令集交换。PSR 指令:程序状态寄存器访问指令(MRS, MSR):MRS 程序状态寄存器到通用寄存器的数据传送指令;MSR 通用寄存器到程序状态寄存器的数据传送指令。中断向量表的程序:
AREA Boot,CODE,READONLY
ENTRY
B Reset_handler B Undef_Handler B SWI_Handler
B PreAbort_Handler B.;for reserved interrupt,stop here B IRQ_handler B FIQ_handler
嵌入式系统的软/硬件框架:
每个任务优先级是唯一的,查找准备就绪的最高优先级的任务并执行上下文切换;UCOSII任务调度所花的时间为常数,与应用程序中建立的任务数无关。
4、消息机制对于多任务系统的意义?使两个任务独立性增强,耦合比较松散。
5、内核涉及的数据结构(就绪表、TCB、优先级表)。
6、生产者、消费者: P(s){if(s<1)wait();s--} V(s){s++;}