欣欣工作室——带你走进单片机世界

         
累计访问3895709
当前在线72
首   页 | 常用器件 | 问答集萃 | 技术文摘 | 在线学习 | 共享工程 | 资料下载 | 网友交流

 
Web xinworks


MINI51 RTOS


版权声明:“MINI51 RTOS”软件及其说明文档由 欣欣工作室 版主 Stoneway Qi 编写,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。——Stoneway Qi 主页: http://www.xinworks.com 邮箱: Stonewayqi@hotmail.com

这是一款为MCS51及其兼容系列单片机量身定做的微型实时操作系统。使用资源最少,只需少量片内RAM,在只有64个字节RAM的AT89C1051上也可以运行。使用时间片轮番调度,支持最多4个任务同时运行。在使用1KHz系统节拍时,拥有95%的CPU有效利用率;在使用200Hz系统节拍时,则可达到99%。

如果手上有 欣欣工作室单片机/C51学习板 或其它种类的51单片机学习板,可以按如下说明操作,观察演示程序的运行。点击 编译工具 下载C51 V3.20软件,保存并解压到 C: 盘根目录下。点击 MINI51RTOS 下载 MINI51 RTOS 系统库和演示程序,保存并解压到 C:\C51 目录下。启动 Windows 的命令窗口,输入 CD \C51 命令,进入到 C:\C51 目录下。输入 AUTOEXEC.BAT 命令设置 C51 的环境参数。输入 C51 T.C -NOAREGS 命令,编译演示程序,T.C 为演示程序。输入 L51 T.OBJ, MINI51.LIB RS(256) 命令生成可执行文件 T 。输入 OHS51 T 命令生成 T.HEX 文件。使用相关烧写软件将 T.HEX 烧写到单片机上就可以观察运行结果了。有关 欣欣工作室单片机/C51学习板 的烧写方法,请参阅该板使用文档中的 在线烧写程序 一篇。

该系统的源码可以点击 MINI51 源码 下载。

MINI51 RTOS 的应用程序可以包含TaskA、TaskB、TaskC、TaskD四个任务中的1 - 4个。各个任务在内核的管理下,分时获得 CPU 资源,得以运行。四个任务的优先级相同,它们之间可以通过系统服务进行同步、通信及共享资源。每个任务拥有独立的堆栈,任务及函数的私有动态变量保存在堆栈中。任务直接或间接调用的函数要定义成再入式函数。任务对事件响应的最大延迟时间由内核的调度节拍和活跃任务数决定。为了提高系统的实时性,可以加快系统调度节拍的频率,但这是以降低CPU利用率为代价的。要求快速响应的事件,须在中断处理程序中处理。内核占用T0定时器资源产生调度节拍。内核起动之后,应用程序不应长时间禁止中断,也不可以修改T0定时器的相关设置。

系统为应用程序提供了一系列的API服务函数,说明如下:

1、OSInit()
函数原型:void OSInit(u8 InitTH0);
应用程序调用该函数对系统进行初始化。该函数必须先于其它API函数调用,且不能在任务中调用。InitTH0 是为TH0设定的初值,内核的任务调度节拍的频率由该参数决定。

2、OSStart()
函数原型:void OSStart(void);
应用程序调用该函数,启动系统内核。在调用此函数前,要保证系统中至少已存在一个任务,否则系统将进入锁定状态。本函数不能在任务中调用。

3、OSCreateTaskA()
函数原型:void OSCreateTaskA(u8 tcb, u16 stk, u16 task) reentrant;
该函数用于建立TaskA任务,可以在系统起动之前调用,也可以在系统起动之后由任务调用。如果系统中已存在一个TaskA任务,原有任务流程将被终止,代以新的流程。在已存在TaskA任的情况下,调用此函数前,要确保原有任务流程已释放其所占用的资源,否则会造成资源不能回收。入口参数 tcb 为任务控制块地址;stk 为堆栈的栈顶和栈底地址,低8位为栈顶(SP)地址,高8位为栈底(BP)地址;task 为任务入口地址。

4、OSCreateTaskB()
函数原型:void OSCreateTaskB(u8 tcb, u16 stk, u16 task) reentrant;
该函数用于建立TaskB任务,使用方法同 OSCreateTaskA()。

5、OSCreateTaskC()
函数原型:void OSCreateTaskC(u8 tcb, u16 stk, u16 task) reentrant;
该函数用于建立TaskC任务,使用方法同 OSCreateTaskA()。

6、OSCreateTaskD()
函数原型:void OSCreateTaskD(u8 tcb, u16 stk, u16 task) reentrant;
该函数用于建立TaskD任务,使用方法同 OSCreateTaskA()。

7、OSDelTaskA()
函数原型:void OSDelTaskA(void) reentrant;
该函数用于删除TaskA任务。一个任务可以删除其它的任务,也可以删除自身。删除任务前,要确保该任务所占用的资源已释放,否则会造成资源不能回收。不要同时删除所有的任务,这样会使系进入锁定状态。

8、OSDelTaskB()
函数原型:void OSDelTaskB(void) reentrant;
该函数用于删除TaskB任务。

9、OSDelTaskC()
函数原型:void OSDelTaskC(void) reentrant;
该函数用于删除TaskC任务。

10、OSDelTaskD()
函数原型:void OSDelTaskD(void) reentrant;
该函数用于删除TaskD任务。

11、OSSched()
函数原型:void OSSched(void) reentrant;
该函数用于任务向内核交还CPU。一个任务在无事可做时,可以主动交还CPU,以便提高CPU的利用率。

12、OSLock()
函数原型:#define OSLock() ET0=0
系统功能宏,用于禁止内核调度,以便执不想被内核打断的程序段落。一次禁止内核调度的时间不宜过长,这会降低系统的实时性。

13、OSUnLock()
函数原型:#define OSUnLock() ET0=1
系统功能宏,用于允许内核调度。OSLock() 与 OSUnLock() 一定要成对的使用。

14、OSCritical()
函数原型:#define OSCritical() EA=0
系统功能宏,用于禁止中断,进入临界段。

15、OSUnCritical()
函数原型:#define OSUnCritical() EA=1
系统功能宏,用于允许中断,退出临界段。

16、OSSemPend()
函数原型:#define OSSemPend(sem) while(1){ET0=0;if(sem){sem=0;break;}OSSched();}ET0=1
系统功能宏,用于申请信号量。其中 sem 为 SEM 型变量。

17、OSSemPost()
函数原型:#define OSSemPost(sem) sem=1
系统功能宏,用于释放信号量。其中 sem 为 SEM 型变量。

18、OSTaskDly()
函数原型:#define OSTaskDly(tcb, times) ET0=0;tcb.cnt=times;OSSched()
系统功能宏,用于任务中的延时。调用该系统功能后,指定的任务进入休眠状态,不参与任务调度。直到延时时间到达时,任务才重新变为活跃状态,参与任务调度。tcb为所指定任务的任务控制块,times为延时节拍数。

19、OSHaltTask()
函数原型:#define OSHaltTask() while(1) OSSched()
系统功能宏,用于停止一个任务的运行。一个任务在等待被其它任务删除时,可以先停止运行,以免产生不期望的动作。

待续...
相关建议请到 这里 论讨。





粤ICP备06035157号