vxworks 任务 浮点任务创建问题求助

vxWorks多任务编程初探(转)
我的图书馆
vxWorks多任务编程初探(转)
进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。根据进程与线程的设置,操作系统大致分为如下类型:1、单进程、单线程:MS-DOS大致是这种操作系统;2、多进程、单线程:多数UNIX(及类Unix的Linux)是这种操作系统;3、多进程、多线程:Windows NT(以及基于NT内核的Windows 2000、XP等)、Solaris 2.x和OS/2都是这种操作系统;4、单进程、多线程:vxWorks就是这种操作系统。vxWorks只有一个进程(内存空间和资源分配),其任务的概念与线程大致相当,所有任务之间共享内存和其它资源。vxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。vxWorks 内核最小为 8KB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。vxWorks的内核主要包括:1、多任务:为满足真实世界事件的异步性,现代操作系统需提供多任务支持,由系统内核分配CPU给多个任务并发执行。如果是单CPU,则执行方式实质是宏观并行、微观串行;2、任务调度:真实世界的事件具有继承的优先级,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务,vxWorks对这种优先级抢占调度(Preemptive Priority Scheduling)提供了支持。同时,vxWorks也支持同优先级任务间的时间片轮转调度(Round-Robin Scheduling);3、任务间的通讯与同步:在一个实时系统中,系统必须提供多个任务间快速且功能强大的通信机制,并提供为了有效地共享不可抢占的资源或临界区所需的同步机制;4、任务与中断之间的通信:许多外设以中断方式与CPU通信,我们不宜在中断服务程序(ISR)中进行过多的处理,通常将相应处理交给特定任务去完成。相关的具体解释如下:硬件中断处理,硬件产生中断,统治系统调用相应的中断历程(ISR),位是系统得到尽快的响应,ISR在它自己独立的上下文和堆栈中运行,它的优先级高于任何任务优先级。中断延迟(Interrupt Latency),中断延迟是指从硬件中断发生到开始执行中断处理程序第一条指令之间的这段时间。优先级驱动(Priority-Driven),优先级驱动是指多任务系统中,当前运行任务总是具有最高优先级的就绪任务。 多任务调度分为两种方式:优先抢占和轮转调度(Preemptive Priority,Round-Robin Scheduling)。优先抢占(Preemptive Priority):每一个任务都有一个优先级,系统核心保证优先级最高的任务运行于CPU。如果有任务优先级高于当前的任务优先级,系统立刻保存当前任务的上下文,切换到优先级高的上下文;抢占(Preemptive):抢占是指当系统处于核心态运行时,允许任务的重新调度。换句话说就是指正在执行的任务可以被打断,让另一个任务运行。抢占提高了应用对异步事件的响应性能力。操作系统内核可抢占,并不是说任务调度在任何时候都可以发生。例如当一个任务正在通过一个系统调用访问共享数据时,重新调度和中断都被禁止。任务上下文(Task Context):任务上下文是指任务运行的环境。例如,针对x86的CPU,任务上下文可包括程序计数器、堆栈指针、通用寄存器的内容。上下文切换(Context Switching):多任务系统中,上下文切换是指CPU的控制权由运行任务转移到另外一个就绪任务时所发生的事件,当前运行任务转为就绪(或者挂起、删除)状态,另一个被选定的就绪任务成为当前任务。上下文切换包括保存当前任务的运行环境,恢复将要运行任务的运行环境。上下文的内容依赖于具体的CPU。轮转调度(Round-Robin Scheduling):使所有相同优先级,状态为ready的任务公平分享CPU(分配一定的时间间隔,使个任务轮流享有CPU)。系统由256个优先级,从0到255,0为最高,255为最低. 任务在被创建时设定了优先级.也可用taskPrioritySet ( ) 来改变任务优先级。任务的主要状态包括READY,PEND,DELAY,SUSPEND,各状态轮转如下:ready--------&pended -----------semTake()/msgQReceive()-其他任务   ready--------&delayed-----------taskDelay()   ready--------&suspended---------taskSuspend()   pended-------&ready-------------semaGive()/msgQSend()-其他任务   pended-------&suspended---------taskSuspend()   delayed------&ready-------------expired delay   delayed------&suspended---------taskSuspend()   suspended----&ready-------------taskResume()/taskActivate()   suspended----&pended------------taskResume()   suspended----&delayed-----------taskResume()    轮转调度 (Round-Robin):轮转调度可以扩充到优先抢占方式中,当多个任务优先级相同的情况下,轮转调度算法使任务按平等的时间片运行于CPU,共享CPU.避免一个任务长时间占用 CPU,而导致其他任务不能运行.可以用 kernelTimeSlice() 来定义时间长度.taskLock ( )和 taskUnlock ( ) 用来取消优先抢占方式和恢复优先抢占方式.注意: 一个任务可以调用taskDelete ( ) 删除另一个任务,但是如果一个当前正在运行的任务被删除后,该任务的内存没有释放,而其他任务不知道,依然在等待,结果导致系统stop.用 taskSafe ( ) 和 taskUnsafe ( ) 来保证正在运行的任务不被删除.用法如下: [cpp]  taskSafe&();&&&semTake&(semId,&WAIT_FOREVER);&&&&..&.critical&region&.&&&semGive&(semId);semGive&(semId);&&&taskUnsafe&();&&&.&.critical&region&.&&&semGive&(semId);semGive&(semId);&&&taskUnsafe&();&&&tasklock()和和 taskUnlock()用来取消优先抢占方式和恢复优先抢占方式。下面介绍下任务间的同步和进程间协调:信号量作为任务间同步和互斥的机制。在 wind 核中有几种类型的信号量,它们分别针对不同的应用需求:二进制信号量、计数信号量、互斥信号量和 POSIX 信号量。所有的这些信号量是快速和高效的,它们除了被应用在开发设计过程中外,还被广泛地应用在VxWorks 高层应用系统中。对于进程间通信,wind 核也提供了诸如消息队列、管道、套接字和信号等机制。 任务间的同步和进程间协调的几种方式:   内存共享(Shared Memory),对简单的数据共享而言.   信号量(Semaphore),基本的互斥和同步.   消息队列(Message queues)和管道(Pipe),单个CPU中,任务间的信息传递.   套结字(Socket)和远程调用(Remote procedure calls),相对于网络任务间的通信.   信号(Signals),出错处理(Exception handling).    内存共享(Shared Memory) 任务间通信最通常的方式是通过共享的数据结构进行通信,因为所有VxWorks的任务存在于一个单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。 互斥(Mutual Exclusion)   互斥是用来控制多任务对共享数据进行串行访问的同步机制。在多任务应用中,当两个或多个任务同时访问共享数据时,可能会造成数据破坏。互斥使它们串行地访问数据,从而达到保护数据的目的.   解决互斥的几种方法: 1. 关闭中断的方法(intLock): 能解决任务和中断ISR之间产生的互斥. [cpp] funcA&()&&&{&int&lock&=&intLock();&&&.&.&critical&region&that&cannot&be&interrupted&.&&&intUnlock&(lock);&}&&&  但在实时系统中采取这个办法会影响系统对外部中断及时响应和处理的能力. 2. 关闭系统优先级(taskLock): 关闭系统优先级,这样在当前任务执行时,除了中断外,不会有其他优先级高的任务来抢占CPU,影响当前程序运行.[cpp] funcA&()&{&taskLock&();&&&.&.&critical&region&that&cannot&be&interrupted&.&&&taskUnlock&();&}&&&这种方法阻止了高优先级的任务抢先运行,在实时系统中也是不适合的,除非关闭优先级的时间特别短. 信号量(Semaphore): 信号量是解决互斥和同步协调进程最好的方法。VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:   1、二进制信号量(binary) 使用最快捷、最广泛,主要用于同步或互斥;   2、互斥信号量(mutual exclusion) 特殊的二进制信号量,主要用于优先级继承、安全删除和回溯;   3、计数器信号量(counting) 和二进制信号量类似,保持信号量被释放(gaven)的次数。主要用于保护一个资源的多个例程(multiple instances of a resource) 信号量控制,函数介绍:   semBCreate( ) 分配并初始化一个二进制信号量   semMCreate( ) 分配并初始化一个互斥信号量   semCCreate( ) 分配并初始化一个计数信号量   semDelete( ) 终止一个自由的信号量   emTake( ) 占有一个信号量   semGive( ) 释放一个信号量   semFlush( ) 解锁所有等待信号量的任务 semBCreate( ), semMCreate( ), and semCCreate( )返回一个信号量ID作为其它后续任务使用该信号量的的句柄。当一个信号量被创建,它的队列(queue)类型就被确定。等待信号量的任务队列以优先级的高低排列(SEM_Q_PRIORITY),或者一先到先得的方式排列(SEM_Q_FIFO). 当一个Semaphore创建时,指定了任务队列的种类。semBCreat( SEM_Q_PRIORITY, SEM_FULL), SEM_Q_PRIORITY 指明处于等待状态的任务在等待队列中以优先级的顺序排列   semBCreat(SEM_Q_FIFO,SEM_FULL), SEM_Q_FIFO指明处于等待状态的任务在等待队列中以先进先出的顺序排列 互斥进程(Mutual Exclusion)   互斥信号量有效的内锁对共享资源的进入,与屏蔽中断(disabling interrupts)和优先级锁定(preemptive locks)相比,二进制信号量将互斥的范围限制在仅与其有关的资源上。从技术上说,创建一个信号量来保护(guarding)资源。信号量初始化位可用的(FULL),当一个Semaphore创建时,指定了这个semaphore是用在解决互斥还是用来同步任务semBCreat( SEM_Q_FIFO, SEM_FULL) , SEM_FULL 指明用于任务间互斥.   SEM_ID semMsemMutex = semBCreate (SEM_Q_PRIORITY, SEM_FULL)& & 当一个任务要进入资源,首先要得到一个信号量(take that semaphore),只要有任务在使用这个信号量,其它的要进入资源的任务要停止执行(blocked from execution),当这个任务完成了对资源的使用,它会释放信号量,允许另一个任务来使用资源。&  semTake (semMutex, WAIT_FOREVER);. . critical region, only accessible by a single task at a timesemGive (semMutex);&  同步协调进程(Synchronization)&  semBCreat(SEM_Q_FIFO,SEM_EMPTY), SEM_EMPTY 指明用于任务间同步.[cpp]&#include&"vxWorks.h"&&&#include&"semLib.h"&&&SEM_ID&syncS&&&init&(&int&someIntNum&)&&&{&&&intConnect&(INUM_TO_IVEC&(someIntNum),&eventInterruptSvcRout,&0);&&&syncSem&=&semBCreate&(SEM_Q_FIFO,&SEM_EMPTY);&&&taskSpawn&("sample",&100,&0,&20000,&task1,&0,0,0,0,0,0,0,0,0,0);&&&}&&&task1&(void)&&&{&...&&&semTake&(syncSem,&WAIT_FOREVER);&&&printf&("task&1&got&the&semaphore\n");&&&...&&&}&&&eventInterruptSvcRout&(void)&&&{&...&&&semGive&(syncSem);&&&...&&&}&&&   semTake(semID,time out)--------有Semaphore空闲,就Take, 如果没有,由time out 定,超时则向下执行。互斥信号量是一个特殊的二进制信号量,设计用于优先级继承,安全删除和回归。它的使用基本和二进制信号量是类似的。但有以下不同:&  1、仅仅被用做互斥。&  2、只能被使用它的任务释放.(It can be given only by the task that took it.)&  3、ISR 不能释放它。&  4、不能使用函数semFlush( )。优先级反转(Priority Inversion)&  优先级反转是指一个任务等待比它优先级低的任务释放资源而被阻塞,如果这时有中等优先级的就绪任务,阻塞会进一步恶化。优先级继承技术可用来解决优先级反转问题。优先级继承(Priority Inheritance)&  优先级继承可用来解决优先级反转问题。当优先级反转发生时,优先级较低的任务被暂时地提高它的优先级,使得该任务能尽快执行,释放出优先级较高的任务所需要的资源。&计数信号量(Counting Semaphores)&  计数信号量是任务同步和互斥的另一种实现方式.计数信号量除了保留信号量被释放的次数以外和二进制信号量是一样的。每次信号量被释放(gaven)一次,计数增加;每次信号量被占用(taken)一次,计数减少;当计数减少为0时,要求得到信号量的任务被阻塞(blocked)。二进制信号量是如果一个信号量被释放,有一个任务阻塞等待,则这个任务就被unblock.而计数信号量如果一个信号量被释放,没有任务阻塞等待,则计数增加。这说明一个被释放两次的计数信号量可以被占用(taken)两次,没有阻塞。下面是计数信号量的使用例子:[cpp]&&&&&Semaphore&Call&&&Count&after&Call&&&Resulting&Behavior&&&semCCreate(&)&&&3&&&Semaphore&initialized&with&initial&count&of&3.&&&semTake(&)&&&2&&&Semaphore&taken.&&&semTake(&)&&&1&&&Semaphore&taken.&&&semTake(&)&&&0&&&Semaphore&taken.&&&semTake(&)&&&0&&&Task&blocks&waiting&for&semaphore&to&be&available.&&&semGive(&)&&&0&&&Task&waiting&is&given&semaphore.&&&semGive(&)&&&1&&&No&task&waiting&for&&count&incremented.&&&消息队列(Message queues)&  消息队列(Message queues)现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效机制。在VxWorks中,用于但一CPU任务之间通信主要(primary)的机制是消息队列。消息队列允许一定数量不同长度的消息进行排列。任何任务或中断服务程序(ISR)能够发送消息给消息队列。任何任务可以从消息队列接受消息。多任务可以从同意消息队列发送和接受消息。两个任务之间的全双工(Full-duplex)通信需要针对不同方向的两个消息队列。&  消息队列函数介绍&  msgQCreate( ) 创建斌初始化一个消息队列&  msgQDelete( ) 终止并释放一个消息队列&  msgQSend( ) 发送一个消息到消息队列&  msgQReceive( ) 从消息队列接受一个消息&  消息队列是由函数msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY)创建。它的参数MAX_MSGS指定了消息队列中可允许最多可以排列的消息数和每个消息允许的最大的字节数MAX_MSG_LEN。&  一个任务或中断服务程序(ISR)用函数msgQSend( )发送一个消息到消息队列。如果没有任务等待消息队列的消息,这个消息被添加消息缓存的队列里。如果某些任务已经在等待消息队列中的消息,消息立刻被传递给第一个等待的消息的任务。&   一个任务用函数msgQReceive( )从消息队列得到一个消息。如果消息队列缓存中有消息存在,第一个消息立刻出列并回到调用处(caller).如果没有消息存在,则任务(calling task)停止(blocks)并被添加到等待消息的任务队列中。这个等待的任务队列按照优先级或先进先出(FIFO)规则排列,这个规则有消息队列创建时所指定。&  等待时间限制(time out)&  msgQSend( ) 和 msgQReceive( )都有时间限制参数。当发送一个消息,如果消息队列缓存这时没有空间,这个参数指定允许等待的时间(ticks数),直到队列缓存有空间来接收消息。当接收消息时,如果消息队列没有消息,这个参数指定允许等待的时间(ticks数),直到消息队列有消息。&[cpp]&  #include&"vxWorks.h"&&&#include&"msgQLib.h"&&&  #define&MAX_MSGS&(10)&&&#define&MAX_MSG_LEN&(100)&&&  MSG_Q_ID&myMsgQId;&&&  task2&(void)&&{&&char&msgBuf[MAX_MSG_LEN];&&& & if&(msgQReceive(myMsgQId,&msgBuf,&MAX_MSG_LEN,&WAIT_FOREVER)&==&ERROR)&&&return&(ERROR);&&&  &printf&("Message&from&task&1:\n%s\n",&msgBuf);&&}&&& & #define&MESSAGE&"Greetings&from&Task&1"&&&task1&(void)&&&{&&if&((myMsgQId&=&msgQCreate&(MAX_MSGS,&MAX_MSG_LEN,&MSG_Q_PRIORITY))&==&NULL)&&&return&(ERROR);&&&  &if&(msgQSend&(myMsgQId,&MESSAGE,&sizeof&(MESSAGE),&WAIT_FOREVER,&MSG_PRI_NORMAL)&==&ERROR)&&&return&(ERROR);&&&}&&&  管道(Pipes)&  管道对消息队列提供了一个可供选择的接口,VxWorks的I/O系统。管道是虚拟的I/O设备,由驱动pipeDrv管理。函数pipeDevCreate()创建一个管道设备,这个调用指定管道的名字,能被排列的最多的消息数,和每个消息允许的长度。&  status = pipeDevCreate ("/pipe/name", max_msgs, max_length);&  被创建的管道是一个通常命名(named)的I/O设备,任务能用标准的I/O函数打开,读,写管道,并能调用ioctl例程。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和消息队列一样,ISR可以向管道写入,但不能从管道读取。做为I/O设备,管道提供了消息队列所没有的重要特性,调用select()。& 转自:http://blog.csdn.net/juana1/article/details/6592125&
TA的最新馆藏[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢基于VxWorks的异常问题分析及调试方法的研究_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于VxWorks的异常问题分析及调试方法的研究
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢VxWorks关于任务创建的几个函数的概述 - CSDN博客
VxWorks关于任务创建的几个函数的概述
& 对于VxWorks&的任务创建可以通过调用 taskSpawn()或是taskInit()/taskActivate()两种方式,以下就对这两种方式进行说明。
& taskSpawn() 实现任务的创建分为两步:1、分配任务栈的空间,初始化WIND_TCB; 2、激活任务。taskSpawn()函数的定义,
int& taskSpawn (char *name,&&&&&&&&&&&&& /*任务名称必须惟一的标示*/
&&&&&&&&&&&&&&&&&&&&&&&&& int priority,&&&&&&&&&&&&&&& /*任务优先级(0-255)越小标示优先级越高*/
&&&&&&&&&&&&&&&&&&&&&&&&& int options,&&&&&&&&&&&&&& /*任务选项*/
&&&&&&&&&&&&&&&&&&&&&&&&&&int stackSize,&&&&&&&&&&& /*任务栈大小(不包含任务名称)*/
&&&&&&&&&&&&&&&&&&&&&&&&& FUNCPTR entryPt,&&&&&/*任务入口函数指针*/
&&&&&&&&&&&&&&&&&&&&&&&&& int arg1,int arg2, int arg3,int arg4, int arg5, int arg6,int arg7, int arg8, int arg9, int arg10)
函数调用成功时,返回新任务的ID,或者返回ERROR。&
参数options任务选项,可以是以下的标志组合:
&&&&&&&&&&&&& VX_FP_TASK:标志浮点寄存器是否属于上下文,若函数中使用了浮点数,应带上此标记。
&&&&&&&&&&&&& VX_PRIVATE_ENV:支持任务私有环境变量。
&&&&&&&&&&&&& VX_NO_STACK_FILL:不进行初始任务栈的填充。
&&&&&&&&&&&&& VX_UNBREAKABLE:任务不允许断点调试(忽略断点)。
&&&&&&&&&&&&& VX_DSP_TASK:DSP 协处理器支持。
&&&&&&&&&&&&& VX_ALTIVEC_TASK:ALTIVEC 协处理器支持。
参数int型的10个,主要传入入口函数的参数,若不足10个,后面剩余的设为0。
&& taskInit()实现创建任务,必须由taskActivate()来激活。以下就对这两个函数进行分解:
STATUS taskInit (WIND_TCB* Ptcb,&&&& /*任务控制块WIND_TCB地址*/
&&&&&&&&&&&&&&&&&&&&&&&&& char* name,&&&&&&&&&&&& /*任务名称必须惟一的标示*/
&&&&&&&&&&&&&&&&&&&&&&&&& int priority,&&&&&&&&&&&&&& /*任务优先级(0-255)越小标示优先级越高*/
&&&&&&&&&&&&&&&&&&&&&&&&& int options,&&&&&&&&&&&&&&&/*任务选项*/
&&&&&&&&&&&&&&&&&&&&&&&&& char* pStackBase,&& /*任务栈的起始地址*/
&&&&&&&&&&&&&&&&&&&&&&&& &int stackSize,&&&&&&&&&& /*任务栈大小(不包含任务名称)*/
&&&&&&&&&&&&&&&&&&&&&&&&&&FUNCPTR entryPt,&&& /*任务入口函数指针*/
&&&&&&&&&&&&&&&&&&&&&&&&&&int arg1,int arg2, int arg3,int arg4, int arg5, int arg6,int arg7, int arg8, int arg9, int arg10)
与taskSpawn() 相比多了两个参数WIND_TCB*和char* pStackBase,任务控制块参数由调用者分配空间,并由其释放;而任务栈也也是由调试者分配与释放,特别留意的是任务栈的起始地址有两种可能,地段地址或高端地址,具体由BSP而定。
STATUS&taskActivate (int tid) /*tid = (int )pT*/
参数tid是表示惟一的任务ID。
&& 其实 taskSpawn() 内部调用taskInit()/taskActivate()来完成的。或者提供了更为细致的任务控制而已。而这两种的创建任务的差别:
&&& 1、taskSpawn()自动在系统堆上分配任务栈空间,并在任务栈上创建TCB;而taskInit()由调用者分配与释放的,TCB不属于任务栈的空间。
&&& 2、taskSpawn()生成任务后进入就绪队列;而taskInit()生成任务后处于挂起状态,不能被直接调用,直到taskActivate()激活。
本文已收录于以下专栏:
相关文章推荐
*******************************************
*******************************************
任务状态...
下载型启动方式概述
    下载形式的VxWorks启动方式需要bootrom引导程序,该程序将被烧录到开发板的ROM或者Flash中,在上电时,系统将自动跳转到ROM或者Flash起始地址处运行该...
VxWorks中与任务控制有关的A
Windows 7下硬盘安装Ubuntu 14.04图文教程
本人下载的是ubuntu-14.04.2-desktop-amd64.iso,经本人亲自测试的,折腾了一天的时间。
1)首先还是分区,...
vxworks启动线程任务的api接口和linux有所不同,vxworks采用的是taskSpawn。
如下代码所示:
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌...
本文介绍在EA工具中,从最初的用例延续下来,先设计类及其方法,再设计时序图过程,以及时序图分层设计方法。
临界资源是指每次仅允许一个进程访问的资源。
属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。
诸进程间应采取互斥方式,实现对这种资源的共享。
每个进程中访...
项目中需要用czmq,但在安装过程中提示需要libzmq,所以要先装libzmq。
通过这篇文章(http://zeromq.org/docs:source-git)中的方法安装,但在configur...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客访问: 238696
博文数量: 102
博客积分: 2000
博客等级: 大尉
技术积分: 1143
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
/* includes */#include "vxWorks.h"#include "taskLib.h"#include "sysLib.h"
/* task function */void myFunc(void){&&&&&& printf("Hello, I am task %d\n", taskIdSelf()); /* Print task Id */&&& taskSafe(); &&& for (i = 0; i & 10; i++)&&& {&&&&&&& printf("%d ", i);&&&&&&& taskDelay(sysClkRateGet() / 2);&&& }&&& taskUnSafe(); }
/* another task function:delete my task */void delMyTaskFunc(void){&&& taskDelay(sysClkRateGet() *4);&&& printf("ready to delete task\n");&&& taskDelete(tid);}
/* user entry */void user_start(){&&& printf("ready to begin new tasks\n");&&& tid = taskSpawn("myTask", 90, 0x100, 2000, (FUNCPTR) myFunc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);&&& taskSpawn("delMyTask", 90, 0x100, 2000, (FUNCPTR)delMyTaskFunc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);}
taskDelete()函数:终止任务并释放任务占用的内存(堆栈和任务控制块空间),其原型为:extern STATUS taskDelete (int tid);
运行输出:Hello, I am task 0 1 2 3 4 5 6 7 ready to begin a new task程序为运行输出8、9,这是因为在此之前,myTask已经被另一个任务――delMyTask删除。任务可能被taskDelete()调用删除掉,但这一行为也不一定是安全的。如果我们删除一个获得了某些资源(如二进制信号量等)的任务,则对应的资源将不被释放,到站其它正在等待该资源的任务永远不能获得资源,系统会挡掉。我们可以用 taskSafe()和 taskUnsafe ()来保护这种区域,例如对myFunc作修改:&&& taskSafe(); &&& for (i = 0; i & 10; i++)&&& {&&&&&&& printf("%d ", i);&&&&&&& taskDelay(sysClkRateGet() / 2);&&& }&&& taskUnSafe(); 运行输出:&&& Hello, I am task 0 1 2 3 4 5 6 7 ready to delete task8 9
阅读(2187) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。}

我要回帖

更多关于 vxworks 任务 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信