VxWorks 任务使用的学习

任务使用

对任务的操作使用taskLib 中的库函数,需要包含的头文件为: taskLib.h.
VxWorks 任务使用的学习_第1张图片
此外,经常使用的库还有taskInfo, 主要包括的是获得任务信息的库的数。需要包含的头文件为: taskLib.h.
涉及的函数为: taskNameToId0, 即从任务的任务名获得对应的ID号。
在任务延迟时还需要和系统直接相关的库sysLib 中的函数sysClkRateGet)和
sysClkRateSet),需要包含的.h文件为: sysLib.h.

涉及的任务操作函数

1. taskSpawn
函数: int taskSpawn (char *name, int priority, int options, int stackSize, FUNCPTR entryPt, int arg1, nt arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, intarg9, int arg10)

参数
*name 指向发起任务的任务名字符串首地址的指针,存放在任务堆栈的启始(pStackBase) 处
priority 发起任务的优先级
options 任务的可选项 ,包括:
VX_FP_TASK(0x0008,使任务支持浮点型计算,必须有嵌入式CPU的同时支持)
VX_ PRIVATE_ ENV [0x0080,支持私有环境变量(参见envLib)]
vX_ NO_ STACK _Fll (0x0100,不在创建任务时使用checkStack()填充堆栈)
VX_ UNBREAKABLE (0x0002, 不允许任务的断点调试)
stackSize 堆栈加上任务名的总大小,单位为byte
entryPt 任务对应的函数入口指针
arg1 ~arg10 函数参数
返回 任务ID,如果分配堆栈时内存不足或创建失败返回ERROR

描述:发起以entryPt指向的函数为入口的任务,并且可以带10个参数作为entryPt .指向函数的参数。可以使用一个函数发起多个任务,并同时运行。
例如有函数STATUStest(int param1, int param2),则使用下面两条语句发起任务名分别为“tTest1” 和“tTest2”,参数分别为“I,2”和“3,4",任务优先级为100,任务堆栈大小为1000byte, test 作为函数入口的两个任务。
taskSpawn("“tTest1",100,0,1000,(FUNCPTR)test, 1,2,0,0,0,0,0,0,0,0); .
taskSpawn(“tTest2”,100,0, 1000,(FUNCPTR)test,3,4,0,0,0,0,0,0,0,0);
由于函数中的局部变量在发起任务时都存储在任务堆栈中,因此有较大局部数组的函
数在发起任务时必须注意堆栈大小。

在shell下输入sp,类似于taskSpawn, sp 使用taskSpawn的默认值。
格式为:sp函数名函数参数1,函数参数2, …
shell下输入sp携带的函数参数可以按照实际使用的参数个数,而不需要像程序中使
用taskSpawn()那样必须写满10 个。如果输入的参数个数少于函数参数个数,则后面的参
数值为0。由sp发起的任务默认任务名,格式为“u[n]t[m]",其中的n和m按顺序逐渐递
增,保证任务名不重复。任务默认优先级100,默认堆栈大小20000byte,
例如:sp test,1,2
####在shell下输入“i”,可以察看当前存活的任务的信息,如任务名、优先级和运行状态
等。

2. taskDelete
函数: STATUS taskDelete (int tid)
描述:删除一个任务,同时释放堆栈和对应的WIND._TCB任务控制块的资源。
除的同时,会调用taskDeleteHookAdd0函数绑定的函数。
参数:

tid 待删除的任务ID
返回 0K,如果任务无法删除则返回ERROR。

3. taskDelay
函数: STATUS taskDelay(int ticks)
描述:此函数使调用它的任务释放CPU,并等待规定的时间。通常用于定时查询一些
不使用中断的外部条件。
参数:
ticks,延迟的tick数。VxWorks 系统将时间分为时间片(tick) 使用,默认Is为60个时间片。可以通过函数sysClkRateGet()/sysClkRateSet0来获得/设置Is对应的时间片个数。也就是说,ticks 个时间片对应的时间是ticks/sysClkRateGet()秒。
返回:OK;当被中断服务程序调用,或者调用其任务接收到没有被阴塞或者被忽略掉的信号(signa1) 时,返回ERROR

4.sysClkRateGet0
函数: int sysClkRateGet0
描述:获得系统中1s对应的时间片个数。具体情况需要对应于相对的BSP.在使用此函数前,请仔细查看BSP文件夹中的参考文档。
参数:无。
返回:系统中ls对应的时间片个数。

5. sysClkRateSet
函数: STATUS sysClkRateSet(int ticksPerSecond)
描述:设置系统时钟每秒钟的中断数,通常被usrConfig.c中的usrRoot()函数调用。此函数可能和POSIX标准的clockLib相关,请参看clockLib.与sysClkRateGet()类似,需要察看BSP的參考文档。提高每秒的tick数可以将系统时间划分得更细,但不能将其设置得太高,否则会导致系统将大量时间花费在任务调度上,降低系统效率。通常设置的tick 数在几十到几千的范围内。
参数:
ticksPerSecond,每秒的时间片数目
返回:OK,如果参数非法(例如将参数设为负数)或者无法设定时间片则返回ERROR。

6.taskNameTod
函数: int taskNameTod(char *name}
描述:通过任务名获得该任务的ID。用这种方法获得任务的控制通常是低效的,因为
函数必须搜索的任务列表的全部。
参数:
*name,指向任务名字符串的首地址的指针。
返回:任务ID,当找不到使用该任务名的任务时返回ERROR。

多任务的优先级划分

一般情况下,用户程序使用的任务优先级不要小于50。如果用户程序的优先级过高,超过了系统任务的优先级,可能会影响系统的运行。为了调试方便,一般由程序发起的任务优先级应当低于用shell下sp发起的任务的优先级,以保证shell的优先响应。故将用户优先级设定为低于100。 根据任务执行的先后次序划分任务优先级。
任务间的同步使用信号灯。
VxWorks的信号灯操作库为scmLib、 semBLib、 semCLib、 semMLib, 分别对应通用信号灯操作与二进制、计数型和互斥信号灯的操作。需要包括的.h文件为semLib.h。VxWorks 任务使用的学习_第2张图片
当一个任务的执行需要由另–个任务来触发时,就可以使用信号灯。例如任务A和任
务B,任务A一直等待某个条件被满足,而这个条件是否满足由任务B来确定。条件不满
足时任务A必须不占用CPU,而条件一旦满足,任务A立刻开始执行。此时任务A采用
VxWorks 任务使用的学习_第3张图片
VxWorks 任务使用的学习_第4张图片

你可能感兴趣的:(vxworks)