[ZLG-ARM] uC_Faraday 基于ARM的嵌入式操作系统的说明

[复制链接]
3179|9
 楼主| 我是火光 发表于 2008-6-13 22:54 | 显示全部楼层 |阅读模式
uC_Faraday&nbsp;&nbsp;&nbsp;&nbsp;基于ARM的嵌入式操作系统的说明<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;杭州电子科技大学计算机学院&nbsp;俞岳军讲师<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMAIL:&nbsp;yuejun_yu@sohu.com<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QQ:&nbsp;&nbsp;&nbsp;&nbsp;358969078&nbsp;智慧的火光<br /><br />一.uC_Faraday源代码的大致介绍:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uC_Faraday是一款专门针对ARM指令集嵌入式系统的多任务操作系统,目前已经实现了任务管理、任务间通讯这二部分功能。将来还要实现文件系统(先是实现FAT32)、TCP/IP协议、GUI、USB驱动等功能。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为什么要专门针对“ARM”指令集呢?而不象一般的OS,比如LINUX、uC/OS&nbsp;II这类操作系统,允许在不同的指令集间移植?本人认为如果要实现易移植性,必然会导致操作系统的性能下降,同时也考虑到ARM指令集是一个大有前途的指令集,那就选中它了,哈哈,考虑到周立功公司的ARM资料比较丰富,所以原始的uC_Faraday版本就是跑在<br />EASYARM2200扳子上的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个uC_Faraday目前包含下面的几个目录:Init_dir、Common_dir、include、SysCall_dir、<br />TIMER0_dir、App_dir<br /><br />Init_dir目录:这个目录包含了系统的启动代码和设备初始化代码,Startup.s是最先执行的,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它先是设置中断向量表,然后就是调用TargetResetInit.s中的TargetResetInit函数对CPU内部的片内外设进行初始化,然后调用GeneralInit.s中的GeneralInit函数对各个板上外设进行相应的初始化。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里有个TIMER0_Init.s,内部有个TIMER0_Init函数,那是对TIMER0进行初始化的,这个定时器提供系统的时钟。<br /><br />Common_dir:这个目录包含了内核的一些核心函数,Common_Varc.c是用来定义内核用到的全局变量的,Common_Vars.s也是定义内核的全局变量的,只不过<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common_Varc.c里定义的,一般是在C文件里用的,Common_Vars.s里定义的,则往往是在汇编里用到的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisEn_IRQ.s里面定义的是允许、禁止中断的子程序代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnterExit_CRITICAL.s里面定义的是进出临界区的代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有的中断服务程序都有一个汇编的外壳,这个外壳是由IRQ_Enter<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ_Exit二部分组成的,IRQ_Enter是在include目录里面,IRQ_Exit就在这<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;个目录下的,它们做的主要就是中断现场的保护和恢复工作。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System_Call和System0_Call和系统调用密切相关,System_Call是系统调用的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;汇编外壳,这个情况和IRQ_Enter和IRQ_Exit的情况类似。。。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而System0_Call则负责对系统调用进行散转,先是根据系统调用的高16位(部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;门号),然后再根据低16位,进行散转。。。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS0_Sched.c&nbsp;、OS_Sched.s&nbsp;、Pre_Sched.s实现任务的调度作业。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_Sched.s、OS0_Sched.c实现基本的任务间调度,我们假设这个时候任务的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现场已经保护好了,OS_Sched函数把任务的堆栈指针作为参数传递给<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS0_Sched,OS0_Sched把这个堆栈指针保存在当前任务的TCB里,然后在<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSPRIOTbl数组寻找就绪任务中的最合适者(优先级最高的),然后把新任务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的堆栈指针返回给OS_Sched函数,由OS_Sched函数把新的堆栈指针赋值给<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SP寄存器,接下去任务恢复现场,自然新的任务开始运行了。。。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pre_Sched函数是给那些在内核无法继续运行的任务调用的,这个函数先是保<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;护现场,然后就调用OS_Sched函数实现任务调度,然后再恢复现场。。。<br /><br />Incude&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个目录下的文件是头文件,要么给C文件使用、要么给汇编文件使用的,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意IRQ_Enter.inc这个文件,呵呵,里面包含的是汇编程序啊!<br /><br />TIMER0_dir:这个目录下的是定时器0的中断服务程序,IRQ_TIMER0.s是汇编外壳,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ0_TIMER0.C是C语言写的真正的中断服务程序。<br /><br />APP_dir:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是应用程序的目录,the_syscalls.h是内核提供的API函数的头文件,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The_syscalls.s是把内核提供的系统调用进行封装,产生用户方便使用的API<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;函数,注意!!!当参数数目多于4个的时候,处理起来可有点特殊的!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Main.c里面是包含着main函数,这是应用程序的开始!!!<br /><br />SysCall_dir:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里面存放的是系统调用的实现。目前只实现了一系列任务管理、任务间通讯<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的系统调用,存放在SYSTEM_dir目录下。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在SYSTEM_dir目录下又有许多文件和子目录:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCall_SYSTEM.s文件里的SysCall_SYSTEM函数,由System0_Call来调用,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;它根据系统调用号中的低16位来进行散转,进入相应的系统调用入口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSEvent_TaskWait.c文件里面有OSEvent_TaskWait和OSEvent_TaskRdy二函<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数,OSEvent_TaskWait做挂起运行任务的前期工作,把任务从就绪队列摘下,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果需要延时的话,加入延时队列。OSEvent_TaskRdy做恢复任务进入就绪状<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;态的前期工作,如果任务有定时请求的话,把它从延时队列上摘下,加入任务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;就绪队列。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSMutex_InsertEvent.c文件里的OSMutex_InsertEvent函数,把互斥信号控制<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;块插入&nbsp;获得这个互斥信号的任务控制块的&nbsp;“拥有队列”中去。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTask_ChgPrio.c里面的OSTask_ChgPrio函数,用于改变某任务的优先级。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Do_Timer.c文件里的Do_Timer函数,这是由定时中断调用的,处理延时事务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的函数。目前暂时只处理为了获取某些资源而挂起的任务比如<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(SUSPEND、SEM、MUTEX、MBOX、Q、QBYTE、QWORD、QDWORD、<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLAG)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有子目录和它们相应的功能:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task_dir:实现任务管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mem_dir:实现内存管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sem_dir:实现信号量管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mutex_dir:实现互斥信号量管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mbox_dir:实现邮箱管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q_dir:&nbsp;&nbsp;&nbsp;实现消息队列管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag_dir:实现事件标志组管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QByte_dir:实现字节队列管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QWord_dir:实现字队列管理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QDWord_dir:实现双字队列管理<br /><br />二.uC_Faraday和uC/OS&nbsp;II的渊源和区别<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在开始编写uC_Faraday前,本人已经研究过Linux和uC/OS&nbsp;II的源代码,所以有许多思想和方法,是直接从这二者那里学过来的。尤其是uC/OS&nbsp;II&nbsp;,但是uC_Faraday和<br />uC/OS&nbsp;II还是有许多区别的:<br />1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在uC/OS&nbsp;II的模式下,内核和应用程序是混在一起的,没有明显的边界。<br />uC_Faraday是采用的传统操作系统的方式,内核以系统调用的方式为应用层提供服务,这些系统调用实际上是被包装成API函数的格式。应用程序运用API函数,通过SWI软中断,最后进入内核的。。。<br />这样的方式,系统比较容易发展<br /><br />2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在uC/OS&nbsp;II下,任务的优先级是必须不同的,正是基于这个前提,Jean&nbsp;J.&nbsp;Labrosse<br />才可以应用他得意的OSMapTbl[],OSUnMapTbl[]表技术,但是这样一来,各个任务必须要分个高低上下了,而实际上,许多任务间的优先关系是不明显的,几乎是平等的。<br />在uC_Faraday下,对任务的优先级采用分层的概念,系统定了总的等级数,任务可以处于某一等级,这个等级里可以有多个任务,另外,应用层可以要求任务改变优先级。总的说来,是采用一种分等级、分层次的优先级方式。<br />注意,在uC_Faraday下,任务还是采用抢占方式的。。。<br /><br />3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uC/OS&nbsp;II里面某些实现不完善。比如互斥信号量问题,如果一个任务申请到了一个<br />互斥信号量,那它的优先级就可能发生改变,变成互斥信号量的当前优先级了;但<br />现在如果这个任务又要申请另外一个互斥信号量呢?那优先级如何改变?当释放<br />了一个互斥信号量,任务优先级又如何恢复?这些问题uC/OS&nbsp;II上面似乎没有对应<br />的办法。对事件标志组管理上,也有类似的问题。<br />在uC_Faraday里面,已经对这些问题进行了改良完善。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />三.实验环境<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;APP_dir下的例子给出了定时控制蜂鸣器鸣叫的例子,main0.c里的是用the_TaskTimeDly延时函数直接实现的;而main.c里的是通过创建一个子任务(kissme函数),<br />运用任务间通讯技术来实现的:the_TaskSuspend函数、the_TaskTimeDly函数、the_TaskResume函数。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要用main0.c的方法,你就把main.c改成main0.c,把main0.c改成main.c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果要用main.c的方法,你现在直接就好用了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对EASYARM2200实验板的跳线的设置:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP1&nbsp;&nbsp;&nbsp;全部断开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全部断开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP3&nbsp;&nbsp;&nbsp;全部断开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP4&nbsp;&nbsp;&nbsp;全部断开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;全部连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于BANK0—RAM,BANK1—FLASH<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP7&nbsp;&nbsp;&nbsp;处于OUTSIDE<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP8&nbsp;&nbsp;&nbsp;全部连接<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JP9&nbsp;&nbsp;&nbsp;全部连接<br /><br />四.对uC_Faraday的感想<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本人是杭州电子科技大学计算机学院的教师,对编写操作系统非常有兴趣,原来就写过一个叫ARCHIMEDES(阿基米德)的PC机上的保护模式下的单任务操作系统,那个系统是能够在真实的PC机上跑的,并且能够执行可执行文件的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />这里是ARCHIMEDES的源代码说明:<br />http://bbs.redhome.cc/viewthread&nbsp;...&nbsp;&extra=page%3D1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里是ARCHIMEDES的演示视频:<br />http://bbs.redhome.cc/viewthread&nbsp;...&nbsp;&extra=page%3D2<br />http://bbs.redhome.cc/upload/archimedes.wmv<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;去年,本人的兴趣转移到给嵌入式系统编写操作系统上了,这个uC_Faraday就是专门针对ARM指令集的嵌入式操作系统,已经实现了任务管理和任务间通讯这二部分的功能。<br />但对操作系统来说非常重要的文件系统和TCP/IP协议却还没有实现。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实本人编写那类模块的技术是成熟的,在ARCHIMEDES上,就已经实现硬盘上的类似EXT2的文件系统和软驱上的FAT12文件系统,效果是很理想的。目前,本人对FAT32的机理也相当的熟悉,,,,对TCP/IP的机理也比较熟悉,,,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关键是本人对编写这类模块的兴趣也是相当高的。。。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最大的苦恼来自IDE硬盘接口的中文资料比较缺乏,RTL8019AS的也是一样缺乏,本人的英语水平也不够好,这些资料估计老外的网络上是应该有的。但我没有办法去利用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在ARCHIMEDES里,对硬盘的操作只用到了二种操作:读物理扇区和写物理扇区,其他的操作命令都没有用到,并且如果读写扇区失败,就没有其他的办法,只有死循环了。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对uC_Faraday,我不希望采用同样的处理方法,应该能把IDE接口的所有操作命令都用起来,对读写扇区的失败,也应该有补救的措施的。。。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对RTL8019AS网卡芯片,也要有更高的认识,我看啊,现在的许多中文书上的介绍太不够精密了,许多参数的意义没有讲明白的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在把这个uC_Faraday放在网络,希望能够起抛砖引玉的作用,,,希望能见到嵌入式操作系统的蓬勃发展。。。<br /><br />附件里的是加上注释的&nbsp;uC_Faraday&nbsp;源代码!<br /><br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/200772923911940.rar'>https://bbs.21ic.com/upfiles/img/20077/200772923911940.rar</a>
 楼主| 我是火光 发表于 2008-6-13 22:56 | 显示全部楼层

