




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SmallRT0S(51)1.12.1v使用手册概述:SmallRTOS是一个源代码公开的多任务实时操作系统,SmallRTOS51是其在8051系列处理器上的移植(使用keilc51SmallRTOS可以简化那些复杂而且时间要求严格的工程的软件设计工作.本手册主要讲述SmallRTOS的使用,本说明了在8051系列处理器上使用应该注意的问题。同时讲述了SmallRTOS的移植。本手册仅针对SmallRTOS(51)1.12版本SmallRTOS的特点:公开源代码只要遵循许可协议,任何人可以免费获得源代码。可移植作者尽虽:使用把与CPU相关部分压缩到最小,与CPU无关部分用ansic编写。可固
2、化SmallRTOS为嵌入系统设计,如果您有固化手段,它可以嵌入到您的产品中成为产品的一部分。占先式SmallRTOS可以管理17个任务,用户最多可以使用16个任务,每个任务优先级不同。中断管理中断可以使止在执行的任务挂起。如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。中断恢套层数可达255层。如果需要,可以禁止中断恢套管理。RAM需求小SmallRTOS为小RAM系统设计,应而RAM需求小,相应的,系统服务也少。SmallRTOS的使用:系统配置:os_cfg.h中定义了一些常量可以配置系统,具体定义如下:defineOS_MAX_TASKS4defineOS
3、_TICKS_PER_SEC10defineEN_USER_TICK_TIMER0defineEN_OS_INT_ENTER1defineEN_TIMER_SHARING1TOC o 1-5 h z/*最大任务数116,也就是实际任务数*/*声明1秒系统系统节舶数*/*禁止(0)或允许(1)系统定时中断调用用户函数UserTickTimerf)*/*禁止(0)或允许(1)中断嵌套管理*/*禁止(0)或允许定时器中断调用OSTimeTickf)*/#defineTICKTIMERSHARING1/*定义进入多少次硕件中断为一次系统定时器软中断*/defineEN_OS_Q#defineEN_OS
4、_Q_CHKdefineOS_Q_MEM_SEL0/*禁止(0)或允许(1)消息队列*/0/*禁止(0)或允许(1)校验消息队列指针*/xdata/*消息队列存储空间选择,keilc51有用,必须为idata.xdata*/*不是keilc51时它必须为空格*/defineEN_OS_Q_PENT1#defineEN_OS_Q_ACCEPT0#defineEN_OS_Q_POST0#defineEN_OS_Q_POST_FRONT1defineEN_OS_Q_INT_POST0defineEN_OS_Q_INT_POST_FRONT1defineENOSQNMsgs1defineEN_OS_Q
5、_SIZE0defineEN_OS_Q_FLUSH0广禁止(0)或允许(1)等待队列中的消息*/*禁止(0)或允许(1)无等待的从队列中取得消息/*禁止(0)或允许(1)FIFO方式相对列发送消息/*禁止(0)或允许(1)LIFO方式相对列发送消息/*禁止(0)或允许(1)中断中FlFO方式相对列发送消息/*禁止(0)或允许(1)中断中LIFO方式相对列发送消息/*禁止(0)或允许(1)取得队列中消息数*/*禁止(0)或允许(1)取得队列总容量*/广禁止(0)或允许(1)淸空队列*/defineEN_OS_SEM#defineEN_OS_SEM_CHKdefineOS_SEM_MEM_SEL0
6、/*禁止(0)或允许(1)信号量w/0/*禁止(0)或允许(1)校验信号量索引*/idata/*信号量储空间选择,keilc51有用,必须为idata.xdata/*不是keilc51时它必须为空格*/defineOS_MAX_SEMS2#defineEN_OS_SEM_PENT1#defineEN_OS_SEM_ACCEPT0defineEN_OS_SEM_INT_POST0#defineEN_OS_SEM_POST1defineEN_OS_SEM_QUERY0/*最大信号量数日*/*禁止(0)或允许(1)等待信号量*/*禁止(0)或允许(1)无等待请求信号量*/*禁止(0)或允许(1)中断
7、中发送信号量*/*禁止(0)或允许(1)中发送信号量*/*禁止(0)或允许(1)査询信号量*/#definedata/*非keilc51时必须加止这一句#ifEN_TIMER_SHARING=0w/defineTIME_ISR_TASK_IDSHOW_TASK_ID/*定义系统定时器软中断触发的任务IDendifOs_cpu.h中定义了一些常量可以配置一些与cpu相关的部分。针对SmallRTOS51,具体定义如下:#defineOS_ENTER_CRITICAL()EA=0,Os_Enter_Sum+/*关中断#defineOS_EXIT_CRITICAL()if(-Os_Enter_Sum
8、=0)EA=1/*开中断/*以上两句仅可以改变“EA=?部分*/#defineEN_SP20厂禁止(0)或允许(1)非屏蔽中断*/#defineIDATA_RAM_SIZE0 x100/*idata大小*/#defineSp2Space4广高级中断(软非屏蔽中断)堆栈大小EN_SP2为0时无效*/*系统定时器使用的中断;打开所有允许中断#defineOS_TIME_ISR/SET_EAMACROSETBEAENDM与编译器无关的数据类型为了便于移植,SmallRTOS定义了6种数据类型,它在Os_cpu.h定义。针对SmallRTOS51,具体定义如下:typedefunsignedcharu
9、int8;typedefsignedcharint8;typedefunsignedintuintl6;typedefsignedintinti6;typedefunsignedlonguint32;typedefsignedlongint32;TOC o 1-5 h z/*定义可移植的无符号8位整数关键字*/*定义可移植的有符号8位整数关键字*/*定义可移植的无符号16位整数关键字/*定义可移植的有符号16位整数关键字*/*定义可移植的无符号32位整数关键字*/*定义可移植的有符号32位整数关键字w/(3)运行SmallRTOS在main函数中调用OSStart()后系统开始运行,OSSta
10、rt()结束后运行优先级为0的任务。注意:在调用OSStart()ijij不要使能总中断标志,系统会口动执行开中断宏OS_EXIT_CRITICAL()e建立任务:SmallRTOS使用静态方法建立任务,在config.h中有这样一段代码:ifdefIN_OS_CPU_CexternvoidTaskA(void);externvoidTaskB(void);externvoidTaskC(void);void(*constTaskFuctionOS_MAX_TASKS)(void)=TaskA,TaskBJaskC;/函数数组TaskFuction保存了各个任务初始PC指针,其按任务ID(既优
11、先级次序)顺序保存endif用户只要定义好OS_MAX_TASKS?TaskFuction,任务将口动运行。其中TaskA等为任务对应函数。注意:1、ID为0的任务为最髙优先级任务,系统运行后首先执行它。2、ID为OS_MAX_TASKS的任务由系统定义。删除任务SmallRTOS1.12版不允许删除任务,因此,每个任务必须为无限循环结构。任务睡眠任务可以调用OSWait()使口己睡眠,其原型如下:unsignedcharOSWait(uint8typ,uint8ticks);功能描述:系统等待函数,任务调用此函数可以等待一定时间或信号输入:typ:等待事件类型,目询可以取以下值,或是其中任意
12、个值的按位或K_SIG:等待信号K_TMO:等待超时ticks:等待超时时的系统节拍数输出:NOT_OK:参数错误TMO_EVENT:超时到SIG_EVENT:有信号如果任务等待信号,另一个任务可以调用OSSendSignal()使其进入就绪状态,其原型如下:voidOSSendSignal(uint8Taskld);功能描述:中断中给指定任务发送信号,既使指定任务就绪输入:TaskId:任务ID输出:无中断调用OSIntSendSignal()也可以唤醒睡眠任务,其原型如下:voidOSIntSendSignal(uint8Taskld);功能描述:任务中给指定任务发送信号,既使指定任务就绪
13、输A:Taskld:任务ID输出:无用户调用OSQPend和OSSemPend时也可能使任务睡眠,可参见相应章节。信号量在SmallRTOS中,用一个0至ij(OS_MAX_SEMS-1)的值做索引标识一个信号虽:,所有对信号量的访问都通过它访问。SmallRTOS在使用一个信号量之前,首先要初始化该信号量,也即调用0SSemCreate()函数,对信号量的初始计数值賦值,该初始值为0到255之间的一个数。如果信号量是用來表示一个或者多个事件的发生,那么该信号量的初始值应设为0。如果信号量是用于对共享资源的访问,那么该信号的初始值应设为1(例如,把它当作二值信号量使用)。最后,如果该信号量是用
14、來表示允许任务访问n个相同的资源,那么该初始值显示应该是n,并把该信号量作为一个可计数的信号量使用。信号量使用的内存空间由用系统分配。消息队列与一般的RTOS不同,SmallRTOS的消息队列是以字节变量(uint8型变量,范围为0到255)作为消息,而不是以指针指向的内容作为消息。也就是说,消息队列发送一个消息实质是将一个0到255的数值存到消息队列中,而不是将一个指针存到消息队列中。类似的,从消息队列中获得一个消息就是得到一个范用为0到255的值。这个0到255的值用户可以任意解释。如果用户确实需要多个字节作为一个整体传递,可以有两个方法:一是消息队列仅仅传递数据的索引,真实数据放在另外的
15、地方:一是一次向消息队列中发送多个消息。消息队列使用的内存空间由用户分配。SmallRTOS51任务特殊处由于keilc51由于keilc51默认不支持重入函数,它的重入函数使用仿貞的重入栈而不使用系统栈,而SmallRTOS51没有进行重入栈管理,因此,用户应该保证各个任务的局部变量不会互相覆盖(方法后面有介绍),并且不定义重入函数。中断程序编制keilc51例子如下:#ifEN_OS_INT_ENTER0#pragmadisable厂除非最高优先级中断或是不需要系统管理的中断,否则,必须加上这一句*/#endifvoidOSTicklSR(void)interruptUSER_ISRifE
16、N_OS_INT_ENTER0OS_INT_ENTER();/*中断开始处理*/endif厂用户代码在这TOSIntExit();/*中断结朿处理,*/在其它CPU中,#pragmadisable不是必须的,但是可能需要口己在OS_INT_ENTER()之询保存任务环境。如果某个中断不需要OS管理,则可以自由编写。SmallRTOS的系统调用:OSVersion()宏,返回SmallRTOS版本号*100OSRunningTasklD()宏,返回当前止在运行的任务IDOSWait()原型:uint8OSWait(uint8typ,uint8ticks);功能描述:系统等待函数,任务调用此函数可
17、以等待一定时间或信号输A:typ:等待事件类型,目询可以取以下值,或是其中任意个值的按位或K_SIG:等待信号K_TMO:等待超时ticks:等待超时时的系统嘀嗒数输出:NOT_OK:参数错误TMO_EVENT:超时到SIG_EVENT:有信号全局变量:OSWaitTick调用模块:OSIntSendSignalOSSendSignal()原型:voidOSSendSignal(uint8Taskld)功能描述:任务中给指定任务发送信号,既使指定任务就绪输入:Taskld:任务ID输出:无全局变量:OSTaskRuning调用模块:OSSchedOSIntSendSignal()原型:void
18、OSIntSendSignal(uint8Taskld);功能描述:中断中给指定任务发送信号,既使指定任务就绪输入:Taskld:任务ID输出:无全局变量:OSTaskRuning调用模块:无OSQCreate()原型:uint8OSQCreate(uint8OS_Q_MEM_SEL*But,uint8SizeOfBuf);功能描述:初始化消息队列输入:Buf:为队列分配的存储空间地址SizeOfBuf:为队列分配的存储空间大小输出:NOTJDK:参数错误OS_Q_OK:成功全局变量:无调用模块:无OSQPend()原型:uint8OSQPend(uint8idata*Ret,uint8OS_
19、Q_MEM_SEL*But,uint8Tick);功能描述:等待消息队列中的消息输入:Ret:返回的消息Buf:指向队列的指针Tick:等待时间输出:NOT_OK:参数错误OS_Q_OK:收到消息OS_Q_TMO:超时到OS_Q_NOT_OK:无消息全局变量:无调用模块:OSRunningTasklD,OSCIearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICALOSQAccept()原型:uint8uint8OSQAccept(uint8idata*Ret,uint8OS_Q_MEM_SEL*Buf);功能描述:无等待从消息队列中取得消息输入
20、:Ret:返回的消息Buf:指向队列的指针输出:NOTJDK:参数错误OS_Q_OK:收至ij消息OS_Q_TMO:超时到OS_Q_NOT_OK:无消息全局变量:无调用模块:OSCIearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICALOSQIntPost()原型:uint8OSQIntPost(uint8OS_Q_MEM_SEL*Buf,uint8Data);功能描述:中断中FlFO方式发送消息输入:Buf:指向队列的指针Data:消息数据输出:OS_Q_FULL:队列满OS_Q_OK:发送成功全局变量:无调用模块:OSIntSendSign
21、al,OS_ENTER_CRITlCAL,OS_EXIT_CRITlCALOSQIntPostFront()原型:uint8OSQIntPostFront(uint8OS_Q_MEM_SEL*Buf,uint8Data);功能描述:中断中LIFO方式发送消息输入:Buf:指向队列的指针Data:消息数据输出:OS_Q_FULL:队列满OS_Q_OK:发送成功全局变量:无调用模块:OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICALOSQPost()原型:uint8OSQPost(uint8OS_Q_MEM_SEL*Buf,uint8Data);功
22、能描述:FIFO方式发送消息输入:Buf:指向队列的指针Data:消息数据输出:OS_Q_FULL:队列满OS_Q_OK:发送成功全局变量:无调用模块:OSQIntPost,OSSchedOSQPostFront()原型:uint8OSQPostFront(uint8OS_Q_MEM_SEL*Buf,uint8Data);功能描述:LIFO方式发送消息输入:Buf:指向队列的指针Data:消息数据输出:OSQFULL:队列满OS_Q_OK:发送成功全局变虽::无调用模块:OSQIntPostFront,OSSchedOSQNMsgsf)原型:uint8OSQNMsgs(uint8OS_Q_ME
23、M_SEL*Buf);功能描述:取得消息队列中消息数输入:Buf:指向队列的指针输出:消息数全局变虽::无调用模块:OS_ENTER_CRITICAL,OS_EXIT_CRITlCALOSQSize()原型:uint8OSQSize(uint8OS_Q_MEM_SEL*But);功能描述:取得消息队列总容量输入:Buf:指向队列的指针输出:消息队列总容量全局变虽::无调用模块:OS_ENTER_CRITICAL,OS_EXIT_CRITlCALOSQFIushf)原型:voidOSQFIush(uint8OS_Q_MEM_SEL*But);功能描述:清空队列输入:Buf:指向队列的指针输出:无
24、全局变虽::无调用模块:OS_ENTER_CRITICAL,OS_EXIT_CRITlCALOSSemCreate()原型:uint8OSSemCreate(uint8index,uint8Data);功能描述:初始化消息队列输入:index:信号量索引data:信号量初始值输出:NOTJDK:没有这个信号量OS_SEM_OK:成功全局变虽::无调用模块:无OSSemPend()原型:uint8OSSemPend(uint8index,uint8Tick);功能描述:等待一个信号量输入:index:信号量索引Tick:等待时间输出:NOT_OK:参数错误OS_SEM_OK:得到信号量OS_SE
25、M_TMO:超时到OS_SEM_NOT_OK:没有得到信号量全局变虽::无调用模块:OSRunningTasklD,OSCIearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICALOSSemAccept()原型:uint8OSSemAccept(uint8index);功能描述:无等待请求信号量输入:index:信号量索引输出:NOT_OK:参数错误OS_SEM_OK:得到信号量OS_SEM_TMO:超时到OS_SEM_NOT_OK:没有得到信号量全局变量:无调用模块:OSCIearSignal,OSSched,OS_ENTER_CRITICAL
26、,OS_EXIT_CRITICALOSSemIntPost()原型:uint8OSSemlntPost(uint8index);功能描述:中断中发送一个信号量输入:index:信号量索引输出:NOT_OK:参数错误OS_SEM_OK:发送成功全局变量:无调用模块:OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICALOSSemPost()原型:uint8OSSemPost(uint8index);功能描述:发送一个信号量输入:index:信号量索引输出:NOT_OK:参数错误OS_SEM_OK:发送成功全局变量:无调用模块:OSSemlntPost
27、,OSSchedOSSemQuery()原型:uint8OSSemQuery(uint8index);功能描述:査询信号量输入:index:信号量索引输出:信号量的值全局变量:无调用模块:OS_ENTER_CRITICAL,OS_EXIT_CRITlCALSmallRTOS的数据结构:OSTaskRuning定义:ifOS_MAX_TASKS0uint8OSIntNesting;endifOSIntNesting存储中断嵌套层数。OSTaskID定义:uint8OSTasklD;OSTaskID存储当前运行任务的ID.OSNextTaskID定义:uint8OSNextTasklD;OSNex
28、tTaskID用于标明将要运行的任务的IDOs_Enter_Sum定义:uint8Os_Enter_Sum=0;Os_Enter_Sum是OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()使用的信号虽:。消息队列数据结构定义(用户程序中):uint8OS_Q_MEM_SELSerialDatan;任务数小于9个时:BufO:队列中字节数,Buf1:Buf总长度Buf2:出对端,Buf3:等待队列任务列表Buf4-Bufn-1:存储消息任务数大于8个时:BufO:队列中字节数,Buf1:Buf总长度Buf2:出对端,Buf3、Buf4:等待队列任务列表Buf5-Bufn
29、-1:存储消息(8)信号量数据结构定义:ifOS_MAX_TASKS9uint8OS_SEM_MEM_SELOsSemButOS_MAX_SEMS*2;elseuint8OS_SEM_MEM_SELOsSemButOS_MAX_SEMS*3;endif任务数小于9个时(index为0(OS_MAX_SEMS-1):OsSemBufindex*2:信号量的值OsSemBuffindex*2+1:等待信号虽:的任务列表任务数小于9个时(index为0(OS_MAX_SEMS-1):OsSemBufindex*3:信号量的值OsSemBuffindex*3+1、OsSemBufindex*3+2:等
30、待信号量的任务列表SmallRTOS51的特殊的数据结构:(1)OSFastSwap定义:ifOS_MAX_TASKS1staticunsignedcharTickSum=0;endif禁止中断;保存任务环境;ifTlCK_TIMER_SHARING1TickSum=(TickSum+1)%TlCK_TIMER_SHARING;if(TickSum!=0)允许中断;恢复任务环境;return;endififEN_OS_INT_ENTER0OS_INT_ENTER();endif允许中断;#ifUSER_TICK_TIMER_EN=1UserTickTimer();endif#ifEN_TIME
31、R_SHARING0OSTimeTickf);else/*中断开始处理厂用户函数/*调用系统时钟处理函数OSIntSendSignal(TIME_ISR_TASK_ID);#endif广中断结束处理OSIntExit();其中有一些CPU的禁止中断和保存任务环境由CPU口动处理或是口动处理一部分。OSIdle()优先级最低的任务定义如下:voidOSIdle(void)while(1)/*使CPU处于省电状态*/OS_TASK_SW()最终调用的函数或中断:非中断中任务切换函数定义如下:voidOS_TASK_SW(void)保存任务环境;堆栈空间变换;堆栈指针指向新的堆栈;OSTasklD=
32、OSNextTasklD;恢复任务环境;恢复程序指针;SmallRTOS51(forkeil)的特殊说明:编译器版本需求需求当不使用消息队列时,需要KeilC51V6.14以上版本。当使用消息队列时,需要KeilC51V7.00以上版本。C语言优化等级设置优化等级设置不能大于7,可以等于7。目标系统需求SmallRTOS51可以在没有任何外部数据存储器的单片8051系统上运行但应用程序仍然可以访问外部存储器。SmallRTOS51可以使用C51支持的全部存储器模块,选择记忆模型仅影响应用日标的位管。一般來说SmallRTOS51应用程序工作在小模式下。SmallRTOS51没有按照banksw
33、itching程序设计,不能使用codebanking程序。可再入功能不允许从几个任务或中断过程调用非可再入C语言函数。非可再入C51函数将它们的参数和口动变量局部数据保存在静态存储器内因此当重复调用函数时这些数据会被改写。非可再入C语言函数不可第归调用,不可被多个任务同时调用,不可被一个或多个任务与一个或多个中断同时调用。SmallRTOS51系统函数不会调用任何这样的函数。那些仅使用寄存器作为参变量和口动变量的C语言函数总是可再入的而且可以从不同的SmallRTOS51任务中没有任何限制的调用。C51编译程序也提供可再入功能,参看“C51用户手册”以便获得更多信息。可再入函数(用reent
34、rant关键字的函数)将他们的参变量和局部数据变虽:储存到一个可再入堆栈内并且数据是被保护的以预防多重呼叫。然而如果你在你的应用程序中使用可再入函数(用reentrant关键字的函数)你必须保证这些功能不呼叫任何SmallRT0S51系统函数。而且那些可再入函数(用reentrant关键字的函数)不会被SmallRTOS51任务调度所中断。特别注意一点,可再入堆栈不得放在内部RAM中。C51库函数全部的可再入C51库函数可以没有任何限制的用于全部任务。非可再入c51库函数与非可再入C语言函数在应用时有着同样的限制。多数据指针和数学单元的用法C51编译程序允许你使用8051派生类型的多数据指针和
35、数学单元。因为SmallRTOS51不包括任何对这些硬件的管理,最好你不要与SmallRTOS51一起使用这些器件。如果你可以保证在使用这些派生硬件的程序执行期间不会被任务调度中断的话你可以使用多数据指针和数学单元。寄存器段SmallRTOS51分配全部任务到寄存器段0。因此全部的任务函数必须用c51的默认设置registerbank0编译。不需要SmallRTOS51管理的中断函数可以使用剩余的寄存器段。局部变量keilc51采用变量覆盖的方法分配局部变虽:,而不是把局部变量分配到堆栈中,当在keilc51使用SmallRTOS时,编译系统会把各个任务的局部变量分配在同一块内存,造成程序运行错误。因此,最多只能允一个任务函数与?CO?OS_CPU_C进行覆盖分析,禁止任务函数与?CO?OS_CPU_C进行覆盖分析的方法如下:在Progect-BL51Misc-Overlay里填?CO?OS_CPU_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烘焙店合伙入股合同范本
- 麻辣烫加盟协议合同范本
- 淘宝怎样签保障协议合同
- 淘宝开店合同协议书模板
- 池州离婚财产分割协议书
- 消防入股合同协议书范本
- 社交电商平台代理协议书
- 物业签订供用水合同范本
- 销售合同终止协议书模板
- 终止荒山承包协议合同书
- 海洋物理现象研究:南海东北部深层次结构与湍流混合机制
- 农业水利考试试题及答案
- 2025中国核工业集团公司招聘(300人)笔试参考题库附带答案详解
- 肺结核患者护理课件
- 商业房屋租赁合同协议书
- 弘扬教育家精神做新时代大学教师
- 生态环境执法案件培训
- 孕期健康方式课件
- 2025至2030年中国油页岩行业市场竞争格局及发展前景研判报告
- 2025至2030中国工业软件行业项目调研及市场前景预测评估报告
- 心肺复苏的试题及答案
评论
0/150
提交评论