打印

smartrtos单片机多任务操作系统发布,资源已可以下载

[复制链接]
9378|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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();

相关帖子

沙发
singleywy|  楼主 | 2011-3-12 14:30 | 只看该作者
所以系统服务开启,所占代码容量为2K左右,运行4个任务时,系统所占内存为124字节左右

使用特权

评论回复
板凳
singleywy|  楼主 | 2011-3-12 14:31 | 只看该作者
例程介绍:
#include<reg52.h>
#include "Os_api.h"
#include"IOfor52.h"
void OsTimerISP()interrupt 1
{
        OsIntEnter();
#if T0_TIMER_EN       
        ACC=((65536+8-SYS_CLK)%256);
        TR0=0;
        TL0+=ACC;
        ACC=0;
        CY=ACC&0x80;
        ACC =((65536+8-SYS_CLK)/256)+ACC;
        TH0+=ACC;
        TR0=1;        //时间管理
#endif
#if T2_TIMER_EN
#endif
        OsTimeTick();
        OsIntExit();                               
}
void TaskD()
{
        static uint8 i;
        while(1)
        {
           i=6;
           while(i--)
           {
                           LED5=LED5^1;
                        OsTaskWait(DO_TMO,50);
                }
        }
}
void TaskA()
{
        static uint8 i;
        LED0_ON;
        while(1)
        {
                i=3;
                while(i--);
                OsTaskInterval(50);       
                LED0=LED0^1;
        }
}


void TaskB()
{
   static uint8 i;
   LED1_ON;
   OsMsgApply();
   while(1)
   {
                i=5;
                while(i--);
                OsTaskInterval(100);
                LED1=LED1^1;
                if(OsMsgLIFOGet(&i))//以后进先出的方式获取消息
                {
                        if(i == 23){
                                LED6^=1;
                        }
                        if(i == 3){       
                                 LED7^=1;
                                if(OsMsgRelease())
                                {
                                        OsHandOver((uint16)TaskD);//当接收到消息3时,父任务自动结束,提交给子任务TaskD
                                }   
                        }
                }
       
   }
}
void TaskC()
{
        LED2_ON;
        while(1)
        {
                OsTaskInterval(200);
                LED2=LED2^1;
                OsMsgSend(1,23);//向任务B的消息队列中发送消息,消息值为23
                OsMsgSend(1,3);//向任务B的消息队列中发送消息,消息值为3               
        }
}
void TaskIdle()
{
         static uint8 i;
         LED3_ON;
         while(1)
         {
                 i++;
                LED3=LED3^1;
         }

}
void main()
{
        OsTaskCreate(0,(uint16)TaskA);
        OsTaskCreate(1,(uint16)TaskB);
        OsTaskCreate(2,(uint16)TaskC);
        OsTaskStart(3,(uint16)TaskIdle);
}

使用特权

评论回复
地板
singleywy|  楼主 | 2011-3-12 14:35 | 只看该作者
呵呵,不知道,大家对此是否感兴趣

使用特权

评论回复
5
心静自然凉| | 2011-3-12 14:46 | 只看该作者
赶紧上床,我看看

使用特权

评论回复
6
singleywy|  楼主 | 2011-3-12 15:03 | 只看该作者
5# 心静自然凉
恩,正在整理,翻页后,上传

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
心静自然凉 + 1
7
nongfuxu| | 2011-3-12 19:09 | 只看该作者
有趣的东西,当然感兴趣了。

使用特权

评论回复
8
刘前辈| | 2011-3-12 19:34 | 只看该作者
好东西。
我缴费购买。就别等翻页了吧。

50¥购买源代码。

使用特权

评论回复
9
singleywy|  楼主 | 2011-3-12 20:16 | 只看该作者
8# 刘前辈
呵呵,源代码是免费公开的,只是看看有多少人对此感兴趣,稍后传上,由于没有详细的使用手册,但函数有详细的说明,如果需要的人多的话,我在再编写详细的使用手册,介绍函数的功能,不过应该还有一些漏洞,如果发现的话,恳请大家指出

使用特权

评论回复
10
半个苹果| | 2011-3-12 22:31 | 只看该作者
mark

使用特权

评论回复
11
zhouwenbin1989| | 2011-3-12 23:26 | 只看该作者
我也在学习small rtos51,看了有一个星期多了,还没有能够完全明白(起码自己不能完整编出来),不知道LZ学了多久就可以自己编写了

使用特权

评论回复
12
apan| | 2011-3-12 23:47 | 只看该作者
先支持一下!

使用特权

评论回复
13
刘前辈| | 2011-3-13 10:25 | 只看该作者
建议:  LZ先贴个源代码或者内核.rar 出来,看看有多少人下载。马上就知道有多少人感兴趣了。

LZ的意思大概是“若感兴趣的人多,就愿意花时间写详细使用手册;若人少,就不愿多花时间?”
这有点委屈了俺这样强烈感兴趣的朋友。不如这样:

我拉我们老板出资帮你印刷成册;你尽管写好使用手册;然后论坛上前30名订购者(支持者)每人赠送一本。

刘前辈决不食言。——前30名支持者每人将可能获得一本LZ的rtos_51源代码及使用手册。还望LZ把使用手册或者源代码说明写好才是。


使用特权

评论回复
14
singleywy|  楼主 | 2011-3-13 11:10 | 只看该作者
13# 刘前辈
呵呵,首先感谢刘前辈的支持,不是我不贴出来,因为至少要简要写一些相关说明,这准备工作不能少的呀,不然读者不知所云,最迟今天下午两点就可以上传了

使用特权

评论回复
15
思宁| | 2011-3-13 11:27 | 只看该作者
:)抢个前30

使用特权

评论回复
16
wxfje| | 2011-3-13 11:28 | 只看该作者
相当感兴趣啊!等待LZ:)

使用特权

评论回复
17
singleywy|  楼主 | 2011-3-13 15:19 | 只看该作者
文件已经上传,大家可以下载了,有什么问题,发送至邮箱singleywy#qq.com

使用特权

评论回复
18
singleywy|  楼主 | 2011-3-13 15:25 | 只看该作者
本帖最后由 singleywy 于 2011-3-13 15:35 编辑

压缩文件中,包含了简单的使用手册,是未完整版的,因为大家需要,先放上来给大家看看

使用特权

评论回复
19
红金龙吸味| | 2011-3-13 15:59 | 只看该作者
支持LZ。

使用特权

评论回复
20
rafd| | 2011-3-13 18:54 | 只看该作者
支持

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

295

帖子

3

粉丝