77范文网 - 专业文章范例文档资料分享平台

VX编程手册(4)

来源:网络收集 时间:2019-04-15 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

VxWorks编程手册

信号量的控制: Wind信号量提供了统一的信号量控制接口,不分类型,只有创建函数需要指明类型。 函数 semBCreate( ) semMCreate( ) semCCreate( ) semDelete( ) semTake( ) semGive( ) semFlush( ) 描述 分配和初始化一个二进制信号量 分配和初始化一个互斥信号量 分配和初始化一个计数信号量 删除并释放信号量 启动信号量 停止信号量 Unblock all tasks that are waiting for a semaphore. 函数semBCreate( ), semMCreate( ), 和 semCCreate()返回信号量ID,当创建信号量时,需要指定队列类型,信号量可以按照优先级顺序或先入先出顺序加入队列中。 当删除信号量时,即调用函数semDelete( ) 时,一定要注意不要删除另一个任务一直正在请求的信号量。

二进制信号量: 获取一个信号量的流程:

二进制信号量可以被看作一个标志位(可用-FULL,不可用-empty),当一个任务起用一个二进制信号量,其结果取决于次信号量当前是否可用,如果可用(full),信号量立即变为不可用(empty),任务继续运行;如果不可用,任务被加入到阻塞任务队列中,并等待信号量可用。

当任务停止信号量(调用函数semGive( )),其结果也取决于次信号量当前是否可用,如果信号量已经可用,停止信号量,结果没什么影响;如果信号量不可用,也没有任务等待获取它,那么信号量变为可用;如果信号量不可用,并且有多个任务正等待获取它,那么阻塞任务队列中的第一个任务变为非阻塞,信号量变为不可用。

释放一个信号量的流程:

第 16 页 共 35 页

VxWorks编程手册

互斥: 二进制信号量对共享资源的互锁访问是十分有效的,它将互斥操作的范围限制到只与它相关的资源。当一个任务想访问某些资源时,它必须首先获得信号量,只要一个任务保持此信号量,其他试图访问此资源的任务被阻塞;当任务完成了资源访问,并释放了信号量,才允许其他任务访问此资源。 因此,所有对资源的互斥访问都是使用semTake( )和semGive( )对。 3 semTake (semMutex, WAIT_FOREVER); .

. critical region, only accessible by a single task at a time .

semGive (semMutex);

同步信号: 当用于任务同步时,信号量可以代表一个任务正在等待的条件或事件。初始化时,信号量是不可用的,一个任务或ISR通过释放信号量代表事件的发生,另一个任务调用函数semTake( )等待信号量。等待的任务阻塞,直到事件发生和信号量被释放。 互斥信号和同步信号的区别是他们的顺序:对于互斥信号,信号量在初始化时是可用的,每个任务必须首先获取它,然后再释放他;对于同步信号,信号量在初始化时是不可用的,一个任务等待获取另一个任务释放的信号量。

互斥信号量: 互斥信号量的行为与二进制信号量基本相同,以定位互斥操作的内部问题,如优先级转换、安全删除、递归访问等:

1、 他只能用于互斥操作;

2、 他只能有获取它的任务释放; 3、 他不能从ISR处释放; 4、 semFlush()操作无效。

优先级反转: 当一个高优先级的任务被迫等待一个低优先级任务不确定的完成时间时,优先级发生了倒置问题。例子:

第 17 页 共 35 页

VxWorks编程手册

T1、T2、T3分别代表优先级为高、中、低的三个任务。任务T3获得了二进制信号量,并可以访问一些资源。当T1(也需要获得同一个信号量)抢占T3,以访问资源时,任务T1就会阻塞。如果T3正常完成资源的访问,T1不会有问题。但是,当中优先级的任务T2抢占了T3任务,这将妨碍T3放弃资源的访问,这种情况一直僵持着,T1将无限期的阻塞。

图——优先级倒置问题

互斥信号量有一选项——SEM_INVERSION_SAFE,它使用priority-inheritance算法,此协议保证访问某一资源的任务以最高优先级任务(也阻塞在这一资源)的优先级别执行。一旦此任务的优先级被提升,它就保持此优先级,直到此任务获取的所有互斥信号量被释放,然后此任务又恢复到正常的或标准的优先级。这样就防止了中优先级的任务的抢占。此选项必须与优先级队列一起使用(SEM_Q_PRIORITY)。 此方法不一定都可行。如果一个任务获取了几个不同的互斥信号量,其中的一个时任务的优先级别提升了,那么任务优先级将一直保持着,直到所有的信号量被释放。

图——优先级继承

在上图中,当T1阻塞在信号量时,通过把T3的优先级提升到与T1相同的优先级,就解决了优先级倒置问题,这种方法叫做优先级继承。他保护了T3,也就间接的保护了T1不被任务T2抢占。

下面是使用优先级继承算法创建互斥信号量的例子: semId = semMCreate (SEM_Q_PRIORITY | SEM_INVERSION_SAFE);

安全删除: 互斥信号量解决的另一个问题是任务删除。当信号量保护着关键域时,删除一个运行在关键域的任务是灾难性的。函数taskSafe( ) 和 taskUnsafe( )为任务删除提供了安全的解决方

第 18 页 共 35 页

VxWorks编程手册

案。而互斥信号量提供SEM_DELETE_SAFE选项,即每个semTake( )函数暗含着调用

taskSafe( )函数,每个semGive( )函数暗含着调用taskUnsafe( )函数。这样,拥有信号量的任务不能被删除。

例子:semId = semMCreate (SEM_Q_FIFO | SEM_DELETE_SAFE);

回归资源访问: 互斥信号量能够被回归的获取,即一个任务在施放信号量之前,可以多次获取信号量。但是,在释放回归获取的互斥信号量之前,信号量也必须获取同样次数,即semTake( )和semGive( )函数必须成对出现。 据个例子:

#include \#include \SEM_ID mySem;

/* Create a mutual-exclusion semaphore. */ init () {

mySem = semMCreate (SEM_Q_PRIORITY); }

funcA () {

semTake (mySem, WAIT_FOREVER);

printf (\...

funcB (); ...

semGive (mySem);

printf (\}

funcB () {

semTake (mySem, WAIT_FOREVER);

printf (\...

semGive (mySem);

printf (\}

计数信号量: 计数信号量是实现任务同步和互斥操作的另一种方式。与二进制信号量相似,只是多了一个计数器,记录信号量被释放的次数。信号量被释放一次,计数器加1;被获取一次,减1;当计数为0时,企图获取此信号量的任务将阻塞。 下表是一个例子: 信号量调用函数 调用后的计数 第 19 页 共 35 页

VxWorks编程手册

semCCreate( ) semTake( ) semTake( ) semTake( ) semTake( ) semGive( ) semGive( ) 3 2 1 0 0 0 1 Semaphore initialized with initial count of 3. Semaphore taken. Semaphore taken. Semaphore taken. Task blocks waiting for semaphore to be available. Task waiting is given semaphore. No task waiting for semaphore; count incremented. 特殊信号量选项: wind信号量接口包括两个特殊的选项,对于POSIX兼容的信号量则没有: 1、超时时间: 当一个任务阻塞等待信号量可用时,信号量获取操作可能需要限制到一定时间内,如果在这段时间内没有信号量被获取,则此操作失败。这个操作由函数semTake( )的一个参数控制,这个参数指明等待时间。如果在指定时间内获得了信号量,返回OK,否则返回ERROR,同时rrno被设置。参数NO_WAIT (0)表示不需要等待,WAIT_FOREVER (-1)表示一直等待。 2、队列: wind信号量为阻塞任务提供了信号量队列选择机制,包括基于先进先出(FIFO)和优先级两种机制。在创建信号量时就选择了队列类型。如使用了优先级继承选项(SEM_INVERSION_SAFE),就必须选择优先级机制。

POSIX信号量: POSIX定义有名字和无名字两种信号量,他们有相同的属性,但接口的使用稍微有些不同(见semPxLib)。POSIX中的术语wait(或lock)和post(或unlock)分别对应于VxWorks中的take和give。POSIX信号量是计数信号量。

2.4消息队列

当前的实时应用都是由一组相互独立又相互协作的任务组成。信号量为任务间同步和互锁提供了高效的机制,而在VxWorks中,消息队列是单处理器中主要的任务间通讯机制。消息队列允许不定数量、不定长度的消息排队等待。任何任务或ISR都能发送消息到消息队列,任何任务也能从消息队列中接受消息。多个任务可以从一个消息队列中接受或发送消息。两个任务间的全双工通讯通常需要两个队列,一个用于发,一个用于收。

第 20 页 共 35 页

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VX编程手册(4)在线全文阅读。

VX编程手册(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/599177.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: