请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1038|回复: 0

[转帖] ucos-同步与通信 简介

[复制链接]

18

主题

0

回帖

54

E币

技术员

Rank: 2

积分
36
发表于 2017-4-1 15:20:31 | 显示全部楼层 |阅读模式
第五节:同步与通信

一:同步
任务之间有各种各样的关系来完成一个工作,有时候,一个任务的完成的齐纳提需要另外一个任务给出的结果,任务之间的这种制约性的合作运行机制叫做任务间的同步。

总例:
A任务实现计算功能,B任务输出A任务计算的结果,然后循环运行。A任务和B任务就必须同步,否则B任务输出的可能不是A任务刚完成的结果,或则B任务访问结果时,A任务正在修改,因而输出错误的结果。A和B就是必须进行同步的任务。



二:互斥:

例中,A,B任务都要访问计算结果这个共享资源,当时在A写这个资源的同事,B必须等待,而不能再A写到一半时候结束A而让B来读。这样的共享资源成为临界资源,这种访问共享资源的排他性就是互斥。


临界资源可以是全局变量,也可以是指针,缓冲区或链表等其他数据结构,也可以是打印机,硬盘等硬件。

互斥访问临界资源,操作系统有很多方法, ucos采用的方法有  关中断,给调度器上锁 和使用信号量等(但是,操作共享资源的时候都要进去临界区)


三:临界区
每个任务中访问共享资源的那段程序成为临界区,因为共享资源的访问是要互斥的。


因为如果在访问共享资源的时候进行任务切换,就可能导致灾难性后果,在临界区不允许任务切换,这是最根本的原则。----临界区代码要尽量短,能够尽量在限定时间之内完成。
所以在进入临界临界区访问共享资源之前,采用 关中断,、给调度器上锁或使用信号量的方法,达到互斥的目的。


例:

int functionl(int p1)
{
OS_ENTER_CRITICAL();    //进入临界区,不允许任务切换
访问临界区代码段    //临界区    临界区代码,访问临界资源
OS_EXIT_CRITICAL();    //离开临界区,允许任务切换
其他代码          //其他代码,可以在这些代码执行期间进行任务切换。
}



四:任务事件:

事件就是在操作系统运行过程中发生的事情。
事件处理就是操作系统处理信号量,互斥信号量,时间表蜘蛛,邮箱,消息队列信息的手段。


例:A任务写缓冲区,B任务读缓冲区。什么时候B任务应该运行呢?就是在A任务写完缓冲区这个事件之后,需要调用OSSemPost()这样的函数,释放缓冲区资源。
在该函数中,发现有任务B在排队等候缓冲区资源,于是调用任务切换函数将cpu给B,达到了任务间的无缝同步。

事件处理的对象主要有:信号量,互斥信号量,时间表蜘蛛,邮箱,消息队列。
信号量,邮箱,消息队列是消息的来源。
来消息了是一个事件,等待消息也是在等待时间的发生。
例如:OSSemPost()函数的功能就是执行的发信号量操作。





五:信号量:
信号量标识了共享资源的有效被访问数量,于是要获得共享资源的访问权,就首先要得到信号量。   
使用信号量管理共享资源,请求访问资源就演变成为请求信号量了。
(因为资源是具体的东西,把他数字化之后,操作系统就便于管理这些资源)


在ucos中,信号量的取值范围是16位的二进制整数,范围是十进制的0--65535.或者是其他长度,如8位,32位。



简单使用信号量的3种操作:
1:建立creat
建立并且初始化信号量,在一个事件中标识该信号,记录该信号的量值。

2:请求pend
请求信号,如果还有信号量,就去请求一个,(信号量--)执行下去,如果没有,就要把自己阻塞掉(不能执行下去就不需要占用cpu)

3:释放post
访问资源的操作完成之后(信号量++).

例:A,B两个任务通过信号量同步:   过程如下:
6591746187447.jpg
首先创建信号量S,因为该缓冲区本质上是全局的一个数组,属于临界资源,因此设置信号量的初值为1。另外,该信号量使用一个事件控制块。

A任务请求信号量S,做pend操作(请求)。
因为信号量S=1,所以请求得到满足,pend操作中将S减1变为0.
任务A继续执行,访问缓冲区。
任务A在执行过程中因为其他的时间而阻塞,任务B得到运行,要访问缓冲区,因此请求信号量S,做pend操作。
因为信号量S=0,请求不能得到满足,任务B只能被阻塞。S的值保持为0.
注:但是在信号量S所使用的时间控制模块中,标记了事件B在等待信号量S的信息。

任务A在满足时继续执行,访问缓冲区完成后,做post操作释放缓冲区。
Post操作中将S加1,S的值变为1.
在post操作中,由于事件控制块中,标记了事件B在等待信号量S的信息,且我们设置任务B有更高的优先级,操作系统调用任务切换函数,切换到任务B运行,使任务B获得信号量,访问A写好的缓冲区。


任务B访问完成,再释放该信号量,任务A又可以访问该缓冲区了。








六:互斥信号量:
是一种特殊的信号量(不仅在于该信号量只有用于互斥资源的访问,还在于使用互斥信号量管理需要解决优先级反转问题。)


优先级反转:
例: 系统中有三个任务,分别是高优先级A、中优先级B、低优先级C:
当低优先级的任务在运行时候访问互斥资源,而中优先级的任务运行时将使低优先级的任务得不到运死抱着资源不放。
这时,高优先级的任务开始运行的时候,必须等待中优先级的任务运行完成,然后等待低优先级任务的任务访问资源完成才行。
如果在低优先级的任务访问资源过程中又有中优先级任务运行,那么高优先级的任务只有继续等待。这种情况叫优先级反转。

在ucosii对互斥信号量的管理中,针对这个问题采用了优先级继承机制
优先级继承机制:是一种对占用资源的任务的优先级进行升级的机制,用以优化系统的调度。

例:
当前的任务的优先级是比较低的。
高优先级的任务请求互斥信号量的时候因为信号量已被占有,所以只有阻塞。这时有中优先级的任务就绪。

如果不采用优先级继承,那么高优先级的任务是竞争不过中优先级的任务。
采用优先级继承机制,将占有资源的低优先级的任务临时设置为一个很高的优先级,允许其在占有资源的时候临时获得特权,先于中优先级任务完成,在访问互斥资源结束又回到原来的优先级,这样高优先级的任务就会先于中优先级的任务运行,解决了这个问题。

七:事件标志组:
1:多个事件都发生
2:多个事件中有一个事件发生
3:多个事件都没有发生
  4:多个事件中有任何一个事件没有发生。
如果任务要等待多个事件的发生,或多个事件中的某一个事件的发生就可以继续运行,那么应该采用事件标志组管理。
事件标志组管理的条件组合可以是多个事件都发生,也可以是多个事件中有任何一个事件发生。尤其特别的是,还可以是多个事件都没有发生或多个事件中有任何一个事件没有发生。

八:消息邮箱和消息队列
操作系统通过邮箱来管理人物间的通信与同步,邮箱中的内容不是信件本身,而是指向消息内容的地址。
注:消息的内容不是消息本身而是地址(指针),指针所指向的内容才是任务想得到的东西。
这个指针是void类型的,可以指向任何数据结构。   这样说发送的信息范围也更宽,邮箱中可以容纳下任何长度的数据。

   
例如:
我们打开自己的邮箱,发现一封信,信的内容是“中国浙江省杭州市河坊街123号”。那么在河坊街的123号,我们可以找到自己想要的东西。
如果邮箱里面没有内容,那么我们看到的就是个空地址。


在取得事件控制块之后,要设置他的类型:是信号量型还是邮箱型。(邮箱和信号量都保存在事件控制块中。)
(因为一个事件控制块可以作为信号量的容器,也可以作为邮箱的容器,但是不能同时作为两者的容器)




A,B两个任务通过发消息来同步访问缓冲区:  过程如下:
任务A创建缓冲区,写缓冲区,发消息。
任务B请求消息,如果邮箱里面没有消息,就把自己阻塞,如果有,就读取消息。
任务B最终读取消息后,根据邮箱里的地址读取缓冲区。
65917461846767.jpg





什么情况下采用消息而不是信号量来完成同步和通信:
假如A写缓冲区,B读缓冲区,但是缓冲区是A创建的,B并不知道它在哪里,但是B知道缓冲区的类型是10个字节长的数组。





消息队列:    也用于给任务发消息,但是它是由多个消息邮箱组合形成的,是消息邮箱的集合。,实质上是消息邮箱的队列。
一个消息邮箱只能容纳一条消息,
采用消息队列,一是可以容纳多条消息,二是消息是有序的。

消息队列   消息    信息量的  异同
相同:消息队列同样采用事件控制块来指示   消息的位置和标记等待消息的任务。
不同:
消息队列自身有消息控制块这样的数据结构,事件控制块中指示的不再是消息的地址,而是消息控制块的地址,使用消息控制块可以先进先出的方式管理多条消息。






第四节:基于优先级的可剥夺内核
内核是操作系统最核心的部分,
内核的主要功能是进行任务调度。
内核中最核心的本服务就是调度的核心--------任务切换。
调度:决定多任务的运行状态(哪个任务应该处于哪种状态)


时间:内核也是程序,运行要占用cpu的时间,即内核要和用户程序之间争夺cpu,因此,实时内核要设计得运行效率尽可能的快,调度算法应该尽可能的好。(比较好的内核系统,内核占用cpu的2%-5%负荷。ucos可以。)

空间:内核还要占用大量的空间。因为要进行任务调度,就会有大量的数据结构(任务控制块,就绪表,信号量,邮箱,消息队列等),并且为了进行任务切换,每个任务都有自己的堆栈空间,占用大量的RAM空间。
(所以没有扩充内存的单片机系统因为没有足够的内存空间就不能运行ucos)




ucos使用的是一种基于优先级的可剥夺型内核
一:基于优先级的调度算法:

在ucos中,可以同时又64个就绪任务,每个任务都有各自的优先级(优先级用0—63的无符号整数来表示,数字越大则优先级越低)
ucos总是调度就绪了的优先级最高的任务获得cpu的控制权 。


二:不可剥夺型内核   和   可剥夺型内核

(一):不可剥夺型内核含义:  当任务一旦获得了cpu的使用权得到运行,如果不将自己阻塞,将一直运行。
(不管是否有更紧迫的任务(优先级更高的任务)在等待。注:高优先级的任务已经进入就绪态。)。就算发生了中断,也只让中断服务程序运行(不论中断服务程序是否创建了更高优先级的任务,也都要返回原任务运行)。

65917481832101.jpg
例:
不可剥夺型内核的调度:
1:在任务A运行时发生中断,进入中断服务程序(使更高优先级任务B就绪)。
2:从中断返回,继续运行任务A
3:任务A结束,任务B获得运行。

分析:
1:任务A由于优先级较低,在运行中发生了中断时,cpu将控制权交给中断服务函数,任务A被挂起。
2:中断服务程序将更高优先级的任务B从睡眠态或者阻塞态恢复到就绪态。
  中断服务程序返回,由于采用不可剥夺型内核,将cpu仍交给任务A运行。
3:知道任务A运行完成或者被阻塞,才将cpu交给任务B,任务B才得到运行。

综上所述:采用不可剥夺型内核缺点在于其响应时间。
                 高优先级的任务就算进入了就绪转台,还必须等待低优先级的任务运行完成或者阻塞后猜得到运行,相应时间不能确定。
因此:不可剥夺型内核不适合实时操作系统



(二):可剥夺型内核: 是这样调度的:最高先级的任务一旦就绪,就能获得CPU的控制权而得到运行,而不管当前运行的任务运行到什么状态。


例:
65917481851272.jpg


可剥夺型内核调度:
1:任务A运行发生中断,进入中断服务程序
2:从中断返回,任务B优先级较高获得运行
3:任务B结束,任务A恢复运行。

分析:在可剥夺型内核的调度下,在中断服务程序中就绪了更高优先级的任务B,
2:在中断返回后因为优先级最高, 所以获得了cpu控制权得到运行。
3:任务B运行结束后,任务A猜得到运行。



因此:可剥夺型内核采用了抢占式的调度策略,总是让优先级最高的任务运行,直到其阻塞或者完成,任务响应的时间因此是最优化的。
因为操作系统总是以时钟中断服务程序作为调度的手段,而时钟中断时间是可知的,高优先级任务的运行时间也是可知的
因此适合于实时操作系统。







第六节:中断和时


一:中断
嵌入式实时操作系统的中断是指在任务的执行过程中,当出现异常情况或者特殊请求时,停止任务的执行,转而对这些异常情况或者特殊请求进行处理,处理结束后再返回当前任务的间断处,或由于中断服务函数使更高优先级的程序就绪,转而执行优先级更高的任务。

中断是实时地处理内部或外部事件的一种内部机制。
这里,异常情况或特许请求时中断源,称为异步事件
处理异步事件所用的程序是中断服务程序



例:
工作时,手机响了,于是先接电话,接完电话后继续工作。  
手机是中断源,接电话是中断服务程序

如果不接电话继续工作,这是对中断的不理会,或称中断被屏蔽了。
工作前关掉手机,直接禁止中断。






ucos中,中断处理过程如图:
65917481847150.jpg


当任务A在运行的时候,由于中断的到来,
1:操作系统先保存任务A当前的运行环境,
2:接着进入中断服务程序
3:在中断服务程序后,由于采用可剥夺型内核,如果A仍是最高优先级任务,就恢复A运行的环境,继续运行A,否则将运行一个更高优先级的任务


二:时钟

时钟是一种特定的周期性中断------时钟节拍。(在ucos中起到心脏的作用)
操作系统能够同步,最根本的硬件条件是系统在统一的时钟下工作。

在ucos中,通过对硬件的设置,使在10~200ms的时间间隔内产生一次时钟中断
在该时钟中断服务程序中,对延时的任务进行延时计数 ,检查系统中是否有高优先级的任务就绪而没有得到运行,相应进行任务调度。
因此。如果没有时钟中断服务,就没有多任务操作系统的任务调度,也谈不上实时。
我们把这种周期性中断称为时钟节拍,对应的中断服务程序称为时钟中断服务程序。




第七节:内存管理
内存很宝贵,在ucosii中,采用分区的方式管理内存-----将连续的大块内存按分区来管理,每个系统中有数个这样的分区,每个分区又包含数个内存块,每个内存块大小相同。这样,在分配内存的时候,根据需要从不同的分区中得到数个内存块,而在释放时,这些内存块重新释放回他们原来所在的分区。

为了方便内存管理,ucos采用内存控制块来管理内存。
内存控制块记录了内存分区的地址、分区中内存块的大小和数量,以及空闲块的数量等信息。

内存管理包含了内存分区的创建、分配、释放、使用、等待系统调用。

积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-18 10:56 , Processed in 0.044516 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表