关注“嵌入式软件开发学习圈”免费获取更多学习教程
死锁(或抱死)
死锁也称作抱死,指两个任务无限期地互相等待对方控制着的资源。设任务T1正独享资源R1,任务T2在独享资源T2,而此时T1又要独享R2,T2也要独享R1,于是哪个任务都没法继续执行了,发生了死锁。最简单的防止发生死锁的方法是让每个任务都:
l先得到全部需要的资源再做下一步的工作
l用同样的顺序去申请多个资源
l释放资源时使用相反的顺序
内核大多允许用户在申请信号量时定义等待超时,以此化解死锁。当等待时间超过了某一确定值,信号量还是无效状态,就会返回某种形式的出现超时错误的代码,这个出错代码告知该任务,不是得到了资源使用权,而是系统错误。死锁一般发生在大型多任务系统中,在嵌入式系统中不易出现。
同步
可以利用信号量使某任务与中断服务同步(或者是与另一个任务同步,这两个任务间没有数据交换)。如图2.13所示。注意,图中用一面旗帜,或称作一个标志表示信号量。这个标志表示某一事件的发生(不再是一把用来保证互斥条件的钥匙)。用来实现同步机制的信号量初始化成0,信号量用于这种类型同步的称作单向同步(unilateral rendezvous)。一个任务做I/O操作,然后等信号回应。当I/O操作完成,中断服务程序(或另外一个任务)发出信号,该任务得到信号后继续往下执行。
图2.13用信号量使任务与中断服务同步
如果内核支持计数式信号量,信号量的值表示尚未得到处理的事件数。请注意,可能会有一个以上的任务在等待同一事件的发生,则这种情况下内核会根据以下原则之一发信号给相应的任务:
l发信号给等待事件发生的任务中优先级最高的任务,或者
l发信号给最先开始等待事件发生的那个任务
根据不同的应用,发信号以标识事件发生的中断服务或任务也可以是多个。
两个任务可以用两个信号量同步它们的行为。如图2.14所示。这叫做双向同步(bilateral rendezvous)。双向同步同单向同步类似,只是两个任务要相互同步。
例如则程序清单2.10中,运行到某一处的第一个任务发信号给第二个任务[L22.10(1)],然后等待信号返回[L2.10(2)]。同样,当第二个任务运行到某一处时发信号给第一个任务[2.10(3)]等待返回信号[L2.10(4)]。至此,两个任务实现了互相同步。在任务与中断服务之间不能使用双向同步,因为在中断服务中不可能等一个信号量。
图2.14两个任务用信号量同步彼此的行为
双向同步
| Task1()
| {
| for (;;) {
| Perform operation;
| Signal task #2;(1)
| Wait for signal from task #2;(2)
| Continue operation;
| }
| }
|
| Task2()
| {
| for (;;) {
| Perform operation;
| Signal task #1;(3)
| Wait for signal from task #1;(4)
| Continue operation;
| }
| }
|
事件标志(Event Flags)
当某任务要与多个事件同步时,要使用事件标志。若任务需要与任何事件之一发生同步,可称为独立型同步(即逻辑或关系)。任务也可以与若干事件都发生了同步,称之为关联型(逻辑与关系)。独立型及关联型同步如图2.15所示。
图2.15独立型及关联型同步
可以用多个事件的组合发信号给多个任务。如图2.16所示,典型地,8个、16个或32个事件可以组合在一起,取决于用的哪种内核。每个事件占一位(bit),以32位的情况为多。任务或中断服务可以给某一位置位或复位,当任务所需的事件都发生了,该任务继续执行,至于哪个任务该继续执行了,是在一组新的事件发生时辨定的。也就是在事件位置位时做辨断。
内核支持事件标志,提供事件标志置位、事件标志清零和等待事件标志等服务。事件标志可以是独立型或组合型。μC/OS-Ⅱ目前不支持事件标志.
任务间的通讯(Intertask Communication)
有时很需要任务间的或中断服务与任务间的通讯。这种信息传递称为任务间的通讯。任务间信息的传递有两个途径:通过全程变量或发消息给另一个任务。
用全程变量时,必须保证每个任务或中断服务程序独享该变量。中断服务中保证独享的唯一办法是关中断。如果两个任务共享某变量,各任务实现独享该变量的办法可以是关中断再开中断,或使用信号量(如前面提到的那样)。请注意,任务只能通过全程变量与中断服务程序通讯,而任务并不知道什么时候全程变量被中断服务程序修改了,除非中断程序以信号量方式向任务发信号或者是该任务以查询方式不断周期性地查询变量的值。要避免这种情况,用户可以考虑使用邮箱或消息队列。
图2.16事件标志
uCOS-II基础入门相关链接:
uCOS-II基础入门一介绍:实时系统概念、前后台系统、代码的临界段、任务切换。如需了解更多详情可以点击如下:
嵌入式学习之uCOS-II基础入门(一)
uCOS-II基础入门二介绍:内核概述、调度含义、不可剥夺型内核、可剥夺内核、可重入性的含义。如需了解更多详情可以点击如下:
嵌入式学习之uCOS-II基础入门(二)
uCOS-II基础入门三介绍:任务优先级、静态(动态)优先级、优先级反转、任务优先级分配。如需了解更多详情可以点击如下:
嵌入式学习之uCOS-II基础入门(三)
uCOS-II基础入门四介绍:资源共享时,互斥条件包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量。如需了解更多详情可以点击如下:
嵌入式学习之uCOS-II基础入门(四)
最近和大家分享嵌入式学习之uCOS-II基础入门学习资料。
获取如下uCOS-II基础入门学习资料,关注分享微信公众号“嵌入式软件开发学习圈”,回复“uCOS-II基础入门学习资料”即可。
关注分享微信公众号“嵌入式软件开发学习圈”,获取更多学习资料、以及资讯。你们的关注是我最大动力。
|