嵌入式系统设计与实例开发 ——arm 与 c/os-Ⅱ 北京航空航天大学...

Post on 01-Jan-2016

149 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

嵌入式系统设计与实例开发 ——ARM 与  C/OS-Ⅱ 北京航空航天大学 智能嵌入式技术工作室 王田苗 魏洪兴. 第十次课:嵌入式系统的软件体系结构设计 时间: 11.24 地点:三教 2101 第十一次课:实验五、嵌入式系统的文件管理 时间: 12.01 地点:软件学院实验楼 第十二次课:实验六、列表框和文本框 时间: 12.08 地点:软件学院实验楼 第十三次课:实验七、综合实验 时间: 12.15 地点:软件学院实验楼 第十四次课:嵌入式技术研讨(参加同学另行通知) - PowerPoint PPT Presentation

TRANSCRIPT

嵌入式系统设计与实例开发——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 的实现 文件系统的实现

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 )。这种可剪裁性是靠条件编译实现的。

C/OS 的性能( 2 )

占先式( Preemptive ) 多任务 C/OS-II 可以管理 64 个任务,然而,目前这一版本保留 8

个给系统。应用程序最多可以有 56 个任务,。 可确定性 全部 UC/OS-II 的函数调用与服务的执行时间具有可确定性。 任务栈 每个任务有自己单独的栈, UC/OS-II 允许每个任务有不同的

栈空间,以便压低应用程序对 RAM 的需求。 系统服务 C/OS-II 提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。

中断管理 中断可以使正在执行的任务暂时挂起,如果优先级更高的任

务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达 255层。

稳定性与可靠性

前后台系统

ISR

ISR

后台 前台

ISR

时间

多任务 (MultiTask)

CPU 寄存器

任务控制块 1

任务控制块 2

任务控制块 n

休眠、就绪、运行、挂起、被中断

任务1

任务2

任务n

……

CPU

寄存器

非占先式 (Non-Preemptive)

低优先级任务

ISR

高优先级任务

( 1 ) ( 2 )

( 3 )

( 4 )

( 5 )

( 6 )

( 7 )

中断服务程序使高优先级任务就绪

低优先级任务释放CPU 使用权

TIME

占先式 (Preemptive)

低优先级任务

ISR 高优先级任务

( 1 ) ( 2 )

( 3 )

( 4 )( 5 )

( 6 )

中断服务程序使高优先级任务就绪

高优先级任务得到CPU 使用权

TIME

COS-II 在 ARM7 上的移植

所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。 COS-II 的主要代码都是由标准的 C 语言写成的,移植方便。

移植 COS-II 满足的条件

处理器的 C 编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断

(通常在 10—1000Hz之间) 处理器支承能够容纳一定量数据的硬件堆

栈 处理器有将堆栈指针和其他 CPU寄存器存

储和读出到堆栈(或者内存)的指令

什么是可重入代码

可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。

也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。

可重入代码举例

程序 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 的处理器上可以产生定时器中断。

本系统工作在 60MHz 的主频下,定时器的中断的频率为 1000Hz 。也就是系统的响应时间为 1ms 。

处理器支持硬件堆栈

COS-II进行任务调度的时候,会把当前任务的 CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是 COS-II 多任务调度的基础。

ARM7 处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。

C/OS-II 在 S3C44B0X 上的移植

设置 OS_CPU.H 中与处理器和编译器相关的代码

用 C 语言编写六个操作系统相关的函数( OS_CPU_C.C )

用汇编语言编写四个与处理器相关的函数( OS_CPU.ASM )

设置与处理器和编译器相关的代码

OS_CPU.H 中定义了与编译器相关的数据类型。比如: INT8U 、 INT8S等。

与 ARM 处理器相关的代码,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启/关闭中

断设施堆栈的增长方向 :堆栈由高地址向

低地址增长

用 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 个函数为钩子函数,可以不加代码

用汇编语言编写四个与处理器相关的函数

OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()

关于移植

相对于其他的嵌入式操作系统, uCOS-II 的移植虽然是一个很简单的过程,但是,对于不熟悉 uCOS-II 的开发者,移植还是有一定难度的。

基于 COS-II 扩展 RTOS 的体系结构

LCD USB 键盘海量存储器

硬件

LCD240. h

USB. h

Keyboard16. h

Fl ash. h

时钟日历

Rtc. h

驱动程序drv. h

uCOS- I I基于RTOS的 内核

消息队列

信号量 邮箱

API函数

绘图函数Di spl ay. h

文件管理函数Fi l e. h

文件读写函数OSFi l e. h

后台缓冲区

任务调度模块

双向链表函数Li st. h

动态内存管理

系统消息队列

OSMessage. h

LCD刷新

键盘扫描

1用户任务

主任务 2用户任务

n用户任务

系统任务

信号量

系统消息

用户应用程序

系统控件函数Control . h

任务之间的通讯用户界面

系统外围设备的硬件部分

系统外围设备的硬件部分包括:液晶显示屏( LCD )触摸屏USBTCP/IP键盘海量 Flash 存储器系统的时钟和日历。

驱动程序模块

驱动程序是连接底层的硬件和上层的API 函数的纽带,有了驱动程序模块,就可以把操作系统的 API 函数和底层的硬件分离开来。硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了。而不会影响到 API 函数的功能,更不会影响到用户的应用程序。

uCOS-II 中使用信号量、邮箱等机制进行协调。

以 uCOS-II 的消息队列派生出来的系统消息传递机制。用来实现系统的各个任务之间,用户应用程序的各个任务之间以及用户应用程序和系统的各个任务之间的通讯。

液晶显示屏( LCD )的刷新任务、系统键盘扫描任务。这两个任务是操作系统的基本任务,随着操作系统的启动而运行。

用户应用程序主要通过调用系统的 API 函数对系统进行操作,完成用户的要求。

嵌入式 GUI 技术

GUI 的概念GUI 的定义 Graphics User Interface, 是指计算机与其使用者之间的图形化对话接口。

GUI 的主要特征: ——Windows ,采用窗口界面,每个窗口是用户或系统

的一个工作区域。一个屏幕上可以有多个窗口。 ——Icons ,采用形象化的图标或图符,易于操作者理解

与操作。 ——Menu ,采用菜单,可供用户选择的功能提示 ——Pointing Devices ,指鼠标器、触摸屏等,便于用户直接对屏幕对象进行操作。

典型的 GUI 系统

X-Window System—— Unix/Linux 上标准的图形界面 X-Window 的结构模型:采用客户 / 服务器式的结构模型。它由 X协议, X 服务器,客户和 Xlib 函数库组成。

键盘 鼠标

显示器

带有图形显示器的主机

1窗口 是一个运行于局域主机上的仿真终端2窗口 是一个运

A行于主机 上的仿真终端

3窗口 是一个运行B于主机 上的客户

程序的显示输出

4窗口 是一个运行于局域主机上的客户程序的显示输出

B主机A主机

X协议:客户与服务器间的网络通信协议

X 服务器:在图形工作站上运行的服务进程,它负责对显示器的输出,键盘和鼠标的输入进行管理。

嵌入式 GUI 的特点

体积小 占用系统资源少 系统独立,可移植性好

嵌入式 GUI

Compact X-Window System: 可扩展性好、可移植性好,代码尺寸大

Microwindows :开放源码的嵌入式 GUI 软件,可移植性好,图形功能出色。

OpenGUI :自由软件。汇编实现的内核,并利用 MMX指令进行了优化, OpenGUI 运行速度非常快。支持 32 位处理器,可以在 MS-DOS , QNX 和 Linux 下运行。主要用来在这些系统中开发图形应用程序和游戏

Qt/Embedded : QT 库开发商 Trolltech 推出的面向嵌入式系统的 QT 版本。可移植性好,价格较贵。

MiniGUI :自由软件,面向嵌入式系统或者实时系统的图形用户界面支持系统。它主要运行于 Linux ,还可以运行在任何一种具有 POSIX 线程支持的 POSIX 兼容系统上

Qt/Embedded 可移植性好 模块化设计 开放源代码 图形界面漂亮

GTKFB 不需 X Server 直接与 FrameBuffer 连接 API 与 Desktop 版相容。 采用 LGPL 授权方式 体积小

Microwindows 跨平台 不需 X Server 采用 FLTK Toolkits 支持 TrueType 字型

MiniGUI 支持 GB2312 与 BIG5 字集 支持多种格式字体,例如: TrueType 、 Adobe Type1等。 GDI 函数 ( MoveTo 、 LineTo 、 FillBox 、 Rectangle 、 Circle 、 T

extOut 、 DrawText ..等 )

Tiny X Server Tiny X Server 为 XFree86 Project 的一部分,体积比较大

嵌入式 GUI 的结构模型

嵌入式硬件平台

嵌入式操作系统

窗口模型 显示模型

用户模型

显示模型:图形在窗口上的基本显示模式

窗口模型:窗口如何显示及改变

用户模型:构造用户界面的工具及如何在屏幕 上组织各种图形对象,以及这些对 象之间如何交互的说明。

图形用户系统是由显示模型接口程序、窗口模型接口程序和用户模型接口程序共同组成的。

嵌入式 GUI 的基本结构

硬件驱动层

中间层

API 层

图形用户界面的基本函数( MiniGUI )

---主窗口 -----------窗口非客户区

------------窗口标题 ------------窗口边框 ------------菜单栏

------------窗口客户区│ -------------子窗口(控件)

------------对话框│ -----------对话框控件

窗口基本分四类,分别为主窗口、对话框、控件和主窗口中的子窗口

GUI 的事件和消息驱动

外设事件

窗口管理器

主窗口线程消息队列

主窗口线程消息队列

主窗口线程消息队列

消息

循环窗口过程

消息驱动的应用程序的简单构架

控件

与 Windows操作系统类似,控件是可视化开发的基础。对于开发应用程序的用户来说,控件是一个独立的组件,有着自己的显示方式、自己的动态内存管理模式,甚至有的控件还可以向系统发送自己的消息。用户不需要掌握控件的内部到底是如何工作的,只需通过控件提供的API 函数,改变控件相应的属性,即可改变控件的显示方式。控件的引入可以大大方便用户的开发,加速用户应用程序界面的编写速度。同时,也为运行在操作系统上的应用程序的界面提供了统一的标准,方便了使 用

控件与控件类Edit 控件类

name

style

Callback Proc

...

next

控件 1

id

caption

...

pcci

Button 控件类

name

style

Callback Proc

...

next

控件 1

id

caption

...

pcci

控件 1

id

caption

...

pcci

字符集与字体支持

ISO-8859 、 GB2312 、 Big5 、 UNICODE

矢量字体 基于矢量的的字体,称之为可缩放的字体,轮廓字体,或矢量字体。由于这些字体在存储时亦只存储了其轮廓,因此,在不同的缩放大小下依然能保持美观而不会出现“锯齿”。这点是很适合其完整地在 Web 上传输。一般说来, Logo 、线形艺术作品、图表、动画、抽象艺术作品等凡较容易定义颜色区域的图形,用矢量图都能产生很好的效果。

基于 Unicode的汉字字库

计算机是以处理数字为基础,如果要处理文字就需要规定一个编目系统用不同的数字来表示相应的字符。我们较为熟悉的有 GB 、 GBK 、 BIG5 、 ASCII等等。由于编码不统一,这些编码系统之间经常相互冲突。事实上,两种编码可能使用相同的数字代表两个不同的字符;或者使用不同的数字代表相同的字符。

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 个代码指针未用,可供扩展。

1. 使用 Unicode避免了乱码的产生,使得国际间文本数据交换成为可能。比如:在浏览网上信息时,常常会遇到页面上出现乱码的情况。

2.解决了多语言文本同平面共存的问题。在传统的字符编码系统中,不能可能实现在同一个版面上显示多种语言文字。

3. 实现了软件的全球化,避免了软件产品在贯穿多个平台、语言和国家时的重建。 ASCII 使用 7 位的编码单元,而GB使用 16 位和 8 位的变长度的编码单元。这都给软件在各个语言版本之间的编译带来的麻烦。而在 Unicode 的双字节版本中,无论是英文字母还是汉字或者其他字符,使用的都是 16 位的编码方式。

a. 在图形操作系统中,字符(包括:中文、英文)通常有 2 种存储方式。一种方式存储的是字符的图形点阵。存储的是字符的图片。用 16x16 大小的图片,表示一个全角字符;用 8x16 大小的图片,表示一个半角字符。

b. 另一种方式是存储汉字的矢量图形。比如:用样条的方式,拟合一个字符的所有的笔画轮廓。存储样条的关键点,来实现字符的存储。这两种方式各有优缺点:图形点阵字库,因为是图形子库,以图片方式存储,显示都很容易,而且,每个相同大小的字符存储所用空间是固定的,便于管理。但是,图形点阵字库不能任意的放大,在放大的时候边缘会产生锯齿。

矢量字库不存在放大以后,失真的问题,而且因为存储的是笔画样条,对于字符做旋转、缩放、甚至三维拉伸都不会产生失真。但是,矢量字库因为的存储的样条,在字符显示的时候,需要计算样条曲线,增加了计算量不便于快速显示。

在嵌入式处理中,使用的是图形点阵字库。在操作系统中,保存有 12x12 、 16x16 和 24x24 三种分辨率的点阵字库。

嵌入式文件系统

什么是文件系统( File System)

文件系统的定义 ——处理文件的操作系统的部分称为文件系统 . 是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新,提供安全可靠的共享和保护手段,并且方便用户使用

文件系统的功能 ——文件的构造、命名、存取、采用、保护和实

现等。

文件的命名

不同的操作系统有不同的命名规则 基本命名规则: ——MS-DOS 系统:文件名( 1-8 个字符) +扩展名

( 1-3 个字符)给出文件命名规则: 长度,数字和特殊字符,大小写区分,支持文件扩展名

(一个或多个) 例子: .bak .c .f77 .gif .hlp .html .mpg .o .ps .tex .txt .zip

存储介质

磁盘,磁带,光盘1.物理块 (块 ) 在文件系统中,文件的存储设备常常划分为若干大小相等的物理块。同时也将文件信息划分成相同大小的逻辑块(块),所有块统一编号。

以块为单位进行信息的存储、传输,分配

文件结构

文件序列 记录序列 树结构

文件存取

顺序存取( sequential access):磁带等介质

随机存取( random access file) :磁盘、 ROM 、RAM 、 FLASH等介质

文件操作

CREATE DELETE OPEN CLOSE WRITE APPEND SEEK GET ATTRIBUTES SET ATTRIBUTES RENAME

文件目录

A B C A

根目录

A B C AA

根目录

A B C

B

C

CA

根目录

A B C

B B C

C C

C C C

全部用户

共享一个目录 每个用户

拥有一个目录每个用户

拥有一个目录树目录 文件

文件系统的实现

连续分配——把每个文件作为连续的数据块存储在磁盘上

优点:简单,容易实现;性能较好 缺点:要先知道文件的最大长度;造成磁盘碎片

链表分配——为每个文件构造磁盘块的链表,每个块的第一个字作为指向下一块的指针,块的其它部分存放数据

采用索引的链表分配

文件0块

文件1块

文件2块

文件3块

文件4块

4 7 8 9 12

A文件

文件0块

文件1块

文件2块

文件3块

5 6 10 11

B文件

文件系统应用—— RT Files

文件系统的基本结构

用户应用程序接口层

物理逻辑块层

底层硬件接口层

文件系统层

文件系统的发展

DOS 1.0

(1981)

DOS 3.0

(1984)

Win 95 (1995)

Win 95 Osr2

(1996)

Win 98 (1998)

Win 3.1