附件里的是没有加注释的 uC_Faraday 源代码!

附件里的是没有加注释的&nbsp;uC_Faraday&nbsp;源代码!<br />&nbsp;&nbsp;做试验的时候,最好就采用这个没有加注释的源代码!<br /><br />因为我注释是我后面才加上去的!&nbsp;原来的代码就是清汤挂面式! <br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20077/2007729231152734.rar'>https://bbs.21ic.com/upfiles/img/20077/2007729231152734.rar</a>
armecos 发表于 2008-6-14 01:37 | 显示全部楼层

如果你用EASYARM2200开发的话,

可以到www.armecos.com上下载免费演示程序。FS、TCP、GUI、USB都已经实现了。<br />开发板配套书上有关于CF卡和8019的介绍啊,如果你觉得资料不够,我可以再提供一些。asdjf@163.com
 楼主| 我是火光 发表于 2008-6-14 09:13 | 显示全部楼层

我缺乏的是IDE硬盘接口的命令块参数中文详细介绍

<br />&nbsp;我缺乏的是IDE硬盘接口的命令块参数中文详细介绍<br /><br />&nbsp;我写过PC上的操作系统,那里已经用到了硬盘,并且已经建立了文件系统.<br />&nbsp;但在那上面,我只用到了&nbsp;&quot;读物理扇区和写物理扇区&quot;&nbsp;这二个命令,其他是比<br />&nbsp;如说:&nbsp;硬盘扇区校验硬盘格式化磁头校正磁盘诊断...这类没有用过,,,<br />&nbsp;还有厂商信息硬盘环境...<br /><br />&nbsp;就是对&nbsp;&quot;读物理扇区和写物理扇区&quot;,我也只能处理读写成功的情况,如果失败了,我就没有办法了,只能让其&nbsp;&quot;WHILE&nbsp;(1)&quot;&nbsp;了.<br /><br />&nbsp;苦恼啊,有IDE硬盘接口的命令块参数的详细介绍,我是一定能成功的...<br />&nbsp;我对编写系统软件有信心,我写程序是从来也不用调试工具来调试来调试去的.<br />&nbsp;一般就是一次搞定的...<br />&nbsp;我依靠的是&nbsp;&quot;小心&nbsp;+&nbsp;细心&quot;,哈哈!还有对硬件细节的准确把握!<br /><br />&nbsp;RTL8019AS的中文资料完整详实的也少.也是一个苦恼!<br /><br />
armecos 发表于 2008-6-14 09:57 | 显示全部楼层

这些资料遍地都是啊,

&nbsp;&nbsp;&nbsp;&nbsp;可能你找的方法有问题。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对于IDE硬盘接口你要搜“ATA”:<br />&nbsp;&nbsp;&nbsp;&nbsp;在www.zlgmcu.com主页搜索“ata”,可以找到英文手册。<br />&nbsp;&nbsp;&nbsp;&nbsp;《ARM嵌入式系统软件开发实例一》上有一些中文资料。<br />&nbsp;&nbsp;&nbsp;&nbsp;Linux驱动里就有现成处理源码,抄过来就成了。源码和手册对照看肯定能了解全部细节。<br />&nbsp;&nbsp;&nbsp;&nbsp;你的错误处理方式不好,最好做卷回处理。<br />&nbsp;&nbsp;&nbsp;&nbsp;调试还是必要的,哪怕只是为了检测正确性可靠性。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;对于8019你要搜“NE2000”,不需要使用8019厂商特定寄存器。只要是NE2000兼容的,都可以用于8019。要找8019资料就去查NE2000。<br />&nbsp;&nbsp;&nbsp;&nbsp;在www.zlgmcu.com主页搜索“ne2000”,可以找到8019中文资料。<br />&nbsp;&nbsp;&nbsp;&nbsp;另外,<br />&nbsp;&nbsp;&nbsp;&nbsp;DDK源码的NE2000部分有驱动参考<br />&nbsp;&nbsp;&nbsp;&nbsp;Linux<br />&nbsp;&nbsp;&nbsp;&nbsp;VxWorks<br />&nbsp;&nbsp;&nbsp;&nbsp;u-boot<br />&nbsp;&nbsp;&nbsp;&nbsp;redboot<br />&nbsp;&nbsp;&nbsp;&nbsp;ecos<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br />&nbsp;&nbsp;&nbsp;&nbsp;以上OS的NE2000目录下都有驱动源码,你不看数据手册,光凭分析源码就能了解ne2000(即8019)详细信息了。<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;EASYARM2200还有《ecos增值包》支持,包括了上面所有资料。www.armecos.com
 楼主| 我是火光 发表于 2008-6-18 14:08 | 显示全部楼层

这些资料确实遍地都是!!!

<br />&nbsp;&nbsp;&nbsp;这些资料确实遍地都是,但含金量并不高啊!<br />&nbsp;&nbsp;&nbsp;看LINUXVXWORDS这类源代码也不能根本性地解决问题,我说的是,它们都无法代替数据手册.<br /><br />&nbsp;&nbsp;&nbsp;其实,我只是对IDE硬盘接口的控制状态寄存器的若干位的含义不是完全明白,尤其是关于出错后的状态位...<br />&nbsp;&nbsp;&nbsp;读写操作之类出现故障,也需要恢复步骤,但就因为对相关的命令不熟悉,也只好WHILE(1)了.<br /><br />&nbsp;&nbsp;&nbsp;网卡芯片的问题也是对控制状态器的若干位意思不完全了解...<br /><br /><br /><br />
winfeng 发表于 2008-6-18 14:20 | 显示全部楼层

没有前途!

  
发表于 2008-6-18 15:24 | 显示全部楼层

同意楼上.

  
发表于 2008-6-18 15:24 | 显示全部楼层

浪费生命.

  
wlq_9 发表于 2008-6-18 16:30 | 显示全部楼层

另一个

freeRTOS?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部