770 likes | 986 Views
嵌入式系统设计与实例开发 ——ARM 与 C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴. 第十次课:嵌入式系统的软件体系结构设计 时间: 11.24 地点:三教 2101 第十一次课:实验五、嵌入式系统的文件管理 时间: 12.01 地点:软件学院实验楼 第十二次课:实验六、列表框和文本框 时间: 12.08 地点:软件学院实验楼 第十三次课:实验七、综合实验 时间: 12.15 地点:软件学院实验楼 第十四次课:嵌入式技术研讨(参加同学另行通知)
E N D
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴
第十次课:嵌入式系统的软件体系结构设计 时间:11.24 地点:三教2101 第十一次课:实验五、嵌入式系统的文件管理 时间:12.01 地点:软件学院实验楼 第十二次课:实验六、列表框和文本框 时间:12.08 地点:软件学院实验楼 第十三次课:实验七、综合实验 时间:12.15 地点:软件学院实验楼 第十四次课:嵌入式技术研讨(参加同学另行通知) 时间:12.22 地点:三教2101 第十五次课:嵌入式技术应用综合演示及复习考试 时间:12.29 地点:三教2101 第十六次课:考试 时间:01.05 地点:三教2101或其他 课程安排
胡显刚 赵泓峰 孙 薇 曹 岩 张 华 李 军 杨 密 陈让宽 王 浩 刘 淼(北航) 嵌入式论坛(时间12.21)
七、基于ARM的嵌入式 系统软件结构设计
C/OS-II的特点 C/OS-II的移植 GUI的实现 文件系统的实现
公开源代码 可移植性(Portable) 绝大部分C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得UC/OS-II便于移植到其他微处理器上。UC/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处理器(DSP)上运行。 可固化(ROMable) UC/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),UC/OS-II可以嵌入到读者的产品中成为产品的一部分。 可裁剪(Scalable) 可以只使用UC/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个UC/OS-II调用,而另一个产品则使用了几乎所有UC/OS-II的功能,这样可以减少产品中的UC/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。 C/OS的性能(1)
占先式(Preemptive) 多任务 C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务,。 可确定性 全部UC/OS-II的函数调用与服务的执行时间具有可确定性。 任务栈 每个任务有自己单独的栈,UC/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。 系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。 稳定性与可靠性 C/OS的性能(2)
前后台系统 后台 前台 ISR 时间 ISR ISR
休眠、就绪、运行、挂起、被中断 任务 1 任务 2 任务 n …… 任务 控制 块1 任务 控制 块2 任务 控制 块n 寄存器 CPU CPU寄存器 多任务(MultiTask)
低优先级任务 (2) (1) ISR (3) TIME (4) 中断服务程序使 高优先级任务就绪 (5) (6) 高优先级任务 (7) 低优先级任务释放 CPU使用权 非占先式(Non-Preemptive)
中断服务程序使 高优先级任务就绪 低优先级任务 (2) (1) 高优先级任务 ISR (3) TIME (4) (5) 高优先级任务得到 CPU使用权 (6) 占先式(Preemptive)
所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。 COS-II在ARM7上的移植
处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在10—1000Hz之间) 处理器支承能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令 移植COS-II满足的条件
可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。 也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。 什么是可重入代码
程序1:可重入型函数 void swap(int *x, int *y) { int temp; temp=*x; *x=*y; *y=temp; } 可重入代码举例
程序2:非可重入型函数 int temp; void swap(int *x, int *y) { temp=*x; *x=*y; *y=temp; } 非可重入代码举例
在COS-II中,可以通过: OS_ENTER_CRITICAL () OS_EXIT_CRITICAL() 宏来控制系统关闭或者打开中断。这需要处理器的支持。 在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。 打开/关闭中断
COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。 本系统工作在60MHz的主频下,定时器的中断的频率为1000Hz。也就是系统的响应时间为1ms。 处理器支持中断并且能产生定时中断
COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。 处理器支持硬件堆栈
设置OS_CPU.H中与处理器和编译器相关的代码 用C语言编写六个操作系统相关的函数(OS_CPU_C.C) 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM) C/OS-II在S3C44B0X上的移植
OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。 与 ARM处理器相关的代码,使用 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 宏开启/关闭中断 设施堆栈的增长方向 :堆栈由高地址向低地址增长 设置与处理器和编译器相关的代码
void *OSTaskStkInit (void (*task)(void *pd),void *pdata, void *ptos, INT16U opt) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelHook (OS_TCB *ptcb) void OSTaskSwHook (void) void OSTaskStatHook (void) void OSTimeTickHook (void) 后5个函数为钩子函数,可以不加代码 用C语言编写六个操作系统相关的函数
OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR() 用汇编语言编写四个与处理器相关的函数
相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。 关于移植
系统外围设备的硬件部分包括: 液晶显示屏(LCD) 触摸屏 USB TCP/IP 键盘 海量Flash存储器 系统的时钟和日历。 系统外围设备的硬件部分
驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分离开来。硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了。而不会影响到API函数的功能,更不会影响到用户的应用程序。驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分离开来。硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了。而不会影响到API函数的功能,更不会影响到用户的应用程序。 uCOS-II中使用信号量、邮箱等机制进行协调。 驱动程序模块
以uCOS-II的消息队列派生出来的系统消息传递机制。用来实现系统的各个任务之间,用户应用程序的各个任务之间以及用户应用程序和系统的各个任务之间的通讯。以uCOS-II的消息队列派生出来的系统消息传递机制。用来实现系统的各个任务之间,用户应用程序的各个任务之间以及用户应用程序和系统的各个任务之间的通讯。 液晶显示屏(LCD)的刷新任务、系统键盘扫描任务。这两个任务是操作系统的基本任务,随着操作系统的启动而运行。 用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户的要求。
GUI的定义 Graphics User Interface, 是指计算机与其使用者之间的图形化对话接口。 GUI的主要特征: ——Windows,采用窗口界面,每个窗口是用户或系统的一个工作区域。一个屏幕上可以有多个窗口。 ——Icons,采用形象化的图标或图符,易于操作者理解与操作。 ——Menu,采用菜单,可供用户选择的功能提示 ——Pointing Devices ,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。 GUI的概念
典型的GUI系统 • X-Window System—— Unix/Linux 上标准的图形界面 • X-Window的结构模型:采用客户/服务器式的结构模型。它由X协议,X服务器,客户和Xlib函数库组成。 X协议:客户与服务器间的网络通信协议 X 服务器:在图形工作站上运行的服务进程,它负责对显示器的输出,键盘和鼠标的输入进行管理。
体积小 占用系统资源少 系统独立,可移植性好 嵌入式GUI的特点
Compact X-Window System:可扩展性好、可移植性好,代码尺寸大 Microwindows :开放源码的嵌入式GUI软件,可移植性好,图形功能出色。 OpenGUI :自由软件。汇编实现的内核,并利用MMX指令进行了优化,OpenGUI运行速度非常快。支持 32 位处理器,可以在MS-DOS,QNX和Linux下运行。主要用来在这些系统中开发图形应用程序和游戏 Qt/Embedded: QT 库开发商Trolltech 推出的面向嵌入式系统的 QT 版本。可移植性好,价格较贵。 MiniGUI:自由软件,面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 Linux ,还可以运行在任何一种具有 POSIX 线程支持的 POSIX 兼容系统上 嵌入式GUI
可移植性好 模块化设计 开放源代码 图形界面漂亮 Qt/Embedded
不需 X Server 直接与 FrameBuffer 连接 API 与 Desktop 版相容。 采用 LGPL 授权方式 体积小 GTKFB
跨平台 不需 X Server 采用 FLTK Toolkits 支持 TrueType 字型 Microwindows
支持 GB2312 与 BIG5 字集 支持多种格式字体,例如:TrueType、Adobe Type1等。 GDI 函数 ( MoveTo、LineTo、FillBox、Rectangle、Circle、TextOut、DrawText ..等 ) MiniGUI
Tiny X Server 为 XFree86 Project 的一部分,体积比较大 Tiny X Server
嵌入式GUI的结构模型 用户模型 显示模型:图形在窗口上的基本显示模式 窗口模型:窗口如何显示及改变 用户模型:构造用户界面的工具及如何在屏幕 上组织各种图形对象,以及这些对 象之间如何交互的说明。 显示模型 窗口模型 嵌入式操作系统 嵌入式硬件平台 图形用户系统是由显示模型接口程序、窗口模型接口程序和用户模型接口程序共同组成的。
嵌入式GUI的基本结构 API层 中间层 硬件驱动层
图形用户界面的基本函数(MiniGUI) 窗口基本分四类,分别为主窗口、对话框、控件和主窗口中的子窗口
GUI的事件和消息驱动 消息驱动的应用程序的简单构架
控件 与Windows操作系统类似,控件是可视化开发的基础。对于开发应用程序的用户来说,控件是一个独立的组件,有着自己的显示方式、自己的动态内存管理模式,甚至有的控件还可以向系统发送自己的消息。用户不需要掌握控件的内部到底是如何工作的,只需通过控件提供的API函数,改变控件相应的属性,即可改变控件的显示方式。 控件的引入可以大大方便用户的开发,加速用户应用程序界面的编写速度。同时,也为运行在操作系统上的应用程序的界面提供了统一的标准,方便了使 用
ISO-8859、GB2312、Big5、UNICODE 矢量字体 基于矢量的的字体,称之为可缩放的字体,轮廓字体,或矢量字体。由于这些字体在存储时亦只存储了其轮廓,因此,在不同的缩放大小下依然能保持美观而不会出现“锯齿”。这点是很适合其完整地在Web上传输。一般说来,Logo、线形艺术作品、图表、动画、抽象艺术作品等凡较容易定义颜色区域的图形,用矢量图都能产生很好的效果。 字符集与字体支持
计算机是以处理数字为基础,如果要处理文字就需要规定一个编目系统用不同的数字来表示相应的字符。我们较为熟悉的有GB、GBK、BIG5、ASCII等等。由于编码不统一,这些编码系统之间经常相互冲突。事实上,两种编码可能使用相同的数字代表两个不同的字符;或者使用不同的数字代表相同的字符。计算机是以处理数字为基础,如果要处理文字就需要规定一个编目系统用不同的数字来表示相应的字符。我们较为熟悉的有GB、GBK、BIG5、ASCII等等。由于编码不统一,这些编码系统之间经常相互冲突。事实上,两种编码可能使用相同的数字代表两个不同的字符;或者使用不同的数字代表相同的字符。 基于Unicode的汉字字库
Unicode出现改变了这一切。Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。Unicode标准已经被这些工业界的领导们所采用,例如:Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys和其它许多公司。例如XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML等等。
在Unicode的双字节版本中(UTF-16)使用的是16位编码方式,可提供65,000多个字符代码指针。其编码容量可涵盖世界上几乎所有的语言,不仅包括拉丁语,希腊语,斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语,还包括中文,日文和韩文这样的象形文字,以及平假名,片假名,孟加拉语,泰米尔语,泰国语,老挝语等。目前还有大约8000个代码指针未用,可供扩展。在Unicode的双字节版本中(UTF-16)使用的是16位编码方式,可提供65,000多个字符代码指针。其编码容量可涵盖世界上几乎所有的语言,不仅包括拉丁语,希腊语,斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语,还包括中文,日文和韩文这样的象形文字,以及平假名,片假名,孟加拉语,泰米尔语,泰国语,老挝语等。目前还有大约8000个代码指针未用,可供扩展。
1.使用Unicode避免了乱码的产生,使得国际间文本数据交换成为可能。比如:在浏览网上信息时,常常会遇到页面上出现乱码的情况。1.使用Unicode避免了乱码的产生,使得国际间文本数据交换成为可能。比如:在浏览网上信息时,常常会遇到页面上出现乱码的情况。 2.解决了多语言文本同平面共存的问题。在传统的字符编码系统中,不能可能实现在同一个版面上显示多种语言文字。 3.实现了软件的全球化,避免了软件产品在贯穿多个平台、语言和国家时的重建。ASCII使用7位的编码单元,而GB使用16位和8位的变长度的编码单元。这都给软件在各个语言版本之间的编译带来的麻烦。而在Unicode的双字节版本中,无论是英文字母还是汉字或者其他字符,使用的都是16位的编码方式。
a.在图形操作系统中,字符(包括:中文、英文)通常有2种存储方式。一种方式存储的是字符的图形点阵。存储的是字符的图片。用16x16大小的图片,表示一个全角字符;用8x16大小的图片,表示一个半角字符。a.在图形操作系统中,字符(包括:中文、英文)通常有2种存储方式。一种方式存储的是字符的图形点阵。存储的是字符的图片。用16x16大小的图片,表示一个全角字符;用8x16大小的图片,表示一个半角字符。 b.另一种方式是存储汉字的矢量图形。比如:用样条的方式,拟合一个字符的所有的笔画轮廓。存储样条的关键点,来实现字符的存储。这两种方式各有优缺点:图形点阵字库,因为是图形子库,以图片方式存储,显示都很容易,而且,每个相同大小的字符存储所用空间是固定的,便于管理。但是,图形点阵字库不能任意的放大,在放大的时候边缘会产生锯齿。