![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 15:54 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » Seekfor eDOS v1.0使用指南(非常详细的eDOS性能列表) |
| 可打印版本 5,095 / 6 |
| 第1楼 seekfor | 发表于 2006-11-18 21:28 |
| 荣誉版主 发帖 23 积分 57 | |
|
Seekfor eDOS v1.0使用指南(非常详细的eDOS性能列表) Seekfor eDOS v1.0简介
Seekfor eDOS v1.0全称是”Seekfor Embedded DOS v1.0”,是一个面向嵌入式运用的32位DOS系统.该系统支持FAT16/FAT32文件系统,基本兼容Microsoft的MSDOS.eDOS提供嵌入式下简洁的文件访问,设备驱动访问,提供功能强大的API支持(如文件操作API,存储管理API,图形库API等).eDOS的设计目的就是希望把嵌入式编程的”专用性”变成”通用性”,也就是说,eDOS相当于一个通用的操作系统.在这个系统中,所有API都基本兼容MSDOS,因此,熟悉过MSDOS下编程的普通程序员可以很快的投入到不同的嵌入式CPU上的编程.在eDOS下,程序员不需要了解太多的硬件架构即可编写程序实现自己的目的. Seekfor eDOS v1.0的基本性能介绍 (1)支持FAT16/FAT32文件系统 只需提供不同硬件的Sector_read(),Sector_write()等函数指针即可方便的安装不同的FAT类型的设备(此设备以磁盘形式存在).因此,在eDOS中可以存在自己的虚拟设备,这些虚拟设备全部被映射成磁盘驱动器! (2) 支持标准stdout,stdin,stderr操作 提供兼容MSDOS下的stdio.h中的使用方法.Console的输入输出可以重定向到不同的系统设备.如stdout可以定向到UART输出,也可以定向到LCD(只要正确添加了LCD的驱动),stdin可以定向到UART输入,可以定向到不同硬件环境的键盘输入等输入设备!这些都是在移植eDOS到新的硬件环境就能方便的进行重定向,一般只需更改三个宏定义即可! (3) 支持驻留程序 内存驻留程序在MSDOS中称为TSR程序.也就是在main()中返回但可以再次执行的程序,这个功能在MSDOS和eDOS中都是一个非常重要的功能.利用TSR功能,在eDOS下可以进行简单的多任务处理.如可以定义个TSR程序实时处理中断等! (4) 支持动态内存管理 提供和ANSI C兼容的malloc()+free()机制的API.在应用程序中,只要系统的RAM足够,可以任意的malloc和free. (5) 支持环境变量 和MSDOS一样,eDOS也支持环境变量.环境变量可以看做不同程序间的全局变量,可以利用它来实现不同程序的通信等功能. (6) 支持*.bat,*.exe,*.com文件的运行 eDOS支持*.bat,*.exe,*.com程序的运行,其中*.bat格式基本同MSDOS,但*.exe,*.com的格式就取决于系统的CPU类型.如当eDOS被移植到ARM下时,*.com文件就是ADS v1.2编译好的*.bin改名成*.com即可运行,而*.exe是ADS v1.2编译后的*.bin利用exeMaker.exe(系统提供的工具)加上EXE文件头形成的可执行文件形式. (7) 支持autoexec.bat的开机启动 eDOS启动后自动寻找系统盘根目录下的autoexec.bat,如果发现此文件则自动开始解释执行autoexec.bat.利用此功能,可以实现动态添加设备驱动,自动启动用户应用程序等功能. (8) 支持系统设备的文件化 eDOS把所有的硬件设备都抽象为”文件”.如系统把LCD设备看做文件名是”LCD:”的一个特殊文件.应用程序和硬件设备通讯,只需要利用标准的文件操作API即可.如p=fopen(“LCD:”,”w”)打开LCD设备,fwrite(“This is a demo program!”,25,1,p)写一行字符串到LCD上显示.其他设备依此类推,硬件设备的文件名取决于移植时定义的名称.一般在设备名称后加上”:”表示和普通磁盘文件的区别! (9) 支持输出所有DOS API MSDOS提供的DOS调用是SWI软件中断实现的.在eDOS中,没有采用SWI中断(因为SWI中断和CPU相关,有的CPU根本就没有SWI中断),而是采用直接输出eDOS API函数的地址!这些地址可以统一输出到任何的磁盘文件中,要使用这些API,只需要把这些文件包含的用户的项目中去即可.在eDOS命令行下,输入exports dos.h dos.c并回车,则在当前目录下就生成了dos.h和dos.c两个文件,把这两个文件包含的用户的项目中去即可调用eDOS提供的API. (10) 支持远程读取磁盘内容 eDOS提供一个实用工具RemoteDisks.exe.该工具可以通过PC串口读取eDOS内部的所有磁盘信息.如查看文件,删除文件,添加文件等,相当于eDOS在PC上的文件浏览器.这样,即使eDOS内部只有RAM虚拟的磁盘,用户也可以把内部的文件信息读取出来,实现下一步处理! (11)良好的系统移植性能 eDOS移植性能良好,移植到不同的CPU工作量很小,同一体系的CPU不同的硬件环境甚至只需要更改两三个宏定义即可. (12)提供超强的图形库Seekfor Image Library v1.0功能(可选) 如果硬件设备包含LCD之类的图形显示设备,则eDOS可以加入基本兼容TC下的BGI库函数的图形库API.只要正确提供LCD的大小信息和SetPixel()和GetPixel()并正确调用initgraph()即可使用eDOS的图形库功能!eDOS提供的图形库,不仅包含兼容BGI的画点,画线,画矩形等基本库,而且提供基于Seekfor Image Library v1.0的图象库API.利用这些API,用户可以方便的在LCD屏幕上显示出*.bmp,*.pcx图象,还支持RLE和RGB编码的*.avi格式.因此,在eDOS的帮助下,可以快速的实现用户的多媒体功能. (13)提供超强的声音库Seekfor Sound Library功能(可选) 如果硬件设备提供I2S或者AC97之类的声音设备,eDOS可以加入Seekfor Sound Library v1.0.该声音库可以实现播放未压缩的*.wav,*.aiff,和压缩的*.mp1,*.mp2(MPEG Audio Level 1和MPEG Audio Level 2)格式的文件. (14)很小的系统需求 eDOS for S3C2410最小功能编译仅需50K的ROM空间和约1M~2M的SDRAM空间.全部功能编译也仅需要350K左右的ROM空间和1M~2M的SDRAM空间.其中消耗的RAM空间是可配置的,主要是系统需要一个比较大的动态分配池,减少动态分配池的大小就可以减少RAM空间的需求! 第二章 eDOS运行环境和操作方法 eDOS 需要运行在符合冯.诺依曼体系的CPU上.在这类CPU上,可以把运行代码保存不同的媒体介质如硬盘,NAND flash中,然后读取代码拷贝到RAM中并跳转到RAM中运行.符合该体系的CPU有ARM和X86等.当前eDOS v1.0已经成功移植到了S3C2410,S3C44b0和AT91RM9200上,在以后的描述中,都假定了eDOS移植在S3C2410上.如果用户CPU不是S3C2410,请对照本指南和该CPU特性参考使用!附录上附上的eDOS v1.0 for S3C2410可以运行在标准的S3C2410板上(64M NAND flash,64M SDRAM,开始地址是0x30000000) (1) 如何编译Seekfor eDOS v1.0 for S3C2410 ADS v1.2编译器设置如下图: 注意,RO_BASE必须是0x30000000且RW_BASE必须为空或者选择”Relocatable”! 编译后在对应目录会生成eDOS.bin. (2) 如何运行Seekfor eDOS v1.0? 只要利用任何工具把编译好的eDOS.bin装载到SDRAM 0x30000000地址空间处并运行即可!可以采用下面的方法: 在2410的Nor flash上烧录好三星的USBMON,选择NOR flash启动,连上UART0和USB线,在PC上开启dnw.exe,出现下图表示连接正常: 先选择菜单[Configuration]àoptions,设置如下: 然后选择菜单[USB Port]àTranmit,在弹出的菜单中选择刚才编译好的eDOS.bin,下载完成后,将显示如下信息表示eDOS启动成功: 这时候屏幕上出现了版本信息和C:\>的提示符,这就表示eDOS启动正常,可以使用DOS命令操作了. (3) eDOS提供哪些内部命令? 在以下的命令格式描述中,[]表示可以不输入该参数,<>表示在命令行中必须输入该参数 Seekfor eDOS v1.0 for S3C2410提供下列命令: (a) dir:显示目录和文件信息 格式:dir [参数] 参数可以带有通配符*和?,如dir *.exe,dir *.*,dir ????.*等. (b) md,mkdir:建立文件夹 格式:md <文件夹名称>,mkdir <文件夹名称> 文件夹可以是全路径名和相对路径,如md mp3,md D:\mp3等 © cd,chdir:进入文件夹 格式:cd <文件夹名>,chdir <文件夹名> 文件夹可以是相对路径也可以是绝对路径,如cd mp3,cd D:\mp3等 (d) rd,rmdir:删除文件夹 格式:rd <文件夹名>,rmdir <文件夹名> 文件夹可以是相对路径也可以是绝对路径,如rd mp3,rd D:\mp3等 (e) del,delete:删除文件 格式:del <文件名>,delete <文件名> 文件名暂时不能带有通配符 (f) copy:拷贝文件 格式:copy <源文件名> <目标文件名> 文件名可是是普通磁盘文件,也可以是硬件设备,如copy a.txt b.txt,copy com1: b.txt(这个命令是从COM1下载文件到磁盘)等 (g) type:显示一个文本文件内容 格式:type <文件名> (h) format:格式化磁盘命令 格式:format <驱动器名> 驱动器名就是C:\,D:\之类的,如format C:,format D:,format H:等 (i) ren,rename:文件(夹)改名 格式:ren <旧名称> <新名称> 名称只能是当前目录下的有效名称,如ren a.txt b.txt,ren mp3 mp4 (j) vol:更改磁盘卷标 格式:vol [驱动器名] (k) exports:输出eDOS API(这个功能可以在编译eDOS的时候关闭此命令) 格式:exports <*.h文件名> <*.c文件名> 如exports dos.h dos.c,exports D:\API\dos.h D:\API\dos.c等 (l) set:显示和设置环境变量(这个功能可以在编译eDOS的时候关闭此命令) 格式:set [环境名] [=] [内容] 如set VERSION = 2.0(设置VERSION=2.0), set VERSION =(删除VERSION),set VERSION(显示VERSION),set(显示所有环境变量) (m) pause:暂停等待一个键按下(一般用在*.bat中) 格式: pause [显示信息] 如pause 请按任意键退出,pause press any key to exit…等 (n) echo:显示信息/开启/关闭DOS提示符 格式(1)echo on(开启提示符) (2)echo off(关闭提示符) (3) echo [显示信息] (o) ver:显示eDOS版本信息 格式:ver (p) sys:传送bootloader和kernel代码到2410的NAND flash(其他CPU可能没有此命令) 格式(1)sys bootloader (2)sys kernel 回车后会提示通过UART传送boot.bin和eDOS.bin,eDOS会自动保存到NAND flash (q) date:显示/更改日期 格式 :date ® time:显示/更改时间 格式:time (r) mem:显示eDOS内存信息(在不能Reallocable的CPU比如ARM有一项内容很重要) 格式:mem 显示如下: OS Dynamic malloc SPACE: 8388608 Bytes OS Reserved SPACE: 2097152 Bytes APP_START_ADDR: 0x30a00000 以上数字随不同的系统而变,APP_START_ADDR是非ReallocableCPU的RO_BASE,所有的应用程序的RO_BASE都要和此值相同! (s) cls:清除stdout屏幕 格式:cls 有的stdout驱动可能不支持cls (t) show:在stdout屏幕上显示图片文件(无LCD系统下没有此命令) 格式:show <图片文件名> 图片文件可以是*.bmp,*.pcx和*.avi,结果会在LCD的中间位置显示出来! (u) X:改变驱动器 格式:<X:> 如 C:,D:等 (4) 如何通过串口从PC上下载文件? (a)在DOS命令行下,输入以下格式: C:\copy com1: demo.exe,回车后系统提示从UART发送文件,在dnw.exe下传送一个文件,完成后在当前目录下就demo.exe这个文件了. (b)通过remotedisks.exe工具 连上UART,启动eDOS,在PC上开启remotedisks.exe,如果连接正常,则可以通过remotedisks.exe操作eDOS内部的磁盘文件了. Remotedisks.exe默认的波特率是115200,如果eDOS更改了波特率,remotedisks.exe对应更改即可 如下图所示: 磁盘驱动器列表: 文件和文件夹列表: remotedisks.exe的操作方法和Windows的文件浏览器操作基本一致,暂时只支持鼠标操作! 第三章 如何建立自己的应用程序 Seekfor eDOS v1.0支持*.bat,*.exe,*.com三种格式文件的运行.其中*.bat格式和MSDOS基本相同,这里就不再详细介绍了.只需要用任何编辑器编辑好用户的BAT文件,再下载到eDOS磁盘中即可.如果需要在eDOS的命令行下建立文件,可以在命令行下输入copy con demo.bat即可,结束输入按Ctrl+Z! *.com和*.exe并非就是MSDOS和Windows下的*.com或者*.exe,在ARM下,*.com就是ADS v1.2或者SDT v2.5编译生成的*.bin改名为*.com,*.exe是ADS v1.2或者SDT v2.5编译生成的*.bin然后用exeMaker.exe生成的*.exe文件格式.事实上,eDOS使用的exe文件,就是在*.bin文件的基础上利用exeMaker.exe加上一个256字节的EXE文件头! (1) 什么是*.com文件? eDOS的*.com文件其实就是编译好的*.bin文件,要求这个*.bin只有一个main()而没有其他的函数,如果在一个项目功能不能在一个main()里完成,则必须使用exeMaker.exe生成*.exe格式,而不能直接用*.com格式,否则程序执行不正确,甚至导致eDOS崩溃! (2) 什么是*.exe文件? *.exe文件是编译好的*.bin加上一个256个字节EXE文件头形成的*.exe格式的文件.这个文件头通过系统提供工具exeMaker.exe添加.添加好的*.exe下载到eDOS的磁盘中即可在命令行运行该文件! (3) eDOS运行文件的优先级是怎样的? 如果在同一个目录下,同时含有demo.bat,demo.exe,demo.com三个主文件名相同的文件,那么在eDOS命令行输入C:\demo会执行哪个文件呢?eDOS按照下列规则实现: 如果目录中有*.com,则运行*.com,否则再查找是否有*.exe,有的话就执行*.exe,最后再查找是否有*.bat,如果有就执行*.bat,如果三种文件都没有,eDOS就提示bad command or file name 如果同时含有demo.bat,demo.exe,demo.com,则可以直接输入文件全名运行对应的文件,如输入demo.bat直接运行bat,输入demo.com直接运行com等. (4) eDOS的exe文件有什么特别限制吗? 有三个限制: (1) 在不能Reallocatable的CPU上,*.bin的RO_BASE必须等于mem命令列出的APP_START_ADDR! (2) 根据eDOS加载exe文件的特殊性能,编译的*.bin的段分布必须是这样: RO段+RW段+ZI段 其中RW段必须紧跟在RO段后面,ZI段必须紧跟在RW段后面,因此在ADS v1.2中,RW_BASE必须不填或者选择Reallocable! (3)如果eDOS重新编译了一次,那么eDOS磁盘下所有的*.com,*.exe都要用新的eDOS API指针文件重新编译一次才能正确运行! (5) 如何使用eDOS提供的API? 在eDOS命令行下输入exports dos.h dos.c,则在当前目录会生成dos.h dos.c两个文件,把这两个文件包含到应用程序的项目文件中去即可自由使用eDOS提供的API!所有的API都采用指针的形式提供,如下所示: typedef int (*PRINTF)(char*,...);/*定义一个函数指针类型*/ PRINTF printf=(PRINTF)0x3000a64c;/*定义一个函数指针并正确定位*/ 把这两行代码添加到main.c中就可以直接使用了!完整的代码如下: void Main() { typedef int (*PRINTF)(char*,...); PRINTF printf=(PRINTF)0x3000a64c; printf(“Hello world!\r\n”); } 在ADS v1.2下编译此段代码成*.bin并下载到eDOS磁盘改名为*.com直接运行即可! (6) 如何让eDOS启动后自动执行用户的应用程序? eDOS启动后是命令行,需要输入命令才能执行其他功能.但eDOS提供对autoexec.bat的支持,如果C:\下存在autoexec.bat文件,则eDOS启动后在执行shell前就运行autoexec.bat!因此用户可以把自己的应用程序放在autoexec.bat文件,实现开机后自动运行程序! (7) 图示建立一个用户的应用程序 1. 启动eDOS,输入exports dos.h dos.c,结果如下: 请注意,当前目录下已经有了dos.h和dos.c两个文件了. 2.入mem回车,系统提示如下: 我们注意到APP_START_ADDR是0x30a00000(不同的系统该值不同),请记住这个值,我们需要把这个值设置为应用程序的RO_BASE! 3.关闭dnw.exe,启动remotedisks.exe,导出dos.h和dos.c到PC上任意一个目录下 4.开启ADS v1.2,建立一个名为”demo”的ARM工程,把dos.c加到该工程中. 5.新建立以下代码的main.c文件,也加入到demo工程中 #include “dos.h” int Main() { printf(“Hello world!\r\n”); return 1; } 如下图所示: 6.设置ADS的Link属性 请注意,RO_BASE填写的数字就是刚才第2步获得的APP_START_ADDR的值,这里是0x30a00000.RW_BASE必须留空或者选择Reallocatable! 7.设置让ADS v1.2直接输出*.bin文件,如图: TargetàTarget Settings-àPost-linker:选择ARM fromELF LinkeràARM fromELFàoutput format选择Plain binary,output file name选择一个文件名: 8.按F7,ADS v1.2将编译demo项目,结果如下: 9.把生成的demo.bin改名为demo.com,并下载到eDOS磁盘中,在命令行中输入demo可以运行该程序了: 请注意demo.com的输出就是”Hello world!”,这样就实现了一个最简单的Hello world的程序的编写!因为这个程序只需要Main()一个函数即可实现功能,所以编译成*.com文件即可,如果功能复杂包含有多个函数,则必须通过exeMaker.exe把生成的*.bin转换成*.exe.请参考第10步! 10.如果要生成的是exe,则在编译*.bin前设置输出所有的*.lst选项: LinkeràARM LinkeràListings,选择所有的选项,输出*.lst文件名和项目名相同,目录和*.bin目录相同即可: 设置好后编译demo,在对应的目录下除了有demo.bin,还有demo.lst文件产生. (11)利用exeMaker.exe生成*.exe格式的文件: 在BIN项下选择刚才生成的demo.bin,在LST项下选择demo.lst,将如下图所示: 注意,如果demo项目中的主函数名称是Main()则不需要再次设置什么了,直接点Make EXE即可,如果名称不是Main()则需要在Section(s)选择一个启动的函数,点击Set as main()(这一步实际上是设置从哪个函数开始运行),再点击Make EXE即可,如下: 这时候,把exeMaker.exe生成的demo.exe下载到eDOS磁盘并运行即可! 这里说明一下,eDOS输出的API都是采用函数指针的形式,因此eDOS重新编译后,所有的com和exe文件都要添加新的dos.h和dos.c文件重新编译才能正常运行.如果是向Hello World这么简单的程序,可以在dos.c中把不需要使用的API的定义全部屏蔽(不屏蔽的话会多占用RAM空间)!如上例的demo程序,其实只需要保留printf()的定义即可,就是不需要包含dos.c文件,把printf()定义放到main.c即可,如下: typedef int (*PRINTF)(char*,...); PRINTF printf=(PRINTF)0x3000a64c; Void Main() { printf(“Hello world!\r\n”); } 这样,应用程序占用的RAM空间就小了很多了! EDOS也支持通过命令行传递参数,这时候只需要把Main()定义改成下列形式即可: int Main(int argc,char *argv[]) { if(argc!=2) printf(“Usage:%s <name>\r\n”,argv[0]); else { printf(“Hello,%s!\r\n”,argv[1]); } return 0; } 编译并运行以上程序,如果仅仅输入demo,则提示”Usage:demo <name>”,如果输入demo seekfor,则提示”Hello seekfor!” 以上程序运行结果如下图: 第四章 eDOS API大全 <1>文件操作API (1) 原型:FILE*fopen(char*filename,char*mode) 功能:打开文件 参数: char*filename:要打开的文件名或者硬件设备名称,支持绝对路径 char*mode:打开模式,”r”,”w”,”a”,”+”的组合,其中硬件设备只能支持”r”,”w”的组合 返回值: 调用成功返回一个文件指针,否则返回NULL 示范: FILE*p=fopen(“C:\\demo.mp3”,”r”);/*打开C:\demo.mp3读”*/ FILE*p=fopen(“demo.mp3”,”w”);/*打开当前目录下的demo.mp3写,不存在该文件则建立文件*/ FILE*p=fopen(“COM1:”,”w”);/*打开硬件设备COM1:写*/ (2) 原型:int fclose(FILE*p) 功能:关闭文件 参数: FILE*p:有效的普通磁盘文件指针或者设备文件指针 返回值: 调用成功返回0,否则返回错误值,一般是-1 示范: FILE*p=fopen(“demo.mp3”,”w”);/*先打开*/ fclose(p); (3) 原型:int fread(void*buffer,int size,int block,FILE*p) 功能:从文件中读取多个数据块 参数: void*buffer:缓冲区指针 int size:每块字节字节数 int block:块总数 FILE*p:用fopen()打开的文件指针 返回值: 调用成功返回0,否则返回错误值,一般是-1 示范: char buffer[256]; FILE*p=fopen(“C:\\demo.txt”,”r”);/*打开读*/ fread((void*)buffer,256,1,p);/*读256*1字节到buffer*/ fclose(p);/*关闭文件*/ (4) 原型:int fgetc(FILE*p) 功能:从文件中读取一个字节数据 参数: FILE*p:文件指针 返回值: 调用成功返回读取到的数据,否则返回-1 示范: int ch; FILE*p=fopen(“demo.txt”,”r”); ch=fgetc(p); fclose(p); (5) 原型:int fputc(int c,FILE*p) 功能:写一个字节到文件 参数: int c:要写入的字符 FILE*p:文件指针 返回值: 调用成功返回0,否则返回-1 示范: 略 (6) 原型:char*fgets(char*s,int n,FILE*p) 功能:从文件中读取一个字符串 参数: char*s:缓冲区指针 int n:最多字节数 FILE*p:文件指针 返回值: 调用成功返回0,否则返回-1 示范: 略 (7) 原型:int fputs(char*s,FILE*p) 功能:写一字符串到文件中 参数: char*s:要写入的字符串指针 FILE*p:文件指针 返回值: 调用成功返回0,否则返回-1 示范: 略 (8) 原型: long ftell(FILE*p) 功能:返回文件当前位置 参数: FILE*p:文件指针 返回值: 总是返回文件的当前位置 示范: 略 (9) 原型:int fwrite(void*buffer,int size,int block,FILE*p) 功能:写入数据块到文件中 参数: void*buffer:要写入的缓冲区指针 int size:每个块大小 int block:块总数 FILE*p:文件指针 返回值: 调用成功返回0,否则返回-1 示范: 略 (10) 原型: int feof(FILE*p) 功能:检测是否到达文件尾 参数: FILE*p:文件指针 返回值: 0=未到文件尾,1=到达文件尾 示范: 略 (11) 原型:int chdir(char*dir_name) 功能:进入文件夹 参数: char*dir_name:文件夹名称,支持全路径 返回值: 调用成功返回0,否则返回-1 示范: 略 (12) 原型: int rmdir(char*dir_name) 功能:删除文件夹 参数: char*dir_name:文件夹名称,支持全路径 返回值: 调用成功返回0,否则返回-1 示范: 略 (13) 原型: int mkdir(char*dir_name) 功能:建立文件夹 参数: char*dir_name:文件夹名称 返回值: 调用成功返回0,否则返回-1 示范: 略 (14) 原型: int getcurdir(int driver,char*buffer) 功能:获取当前目录 参数: int driver:驱动器号码,0表示当前驱动器 char*buffer:保存当前目录的缓冲区指针 返回值: 调用成功返回0,否则返回-1 示范: 略 (15) 原型:int findfirst(char*mask,ffblk*ffblk,char attr) 功能:按条件查找文件 参数: char*mask:条件字符串,支持通配符 ffblk*ffblk:内部使用的文件块结构指针 char attr:匹配的属性 返回值: 调用成功返回0,否则返回-1 示范: ffblk ffblk; int i=findfirst(“*.exe”,&ffblk,0); while(!i) { printf(“found file %s\r\n”,ffblk.ff_name); i=findnext(&ffblk); } (16) 原型: int findnext(ffblk*ffblk) 功能:继续查找文件 参数: ffblk*ffblk:findfirst()返回的ffblk指针 返回值: 查找到匹配文件返回0,否则返回-1 示范: 参考findfirst() (17) 原型:void getdfree(char driver,dfree*table) 功能:获取磁盘信息 参数: char driver:磁盘驱动器号,0=当前驱动器 dfree*table:dfree结构指针 返回值: 无 示范: 略 (18) 原型:int rename(char*old_name,char*new_name) 功能:重命名文件或者文件夹 参数: char*old_name:旧名称 char*new_name:新名称 返回值: 调用成功返回0,否则返回-1 示范: 略 (19) 原型: int remove(char*file_name) 功能:删除文件 参数: char*file_name:文件名,支持全路径 返回值: 调用成功返回0,否则返回-1 示范: 略 (20) 原型: int fseek(FILE*p,long offset,int opt) 功能:移动文件指针 参数: FILE*p:文件指针 Long offset:偏移量 Int opt:SEEK_SET,直接设置到offset,SEEK_CUR,当前位置偏移offset,SEEK_END,文件尾偏移offset 返回值: 调用成功返回0,否则返回-1 示范: 略 (21) 原型: int attrib(char*file_name,char attr) 功能:设置文件的新属性 参数: char*file_name:文件名 char attr:文件属性 返回值: 调用成功返回0,否则返回-1 示范: 略 (22) 原型: int label(char driver,char*name) 功能:更改磁盘卷标 参数: char driver:磁盘名,如’C’,’D’,’E’ char*name:新的磁盘卷标 返回值: 调用成功返回0,否则返回-1 示范: 略 (23) 原型: int getfilelength(FILE*p) 功能:获取文件总长度 参数: FILE*p:文件指针 返回值: 返回文件的长度 示范: 略 (24)原型: int FAT_install(int dwStart,SECTOR_ERASE lpfnErase,SECTOR_READ lpfnRad,SECTOR_WRITE lpfnWrite,void*user_data) 功能:安装一个新的磁盘驱动器 参数: int dwStart:开始扇区号 SECTOR_ERASE lpfnErase:硬件提供的扇区擦除函数 SECTOR_READ lpfnRead:硬件提供的扇区读函数 SECTOR_WRITE lpfnWrite:硬件提供的扇区写函数 void*user_data:用户数据指针 返回值: 调用成功返回已安装的磁盘驱动器总数,否则返回0 示范: 略 (24) 原型: int FAT_format(void*unused,FORMAT_PARMS*fmt) 功能:格式化一个新的磁盘驱动器 参数: void*unused:在kernel代码中,可以使用为已经install过的驱动器指针,用户代码必须为NULL FORMAT_PARMS*fmt:格式化信息指针 注意,以上参数必须有一个参数且只有一个参数有效 返回值: 调用成功返回1,否则返回0 示范: 略 <2>动态内存分配操作API (1) 原型:void*malloc(int size) 功能:动态分配内存 参数: int size:要分配的数据大小 返回值: 调用成功返回数据块指针,否则返回NULL 示范: 略 (2) 原型:void*free(void*ptr) 功能:释放先前分配的内存块 参数: void*ptr:有效的已分配指针 返回值: 返回原来的块地址 示范: 略 <3>基本输入输出API (1) 原型:void putc(char ch) 功能:往stdout输出一个字符 参数: char ch:要显示的字符 返回值: 无 示范: 掠 (2) 原型:void puts(char*s) 功能:往stdout上输出一个字符串 参数: char*s:要输出的字符串指针 返回值 无 示范: 略 (3) 原型:char getch() 功能:从stdin读取一个字节 参数: 无 返回值: 返回读取到的数据 示范: 略 (4) 原型:void gets(char*s) 功能:从stdin读取一个字符串 参数: char*s:缓冲区指针 返回值: 无 示范: 略 (5) 原型:int pringf(char*fmt,…) 功能:stdout格式化输出 参数: char*fmt:格式化字符串 返回值: 返回最后输出的总字节数 示范: 略 (6) 原型:void clrscr() 功能:stdout清屏 参数: 无 返回值: 无 示范: 略 (7) 原型:void gotoxy(int x,int y) 功能:stdout设置显示位置 参数: int x,y:显示坐标 返回值: 无 示范: 略 (8) 原型:int textcolor(int color) 功能:设置stdout文本颜色 参数: int color:文本颜色 返回值:返回原来的文本颜色 示范: 略 (9) 原型:int textbackground(int color) 功能:设置stdout背景颜色 参数: int color:背景颜色 返回值:返回原来的背景颜色 示范: 略 <4>一般功能API (1) 原型:void*memset(void*buffer,char set_value,int size) 功能:内存块预置数据 参数: void*buffer:内存块指针 char set_value:要设置的值 int size:内存块大小 返回值: 返回原来的指针 示范: 略 (2) 原型:char*strcpy(char*dst,char*src) 功能:字符串拷贝 参数: char*dst:目标字符串 char*src:源字符串 返回值: 返回dst指针 示范: 略 (3) 原型:int strlen(char*dst) 功能:计算字符串长度 参数: char*dst:字符串指针 返回值: 返回该字符串长度,不包括’\0’ 示范: 略 (4) 原型:char*strcat(char*dst,char*src) 功能:字符串连接 参数: char*dst:目标串 char*src:源串 返回值: 返回dst指针 示范: 略 (5) 原型:char strcmp(char*dst,char*src) 功能:严格字符串比较 参数: char*dst:第一个字符串 char*src:第二个字符串 返回值: 两个字符串完全匹配返回0,否则返回第一个不匹配字符的差 示范: 略 (6) 原型:char strcmpi(char*dst,char*src) 基本和strcmp相同,只是strcmp区分大小写,strcmi不区分大小写 (7) 原型:void sprintf(char*buff,char*fmt,…) 功能:格式化字符串 参数: char*buff:保存数据的指针 char*fmt:格式化串 返回值: 无 示范: 略 (8) 原型:int atoi(char*txt) 功能:ASCII转int 参数: char*txt:ASCII格式的数字串 返回值: 返回对应的数据 示范: 略 (9) 原型:void delay(int ms) 功能:延时ms 参数: int ms:要延时的毫秒数 返回值: 无 示范: 略 (10) 原型:void sleep(int s) 功能:延时s 参数: int s:要延时的秒数 返回值: 无 示范: 略 (11) 原型: int exec(int argc,char argv[][256]) 功能:执行外部程序 参数: int argc:参数个数 char argv[][256]:参数数组,argv[0]必须是可执行程序文件名 返回值: 调用成功返回该程序main()的返回值,否则返回-1 示范: 略 <5>TSR程序API 原型: void keep(unsigned char status,unsigned intsize) 功能:保留CODE到RAM空间 参数: unsigned char status:状态,eDOS未用,兼容MSDOS参数 unsigned int intsize:要保留的字节数 返回值: 无 示范: 略 <6>环境设置API (1) 原型:char*getenv(char*name) 功能:获取环境值 参数: char*name:环境名 返回值: 调用成功返回对应的环境值,否则返回NULL 示范: char*value; putenv(“VERSION=0.0.0.1”); value=getenv(“VERSION”);/*value将是”0.0.0.1” (2) 原型:int putenv(char*envs) 功能:设置/添加/更改/删除环境 参数: char*envs:设置字符串 返回值: 调用成功返回0,否则返回-1 示范: putenv(“VERSION=1.0.0.0”);/*添加或更改VERSION*/ putenv=(”VERSION=”);/*删除VERSION*/ (7)设备驱动API (1)原型: int Device_install(char*name,int mode,DEVICE_OPEN lpfnOpen,DEVICE_CLOSE lpfnClose,DEVICE_READ lpfnRead,DEVICE_WRITE lpfnWrite,DEVICE_ESCAPE lpfnEscape) 功能:安装一个新的驱动程序 参数: char*name:驱动程序名,如”LCD:”.”KBD:”等 int mode:驱动程序模式,0x01=可读,0x02=可写,0x40=可共享读,0x80=可共享写 DEVICE_OPEN lpfnOpen: DEVICE_CLOSE lpfnClose: DEVICE_READ lpfnRead: DEVICE_WRITE lpfnWrite: DEVICE_ESCAPE lpfnEscape:对应的函数指针 返回值: 调用成功返回0,否则返回-1 (3) 原型: int Device_uninstall(char*name) 功能:卸载一个驱动 参数: char*name:已安装的驱动名 返回值: 调用成功返回0,否则返回-1 示范: 略 <8>图形库API (1)原型: int initgraph(void*gp,void*sp,int gf) 功能:图形系统初始化 参数: void*gp:硬件定义的获取点颜色值的函数指针 void*sp: 硬件定义的设置点颜色值的函数指针 int gf:屏幕参数,低16位是屏幕长度,高16位是屏幕宽度 返回值: 调用成功返回1,否则返回0 示范: 略 (3) 原型: void cleardevice() 功能:清除屏幕 参数: 无 返回值: 无 示范: 略 (4) 原型: int getmaxx() 功能:返回屏幕长-1 参数: 无 返回值: 屏幕长-1 示范: 无 (5) 原型: int getmaxy() 功能:返回屏幕宽-1 参数: 无 返回值: 屏幕宽-1 示范: 无 (6) 原型: void putpixel(int x,int y,int color) 功能:在(x,y)位置画color颜色的点 参数: int x,y:坐标 int color:颜色 返回值: 无 示范: 略 (7) 原型: int getpixel( int x, int y) 功能:获取(x,y)处颜色值 参数: int x,y:坐标 返回值: 调用成功返回有效颜色代码,否则返回-1 示范: 略 (8) 原型: void moveto(int x,int y) 功能:移动当前画笔位置到(x,y) 参数: int x,y:坐标 返回值: 无 示范: 略 (9) 原型: void lineto(int x,int y) 功能:从当前位置画线到(x,y) 参数: int x,y:坐标 返回值: 无 示范: 略 (10) 原型: void line(int x1,int y1,int x2,int y2) 功能:从(x1,y1)处绘线到(x2,y2) 参数: int x1,y1:起点坐标 int x2,y2:终点坐标 返回值: 无 示范: 略 (11) 原型: void rectangle(int x1,int y1,int x2,int y2) 功能:绘制矩形 参数: int x1,y1:左上角坐标 int x2,y2:右下角坐标 返回值: 无 示范: 略 (12) 原型: void settextstyle(int bkmode, int scale_x, int scale_y) 功能:设置文本输出属性 参数: int bkmode:背景模式,0=显示背景色,1=透明输出 int scale_x:x方向的放大倍数 int scale_y:y方向的放大倍数 返回值: 无 示范: 略 (13) 原型: void setcolor(int color) 功能:设置绘制颜色 参数: int color:颜色值 返回值: 无 示范: 略 (14) 原型: void setbkcolor(int color) 功能:设置背景颜色 参数: int color:颜色值 返回值: 无 示范: 略 (15) 原型:int getcolor() 功能:获取当前绘制颜色 参数: 无 返回值: 当前绘制颜色 示范: 略 (16) 原型:int getbkcolor() 功能:获取当前绘制背景颜色 参数: 无 返回值: 当前绘制背景颜色 示范: 略 (17) 原型:void outtext(char*text) 功能:从当前位置开始显示字符串 参数: char*text:要显示的字符,支持中西文混合 返回值: 无 示范: 略 (18) 原型:void outtextxy(int x,int y,char*text) 功能:从(x,y)处开始显示字符串 参数: int x,y:开始位置 char*text:要显示的字符,支持中西文混合 返回值: 无 示范: 略 (19) 原型:int textwidth(char*text) 功能:检测字符串显示的长度,单位是象素 参数: char*text:文本字符串 返回值: 整个文本的显示点阵长度 示范: 略 (20) 原型:int textheight(char*text) 功能:检测字符串显示的宽度,单位是象素 参数: char*text:文本字符串 返回值: 整个文本的显示点阵宽度 示范: 略 (21) 原型:int imagesize(int left,int top,int right,int bottom) 功能:计算保存(left,top,right,bottom)矩形的屏幕内容所需要的字节数 参数: int left,top,right,bottom:矩形坐标 返回值: 返回所需要RAM的最小字节数 示范: 略 (22) 原型:int getimage(int left,int top,int right,int bottom,void*images) 功能: 把屏幕区域保存到RAM缓存 参数: int left,top:左上角坐标 int right,bottom:右下角坐标 void*bitmap:RAM指针 返回值: 调用成功返回1,否则返回0 示范: 略 (23) 原型: void putimage(int left,int top,void*bitmap,int op) 功能: 把上次保存的图象重新显示到屏幕上 参数: int left,top:开始显示的位置 void*bitmap:RAM指针 int op:MASK选项(0x01:and,0x02:or,0x03:not,0x04:xor,其他:copy) 返回值: 无 示范: 略 (24) 原型: void drawpoly(int num_points,int*points) 功能:绘制封闭多边形 参数: int num_points:多边形点数 int*points:点坐标列表,排列方法是(x1,y1,x2,y2,x3,y3,…,xn,yn) 返回值: 无 示范: 略 第五章 eDOS的通讯协议 Seekfor eDOS v1.0通过UART实现远程磁盘(Remotedisks.exe)功能.UART的波特率是115200(可配置,和CPU相关).通讯协议如下: (1) 每帧数据起始字节不定,最后总是与0x0d结尾,就是必须用’\n’结尾. (2) 当第一个字节在0x20~0x7f(可显示ASCII)时,表示输入的命令是基本DOS命令,eDOS直接调用shell解释该命令. (3) 当第一个字节是0x80~0xa0时,表示输入的命令是远程磁盘通讯命令,eDOS调用通讯处理函数来处理该命令 (4) 当eDOS接收到有效的远程磁盘命令时,eDOS向主机发送下列信息: A. 发送9字节标志信息,是”SFDOS1.0”+’\0’,主机读取此字符串信息判断eDOS是否回应 B. 针对不同的命令代码,eDOS继续统一发送下列格式信息给主机:packet_len+datas,其中的packet_len是一个32位的包长度信息,其后紧跟n个对应packet_len的数据.packet_len发送的时候是LSB first,这样的话eDOS回复给主机的字节数=9+4+packet_len! C. 当eDOS需要发送字符串的时候(如获取文件名等),eDOS会把字符串的’\0’也计算在packet_len里并发送’\0’给主机 D. 当主机需要发送字符串信息给eDOS的时候,主机也必须发送字符串尾部的’\0’ (5) 具体的通讯命令代码如下: (A) 主机格式:0x80+0x0d,表示要求eDOS发送所有的磁盘信息 eDOS回应:packet_len+driver 0 name+label+total clusters(32bits)+free clusters(32 bits)+… (B) 主机格式:0x81+mask name+attrib+0x0d,相当于执行findfirst+fintnext()功能 eDOS回应:packet_len+short name+long name+date(16bits)+time(16bits)+file length(32 bits)+… (C) 主机格式:0x82+dir name+0x0d:请求eDOS进入子文件夹 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (D) 主机格式:0x83+dir name+0x0d,请求eDOS建立文件夹 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (E) 主机格式:0x84+dir name+0x0d,请求eDOS删除文件夹 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (F) 主机格式:0x85+old name+new name+0x0d,请求eDOS更改文件名 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (G) 主机格式:0x86+file name+0x0d,请求eDOS删除文件 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (H) 主机格式:0x87+driver name+0x0d,请求eDOS格式化磁盘 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (I) 主机格式:0x88+file name+0x0d,请求eDOS读取文件所有内容 eDOS回应:packet_len(应该等于文件长度)+n个数据 (J) 主机格式:0x89+file name+0x0d+length+datas,请求eDOS写入数据到文件 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (I) 主机格式:0x8a+file name+0x0d,请求eDOS检测文件是否存在 eDOS回应:packet_len(应该等于1)+0(不存在)或者1(存在) (J) 主机格式:0x8b+driver name + label+0x0d,请求eDOS更改卷标 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (K) 主机格式:0x8c+name+attr+0x0d,请求eDOS更改文件属性 eDOS回应:packet_len(应该等于1)+0(失败)或者1(成功) (L) 主机格式:0x8d+0x0d,请求eDOS发送当前路径 eDOS回应:packet_len+name 附录 Seekfor eDOS v1.0 for S3C2410 这里提供一套移植在S3C2410标准开发板上的eDOS.硬件资源有64M NAND flash,2M nor flash,64M SDRAM.eDOS移植下的系统配置如下: (1) stdin,stdout,stderr全部使用UART0,eDOS内部驱动名是”COM1:” (2) 动态可分配内存大小是8M Bytes (3) eDOS包含NAND flash做为系统C:\,加入一2M的SDRAM虚拟成D:\ (4) 最大支持16个命令行参数 (5) 支持输出DOS API,支持autoexec.bat,支持环境变量功能 (6) CPU运行在202.8MHZ 双击eDOS.bin的图标可以下载Seekfor eDOS v1.0 for S3C2410: 感谢所有关心和支持Seekfor eDOS v1.0的同道和朋友,你们的支持就是我最大的动力! 欢迎和我联系讨论eDOS方面问题 QQ:82054357 MSN:[email protected] Mail:[email protected] |
|
| 第2楼 electronixtar | 发表于 2006-11-19 00:15 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
什么时候把偶的 文曲星 装个eDOS玩玩。文曲星也是6502单片机呢~~
|
|
| 第3楼 fish007yu | 发表于 2007-01-02 06:59 |
| 初级用户 发帖 12 积分 25 | |
|
以后学习,!
|
|
| 第4楼 osfree | 发表于 2007-01-12 02:05 |
| 初级用户 发帖 34 积分 72 来自 中国大陆 | |
|
支持!
|
|
| 第5楼 hjch65655166 | 发表于 2007-03-21 15:20 |
| 新手上路 发帖 10 积分 19 | |
|
强烈支持 谢谢斑竹
|
|
| 第6楼 shanliang8008 | 发表于 2007-07-28 01:15 |
| 银牌会员 发帖 514 积分 1,148 来自 河北 | |
Originally posted by electronixtar at 2006-11-19 12:15 AM: 有创意呀 |
|
| 第7楼 114176601 | 发表于 2007-10-10 18:36 |
| 初级用户 发帖 30 积分 63 来自 fu zhou | |
|
支持啊,
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |