您好、欢迎来到现金彩票网!
当前位置:2019正版免费全年资料 > 同步通信量 >

再读 ucosII源码(邵贝贝):任务之间的通讯与同步--信号量

发布时间:2019-07-03 08:49 来源:未知 编辑:admin

  一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);

  首先要建立该信号量,也即调用OSSemCreate()函数,对信号量的初始计数值赋值。该初始值为0到65,535之间的一个数。

  如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。

  如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。

  最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。

  如果信号量用于对共享资源的访问,那么信号量就用钥匙符号。符号旁边的数字N代表可用资源数。对于二值信号量,该值就是1;

  如果信号量用于表示某事件的发生,那么就用旗帜符号。这时的数字N代表事件已经发生的次数。

  从图 F6.5中可以看出OSSemPost()函数可以由任务或者中断服务子程序调用,而OSSemPend()和OSSemQuery()函数只能由任务程序调用。

  程序清单 L6.9是OSSemCreate()函数的源代码。首先,它从空闲任务控制块链表中得到一个事件控制块[L6.9(1)],并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块[L6.9(2)]。如果这时有任务控制块可用[L6.9(3)],就将该任务控制块的事件类型设置成信号量OS_EVENT_TYPE_SEM[L6.9(4)]。其它的信号量操作函数OSSem???()通过检查该域来保证所操作的任务控制块类型的正确。例如,这可以防止调用OSSemPost()函数对一个用作邮箱的任务控制块进行操作[6.06节,邮箱]。接着,用信号量的初始值对任务控制块进行初始化[L6.9(5)],并调用OSEventWaitListInit()函数对事件控制任务控制块的等待任务列表进行初始化[见6.01节,初始化一个任务控制块,OSEventWaitListInit()][L6.9(6)]。因为信号量正在被初始化,所以这时没有任何任务等待该信号量。最后,OSSemCreate()返回给调用函数一个指向任务控制块的指针。以后对信号量的所有操作,如OSSemPend(), OSSemPost(), OSSemAccept()和OSSemQuery()都是通过该指针完成的。因此,这个指针实际上就是该信号量的句柄。如果系统中没有可用的任务控制块,OSSemCreate()将返回一个NULL指针。

  值得注意的是,在µC/OS-II中,信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲ECB链表中。如果有任务正在等待某个信号量,或者某任务的运行依赖于某信号量的出现时,删除该任务是很危险的。

  确认事件类型合适:它首先检查指针pevent所指的事件类型,是否为信号量类型。

  可用:如果信号量当前是可用的(信号量的计数值大于0)[L6.10(2)],将信号量的计数值减1[L6.10(3)],然后函数将“无错”错误代码返回给它的调用函数。显然,如果正在等待信号量,这时的输出正是我们所希望的,也是运行OSSemPend()函数最快的路径。

  不可用:如果此时信号量无效(计数器的值是0),OSSemPend()函数要进一步检查它的调用函数是不是中断服务子程序[L6.10(4)]。在正常情况下,中断服务子程序是不会调用OSSemPend()函数的。这里加入这些代码,只是为了以防万一。当然,在信号量有效的情况下,即使是中断服务子程序调用的OSSemPend(),函数也会成功返回,不会出任何错误。

  如果信号量的计数值为0,而OSSemPend()函数又不是由中断服务子程序调用的,则调用OSSemPend()函数的任务要进入睡眠状态,等待另一个任务(或者中断服务子程序)发出该信号量(见下节)。OSSemPend()允许用户定义一个最长等待时间作为它的参数,这样可以避免该任务无休止地等待下去。如果该参数值是一个大于0的值,那么该任务将一直等到信号有效或者等待超时。如果该参数值为0,该任务将一直等待下去。OSSemPend()函数通过将任务控制块中的状态标志.OSTCBStat置1,把任务置于睡眠状态[L6.10(5)],等待时间也同时置入任务控制块中[L6.10(6)],该值在OSTimeTick()函数中被逐次递减。注意,OSTimeTick()函数对每个任务的任务控制块的.OSTCBDly域做递减操作(只要该域不为0)[见3.10节,时钟节拍]。真正将任务置入睡眠状态的操作在OSEventTaskWait()函数中执行 [见6.03节,让一个任务等待某个事件,OSEventTaskWait()][L6.10(7)]。

  因为当前任务已经不是就绪态了,所以任务调度函数将下一个最高优先级的任务调入,准备运行[L6.10(8)]。

  当信号量有效或者等待时间到后,调用OSSemPend()函数的任务将再一次成为最高优先级任务。这时OSSched()函数返回。这之后,OSSemPend()要检查任务控制块中的状态标志,看该任务是否仍处于等待信号量的状态[L6.10(9)]。如果是,说明该任务还没有被OSSemPost()函数发出的信号量唤醒。事实上,该任务是因为等待超时而由TimeTick()函数把它置为就绪状态的。这种情况下,OSSemPend()函数调用OSEventTO()函数将任务从等待任务列表中删除[L6.10(10)],并返回给它的调用任务一个“超时”的错误代码。如果任务的任务控制块中的OS_STAT_SEM标志位没有置位,就认为调用OSSemPend()的任务已经得到了该信号量,将指向信号量ECB的指针从该任务的任务控制块中删除,并返回给调用函数一个“无错”的错误代码[L6.10(11)]。

  如果该任务控制块中的.OSEventGrp域不是0,说明有任务正在等待该信号量。

  这时,就要调用函数OSEventTaskRdy()[见6.02节,使一个任务进入就绪状态,OSEventTaskRdy()],把其中的最高优先级任务从等待任务列表中删除[L6.11(3)]并使它进入就绪状态。

  然后,调用OSSched()任务调度函数检查该任务是否是系统中的最高优先级的就绪任务[L6.11(4)]。

  如果是,这时就要进行任务切换[当OSSemPost()函数是在任务中调用的],准备执行该就绪任务。

  如果不是,OSSched()直接返回,调用OSSemPost()的任务得以继续执行。

  如果这时没有任务在等待该信号量,该信号量的计数值就简单地加1[L6.11(5)]。

  上面是由任务调用OSSemPost()时的情况。当中断服务子程序调用该函数时,不会发生上面的任务切换。如果需要,任务切换要等到中断嵌套的最外层中断服务子程序调用OSIntExit()函数后才能进行(见3.09节,µC/OS-II中的中断)。

  当一个任务请求一个信号量时,如果该信号量暂时无效,也可以让该任务简单地返回,而不是进入睡眠等待状态。这种情况下的操作是由OSSemAccept()函数完成的,其源代码见程序清单 L6.12。

  该函数在最开始也是检查参数指针pevent指向的事件控制块是否是由OSSemCreate()函数建立的[L6.12(1)],

  接着从该信号量的事件控制块中取出当前计数值[L6.12(2)],并检查该信号量是否有效(计数值是否为非0值)[L6.12(3)]。

  如果有效,则将信号量的计数值减1[L6.12(4)],然后将信号量的原有计数值返回给调用函数[L6.12(5)]。

  如果该值大于0,说明该信号量有效,同时该值也暗示着该信号量当前可用的资源数。

  应该注意的是,这些可用资源中,已经被该调用函数自身占用了一个(该计数值已经被减1)。

  中断服务子程序要请求信号量时,只能用OSSemAccept()而不能用OSSemPend(),因为中断服务子程序是不允许等待的。

  在应用程序中,用户随时可以调用函数OSSemQuery()[程序清单L6.13]来查询一个信号量的当前状态。

  该函数有两个参数:一个是指向信号量对应事件控制块的指针pevent。该指针是在生产信号量时,由OSSemCreate()函数返回的;

  另一个是指向用于记录信号量信息的数据结构OS_SEM_DATA(见uCOS_II.H)的指针pdata。

  因此,调用该函数前,用户必须先定义该结构变量,用于存储信号量的有关信息。

  在这里,之所以使用一个新的数据结构的原因在于,调用函数应该只关心那些和特定信号量有关的信息,而不是象OS_EVENT数据结构包含的很全面的信息。

  引用任哲书上的一句话解释什么是信号量最合适不过,应用程序中的各个人物,必须通过彼此之间的有效合作,才能完成一项大规模的工作,因为这些任务在运行的时候,经常需要无冲突的访问同一个共享资源,或者需要互相支...博文来自:逐梦男孩

  uCOS-II任务间通信之信号量信号量是什么?信号量有什么用?信号量是可以用来表示一个或多个事件的发生,还可以用来对共享资源的访问。uCOS-II提供了5个对信号量进行操作的函数。如下所示:1.建立一...博文来自:我的博客

  ucosii任务间的同步和通信都可以通过“事件”的方式来搞定,这个事件包括:信号量、互斥量、邮箱和消息队列其中信号量和互斥量用于同步,邮箱和消息队列可用于通信。任务中有任务控制块,同样,在“事件”中有...博文来自:进步源于记录,优秀来自分享

  本章给出μC/OS-Ⅱ的主要结构概貌:-μC/OS-Ⅱ是怎样处理临界段代码的;-什么是任务,怎样把用户的任务交给μC/OS-Ⅱ;-任务是怎样调度的;-应用程序CPU的利用率是多少,μC/OS-Ⅱ是怎样...博文来自:@角色扮演#

  推荐分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!Ⅰ、写在前面本文...博文来自:strongerHuang的专栏

  邵贝贝译uCOS-II,其中包含了uCOS-II源码及学习书籍,是嵌入式学习开发者不可多得的学习资料

  《嵌入式实时操作系统uCOS-II》邵贝贝(第二版) !μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。

  保护任务之间的共享数据和提供任务之间的通讯方法:利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭和打开中断,这可以用于多任务或者任务和ISR共享某些数据时可以采...博文来自:_CJM的博客

  所谓优先级翻转问题(priorityinversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级任...博文来自:IT migrant workers

  转载请注明原文地址:普通信号量:Sem      互斥信号量可能出现优先级翻转,低优先级任务获得信号量还没有释放时发生任务切换,切换到高优先级任务,高优先级任务获得不了信号量而让出CPU,低优先级任务...博文来自:欧阳海宾

  上一节我们引入了信号量的概念,这一讲我们将揭晓互斥信号量的奥秘。互斥信号量和信号量虽然都带了信号量的帽子,但是二者却有着不同的运用场合,互斥信号量相比而言经常用于一些资源的互斥访问,比如打印机、厕所等...博文来自:逐梦男孩

  作为一个UCOSII的初学者,记录下学习过程,以备以后查询。主要参考资料是邵贝贝的嵌入式实时操作系统uCOS-II,其余均来自网络。一、对处理器的要求   要使µC/OS-Ⅱ正常运行,处理器必须满足以...博文来自:自由的天空

  本文内容简介:一共分为三部分:第一部分:互斥信号量,用于解决信号量优先级反转问题第二部分:内嵌信号量信号量的优先级反转问题信号量在一定情况下会造成高优先级的任务反而之后才执行解决方法:可以将需要等待的...博文来自:feather(猎羽)

  一、信号量实现访问共享资源task4task5共同需要访问共享资源区,都同时请求信号量其中一个在访问的时候,另一个只能处于等待状态。//task4、5:使用信号量访问共享资源区voidtask4_ta...博文来自:的博客

  在µC/OS-II中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。在前面的章节中,已经讲到了其中的两种:一是利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL...博文来自:FunkyFrog821951259的博客

  四种信号灯的介绍1.计数信号灯:计数信号灯可以看成是长度大于1的队列2.二值型信号灯:二进制信号灯可以认为长度是1的队列,二值型信号灯是种特殊的计数信号灯,二值信号灯和互斥锁十分相像,不过二值型信号灯...博文来自:白鱼儿的博客

  1、OSTimtick():给每个用户控制块OS_TCB中的时间延时项OSTCBDly减1,当某个任务的延时项减到零后任务就进入到了就绪状态。SysTickHandler():定时器服务中断函数(硬件...博文来自:qinhao399的博客

  文章目录前言任务的同步直接制约关系间接制约关系事件发送事件与请求事件信号量消息邮箱消息队列参考资料前言本节简要的介绍什么是任务的同步以及实现任务通信的几种方式:信号量、消息邮箱、消息队列等等。程序中的...博文来自:williamgavin的博客

  邮箱是用来在不同任务之间传递数据(这种数据叫“消息”)的,信息量的作用跟标志位一样,只是表达的方式不太一样。1)创建邮箱函数 OSMboxCreate(void*msg); 原型为OS_EVENT* ...博文来自:一个写笔记的博客

  消息队列是邮箱的升级版,邮箱只能传递一个数据,消息队列可以传递多个数据。消息队列由3个部分组成:事件控制块、消息队列和消息。消息队列的数据结构如下图:(图片来源是探索者F4的书,应该不会侵权吧)当把事...博文来自:一个写笔记的博客

  信号与任务之间的通信、任务优先级的反转博文来自:zhang_yin_liang的博客

  1、信号量1.1信号量简介①信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被锁部分代码的权限。一旦执行至被锁代码段,则任务一直等待,直到对应被锁部...博文来自:nandycu的博客

  首先我们得先讨论前后台系统和RTOS(RealTimeOS)的区别。前后台系统,也即是我们所说的裸机程序,它的结构通常包括一个死循环和若干个中断服务程序,直接上图,我们有一个直观认识:假如Task2是...博文来自:lbt111的博客

  uCOS-II任务间通信之邮箱学过信号量之后再来看邮箱,发现它们是非常相似的,甚至有时候邮箱可以当做信号量来使用,邮箱相对信号量而言,只是多传递了一个指针变量。和信号量很相似,ucosII提供了5个对...博文来自:我的博客

  多任务合作工作的过程中,操作系统应解决两个问题:一是各任务间应具有一种互斥关系,即对于某个共享资源,如果一个任务正在使用,则其他任务只能等待,等到该任务释放该资源后,等待的任务之一才能使用它;二是相关...博文来自:的博客

  阻塞   相应事件的OSSemPend()函数会调用 OSEventTaskWait() 函数后,当前任务进入等待态,执行了任务切换,CPU执行处于就绪态最高优先级的任务。唤醒   事件对应的 OSS...博文来自:xiayufeng520的专栏

  1.共享内存,它是LINUX下,属于SYSTEMVIPC对象的一种通信方式。 1)共享内存是一种尤为高效的进程间通信方式,进程直接进行读写操作,不需要任何数据的COPY。 2)内核中专门留出了一块内存...博文来自:xld_hung的博客

  从零开始学习UCOSII操作系统1--UCOSII的基础知识前言:首先比较主流的操作系统有UCOSII、FREERTOS、LINUX等,UCOSII的资料相对比其余的两个操作系统的资料是多很多的。更重...博文来自:李辉的博客

  那年的笔试面试题,面试经验总结和干货发放博文来自:Mingrenjiuwei的博客

  jquery/js实现一个网页同时调用多个倒计时(最新的)nn最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦!nnnn//jsn...博文来自:Websites

  最近在EasyDarwin开源群里,有不少用户私信需求,要做一种能够多端同屏的系统,细分下来有屏幕采集端和同屏端,屏幕采集端细想也就是一个低延时的流媒体音视频服务器,同屏端也就是一个低延时的播放器,负...博文来自:Babosa的专栏

  扫二维码关注,获取更多技术分享nnn 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  最近比较有空,大四出来实习几个月了,作为实习狗的我,被叫去研究Docker了,汗汗!nnDocker的三大核心概念:镜像、容器、仓库n镜像:类似虚拟机的镜像、用俗话说就是安装文件。n容器:类似一个轻量...博文来自:我走小路的博客

  webService学习(二)—— 调用自定义对象参数rn本文主要内容:rn1、如何通过idea进行webService Client的简单实现(不再使用wsimport的方式,其实是ide帮我们做了...博文来自:止水的专栏

  maker一下自己捣鼓的商品详情页,主要是选择商品类型的交互和样式,点击不同类型切换图片和文字,商品增加减少,还有商品预览图片(本地图片无法预览!!!)。。源码下载:博文来自:dKnightL的博客

  li_xin_long:“Top of Stack:栈顶指针,被放在向量表的开始,FLASH的0地址,复位后首先装载栈顶指针。” 32的栈不是向下伸长得吗,怎么会栈顶起始被放在flash的0地址呢?

  :大兄弟,有它的其他引脚配置吗 ,比如那个isp模式到底硬件应该如何配置。jtag外部硬件哪个上拉,,请指导一哈~~

http://disyu.com/tongbutongxinliang/443.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有