本帖最后由 singleywy 于 2011-3-13 15:39 编辑
下载资源处:
smartrtos.rar
(68.65 KB)
smartrtos,C语言版本的单片机操作系统;
前言:
从暑假开始到现在,完整版的smartrtos已经出炉了,在最近这些日子里,我忙忙碌碌地过着,除了吃饭、睡觉、上课,一直在调试smartrtos中各项功能,折磨了可怜的开发板几百次,最终完成了调试工作;
smartrtos系统相关介绍:
首先,该系统主要是针对51单片机而设计的,提供8个激活任务,理论上支持255个未激活任务,该功能类似活动槽,可以随时将任务激活,或者撤销,;
其次,smartrtos,有如下特点:
1)本版本的smartrtos,是建立在之前编写的汇编调度器Os_mini_shortv1.0以及C语言版本Os_c基础上完成的
2)smartrtos,主要是针对51单片机编写的,至于有关是否需要在8位单片机上运行RTOS的问题,我在此就不再讨论了,毕竟有所求就有所需;
3)其中参考的相关资料有UCOS、RTX-TINY、lqrtos、smallRTOS以及网上相关的RTOS,它结合了诸多RTOS的优点,在方法上进行了参考并改进;
4)任务切换调度器采用RTX-TINY相类似的动态堆栈内核,即各个任务以及中断共用一个堆栈空间,采取这样工作方式的明显优势是内存空间得到充分利用,劣势是这涉及到数据的搬移,导致平均切换时间的增长;
smartrtos,将任务划分成两类,一类处于激活态,即在内存中的任务,另一类处于未激活态,即在代码空间的,没有调入内存中;本系统支持8个激活态的任务(包括系统空闲任务),理论上支持255个处于未激活的任务;系统中任务有如下几种状态:运行态、就绪态、挂起态、休眠态、删除态,以下是对这几种状态的简要说明:
运行态,即任务正在运行中,
就绪态,即任务已经具备运行的相关资源,
挂起态,即任务由于某种原因挂起,如延时、等待资源等,
休眠态,即任务处于内存中,不被系统所调度,
删除态,即任务已经从内存中删除了;
5)smartrtos,支持动态优先级调制,采用优先级抢占式内核
smartrtos,本版本所支持的系统服务有信号、信号量、消息队列、邮箱、任务延时、任务等待、任务间隔运行、动态修改优先级、任务删除与创建等;
smartrtos,与其他RTOS而言,较突出的部分为:
1)由于在8位单片机上操作,舍去了可读性高的结构体数据结构及结构体指针、链表操作,而改为数组指针操作,这样可以减少单片机的运算负担,提高效率,但给系统模块化操作带来不便,同时降低了可读性;
2)smartrtos中大部分函数是不可重入的,采取了关中断,开中断的方式,来保护程序的正常运行,如果编译器仅采取寄存器或者堆栈作为局部变量(不涉及全局变量或者只修改相关位),则函数具有可重入性;
3)smartrtos中消息队列特点,具有不透明性,即消息队列的长度是由用户在编译时设定的,消息队列处于内存中可以由任务动态申请或者释放,申请时与任务绑定,释放时与任务撤销绑定,这样做的好处是,任务给其他任务发送消息时,只需提供该任务的任务号即可完成消息的发送,无需提供消息队列的地址;
4)smartrtos中的信号特点,发送信号时,仅当任务等待信号事,才使任务插入就绪列表并退出挂起态,如果任务不在等待信号,则不插入就绪列表,仅使任务退出休眠态;清除信号时,使任务进入休眠态;
5)smartrtos,具有任务动态删除与创建功能,(功能只适用于RTX类型的动态堆栈结构,不适合用于其他堆栈结构)
任务删除,指的是任务从内存中删除,任务创建,指的是将代码区的任务调入内存中
6)smartrtos,采用C语言编写,同样具有可移植性,但要修改相关的内容,编写过程尽量采取通用性操作;
smartrtos,所提供的系统服务函数有:
extern uint8 OsTimeSet(uint8 timetick);
extern void OsTaskInterval(uint8 timetick);
extern uint8 OsSemCreate(uint8 index,uint8 semdata);
extern uint8 OsSemDelete(uint8 index);
extern uint8 OsSemV(uint8 index);
extern uint8 OsSemP(uint8 index,uint8 timetick);
extern void OsMsgInitial();
extern uint8 OsMsgApply();
extern uint8 OsMsgRelease();
extern uint8 OsMsgSend(uint8 taskid,uint8 message);
extern uint8 OsMsgFIFOGet(Pdata8 getmsg);
extern uint8 OsMsgLIFOGet(Pdata8 getmsg);
extern uint8 IntMBoxSend(uint8 index,uint8 mail);
extern uint8 OsMBoxSend(uint8 index,uint8 mail);
extern uint8 OsMBoxGet(uint8 index,Pdata8 mail,uint8 timetick);
extern uint8 IntSignalSend(uint8 taskid);
extern uint8 OsSignalSend(uint8 taskid);
extern void OsSignalClear(uint8 taskid);
extern uint8 OsTaskWait(uint8 selecttype,uint8 timetick);
extern uint8 DelStackTest();
extern uint8 OsTaskDel(uint8 taskid);
extern void OsSelfDel();
extern void OsHandOver(uint16 taskhandle);
extern uint8 OsTaskBuild(uint16 taskhandle);
extern void OsTaskCreate(uint8 taskid,uint16 taskhandle);
extern void OsTaskStart(uint8 taskid,uint16 taskhandle);
extern void OsIntExit();
extern void OsTimeTick();
extern void SetTaskPrio(uint8 taskid,uint8 taskprio);
extern void OsMovePrio(uint8 operation);
extern void OsSetPrio(uint8 taskprio);
extern uint8 GetTaskPrio( uint8 taskid );
extern uint8 OsGetPrio();
extern uint8 OsGetID(); |