中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » Seekfor eDOS v1.0使用指南(非常详细的eDOS性能列表)
作者:
标题: Seekfor eDOS v1.0使用指南(非常详细的eDOS性能列表) 上一主题 | 下一主题
seekfor
荣誉版主





积分 57
发帖 23
注册 2006-10-28
状态 离线
『楼 主』:  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:sfrad32@hotmail.com
Mail:Seek_For@163.com

2006-11-18 21:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 2 楼』:  

什么时候把偶的 文曲星 装个eDOS玩玩。文曲星也是6502单片机呢~~




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-11-19 00:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fish007yu
初级用户





积分 25
发帖 12
注册 2006-11-17
状态 离线
『第 3 楼』:  

以后学习,!

2007-1-2 06:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
osfree
初级用户





积分 72
发帖 34
注册 2007-1-12
来自 中国大陆
状态 离线
『第 4 楼』:  

支持!



PowsdeRTOS,可运行于FreeDOS,窗口实时操作系统.
2007-1-12 02:05
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
hjch65655166
新手上路





积分 19
发帖 10
注册 2006-3-23
状态 离线
『第 5 楼』:  

强烈支持  谢谢斑竹

2007-3-21 15:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
shanliang8008
银牌会员




积分 1148
发帖 514
注册 2007-6-1
来自 河北
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by electronixtar at 2006-11-19 12:15 AM:
什么时候把偶的 文曲星 装个eDOS玩玩。文曲星也是6502单片机呢~~

有创意呀



我的论坛:http://shanliang8008.31344.com/
我的空间:http://hi.baidu.com/shanliang8008/
2007-7-28 01:15
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
114176601
初级用户





积分 63
发帖 30
注册 2007-10-7
来自 fu zhou
状态 离线
『第 7 楼』:  

支持啊,

2007-10-10 18:36
查看资料  发送邮件  发短消息 网志  OICQ (114176601)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: