Download presentation
Presentation is loading. Please wait.
1
嵌入式系统设计与实例开发 ——ARM与C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴
2
课程安排 第十次课:嵌入式系统的软件体系结构设计 时间:11.24 地点:三教2101 第十一次课:实验五、嵌入式系统的文件管理
时间: 地点:三教2101 第十一次课:实验五、嵌入式系统的文件管理 时间: 地点:软件学院实验楼 第十二次课:实验六、列表框和文本框 时间: 地点:软件学院实验楼 第十三次课:实验七、综合实验 时间: 地点:软件学院实验楼 第十四次课:嵌入式技术研讨(参加同学另行通知) 时间: 地点:三教2101 第十五次课:嵌入式技术应用综合演示及复习考试 时间: 地点:三教2101 第十六次课:考试 时间: 地点:三教2101或其他
3
嵌入式论坛(时间12.21) 胡显刚 赵泓峰 孙 薇 曹 岩 张 华 李 军 杨 密 陈让宽 王 浩 刘 淼(北航)
4
七、基于ARM的嵌入式 系统软件结构设计
5
C/OS-II的特点 C/OS-II的移植 GUI的实现 文件系统的实现
6
C/OS的性能(1) 公开源代码 可移植性(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)。这种可剪裁性是靠条件编译实现的。
7
C/OS的性能(2) 占先式(Preemptive) 多任务
C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有56个任务,。 可确定性 全部UC/OS-II的函数调用与服务的执行时间具有可确定性。 任务栈 每个任务有自己单独的栈,UC/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。 系统服务 C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。 稳定性与可靠性
8
前后台系统 后台 前台 ISR 时间 ISR ISR
9
多任务(MultiTask) CPU寄存器 任务 控制 块1 块2 块n 休眠、就绪、运行、挂起、被中断 1 2 n …… CPU 寄存器
10
非占先式(Non-Preemptive)
低优先级任务 ISR 高优先级任务 (1) (2) (3) (4) (5) (6) (7) 中断服务程序使 高优先级任务就绪 低优先级任务释放 CPU使用权 TIME
11
占先式(Preemptive) ISR 中断服务程序使 低优先级任务 高优先级任务就绪 (1) (2) 高优先级任务 (3) TIME
(4) (5) (6) 中断服务程序使 高优先级任务就绪 高优先级任务得到 CPU使用权 TIME
12
COS-II在ARM7上的移植 所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。
13
移植COS-II满足的条件 处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断
处理器支持中断,并且能产生定时中断(通常在10—1000Hz之间) 处理器支承能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令
14
什么是可重入代码 可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。
也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。
15
可重入代码举例 程序1:可重入型函数 void swap(int *x, int *y) { int temp; temp=*x;
*x=*y; *y=temp; }
16
非可重入代码举例 程序2:非可重入型函数 int temp; void swap(int *x, int *y) { temp=*x;
*x=*y; *y=temp; }
17
打开/关闭中断 在COS-II中,可以通过: OS_ENTER_CRITICAL () OS_EXIT_CRITICAL()
宏来控制系统关闭或者打开中断。这需要处理器的支持。 在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
18
处理器支持中断并且 能产生定时中断 COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。 本系统工作在60MHz的主频下,定时器的中断的频率为1000Hz。也就是系统的响应时间为1ms。
19
处理器支持硬件堆栈 COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。
20
C/OS-II在S3C44B0X上的移植 设置OS_CPU.H中与处理器和编译器相关的代码
用C语言编写六个操作系统相关的函数(OS_CPU_C.C) 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM)
21
设置与处理器和编译器相关的代码 OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。
与 ARM处理器相关的代码,使用 OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 宏开启/关闭中断 设施堆栈的增长方向 :堆栈由高地址向低地址增长
22
用C语言编写六个操作系统相关的函数 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个函数为钩子函数,可以不加代码
23
用汇编语言编写四个 与处理器相关的函数 OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()
24
关于移植 相对于其他的嵌入式操作系统,uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。
25
基于COS-II扩展RTOS的体系结构
26
系统外围设备的硬件部分 系统外围设备的硬件部分包括: 液晶显示屏(LCD) 触摸屏 USB TCP/IP 键盘 海量Flash存储器
系统的时钟和日历。
27
驱动程序模块 驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分离开来。硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了。而不会影响到API函数的功能,更不会影响到用户的应用程序。 uCOS-II中使用信号量、邮箱等机制进行协调。
28
以uCOS-II的消息队列派生出来的系统消息传递机制。用来实现系统的各个任务之间,用户应用程序的各个任务之间以及用户应用程序和系统的各个任务之间的通讯。
液晶显示屏(LCD)的刷新任务、系统键盘扫描任务。这两个任务是操作系统的基本任务,随着操作系统的启动而运行。 用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户的要求。
29
嵌入式GUI技术
30
GUI的概念 GUI的定义 GUI的主要特征: Graphics User Interface, 是指计算机与其使用者之间的图形化对话接口。
——Windows,采用窗口界面,每个窗口是用户或系统的一个工作区域。一个屏幕上可以有多个窗口。 ——Icons,采用形象化的图标或图符,易于操作者理解与操作。 ——Menu,采用菜单,可供用户选择的功能提示 ——Pointing Devices ,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。
31
典型的GUI系统 X-Window System—— Unix/Linux 上标准的图形界面
X-Window的结构模型:采用客户/服务器式的结构模型。它由X协议,X服务器,客户和Xlib函数库组成。 X协议:客户与服务器间的网络通信协议 X 服务器:在图形工作站上运行的服务进程,它负责对显示器的输出,键盘和鼠标的输入进行管理。
32
嵌入式GUI的特点 体积小 占用系统资源少 系统独立,可移植性好
33
嵌入式GUI Compact X-Window System:可扩展性好、可移植性好,代码尺寸大
Microwindows :开放源码的嵌入式GUI软件,可移植性好,图形功能出色。 OpenGUI :自由软件。汇编实现的内核,并利用MMX指令进行了优化,OpenGUI运行速度非常快。支持 32 位处理器,可以在MS-DOS,QNX和Linux下运行。主要用来在这些系统中开发图形应用程序和游戏 Qt/Embedded: QT 库开发商Trolltech 推出的面向嵌入式系统的 QT 版本。可移植性好,价格较贵。 MiniGUI:自由软件,面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 Linux ,还可以运行在任何一种具有 POSIX 线程支持的 POSIX 兼容系统上
34
Qt/Embedded 可移植性好 模块化设计 开放源代码 图形界面漂亮
35
GTKFB 不需 X Server 直接与 FrameBuffer 连接 API 与 Desktop 版相容。 采用 LGPL 授权方式
体积小
36
Microwindows 跨平台 不需 X Server 采用 FLTK Toolkits 支持 TrueType 字型
37
MiniGUI 支持 GB2312 与 BIG5 字集 支持多种格式字体,例如:TrueType、Adobe Type1等。
GDI 函数 ( MoveTo、LineTo、FillBox、Rectangle、Circle、TextOut、DrawText ..等 )
38
Tiny X Server Tiny X Server 为 XFree86 Project 的一部分,体积比较大
39
嵌入式GUI的结构模型 图形用户系统是由显示模型接口程序、窗口模型接口程序和用户模型接口程序共同组成的。
显示模型:图形在窗口上的基本显示模式 窗口模型:窗口如何显示及改变 用户模型:构造用户界面的工具及如何在屏幕 上组织各种图形对象,以及这些对 象之间如何交互的说明。 窗口模型 显示模型 嵌入式操作系统 嵌入式硬件平台 图形用户系统是由显示模型接口程序、窗口模型接口程序和用户模型接口程序共同组成的。
40
嵌入式GUI的基本结构 API层 中间层 硬件驱动层
41
图形用户界面的基本函数(MiniGUI)
窗口基本分四类,分别为主窗口、对话框、控件和主窗口中的子窗口
42
GUI的事件和消息驱动 消息驱动的应用程序的简单构架
43
控件 与Windows操作系统类似,控件是可视化开发的基础。对于开发应用程序的用户来说,控件是一个独立的组件,有着自己的显示方式、自己的动态内存管理模式,甚至有的控件还可以向系统发送自己的消息。用户不需要掌握控件的内部到底是如何工作的,只需通过控件提供的API函数,改变控件相应的属性,即可改变控件的显示方式。 控件的引入可以大大方便用户的开发,加速用户应用程序界面的编写速度。同时,也为运行在操作系统上的应用程序的界面提供了统一的标准,方便了使 用
44
控件与控件类
45
字符集与字体支持 ISO-8859、GB2312、Big5、UNICODE
矢量字体 基于矢量的的字体,称之为可缩放的字体,轮廓字体,或矢量字体。由于这些字体在存储时亦只存储了其轮廓,因此,在不同的缩放大小下依然能保持美观而不会出现“锯齿”。这点是很适合其完整地在Web上传输。一般说来,Logo、线形艺术作品、图表、动画、抽象艺术作品等凡较容易定义颜色区域的图形,用矢量图都能产生很好的效果。
46
基于Unicode的汉字字库 计算机是以处理数字为基础,如果要处理文字就需要规定一个编目系统用不同的数字来表示相应的字符。我们较为熟悉的有GB、GBK、BIG5、ASCII等等。由于编码不统一,这些编码系统之间经常相互冲突。事实上,两种编码可能使用相同的数字代表两个不同的字符;或者使用不同的数字代表相同的字符。
47
Unicode出现改变了这一切。Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。Unicode标准已经被这些工业界的领导们所采用,例如:Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys和其它许多公司。例如XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML等等。
48
在Unicode的双字节版本中(UTF-16)使用的是16位编码方式,可提供65,000多个字符代码指针。其编码容量可涵盖世界上几乎所有的语言,不仅包括拉丁语,希腊语,斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语,还包括中文,日文和韩文这样的象形文字,以及平假名,片假名,孟加拉语,泰米尔语,泰国语,老挝语等。目前还有大约8000个代码指针未用,可供扩展。
49
1.使用Unicode避免了乱码的产生,使得国际间文本数据交换成为可能。比如:在浏览网上信息时,常常会遇到页面上出现乱码的情况。
2.解决了多语言文本同平面共存的问题。在传统的字符编码系统中,不能可能实现在同一个版面上显示多种语言文字。 3.实现了软件的全球化,避免了软件产品在贯穿多个平台、语言和国家时的重建。 ASCII使用7位的编码单元,而GB使用16位和8位的变长度的编码单元。这都给软件在各个语言版本之间的编译带来的麻烦。而在Unicode的双字节版本中,无论是英文字母还是汉字或者其他字符,使用的都是16位的编码方式。
50
a.在图形操作系统中,字符(包括:中文、英文)通常有2种存储方式。一种方式存储的是字符的图形点阵。存储的是字符的图片。用16x16大小的图片,表示一个全角字符;用8x16大小的图片,表示一个半角字符。
b.另一种方式是存储汉字的矢量图形。比如:用样条的方式,拟合一个字符的所有的笔画轮廓。存储样条的关键点,来实现字符的存储。这两种方式各有优缺点:图形点阵字库,因为是图形子库,以图片方式存储,显示都很容易,而且,每个相同大小的字符存储所用空间是固定的,便于管理。但是,图形点阵字库不能任意的放大,在放大的时候边缘会产生锯齿。
51
矢量字库不存在放大以后,失真的问题,而且因为存储的是笔画样条,对于字符做旋转、缩放、甚至三维拉伸都不会产生失真。但是,矢量字库因为的存储的样条,在字符显示的时候,需要计算样条曲线,增加了计算量不便于快速显示。 在嵌入式处理中,使用的是图形点阵字库。在操作系统中,保存有12x12、16x16和24x24三种分辨率的点阵字库。
52
嵌入式文件系统
53
什么是文件系统(File System) 文件系统的定义
——处理文件的操作系统的部分称为文件系统.是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用 文件系统的功能 ——文件的构造、命名、存取、采用、保护和实现等。
54
文件的命名 不同的操作系统有不同的命名规则 基本命名规则: ——MS-DOS系统:文件名(1-8个字符)+扩展名(1-3个字符)
给出文件命名规则: 长度,数字和特殊字符,大小写区分,支持文件扩展名(一个或多个) 例子:.bak .c .f77 .gif .hlp .html .mpg .o .ps .tex .txt .zip
55
存储介质 磁盘,磁带,光盘 1.物理块(块) 在文件系统中,文件的存储设备常常划分为若干大小相等的物理块。同时也将文件信息划分成相同大小的逻辑块(块),所有块统一编号。 以块为单位进行信息的存储、传输,分配
56
文件结构 文件序列 记录序列 树结构
57
文件存取 顺序存取(sequential access):磁带等介质
随机存取(random access file):磁盘、ROM、RAM、FLASH等介质
58
文件操作 CREATE DELETE OPEN CLOSE WRITE APPEND SEEK GET ATTRIBUTES
SET ATTRIBUTES RENAME
59
文件目录 全部用户 共享一个目录 每个用户 拥有一个目录 每个用户 拥有一个目录树 目录 文件
60
文件系统的实现 连续分配——把每个文件作为连续的数据块存储在磁盘上 优点:简单,容易实现;性能较好
缺点:要先知道文件的最大长度;造成磁盘碎片
61
链表分配——为每个文件构造磁盘块的链表,每个块的第一个字作为指向下一块的指针,块的其它部分存放数据
采用索引的链表分配
62
文件系统应用——RT Files
63
文件系统的基本结构 用户应用程序接口层 文件系统层 物理逻辑块层 底层硬件接口层
64
文件系统的发展 FAT12 FAT16 VFAT FAT32 DOS 1.0 (1981) DOS 3.0 (1984)
Win 3.1 (1992) Win 95 (1995) Win 95 Osr2 (1996) Win 98 (1998)
65
FAT12/FAT16/FAT32的比较 FAT12 FAT16 FAT32 Size of FAT entry 12 bits
Max num of clusters 4,086 65,526 268,435,456 Cluster size used 0.5 KB - 4 KB 2 KB - 32 KB 4 KB - 32 KB 最大磁盘容量 16,736,256 (16M) 2,147,123,200 (2G) about 2^41 (2T)
66
FAT 文件系统基本结构 FAT 文件系统由下面四部分组成 保留区 Reserved region FAT 区 根目录区 文件和目录区
存放引导记录,BIOS信息等 FAT 区 FAT信息列表 (12/16/32 bits) 根目录区 目录信息列表 (32 bytes) 文件和目录区 存放簇信息 reserved FAT(p) FAT(b) Root dir File and directory ……
67
保留区 Reserved Region 引导记录 BIOS参数块 (BPB) 基本信息 …… 引导代码
FAT(p) FAT(b) Root dir File and directory …… 引导记录 基本信息 …… 引导代码 BIOS参数块 (BPB) 字节/扇区 (512,1024,2048,4096) 扇区/簇 (1,2,4,8,16,32,64,128) 根目录数 总扇区值 介质类型 (硬盘,软盘,FLASH)
68
FAT 区 通常有 FAT(P)(primary)和FAT(B)(backup) 每一个簇都有一个对应的FAT目录 FAT 数据区 …… …
reserved FAT(p) FAT(b) Root dir File and directory …… 通常有 FAT(P)(primary)和FAT(B)(backup) 每一个簇都有一个对应的FAT目录 Cluster 2 Cluster 3 FAT …… 数据区 … Cluster n-1 Cluster n
69
FAT 链表 (FAT16) 目录树 ……
70
目录信息(Directory Entry)
结构 (32 bytes) 不使用 (0) 建立时间 文件名 ext 属性 最后 访问 日期 最后 修改 日期 最后 修改 时间 建立 日期 首簇 文件大小 FAT 12/16 :不用 FAT32 : 首簇
71
FAT16系统的实现(File system)
此文件系统可以保存最多512个文件,文件数据以簇为单位进行存储。 FAT(File Allocation Table)16的文件系统文件也是以“簇”(Cluster)为单位,分块存储的。每个簇的大小固定为16KB。文件的所占用的存储空间必须为16KB(一个簇)的整数倍。例如:即使文件只有一个字节,也要占用一个簇的存储空间。 每个簇在文件分配表(FAT)中都有对应的表项,簇号即为表项号,每个表项2个字节。不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。
72
文件的名称和相关信息(比如:创建时间、文件属性等)存放在文件目录表中。同时文件目录表记录了每一个文件的首簇号码。这样整个文件系统(文件目录表和文件分配表)就构成了一个单向链表。
首先在文件目录表中找到相应的文件所对应的首簇的号码,读取完成一个簇以后,如果文件的长度大于16KB(一个簇),就从文件分配表中查找到下一个簇的号码,然后继续读取,直到文件分配表中的下一个簇号码为FFFFH时为止。
73
初始化文件系统的例子 initOSFile: { INT8U err;
pFileMem=OSMemCreate(FileMemPart,10, sizeof(FILE), &err); if(pFileMem==NULL){ Uart_Printf("Failed to Create File"); LCD_printf("Failed to Create File"); } typedef struct{ U8 Buffer[BLOCK_SIZE]; //文件缓冲区 U32 fileblock; //文件当前的簇的位置 U32 filemode; //打开文件的模式 U32 filebufnum; //文件缓冲区中已经读取/写入的字节数 U32 fileCurpos; //读写的当前位置 U32 filesize; //文件的大小 }FILE;
74
OpenOSFile的工作的流程图 OpenOSFile的工作的流程图
75
ReadOSFile函数的程序流程图 ReadOSFile函数的程序流程图
76
WriteOSFile函数的程序流程图 WriteOSFile函数的程序流程图
77
CloseOSFile函数的程序流程图 CloseOSFile函数的程序流程图
Similar presentations