1、1v软件的结构和组成v监控程序vBSPv软件系统的设计方法v软件的移植2#include main() printf(“hello,worldn”);31.嵌入式操作系统。2.操作系统与应用软件的集成。3.软件的结构。4.嵌入式系统的软件是没有出口的,程序不能“退出”,整个程序的结构应该是无限的循环。5.嵌入式系统的软件设计需要考虑硬件的支持、操作系统的支持、程序的初始化和引导等诸多的方面。6.嵌入式系统的软件可能没有操作系统,在裸机上直接开发。 4v初始化引导代码v板级支持包v操作系统v通信协议栈v图形用户界面v应用软件56v初始化引导代码是任务嵌入式系统上电复位后第一个执行的代码 v复位向
2、量 80186:FFFF0H MCS51:0 ARM:0v执行: 自检 引导操作系统 进入初始化(硬件、软件)7vAT平台的标准化v嵌入式系统平台的多样化vBSP的功能 用户定制的系统各不相同 用户定制的系统主要部分相同v含有存储器、定时器、中断等操作系统运行所需的基本部件 嵌入式操作系统与用户定制硬件平台之间的接口8v复杂系统需要嵌入式操作系统的支持v简单系统可以不使用嵌入式操作系统v嵌入式操作系统可裁减 嵌入式操作系统的内核v处理机管理(任务、任务之间的通信和同步等)v存储器管理 完整的嵌入式操作系统v内核v文件系统v人机界面v设备驱动等9v协议栈对于具有网络功能的嵌入式系统产品是必要的,
3、目前嵌入式协议栈的提供有两种方式, 一种是独立的第三方协议栈产品, 一种是嵌入式操作系统的提供商提供协议栈产品。v协议栈的运行必须基于嵌入式操作系统的平台支持,但是并不意味着协议栈必须依赖于嵌入式操作系统的API。事实上,许多的嵌入式协议栈,如inter niche的嵌入式TCP/IP协议栈做到了与操作系统的最大独立性,可以与大多数嵌入式操作系统集成运行。10v嵌入式系统的应用软件一般需要自主开发,不同的嵌入式系统的应用软件各具特色和功能。 例如常用的应用软件用于PDA上,记事本、通讯录、计算器等。 应用于工业现场总线领域的应用软件如控制软件等。 应用软件的开发基于操作系统、网络通信协议栈、图
4、形用户接口、文件系统等一系列的低层API。 11v对于大多数嵌入式系统,图形用户接口是必要的,特别是随身设备如PDA、手机等。vGUI运行在嵌入式操作系统之上。用户开发的与用户交互的应用软件通过调用GUI的功能调用(API)来实现。 12v监控程序是运行在嵌入式系统中的一段代码,具有与用户进行交互,管理系统资源的功能,具有操作系统内核的一小部分功能。嵌入式系统正式运行时,通常不需要监控程序的干预。v目前开发嵌入式系统,监控程序的作为正在减少,只用在一些小的嵌入式系统中。v有的嵌入式控制器的制造商把监控程序驻留在ROM中提供给用户在开发时使用,提供的功能如程序下载、调试、固化等。 如motoro
5、la公司的某些8位嵌入式微控制器13v嵌入式操作系统运行的必要条件 ROM空间 RAM空间 定时器 中断 堆栈14vBSP的运行流程 1. 复位向量入口,此时中断是禁止的; 2. 设置处理器的工作模式,通常使用复位时的缺省模式; 3. 设置RAM和ROM的工作参数,包括DRAM的刷新参数、地址空间分配等,到此嵌入式系统的处理器和存储器子系统可以达到运行状态; 4. 设置操作系统运行所需要的数据段、堆栈空间等; 5. 设置中断向量,中断向量的设置根据需要进行,也可以在其它的时候设置,但是一定要在中断允许之前完成设置; 6. 操作系统的初始化; 7. 进入用户的应用;15v1. 跳转到INT_re
6、set;系统上电复位程序入口;v2. 执行Int_Initialize;v3. 执行Inc_Initialize;v4. 进入应用程序入口Application_Initialize。16startINT_resetINT_initializeINC_Initializeapplication_initialize过程调用17v(1) 初始化处理器的硬件寄存器;v(2) 设置处理器的片上译码器的寄存器,为FLASH,RAM,I/O等分配存储空间。 18v(1) 设置必要的处理器/系统控制寄存器;v(2) 初始化中断向量表;v(3) 设置系统堆栈指针;v(4) 设置定时器中断;v(5) 计算定时
7、器的优先级和堆栈;v(6) 计算出可用的存储器的首地址;v(7) 跳转到INC_Initialize,初始化所有的系统组件。19v操作系统的初始化: 初始化操作系统的每一个组件, 初始化完成后进入Application_Initialize, 进入用户开发的应用程序。 这一部分代码不需要用户编写。20v用户的应用:应用程序入口Application_Initialize() /* to do: 用户编写的应用程序 */ 211.无操作系统的嵌入式软件设计2.有操作系统的嵌入式软件设计221.前后台系统2.中断(事件)驱动系统3.巡回服务系统4.基于定时器的巡回服务系统231.后台:应用程序是一
8、个无限循环,巡回地执行多个事件,完成相应的操作。这一部分软件称为后台。通常在主程序main()中被调用。2.前台:中断服务程序处理异步事件,这一部分可以看成是前台。v后台可以称为任务级,前台可以称为中断级。强实时性的的关键操作一定要用中断来实现。24main()/* 硬件初始化 */ while(1) /* 后台程序 */ action1();action2();action3(); action_1()/* 执行动作n */ action_n()/* 执行动作n */25Isr_1() /* 中断1的中断服务程序 */ Isr_n() /* 中断2的中断服务程序 */ 26v实时性问题(不好
9、) 中断服务程序提供的数据(实时性数据)只有在后台轮询到的时候才能得到运行v应用 小系统:v微波炉v电话机v玩具等27v原理 整个嵌入式系统软件由中断服务程序构成 主程序完成系统的初始化工作v应用 低功耗系统设计 事件驱动系统v构成 主程序-完成系统的初始化 中断服务例程-完成事务处理28main() /*完成系统的硬件初始化和数据结构的初始化(如果必要的话)*/* to do: 系统的初始化 */ while(1) 。其它代码或 enter_low_power(); /*进入低功耗状态*/ 29Isr_n() /* 其中的一个中断服务程序 */* to do: 处理中断事件 */ /* to
10、 do: 中断返回 */30v应用: 嵌入式处理器/控制器的中断源不多 解决方案v增加中断源-需要硬件,成本高v软件方案-软件巡回服务main() /* to do: 系统初始化 */ while(1) action_1();/*巡回检测事件1并处理事件*/ action_2();/*巡回检测事件2并处理事件*/ action_n();/*巡回检测事件n并处理事件*/ 31v普通巡回服务系统的缺点1. 处理器全速运行,开销大-功耗高-电池供电系统2. 降低处理器的工作时间-基于定时器的巡回服务系统v构成1. 主程序2. 定时器中断服务程序32main() /* to do: 系统初始化 */
11、/* to do: 设置定时器,如自动重新加载方式 */ while(1) 。其它代码或 enter_low_power(); 33Isr_timer() /* 定时器的中断服务程序 */action_1(); /*执行事件1的处理*/action_2(); /*执行事件2的处理*/action_n(); /*执行事件n的处理*/34v使用操作系统的目的: 如其设计一个复杂的程序处理多个事件,不如为每个事件设计一个简单的任务,任务由操作系统自动、可靠地管理和控制。 加速开发-部分工作由操作系统完成 减少工作量-利用操作系统的功能 系统设计可靠-操作系统经过运行的考验 简化系统设计-设计简单的任
12、务35v基本概念1. 嵌入式操作系统2. 进程: process3. 线程: thread4. 过程: procedure;子程序;函数5. 任务: task6. 作业: job361.分时系统:嵌入式linux2.实时系统1. 实时性1.硬实时2.软实时2. 任务调度方式1.非抢占式2.抢占式37v缺点:无法保证事务处理的优先级v应用:PDA等不需要实时处理的应用3839v系统组成1. 任务v用户任务v系统任务2. 操作系统的任务调度器v操作系统的任务调度器根据任务的优先级进行调度任务的执行3. 引起任务调度的因素v硬件中断v定时器溢出v任务之间的通信和同步等 其它程序(主程序、子程序等)4
13、0v调度方法:to be continued41v非抢占式调度1. 系统总是运行最高优先级的任务2. 低优先级的任务运行时,高优先级的任务不能中断低优先级的任务3. 系统简单,操作系统的开销小4. 实时性差v抢占式调度1. 系统总是运行最高优先级的任务2. 一旦高优先级的任务就绪,低优先级的任务被中断3. 系统复杂,操作系统的开销大4. 实时性好421.无操作系统的嵌入式软件架构2.使用嵌入式操作系统的目的3.决策:用 or 不用4.嵌入式操作系统的基本概念43vContents 考虑移植的必要性 裸机系统的软件移植 操作系统与应用软件整体移植v移植案例:uC/OSII 应用软件的移植 可移植
14、应用软件的设计思路441.基于嵌入式处理器的原因处理器的更新方式v兼容机更新方式-量变,短时间80 x86系列v新的体系结构代替旧的体系结构-质变,长时间dragon ball:EZ,VZ: 68000体系,SZ:ARM体系2.基于嵌入式操作系统的原因旧的操作系统淘汰,新的操作系统被开发出来应用软件需要运行于不同的嵌入式操作系统平台上45v硬件: Z80,STD总线工业PCv软件: DOS的DCSwindows平台、Vxworks平台461.裸机系统的特点通常比较简单使用汇编语言或C语言开发2.不易移植的情况汇编语言开发跨平台模块化差47应用软件输入/输出模块处理器硬件应用软件硬件抽象层处理器
15、硬件输入/输出模块硬件相关481.硬件抽象层具有与硬件密切相关性;2.硬件抽象层具有与操作系统无关性;3.接口定义的功能应包含硬件或系统所需硬件支持的所有功能;4.接口定义简单明了,太多接口函数会增加软件模拟的复杂性;5.具有可测性的接口设计有利于系统的软硬件测试和集成。应用软件硬件抽象层处理器硬件输入/输出模块491.软件硬件并行、协同设计2.分析接口的数据传输特性(双向/单向数据传输,字节型/数据帧型传输模式);3.分析接口配置属性;4.定义接口所需的相关函数。50vRS232串行通信接口 发送功能 接收功能 模式、参数设置功能 控制功能v对于MCS51,8251,16450/16550,
16、etc设计同样的接口函数, uart_put(uint8 ch, uint8 c); uart_get(uint8 ch, uint8 *buf); uart_puts(uint8 ch, uint8 *pstr); uart_gets(uint8 ch, uint8 *pbuf); uart_init(uint8 ch, uint8 rate, uint8 data_len, uint8 check, uint8 start_bit, uint8 stop_bit); 51v初始化uartuart_init()v发送一个字符uart_put()v接收一个字符uart_get()52v主机 从
17、uart接收字符,并发回uartv终端 从键盘上输入字符,屏幕上回显53main() /*主机程序*/ init_uart(); while(1) c=uart_get(); uart_put() 54main() /*终端程序*/ init_uart(); while(1) c=key_get();/* read keyboard */ uart_put(); uart_get(); printf(); 55v系统组成 操作系统 应用软件v移植工作 I/O接口驱动程序的移植 BSP5657v请参见uc/OSII书籍58v两种情况 操作系统更换了,但是硬件(处理器)没有变化主要移植应用软件v例
18、:一个应用运行于NT平台上,一直到安全性更高的Vxworks平台上 硬件平台和操作系统都更换了需移植应用软件和设备驱动程序v例:原来的Z80系列的STD总线的工控机更新为AT总线的计算机,操作系统也随着更新59v可移植条件(1)应用软件是层次化设计的;(2)应用软件是模块化设计的;(3)源代码 vs 二进制码。60v易移植系统的结构 基于虚拟机层的结构应用软件OS1OS2OS4OS3操作系统抽象层611.实际的嵌入式操作系统2.各种嵌入式操作系统的API可能不同3.提供的功能大体相同任务之间的通信与同步任务的管理中断设备等如:nucleus plus, Vxworks, etc应用软件OS1O
19、S2OS3操作系统抽象层62v功能和作用 屏蔽了不同的嵌入式操作系统的API的多样性 提供了目前可用的嵌入式操作系统的功能v设计原则 1)最大限度地支持流行的嵌入式操作系统; 2)利用现有的嵌入式操作系统易于实现虚拟层; 3)支持未来的扩展; 4)虚拟层可裁减,如任务之间的通信有信箱、队列、管道,虚拟层应实现这三种方式,如果应用系统不使用其中的一种方式,可以去掉,以减少代码量; 5)尽量不要降低实际的操作系统的性能; 6)尽量不要屏蔽实际操作系统的先进功能和特性; 7)如果可能的话,使用标准的操作系统接口,如posix标准可能是一个很好的选择。应用软件OS1OS2OS3操作系统抽象层63任务1
20、任务26465应用软件的设计特点v与操作系统的无关性v把与操作系统紧密相关的部分单独在一个文件中实现,例如实现一个文件OS_dependent.c,该文件中定义了虚拟的操作系统API。在使用实际的操作系统时,利用实际的操作系统实现虚拟系统,进行软件移植时,只需要修改虚拟操作系统的实现v为了移植的方便,一些代码尽量使用标准的C语言实现,不要使用操作系统特定的代码。例如大多数嵌入式操作系统实现了队列的通信方式,在开发实际应用软件时,如果不使用系统提供的队列方式,自己开发,那么以后的移植工作就可以减少移植的难度和工作量。在系统编译的时候,把不同的操作系统代码裁减掉,以减少代码占用的存储器空间。应用软
21、件OS1OS2OS3操作系统抽象层66v嵌入式系统开发的初期考虑移植问题v设计原则 层次化 模块化 层次化与模块化的结合 可设计硬件抽象层 可设计操作系统抽象层676869701.硬件抽象层(请见前面)2.操作系统抽象层71应用软件操作系统应用软件操作系统操作系统抽象层方案1:操作系统抽象层方案2:把与操作系统有关的代码单独写在一个文件中目的:为了移植的方便72v定义抽象层使用的可移植的数据类型,不要使用标准的数据类型,因为标准C语言的数据类型是不可移植的,如int类型,在不同的编译器中长度不同;v分析不同的操作系统提供的功能;v把功能分成必须的功能和可选的功能,必须的功能在所有的操作系统中都
22、具有,可选的功能只有在部分操作系统中具有;v分析操作系统提供的服务的数据类型,设计抽象层的数据类型,必须考虑到抽象层使用的数据类型,利用实际的操作系统的数据类型可以实现;v定义操作系统抽象层提供的服务函数及其接口参数。73datatype.h /* 基本数据类型 */typedef unsigned char BOOLEAN;typedef unsigned char UINT8;typedef signed char INT8;typedef unsigned short UINT16; typedef signed short INT16; typedef unsigned int UIN
23、T32;typedef signed int INT32;typedef float FP32;typedef double FP64;可移植数据类型的定义可移植数据类型的定义74 /* to do: 包含实际操作系统的头文件 */* to do: 可移植数据类型的定义 */* to do: 裁减定义 */* to do: 任务管理功能的定义 */* to do: 定义任务之间的通信:信箱、队列、管道等 */* to do: 定义任务之间的同步:信号量(semaphore)、事件组(event)、信号(signal) */* to do: 定义定时器功能 */* to do: 定义分区存储器管
24、理 */* to do: 定义文件系统 */* to do: 定义输入/输出系统和设备驱动 */75 v关于头文件 在移植文件中,包含实际的操作系统的头文件v关于可移植的数据类型 C语言可移植 int 表示什么?v#define Unsigned8 unsigned charv关于裁减定义-使用编译控制实现 #define USE_PIPELINE 1 /* 1:使用管道操作;0:不使用管道操作 */v关于抽象操作系统的功能定义(实现) 利用实际的操作系统的API实现抽象操作系统的API76v优点 可移植性好v缺点 效率低v例子: ODBC77v嵌入式系统的软件结构 裸机系统 含有操作系统的复杂系统 关于嵌入式应用软件的移植问题 可移植系统的设计78v针对于每一种(共4种)裸机系统的设计方法,各举一个应用的例子,并用类C语言描述你的方案v熟悉嵌入式操作系统的基本概念和术语79