VOS系统调用Word下载.docx
《VOS系统调用Word下载.docx》由会员分享,可在线阅读,更多相关《VOS系统调用Word下载.docx(27页珍藏版)》请在冰点文库上搜索。
sys_int_unlock(m)15
SYS_PC_SAVE/SYS_PC_RESTORE/SYS_PC_GET15
错误码索引16
原pSOS系统调用对应的VOS系统调用17
用于系统配置的宏17
SYS_MAX_TASKS18
SYS_TASK_WITH_MSGQ18
SYS_MAX_TIMERS18
SYS_MAX_MSGQLEN18
SYS_MEM_VOS18
SYS_MEM_MAX_SIZE_RANK18
SYS_MEM_VOS_MAXSIZE19
SYS_MEM_SIZE_INC_METHOD19
SYS_MEM_SIZE_INC_FACTOR19
SYS_MEM_VOS_MALLOC_WHEN_LIST_EMPTY19
SYS_MBLK_SWAP_MBLK_WHEN_ADDHDR19
SYS_MBLK_SWAP_MBLK_WHEN_DELHDR19
SYS_MBLK_SWAP_MBLK_WHEN_FREE19
常用语说明:
RTOS:
系统运行的实时操作系统,如pSOS、VxWorks等
VOS:
RTOS上的封装层,对应用屏蔽不同RTOS接口的差异
主调任务:
调用该系统调用的任务
指定任务:
由参数tid标识的任务
互斥量持有者:
当前对于某个互斥量进行了P操作的任务
使用方法
1、在不同的操作系统中需要定义不同的操作系统宏;
例如pSOS系统需要定义OS_PSOS为1、VxWorks系统中需要定义OS_VXWORKS为1
2、头文件包含关系:
先包含操作系统的头文件,再包含开发环境的头文件,对于VxWorks系统,应该先包含$(TGT_DIR)/h再包含开发环境的头文件
3、(VxWorks)编译时应该增加的额外选项:
-DOS_VXWORKS=1–I$(TGT_DIR)/h–I$(SWITCH_BASE)/include–I.
4、应用程序需要包含<
libsys/vos/vos_rtos.h>
头文件;
对于不同的模块应额外包含不同的头文件:
a)任务管理:
<
libsys/vos/vos_task.h>
b)消息队列管理:
libsys/vos/vos_msgq.h>
c)信号量、互斥量管理:
libsys/vos/vos_semaphore.h>
d)定时器管理:
libsys/timer.h>
e)存储管理:
libsys/memory.h>
任务管理
_sys_task_init_private
原型:
uint32_sys_task_init_private()
说明:
初始化任务相关数据结构,并创建IDLE任务
返回值:
SYS_OK:
成功
其它:
失败
sys_task_spawn
TASK_IDsys_task_spawn(
charname[],
uint32priority,
uint32options,
uint32stacksize,
FUNCPTRentrypoint,
uint32args[],
uint32argc)
本函数创建一个任务,并将该任务设置为就绪(Ready)状态。
参数说明如下:
名称
定义域
含义
Name
不超过四个字节,不包含作为字符串结尾的’/0’;
如果多于4个字符,多出的将被忽略
任务的名字;
命名规范依赖于用户。
一般任务名字用于调试目的;
不同任务可以重名;
可以传入NULL
Priority
0~255
任务的优先级;
数量越小优先级越高。
注意:
与pSOS系统中定义的优先级相反,因此不要将此优先级直接用于pSOS的系统调用;
对于pSOS系统,优先级230以上保留给系统
Options
Int
任务的运行选项,目前支持下列选项(如果用户在不被支持的系统上使用特定的选项,该选项将被忽略;
所有选项默认不设置):
T_OP_PREEMPT:
任务可抢占(All)
T_OP_TSLICE:
支持优先级轮转(pSOS)
T_OP_SUPV:
任务运行于系统态(pSOS)
T_OP_ISR:
任务允许中断(All)
T_OP_FPSUPPORT:
支持浮点(All)
T_OP_UNBREAKABLE:
任务不可设置断点(VxWorks)
T_OP_DONTSTARTTASK:
创建后不启动任务;
设置此参数时,该函数行为与sys_task_create相同
Stacksize
int
任务堆栈大小。
对于VxWorks系统,任务TCB位于任务堆栈最低端;
由于不同应用需求不同,VOS对堆栈大小不做限制;
如果应用程序堆栈需求过大,会造成操作系统资源不足
entrypoint
本任务入口函数地址
本任务的入口函数。
建议该函数包含一个死循环用于任务主处理流程,每次循环必须有主动放弃CPU控制权的调用;
不建议在该函数中直接或间接调用清狗函数;
该函数可以最多带4个uint32型入参
Args
参数数组,最多4个参数
entrypoint的入口参数
Argc
0~3
参数数量
SYS_ERROR:
创建任务失败
其它值:
任务的TID;
此TID只能由VOS的系统调用使用
相关:
sys_task_create、sys_task_delete
sys_task_create
TASK_IDsys_task_create(
charname[],
uint32args[],
本函数创建一个任务,并将任务设置为阻塞态,需要通过sys_task_start启动。
参数说明及返回值与sys_task_spawn完全相同。
略
sys_task_spawn、sys_task_delete
sys_task_delete
uint32sys_task_delete(TASK_IDtid)
本函数删除一个任务。
参数tid由函数sys_task_spawn或sys_task_create返回。
当删除一个持有互斥信号量的任务时,该信号量可能永远无效
SYS_OK:
其它:
失败,可能的错误码有
ERR_OBJDEL:
执行sys_task_delete的过程中,由于任务当前处于不可删除状态导致主调过程被挂起;
当任务重新可删除时,tid任务却已经被其它任务删除,本函数返回此错误码
ERR_OBJID:
非法的tid,或tid不是一个任务ID
sys_task_spawn、sys_task_create
sys_task_restart
uint32sys_task_restart(TASK_IDtid)
重启动一个任务。
ERR_NACTIVE:
任务尚未启动
ERR_OBJDEL
sys_task_spawn、sys_task_create、sys_task_delete
sys_task_start(tid)
启动一个由sys_task_create创建的任务,tid由该函数返回。
该宏有uint32型返回值
ERR_ACTIVE:
任务已经激活
sys_task_lock
宏。
禁止任务调度;
调用该宏防止主调任务被高优先级任务抢占。
如果创建任务时未使用参数T_OP_PREEMPT,则无需调用该宏。
调用sys_task_unlock解除禁止。
sys_task_spawn、sys_task_create、sys_task_unlock
SYS_OK
sys_task_unlock
允许任务调度;
调用该宏相当于创建任务时使用了参数T_OP_PREEMPT。
调用sys_task_lock禁止任务调度。
sys_task_spawn、sys_task_create、sys_task_lock
sys_task_safe
禁止主调任务被删除。
创建任务时被默认调用;
调用sys_task_unsafe解除禁止。
如果调用sys_task_delete删除之前无需调用。
sys_task_unsafe
允许主调任务被删除。
sys_task_delay(ticks)
使主调任务进入阻塞状态,直至ticks时间后,或收到异常。
无
任务等待了ticks时间
sys_task_suspend(tid)
使指定任务进入阻塞状态,只有调用sys_task_resume才能使任务离开阻塞状态。
sys_task_resume
成功挂起任务
任务挂起失败,可能的错误码有
tid错误
sys_task_resume(tid)
使指定任务离开由sys_task_suspend而造成的阻塞状态。
sys_task_suspend
成功恢复任务挂起
任务恢复失败,可能的错误码有
sys_task_pri_get
uint32sys_task_pri_get(TASK_IDtid,uint32*pri)
本函数用于取得任务的优先级;
TASK_ID由创建任务的调用返回;
pri用于返回优先级
失败;
可能的错误码有
错误的tid
ERR_NULLPTR:
指针pri为NULL
sys_task_pri_set
uint32sys_task_pri_set(TASK_IDtid,uint32pri)
本函数用于设置任务的优先级;
pri为新优先级
ERR_SETPRI:
错误的优先级
sys_task_option_get
uint32sys_task_option_get(TASK_IDtid,uint32*options)
本函数用于取得任务的初始设置;
TASK_ID由创建任务的系统调用返回;
options为保存设置的指针
ERR_OBJID:
sys_task_option_set
uint32sys_task_option_set(TASK_IDtid,uint32options)
本函数用于重新设置任务的设置选项;
options为该任务的新设置。
对于非法的设置将被忽略
消息队列管理
sys_msgq_create
MSG_Q_IDsys_msgq_create(uint32maxmsg,uint32options)
本函数创建一个消息队列,该队列最多能够容纳maxmsg个消息,每个消息16字节。
消息传送使用拷贝方式。
maxmsg
uint32
该消息队列能够容纳的最多的消息数量
options
该队列的选项。
目前支持:
Q_OP_PRIORITY:
设置此标志则阻塞于队列的任务按照优先级排序,否则先进先出(All)
Q_OP_LIMIT:
是否限制该队列容纳的消息数量,如果设置此标志则maxmsg被忽略。
对于VxWorks系统,如果不限制队列消息数量,当该队列中的消息数量超过系统默认每队列消息数量时(SYS_MAX_MSGQLEN),额外的消息将被抛弃
返回:
NULL:
创建消息队列失败,如果它不是在ISR中调用的,则是系统堆内存不足
消息队列的qid
sys_msgq_delete
uint32sys_msgq_delete(MSG_Q_IDqid)
删除指定消息队列。
参数qid由sys_msgq_create返回。
所有阻塞于该队列的任务将返回,调用的函数返回错误(SYS_OK之外的值)
删除成功
删除失败,可能的错误码有:
qid错误
sys_msgq_send
uint32sys_msgq_send(MSG_Q_IDqid,uint32buf[SYS_MAX_MSGLEN_INT],uint32options,TICKtimeout)
向指定消息队列发消息。
qid
MSGQID_T
消息队列ID,由sys_msgq_create返回
buf
16byte
消息包内容
发送选项,目前支持:
Q_OP_NORMAL:
普通消息,将被放在消息队列尾
Q_OP_URGENT:
紧急消息,将被放在消息队列头
timeout
当消息队列满时等待时间(对于pSOS系统无定义),支持以下值:
NO_WAIT:
不等待,直接返回
WAIT_FOREVER:
直至消息队列有空闲缓冲区才返回
others:
如果消息队列一直不空闲,等待时间timeout后返回
发送成功
发送失败,可能的错误码有:
ERR_QFULL:
队列满
ERR_TIMEOUT:
超时
ERR_OBJDEL:
等待过程中队列被删除
sys_msgq_create、sys_msgq_receive、sys_msgq_send_to_task
sys_msgq_receive
uint32sys_msgq_receive(
MSG_Q_IDqid,
uint32buf[SYS_MAX_MSGLEN_INT],
TICKtimeout)
从指定消息队列中收消息。
参数含义如下:
消息队列ID
消息包缓冲区
TICK
当消息队列中没有消息时等待时间,支持以下值:
SYS_NO_WAIT:
SYS_WAIT_FOREVER:
直至消息队列有包到达才返回
如果消息队列一直没有消息包到达,等待时间timeout后返回
接收成功
接收失败,可能的错误码有:
ERR_NOMSG:
队列空
sys_msgq_create、sys_msgq_send、sys_msgq_receive_from_task
sys_msgq_msgcount
uint32sys_msgq_msgcount(MSG_Q_IDqid)
取得指定队列中的待处理消息数量;
参数qid由sys_msgq_create返回
qid非法
消息数量
sys_msgq_peek
uint32sys_msgq_peek(MSG_Q_IDqid,uint32buf[SYS_MAX_MSGLEN_INT],TICKtimeout)
取得指定消息队列的第一个消息包,如果没有消息包则根据timeout参数进行等待;
qid由sys_msgq_create返回
错误,可能的错误码有
信号量管理
sys_sm_create
SEM_IDsys_sm_create(uint32options,uint32count);
创建一个信号量。
信号量选项,支持以下值:
SM_OP_PRIORITY:
被阻塞的任务按照优先级排列
SM_OP_FIFO:
被阻塞的任务按照先进先出顺序排列(默认设置)
SM_OP_MUTEX:
互斥量(默认不设置)
SM_OP_BINARY:
二元信号量(默认不设置,pSOS下不建议使用)
SM_OP_RECURSIVE:
是否可以递归P操作(相通任务可以多次对已经P操作的信号量再次P操作),只对互斥量有效(pSOS,默认设置;
VxWorks强制支持)
SM_OP_PRIO_INHERIT:
是否支持优先级继承,只对互斥量有效(默认设置,需要与SM_OP_PRIORITY同时使用,否则将被忽略)
count
信号量的初始值;
如果options设置了SM_OP_BINARY,则count为0时表示0,其它情况表示1
没有内存
信号量ID
sys_sm_delete
uint32sys_sm_delete(SEM_IDsid);
删除一个信号量;
所有阻塞于该信号量的任务将被解阻塞,对应函数返回错误;
参数sid由函数sys_sm_create返回
删除失败,可能的原因有:
非法的sid
sys_sm_p
uint32sys_sm_p(SEM_IDsid,TICKtimeout);
对一个信号量进行P操作,参数含义如下:
sid
当信号量计数器为零时的等待时间(SM_OP_MUTEX和SM_OP_RECURSIVE未都设置),允许以下值
不等待,直接返回错误
等待直到信号量有效
Others:
等待时间
只适用于信号量;
对于互斥量,请使用函数sys_sm_mutex_lock。
P操作成功
P操作失败,可能的错误码有
等待超时
ERR_NOSEM:
P操作失败,计数器已经为零
对象被删除
sys_sm_v、sys_sm_create
sys_sm_v
uint32sys_sm_v(SEM_IDsid);
对一个信号量进行V操作,参数sid由函数sys_sm_create返回。
对于互斥量,请使用函数sys_sm_mutex_unlock只有持有者才能对它进行V操作。
可能导致主调任务被抢占
V操作成功
V操作失败;
可能的原因有:
sys_sm_p、sys_sm_create
sys_sm_mutex_create
uint32sys_sm_mutex_create()
创建一个互斥量
内存不足,无法创建互斥量
互斥量的SEM_ID
sys_sm_mutex_delete
uint32sys_sm_mutex_delete(SEM_IDmutex)
删除一个互斥量
删除失败,可能的错误码有
互斥量ID无效
sys_sm_mutex_lock
uint32sys_sm_mutex_lock(SEM_IDsid,TICKtimeout)
对一个互斥量进行lock操作(P操作),参数sid由函数sys_sm_create返回。
只用于互斥量,信号量请使用函数sys_sm_p。
对于设置了SM_OP_RECURSIVE的互斥量(即同时以标志SM_OP_MUTEX和SM_OP_RECURSIVE创建的信号量),它的持有者可以多次对它进行P操作,虽然该互斥量的初始值为1。
lock操作成功
失败,可能的错误码有:
ERR_MULOCKED:
互斥量已经被占用
ERR_TIMEOUT:
ERR_MUKILLD:
等待过程中互斥量被