(1992)

FAT12 FAT16 VFAT FAT32

FAT12/FAT16/FAT32 的比较

FAT12 FAT16 FAT32

Size of FAT entry

12 bits 16 bits 32 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)

FAT 文件系统基本结构

FAT 文件系统由下面四部分组成 保留区 Reserved region

存放引导记录, BIOS 信息等 FAT 区

FAT 信息列表 (12/16/32 bits) 根目录区

目录信息列表 (32 bytes) 文件和目录区

存放簇信息

reserved FAT(p) FAT(b) Root dir File and directory ……

保留区 Reserved Region

引导记录 基本信息 …… 引导代码

BIOS 参数块 (BPB) 字节 /扇区 (512,1024,2048,4096) 扇区 /簇 (1,2,4,8,16,32,64,128) 根目录数 总扇区值 介质类型 ( 硬盘 , 软盘, FLASH )

reserved FAT(p) FAT(b) Root dir File and directory ……

FAT 区

通常有 FAT(P)(primary) 和 FAT(B)(backup) 每一个簇都有一个对应的 FAT 目录

Cluster 2

Cluster 3

Cluster n-1

Cluster n

……FAT

数据区

reserved FAT(p) FAT(b) Root dir File and directory ……

FAT 链表 (FAT16)

……

目录树

目录信息( Directory Entry)

结构 (32 bytes)

文件名 ext建立时间

建立

日期

最后 修改日期

最后访问日期

属性

不使用 (0)

FAT 12/16 : 不用

首簇 文件大小

FAT32 : 首簇

最后 修改时间

FAT16 系统的实现 (File system)

此文件系统可以保存最多 512 个文件,文件数据以簇为单位进行存储。 FAT ( File Allocation Table ) 16 的文件系统文件也是以“簇”( Cluster )为单位,分块存储的。每个簇的大小固定为16KB 。文件的所占用的存储空间必须为 16KB(一个簇)的整数倍。例如:即使文件只有一个字节,也要占用一个簇的存储空间。

每个簇在文件分配表( FAT )中都有对应的表项,簇号即为表项号,每个表项 2 个字节。不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。

文件的名称和相关信息(比如:创建时间、文件属性等)存放在文件目录表中。同时文件目录表记录了每一个文件的首簇号码。这样整个文件系统(文件目录表和文件分配表)就构成了一个单向链表。

首先在文件目录表中找到相应的文件所对应的首簇的号码,读取完成一个簇以后,如果文件的长度大于 16KB (一个簇),就从文件分配表中查找到下一个簇的号码,然后继续读取,直到文件分配表中的下一个簇号码为 FFFFH 时为止。

初始化文件系统的例子

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;

OpenOSFile 的工作的流程图

OpenOSFile 的工作的流程图

OpenOSFi l e函数开始

返回失败

找到指定的文件名

定位文件的首簇的位置

为文件的打开分配缓冲区

是读取文件模式

读取文件的首簇到文件缓冲区

文件缓冲区用0xff填充

(FI LE)填充文件结构中的相关信息

文件打开结束,返回文件结构

ReadOSFile 函数的程序流程图

ReadOSFile 函数的程序流程图

ReadOSFi l e启动 读取一个字节

读取的缓冲区是否为空

是否读取了指定的字节数

是否读取到了文件结尾

读取下一个簇到文件缓冲区

返回读取的字节数目

WriteOSFile 函数的程序流程图

WriteOSFile 函数的程序流程图

Wri teOSFi l e启动

向缓冲区中写入一个字节

文件的缓冲区是否为满

是否写入了指定的字节数

是否成功获“ ”得了 空簇

向当前的簇中中写入数据

返回写入成功

是否达到了写入的字节数

返回写入失败

填充缓冲区的0xff数据为

CloseOSFile 函数的程序流程图

CloseOSFile 函数的程序流程图

Cl oseOSFi l e函数开始

是否是以写入方式打开的文

把文件缓冲区写入当前簇

释放掉文件结构Fi l e( )的内存

函数结束

top related