Small RTOS51 110v 使用手册.docx
- 文档编号:24247607
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:25
- 大小:24.35KB
Small RTOS51 110v 使用手册.docx
《Small RTOS51 110v 使用手册.docx》由会员分享,可在线阅读,更多相关《Small RTOS51 110v 使用手册.docx(25页珍藏版)》请在冰豆网上搜索。
SmallRTOS51110v使用手册
SmallRTOS(51)1.10v使用手册
概述:
SmallRTOS是一个源代码公开的多任务实时操作系统,SmallRTOS51是其在8051系列处理器上的移植(使用keilc51)。
SmallRTOS可以简化那些复杂而且时间要求严格的工程的软件设计工作.本手册主要讲述SmallRTOS的使用,本说明了在8051系列处理器上使用应该注意的问题。
同时讲述了SmallRTOS的移植。
本手册仅针对SmallRTOS(51)1.10版本
SmallRTOS的特点:
(1)公开源代码,只要遵循许可协议,任何人可以免费获得源代码。
(2)可移植,作者尽量使用把与CPU相关部分压缩到最小,与CPU无关部分用ANSIC编写。
(3)可固化,SmallRTOS为嵌入系统设计,如果您有固化手段,它可以嵌入到您的产品中成为产品的一部分。
(4)占先式,SmallRTOS可以管理16个任务,每个任务优先级不同。
(5)中断管理,中断可以使正在执行的任务挂起。
如果优先级更高的任务被中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行。
中断嵌套层数可达255层。
如果需要,可以禁止中断嵌套管理。
(6)RAM需求小,SmallRTOS为小RAM系统设计,应而RAM需求小,相应的,系统服务也少。
SmallRTOS的使用:
(1)系统配置:
os_cfg.h中定义了一些常量可以配置系统,具体定义如下:
#defineOS_MAX_TASKS/*最大任务数1~16*/
#defineOS_TICKS_PER_SEC/*设置1秒系统系统节拍数*/
#defineUSER_TICK_TIMER_EN/*禁止(0)或允许
(1)系统定时中断调用用户函数UserTickTimer()*/
#defineEN_OS_INT_ENTER/*禁止(0)或允许
(1)中断嵌套管理*/
#defineEN_TIMER_SHARING/*禁止(0)或允许
(1)定时器中断调用OSTimeTick()*/
#defineTICK_TIMER_SHARING/*定义进入多少次硬件中断为一次系统定时器软中断*/
#defineEN_OS_Q/*禁止(0)或允许
(1)消息队列*/
#defineEN_OS_Q_CHK/*禁止(0)或允许
(1)校验消息队列指针*/
#defineOS_Q_MEM_SELxdata/*消息队列存储空间选择,keilc51有用,必须为idata、xdata*/
/*不是keilc51时它必须为空格*/
#defineEN_OS_Q_PENT1/*禁止(0)或允许
(1)等待队列中的消息*/
#defineEN_OS_Q_ACCEPT0/*禁止(0)或允许
(1)无等待的从队列中取得消息*/
#defineEN_OS_Q_POST0/*禁止(0)或允许
(1)FIFO方式相对列发送消息*/
#defineEN_OS_Q_POST_FRONT1/*禁止(0)或允许
(1)LIFO方式相对列发送消息*/
#defineEN_OS_Q_INT_POST0/*禁止(0)或允许
(1)中断中FIFO方式相对列发送消息*/
#defineEN_OS_Q_INT_POST_FRONT1/*禁止(0)或允许
(1)中断中LIFO方式相对列发送消息*/
#defineEN_OS_Q_NMsgs1/*禁止(0)或允许
(1)取得队列中消息数*/
#defineEN_OS_Q_SIZE0/*禁止(0)或允许
(1)取得队列总容量*/
#defineEN_OS_Q_FLUSH0/*禁止(0)或允许
(1)清空队列*/
#defineEN_OS_SEM0/*禁止(0)或允许
(1)信号量*/
#defineEN_OS_SEM_CHK0/*禁止(0)或允许
(1)校验信号量索引*/
#defineOS_SEM_MEM_SELidata/*信号量储空间选择,keilc51有用,必须为idata、xdata*/
/*不是keilc51时它必须为空格*/
#defineOS_MAX_SEMS2/*最大信号量数目*/
#defineEN_OS_SEM_PENT1/*禁止(0)或允许
(1)等待信号量*/
#defineEN_OS_SEM_ACCEPT0/*禁止(0)或允许
(1)无等待请求信号量*/
#defineEN_OS_SEM_INT_POST0/*禁止(0)或允许
(1)中断中发送信号量*/
#defineEN_OS_SEM_POST1/*禁止(0)或允许
(1)中发送信号量*/
#defineEN_OS_SEM_QUERY0/*禁止(0)或允许
(1)查询信号量*/
//#defineidata/*非keilc51时必须加止这一句*/
#ifEN_TIMER_SHARING==0
#defineTIME_ISR_TASK_IDSHOW_TASK_ID/*定义系统定时器软中断触发的任务ID*/
#endif
Os_cpu.h中定义了一些常量可以配置一些与cpu相关的部分。
针对SmallRTOS51,具体定义如下:
#defineEN_SP20/*禁止(0)或允许
(1)非屏蔽中断*/
#defineIDATA_RAM_SIZE0x100/*idata大小*/
#defineSp2Space4/*高级中断(软非屏蔽中断)堆栈大小EN_SP2为0时无效*/
#defineOS_TIME_ISR1/*系统定时器使用的中断*/
//
SET_EAMACRO;打开所有允许中断
SETBEA
ENDM
(2)与编译器无关的数据类型
为了便于移植,SmallRTOS定义了6种数据类型,它在Os_cpu.h定义。
针对SmallRTOS51,具体定义如下:
typedefunsignedcharuint8;/*定义可移植的无符号8位整数关键字*/
typedefsignedcharint8;/*定义可移植的有符号8位整数关键字*/
typedefunsignedintuint16;/*定义可移植的无符号16位整数关键字*/
typedefsignedintint16;/*定义可移植的有符号16位整数关键字*/
typedefunsignedlonguint32;/*定义可移植的无符号32位整数关键字*/
typedefsignedlongint32;/*定义可移植的有符号32位整数关键字*/
(3)运行SmallRTOS
在main函数中调用OSStart()后系统开始运行,OSStart()结束后运行优先级为0的任务。
注意:
在调用OSStart()前不要使能总中断标志,系统会自动使能这个标志,对于8051系列,这个标志为EA。
(4)建立任务:
SmallRTOS使用静态方法建立任务,在config.h中有这样一段代码:
#ifdefIN_OS_CPU_C
externvoidTaskA(void);
externvoidTaskB(void);
externvoidTaskC(void);
void(*constTaskFuction[OS_MAX_TASKS])(void)={TaskA,TaskB,TaskC};
//函数数组TaskFuction[]保存了各个任务初始PC指针,其按任务ID(既优先级次序)顺序保存
#endif
用户只要定义好OS_MAX_TASKS,TaskFuction[],任务将自动运行。
其中TaskA等为任务对应函数。
注意:
ID为0的任务为最高优先级任务,系统运行后首先执行它。
(5)删除任务,SmallRTOS1.10版不允许删除任务,因此,每个任务必须为无限循环结构。
(6)任务睡眠,任务可以调用OSWait()使自己睡眠,其原型如下:
unsignedcharOSWait(uint8typ,uint8ticks);
功能描述:
系统等待函数,任务调用此函数可以等待一定时间或信号输入:
typ:
等待事件类型,目前可以取以下值,或是其中任意个值的按位或
K_SIG:
等待信号
K_TMO:
等待超时
ticks:
等待超时时的系统节拍数,输出:
NOT_OK:
参数错误
TMO_EVENT:
超时到
SIG_EVENT:
有信号
如果任务等待信号,另一个任务可以调用OSSendSignal()使其进入就绪状态,其原型如下:
voidOSSendSignal(uint8TaskId);
功能描述:
中断中给指定任务发送信号,既使指定任务就绪
输 入:
TaskId:
任务ID
输 出:
无
中断调用OSIntSendSignal()也可以唤醒睡眠任务,其原型如下:
voidOSIntSendSignal(uint8TaskId);
功能描述:
任务中给指定任务发送信号,既使指定任务就绪
输 入:
TaskId:
任务ID
输 出:
无
用户调用OSQPend和OSSemPend时也可能使任务睡眠,可参见相应章节。
(7)优先级最低的任务
优先级最低的任务必须一直处于就绪状态,不允许调用OSWait等可能使自己进入休眠状态的函授。
(8)消息队列和信号量
SmallRTOS使用简化的消息队列,实质上出队入队的均为uint8类型变量,而不是指针。
消息队列和信号量的使用请参见示例及SmallRTOS的系统调用。
(9)SmallRTOS51任务特殊处
由于keilc51由于keilc51默认不支持重入函数,它的重入函数使用仿真的重入栈而不使用系统栈,而SmallRTOS51没有进行重入栈管理,因此,用户应该保证各个任务的局部变量不会互相覆盖(方法后面有介绍),并且不定义重入函数。
(10)中断程序编制
keilc51例子如下:
#ifEN_OS_INT_ENTER>0
#pragmadisable/*除非最高优先级中断或是不需要系统管理的中断,否则,必须加上这一句*/
#endif
voidOSTickISR(void)interruptUSER_ISR
{
#ifEN_OS_INT_ENTER>0
OS_INT_ENTER();/*中断开始处理*/
#endif
/*用户代码在这*/
OSIntExit();/*中断结束处理,*/
}
在其它CPU中,#pragmadisable不是必须的,但是可能需要自己在OS_INT_ENTER()之前保存任务环境。
如果某个中断不需要OS管理,则可以只有编写。
SmallRTOS的系统调用:
(1)OSVersion()宏,返回SmallRTOS版本号*100
(2)OSRunningTaskID()宏,返回当前正在运行的任务ID
(3)OSWait()原型:
uint8OSWait(uint8typ,uint8ticks);
功能描述:
系统等待函数,任务调用此函数可以等待一定时间或信号
输 入:
typ:
等待事件类型,目前可以取以下值,或是其中任意个值的按位或,K_SIG:
等待信号,K_TMO:
等待超时,ticks:
等待超时时的系统嘀嗒数;
输 出:
NOT_OK:
参数错误;TMO_EVENT:
超时到;SIG_EVENT:
有信号
全局变量:
OSWaitTick
调用模块:
OSIntSendSignal
(4)OSSendSignal()原型:
voidOSSendSignal(uint8TaskId)
功能描述:
任务中给指定任务发送信号,既使指定任务就绪
输 入:
TaskId:
任务ID
输 出:
无
全局变量:
OSTaskRuning
调用模块:
OSSched
(5)OSIntSendSignal()
原型:
voidOSIntSendSignal(uint8TaskId);
功能描述:
中断中给指定任务发送信号,既使指定任务就绪
输 入:
TaskId:
任务ID
输 出:
无
全局变量:
OSTaskRuning
调用模块:
无
(6)OSQCreate()
原型:
uint8OSQCreate(uint8OS_Q_MEM_SEL*Buf,uint8SizeOfBuf);
功能描述:
初始化消息队列
输 入:
Buf:
为队列分配的存储空间地址
SizeOfBuf:
为队列分配的存储空间大小
输 出:
NOT_OK:
参数错误
OS_Q_OK:
成功
全局变量:
无
调用模块:
无
(7)OSQPend()
原型:
uint8OSQPend(uint8idata*Ret,uint8OS_Q_MEM_SEL*Buf,uint8Tick);
功能描述:
等待消息队列中的消息
输 入:
Ret:
返回的消息
Buf:
指向队列的指针
Tick:
等待时间
输 出:
NOT_OK:
参数错误
OS_Q_OK:
收到消息
OS_Q_TMO:
超时到
OS_Q_NOT_OK:
无消息
全局变量:
无
调用模块:
OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(8)OSQAccept()
原型:
uint8uint8OSQAccept(uint8idata*Ret,uint8OS_Q_MEM_SEL*Buf);
功能描述:
无等待从消息队列中取得消息
输 入:
Ret:
返回的消息
Buf:
指向队列的指针
输 出:
NOT_OK:
参数错误
OS_Q_OK:
收到消息
OS_Q_TMO:
超时到
OS_Q_NOT_OK:
无消息
全局变量:
无
调用模块:
OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(8)OSQIntPost()
原型:
uint8OSQIntPost(uint8OS_Q_MEM_SEL*Buf,uint8Data);
功能描述:
中断中FIFO方式发送消息
输 入:
Buf:
指向队列的指针
Data:
消息数据
输 出:
OS_Q_FULL:
队列满
OS_Q_OK:
发送成功
全局变量:
无
调用模块:
OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(9)OSQIntPostFront()
原型:
uint8OSQIntPostFront(uint8OS_Q_MEM_SEL*Buf,uint8Data);
功能描述:
中断中LIFO方式发送消息
输 入:
Buf:
指向队列的指针
Data:
消息数据
输 出:
OS_Q_FULL:
队列满
OS_Q_OK:
发送成功
全局变量:
无
调用模块:
OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(10)OSQPost()
原型:
uint8OSQPost(uint8OS_Q_MEM_SEL*Buf,uint8Data);
功能描述:
FIFO方式发送消息
输 入:
Buf:
指向队列的指针
Data:
消息数据
输 出:
OS_Q_FULL:
队列满
OS_Q_OK:
发送成功
全局变量:
无
调用模块:
OSQIntPost,OSSched
(11)OSQPostFront()
原型:
uint8OSQPostFront(uint8OS_Q_MEM_SEL*Buf,uint8Data);
功能描述:
LIFO方式发送消息
输 入:
Buf:
指向队列的指针
Data:
消息数据
输 出:
OS_Q_FULL:
队列满
OS_Q_OK:
发送成功
全局变量:
无
调用模块:
OSQIntPostFront,OSSched
(12)OSQNMsgs()
原型:
uint8OSQNMsgs(uint8OS_Q_MEM_SEL*Buf);
功能描述:
取得消息队列中消息数
输 入:
Buf:
指向队列的指针
输 出:
消息数
全局变量:
无
调用模块:
OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(13)OSQSize()
原型:
uint8OSQSize(uint8OS_Q_MEM_SEL*Buf);
功能描述:
取得消息队列总容量
输 入:
Buf:
指向队列的指针
输 出:
消息队列总容量
全局变量:
无
调用模块:
OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(14)OSQFlush()
原型:
voidOSQFlush(uint8OS_Q_MEM_SEL*Buf);
功能描述:
清空队列
输 入:
Buf:
指向队列的指针
输 出:
无
全局变量:
无
调用模块:
OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(15)OSSemCreate()
原型:
uint8OSSemCreate(uint8index,uint8Data);
功能描述:
初始化消息队列
输 入:
index:
信号量索引
data:
信号量初始值
输 出:
NOT_OK:
没有这个信号量
OS_SEM_OK:
成功
全局变量:
无
调用模块:
无
(16)OSSemPend()
原型:
uint8OSSemPend(uint8index,uint8Tick);
功能描述:
等待一个信号量
输 入:
index:
信号量索引
Tick:
等待时间
输 出:
NOT_OK:
参数错误
OS_SEM_OK:
得到信号量
OS_SEM_TMO:
超时到
OS_SEM_NOT_OK:
没有得到信号量
全局变量:
无
调用模块:
OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(17)OSSemAccept()
原型:
uint8OSSemAccept(uint8index);
功能描述:
无等待请求信号量
输 入:
index:
信号量索引
输 出:
NOT_OK:
参数错误
OS_SEM_OK:
得到信号量
OS_SEM_TMO:
超时到
OS_SEM_NOT_OK:
没有得到信号量
全局变量:
无
调用模块:
OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(18)OSSemIntPost()
原型:
uint8OSSemIntPost(uint8index);
功能描述:
中断中发送一个信号量
输 入:
index:
信号量索引
输 出:
NOT_OK:
参数错误
OS_SEM_OK:
发送成功
全局变量:
无
调用模块:
OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
(19)OSSemPost()
原型:
uint8OSSemPost(uint8index);
功能描述:
发送一个信号量
输 入:
index:
信号量索引
输 出:
NOT_OK:
参数错误
OS_SEM_OK:
发送成功
全局变量:
无
调用模块:
OSSemIntPost,OSSched
(20)OSSemQuery()
原型:
uint8OSSemQuery(uint8index);
功能描述:
查询信号量
输 入:
index:
信号量索引
输 出:
信号量的值
全局变量:
无
调用模块:
OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
SmallRTOS的数据结构:
(1)OSTaskRuning
定义:
#ifOS_MAX_TASKS<9
uint8OSTaskRuning=0xff;
#else
uint16OSTaskRuning=0xffff;
#endif
OSTaskRuning存储着每一个任务状态(就绪/运行还是休眠),每一个任务存储一位,1代表就绪/运行,0代表休眠。
OSTaskRuning的最低位存储ID为0的任务状态,次低位存储ID为0的任务状态。
以此类推。
(2)OSWaitTick
定义:
uint8OSWaitTick[OS_MAX_TASKS-1];
OSWaitTick存储各个任务剩余等待系统节拍数。
注意,最低级任务必须一直处于就绪状态,因此OSWaitTick长度为OS_MAX_TASKS-1
(3)OSIntNesting
定义:
#ifEN_OS_INT_ENTER>0
uint8OSIntNesting;
#endif
OSIntNesting存储中断嵌套层数。
(4)OSTaskID
定义:
uint8OSTaskID;
OSTaskID存储当前运行任务的ID。
(5)OSNextTaskID
定义:
uint8OSNextTaskID;
OSNextTaskID用于标明将要运行的任务的ID
(6)Os_Enter_Sum
定义:
uint8Os_Enter_Sum=0;
Os_Enter_Sum是OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()使用的
信号量。
(7)消息队列数据结构
定义(用户程序中):
uint8OS_Q_MEM_SELSerialData[n];
任务数小于9个时:
Buf[0]:
队列中字节数,
Buf[1]:
Buf总长度
Buf[2]:
出对端,
Buf[3]:
等待队列任务列表
Buf[4]~Buf[n-1]:
存储消息
任务数大于8个时:
Buf[0]:
队列中字节数,
Buf[1]:
Buf总长度
Buf[2]:
出对端,
Buf[3]、Buf[4]:
等待队列任务列表
Buf[5]~Buf[n-1]:
存储消息
(8)信号量数据结构
定义:
#ifOS_MAX_TASKS<9
uint8OS_SEM_MEM_SELOsSemBuf[OS_MAX_SEMS*2];
#else
uint8OS_SEM_MEM_SELOsSemBuf[OS_MAX_SEMS*3];
#endif
任务数小于9个时(index为0~(OS_MAX_SEMS-1)):
OsSemBuf[index*2]:
信号量的值
OsSemBuf[index*2+1]:
等待信号量的任务列表
任务数小于9个时(index为0~(OS_MAX_SEMS-1)):
OsSemBuf[index*3]:
信号量的值
OsSemBuf[index*3+1]、OsSemBuf[index*3+2]:
等待信号量
的任务列表
SmallRTOS51的特
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Small RTOS51 110v 使用手册 110