taskSpawn( )函数,semBCreate()函数,二进制信号量实现互斥和同步

发布时间:2016-12-7 22:39:22 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"taskSpawn( )函数,semBCreate()函数,二进制信号量实现互斥和同步",主要涉及到taskSpawn( )函数,semBCreate()函数,二进制信号量实现互斥和同步方面的内容,对于taskSpawn( )函数,semBCreate()函数,二进制信号量实现互斥和同步感兴趣的同学可以参考一下。

taskspawn创建的任务是进程,不是线程,在vxworks里Task等价于进程。 死循环方式是可以的,比如exctask等很多核心的task都是死循环 进程之间的内存空间是互相隔离的(虽然vxworks里也可以访问),进程内不同线程之间内存空间是共享的。 int taskSpawn     (     char          *name,        /*任务名*/     int           priority,     /*任务优先级,vxWorks好像共255个,而且调度采用优先级抢占式,同优先级轮换式的调度方式*/     int           options,      /*任务的一些特性,例如VX_SUPERVISOR_MODE 0x0001           OBSOLETE: tasks always in sup mode*/ /*一般为0*/     int           stackSize,    /* 需要申请堆栈的大小*/     FUNCPTR       entryPt,      /*任务处理函数*/     int           arg1,         /*任务处理函数需要的参数*/     int           arg2,     int           arg3,     int           arg4,     int           arg5,     int           arg6,     int           arg7,     int           arg8,     int           arg9,     int           arg10      ) 13.1 二进制信号量实现互斥和同步 13.1.1 互斥的实现: 使用二进制信号量可以很方便的实现互斥,互斥是指多任务在访问临界资源时具有排他性。为使多个任务互斥访问临界资源,只需要为该资源设置一个信号量,相当于一个令牌,哪个任务拿到这个令牌即有权使用该资源。把信号量设为可用,然后将需要资源的任务的临界代码置于semTake()和SemGive()之间即可。注明: 互斥中的信号量与任务优先级的关系:任务的调度还是按照任务优先级进行,但是在使用临界资源的时候只有一个任务获得信号量,也就是说还是按照任务优先级来获得信号量从而访问资源。只有当前使用资源的任务释放信号量SemGive(),其他任务按照优先级获得信号量。  信号量属性中的参数为:SEM_Q_PRIORITY。而且在创建信号量的时候必须把信号量置为满的SEM_FULL。即信号量可用。  注:信号量属性指定任务阻塞在信号量后的各任务排队的队列类型    (sem_q_priority   按照优先级排队   或者sem_q_fifo   按照先来先服务的顺序排队)   ,sem_delete_safe安全删除属性,允许任务优先级安全倒置sem_inversion_safe   基本实现互斥模型: SEM_ID  semMutex;semMutex = semBCreate(SEM_Q_PRIORITY, SEM_FULL); task(void)        { semTake(semMutex,WAIT_FOREVER);//得到信号量,即相当于得到使用资源的令牌//临界区,某一个时刻只能由一个任务访问; semGive(semMutex); }  13.1.2 同步的实现:     同步即任务按照一定顺序先后执行,为了实现任务A和B的同步,只需要让任务A和B共享一个信号量,并设初始值为空,即不可用,将semGive()置于任务A之后,而在任务B之前插入semTake()即可.说明: 还是讨论和优先级的关系。由于信号量初始化为空,不可用,所以可能使得优先级反转,即高优先级任务B在等待低优先级任务A释放信号量。只有执行了信号量释放语句semGive()后任务B得到信号量才能执行。  属性参数的设置为SEM_Q_FIFO,SEM_EMPTY;  实现模式参考: SEM_ID semSync;semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY); taskA(void) { ………. semGive(semSync);    //信号量释放,有效。 } taskB(void) { semTake(semSync,WAIT_FOREVER);   //等待信号量。 …….. } 使用信号量注意事项: 用途不同,信号量属性和初始值不同;  互斥访问资源使,semTake()和semGive()必须成对出现,且先后顺序不能颠倒;  避免删除那些其他任务正在请求的信号量。  应用: 1、  确保任务优先级不反转: SEM_ID  semFs; SEM_ID  semFss; SEM_ID  semFex; semFs = semBCreate (SEM_Q_FIFO , SEM_EMPTY); semFss = semBCreate (SEM_Q_FIFO , SEM_EMPTY); semFex = semBCreate (SEM_Q_FIFO , SEM_EMPTY);   //创建三个信号量 void t_imaGet(void){    printf("a   ";   semGive(semFs);             //释放信号量} void t_imaJud(void) {    semTake(semFs,WAIT_FOREVER);     //确保优先级不反转。   printf("jj ";   semGive(semFss); } void t_imaPro(void) {     semTake(semFss,WAIT_FOREVER);     printf("rr";     semGive(semFex);     } void t_imaExc(void) {      semTake(semFex,WAIT_FOREVER);      printf("Y";   } void start(void) {   int tGetId,tJudId,tProId,tExcId;   tGetId = taskSpawn("tPget",200,0,1000,(FUNCPTR)t_imaGet,1,0,0,0,0,0,0,0,0,0);      tJudId = taskSpawn("tPjud",201,0,1000,(FUNCPTR)t_imaJud,3,0,0,0,0,0,0,0,0,0);  tProId = taskSpawn("tPpro",202,0,1000,(FUNCPTR)t_imaPro,3,0,0,0,0,0,0,0,0,0);  tExcId = taskSpawn("tPexc",203,0,1000,(FUNCPTR)t_imaExc,3,0,0,0,0,0,0,0,0,0);} 以上例子虽然定了各个任务的优先级,但加上信号量可以实现同步,而且防止优先级反转出现。

上一篇:oracle冷备份_记录
下一篇:MFC中如何添右键弹出菜单

相关文章

相关评论