2017-12-30 12:17:21 wuxy720 阅读数 22247
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7534 人正在学习 去看看 朱有鹏

题记:

这几天一直在学习有关操作系统的知识,遇到了有关信号量的知识,所以想记录下来学习一下。

正文:

信号量

信号量机制

1965年,荷兰学者DIJKSTRA提出的信号量机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制又得到了很大的发展。

信号量的作用

  • 控制共享资源的使用权(满足互斥条件)
  • 标志某事件的发生
  • 使两个或两个以上的进程的行为同步

信号量的实质:

像是一把钥匙,进程要运行下去,需要先拿到这把钥匙,通俗点来讲就是在允许的信号量下,进程才能够执行。

接下来,我们就来看看如何通过操作信号量,来实现控制进程的执行。

PV的操作:

pv操作:就是来解决互斥与同步的问题的。PV操作是分开来看的。
首先来看P操作(等待信号量):

  • 信号量有效(值>0)
  • 信号量值减1
  • 任务继续运行
  • 信号量值=0
  • 等待信号量的进程被列入等待信号量进程列表。

可以理解为:
if ( (s = s - 1) >= 0 )
继续执行本进程;
else
挂起本进程/本进程等待;

然后再来看V操作:

  • 没有进程等待信号量
  • 信号量的值加1
  • 有进程等待信号量
  • 信号量的值加1
  • 等待的其中一个进程进入就绪状态

可以理解为:
if ( (s = s + 1) >0 )
不唤醒s的队列中的等待进程;
else // (s = s + 1) <= 0
唤醒s的队列中的等待进程;
继续执行本进程;

我们简单的记住这个原理,然后我们通过一个例子来解释,什么是PV操作。
公交车司机与售票员的问题:
这里写图片描述
我在图上画了步骤,接下来我们严格按照步骤来一步一步走。

  1. 首先,我们在司机进程使用P操作(S1=S1-1=-1),现在是S1的值为-1,我们来查看P操作发现应该 挂起本进程,也就是说司机进程暂时挂起,我们进入到售票员进程
  2. 进入售票员进程后,我们先 关车门,然后我们进行V操作(S1=S1+1=0),发现满足V操作的else,我们首先唤醒司机进程,然后我们继续执行售票员进程
  3. 接着售票,售票后我们执行P操作(S2=S2-1=-1),发现满足P操作的else,我们暂时将售票员进程挂起。
  4. 进入到司机进程
  5. 启动车辆正常行驶到站停车,执行V操作(S2=S2+1=0),发现S2满足V操作的else,唤醒售票员进程,同时继续执行本进程。
  6. 但是,我们可以发现司机进程已经执行完了,但是等待队列中还有售票员进程,我们就进入到售票员进程
  7. 售票员进程中,开车门上下客。整个司机与售票员问题结束。

关于PV操作容易产生的一些疑问:

1,S大于0那就表示有临界资源可供使用,为什么不唤醒进程?

S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒。

2,S小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完, 当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。

3,如果是互斥信号量的话,应该设置信号量S=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0,也还是执行不了,这是怎么回事呢?

当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

4,S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。

在最后,我们可以发现,我们是严格按照之前的PV操作的定义执行的,其实我们身边很多例子都是这样一步步实现的,只要多发现,用这种计算机思想来思考,是可以得到很多锻炼的。

2019-03-01 20:36:39 weixin_42285271 阅读数 44
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7534 人正在学习 去看看 朱有鹏

大家好,之前的博文讲解了进程互斥(进程与进程间的竞争来争夺对资源的使用),这篇文章给大家讲讲进程同步。
所谓进程同步(synchronization):指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务。
具体的说,有多个进程,其中一个进程执行到某一个位置,需要另外一个进程给其提供消息,在没有获得该消息的时候,前一个进程进入阻塞态,一旦获得消息就被唤醒进入就绪态。
举一个典型例子,生产者消费者问题,该图引用自MOOC网 北大陈向群教授操作系统的课件
在这里插入图片描述
该图所描绘的场景是,生产者进程生产某种数据类型放入缓冲区后,消费者进程才可以取走,不允许生产者和消费者同时对缓冲区进行操作。
很显然上图是一个典型的进程同步问题,如何解决这个问题呢?我们接下来引入一种经典的进程同步机制-信号量及P、V操作(既能解决互斥问题,又能解决同步问题)
信号量:一种特殊变量,由一个整数值(进程间传递信息的一个整数值)和一个队列组成(进程排序所用)
数据结构为
struc semaphore{
int count;
queueType queue;
}
信号量声明 semaphore s;
对信号量只能实施三种操作:初始化、P和V
在这里插入图片描述
其中P操作是实现使进程进入阻塞态,并且将进程放入s.queue末尾,重新调度
Q操作是唤醒s.queue等待队列中的一个等待进程,改变其为就绪态并且将其插入就绪队列。

注意:P、V都是原语操作,在操作过程中不允许被中断
信号量上的操作主要是初始化(非负数)、P操作、V操作

下面介绍一下同步中具体的PV操作实例(进程的互斥为一种特殊的同步),既能解决进程的同步问题,又能解决进程的互斥问题。
在这里插入图片描述
假设有三个进程P1、P2、P3,对同一个临界资源进程操作,设置信号量mutex=1,如果P1先进入CPU,进行P操作,mutex=0,P1进程进入临界区,如果此时P1进入临界区后被中断了,此时P2如果要进入临界区,那么P2执行P操作,mutex=-1,而由我们上面的定义可知,P2进程就等在s.queue队列里面了,同理如果P3也想进入临界区,此时mutex=-2,P3进程也进入队列中,等在P2后面,然后如果此时P1再次进入CPU,那么其进入临界区完成后执行V操作,mutex加1变为mutex=-1,此时V操作把P2从等待队列里送入就绪队列。P3同理。

2017-03-20 11:56:24 li2011014203 阅读数 925
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7534 人正在学习 去看看 朱有鹏
PV原语操作详解 
 
 
  PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。
 
    semaphore有两种实现方式:
 
    1semaphore的取值必须大于或等于0。0表示当前已没有空闲资源,而正数表示当前空闲资源的数量;
    2) semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数。
 
    信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问。初始化可指定一个非负整数,即空闲资源总数。
 
    P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;
 
    V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。
 
    P原语操作的动作是:     (1)sem减1;     (2)若sem减1后仍大于或等于零,则进程继续执行;     (3)若sem减1后小于零,则该进程被阻塞后进入与该信号相对应的队列中,然后转进程调度。
    V原语操作的动作是:     (1)sem加1;     (2)若相加结果大于零,则进程继续执行;     (3)若相加结果小于或等于零,则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度。
    PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。
 
 
---------------------------------------------
 
    具体PV原语对信号量的操作可以分为三种情况:
 
    1把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。
 
    实现过程:
 
    P(mutex); // mutex的初始值为1 访问该共享数据;
    V(mutex);
    非临界区;
 
    2把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。
 
    实现过程:
 
    P(resource); // resource的初始值为该资源的个数N 使用该资源;
    V(resource);
    非临界区;
 
  3把信号量作为进程间的同步工具
 
    实现过程:
 
    临界区C1;
    P(S);
    V(S);
    临界区C2;
 
 
---------------------------------------------
 
举例说明:
 
 
    例1:某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去。试用P、V操作正确实现顾客进程的同步互斥关系。
 
    分析:把手推车视为某种资源,每个顾客为一个要互斥访问该资源的进程。因此这个例子为PV原语的第二种应用类型。
 
    解:
 
semaphore S_CartNum;    // 空闲的手推车数量,初值为100
void  consumer(void)    // 顾客进程 {     P(S_CartNum);
   买东西;
   结帐;
   V(S_CartNum);  }
 
 
    例2:桌子上有一个水果盘,每一次可以往里面放入一个水果。爸爸专向盘子中放苹果,儿子专等吃盘子中的苹果。把爸爸、儿子看作二个进程,试用P、V操作使这两个进程能正确地并发执行。
 
    分析:爸爸和儿子两个进程相互制约,爸爸进程执行完即往盘中放入苹果后,儿子进程才能执行即吃苹果。因此该问题为进程间的同步问题。
 
    解:
 
semaphore  S_PlateNum;  // 盘子容量,初值为1
semaphore  S_AppleNum;  // 苹果数量,初值为0
void  father( )  // 父亲进程 {
    while(1)
    {         P(S_PlateNum);
        往盘子中放入一个苹果;
        V(S_AppleNum);
    }  }
void  son( )   // 儿子进程 {
    while(1)
    {         P(S_AppleNum);
        从盘中取出苹果;
        V(S_PlateNum);
        吃苹果;
    }  }
 
---------------------------------------------
 
    另附用PV原语解决进程同步与互斥问题的例子:
 
   
    例3两个进程PA、PB通过两个FIFO(先进先出)缓冲区队列连接(如图)
    pv.JPG      PA从Q2取消息,处理后往Q1发消息;PB从Q1取消息,处理后往Q2发消息,每个缓冲区长度等于传送消息长度。 Q1队列长度为n,Q2队列长度为m. 假设开始时Q1中装满了消息,试用P、V操作解决上述进程间通讯问题。
 
    解:
 
// Q1队列当中的空闲缓冲区个数,初值为0 semaphore  S_BuffNum_Q1;  
// Q2队列当中的空闲缓冲区个数,初值为m  semaphore  S_BuffNum_Q2;    
// Q1队列当中的消息数量,初值为n  semaphore  S_MessageNum_Q1;
// Q2队列当中的消息数量,初值为0  semaphore  S_MessageNum_Q2;
 
void PA( ) {
    while(1)
    {         P(S_MessageNum_Q2);
        从Q2当中取出一条消息;
        V(S_BuffNum_Q2);
        处理消息;
        生成新的消息;
        P(S_BuffNum_Q1);
        把该消息发送到Q1当中;
        V(S_MessageNum_Q1);
    }  }
 
void PB( ) {
    while(1)
    {         P(S_MessageNum_Q1);
        从Q1当中取出一条消息;
        V(S_BuffNum_Q1);
        处理消息;
        生成新的消息;
        P(S_BuffNum_Q2);
        把该消息发送到Q2当中;
        V(S_MessageNum_Q2);
    }  }
 
 
    例4:《操作系统》课程的期末考试即将举行,假设把学生和监考老师都看作进程,学生有N人,教师1人。考场门口每次只能进出一个人,进考场的原则是先来先进。当N个学生都进入了考场后,教师才能发卷子。学生交卷后即可离开考场,而教师要等收上来全部卷子并封装卷子后才能离开考场。
    (1)问共需设置几个进程?
    (2)请用P、V操作解决上述问题中的同步和互斥关系。
 
    解:
 
semaphore  S_Door;         // 能否进出门,初值1
semaphore  S_StudentReady; // 学生是否到齐,初值为0
semaphore  S_ExamBegin;   // 开始考试,初值为0
semaphore  S_ExamOver;    // 考试结束,初值为0
 
int nStudentNum = 0;       // 学生数目
semaphore  S_Mutex1;       //互斥信号量,初值为1
int  nPaperNum = 0;       // 已交的卷子数目
semaphore  S_Mutex2;       //互斥信号量,初值为1
 
void  student( ) {
    P(S_Door);
    进门;     V(S_Door);
    P(S_Mutex1);
    nStudentNum ++;   // 增加学生的个数
    if(nStudentNum == N)  V(S_StudentReady);
    V(S_Mutex1);
    P(S_ExamBegin);  // 等老师宣布考试开始
    考试中…
    交卷;
    P(S_Mutex2);
    nPaperNum ++;    // 增加试卷的份数
        if(nPaperNum == N) 
        V(S_ExamOver);
        V(S_Mutex2);
        P(S_Door);
        出门;
        V(S_Door);
}
 
void  teacher( ) {
    P(S_Door);
    进门;     V(S_Door);
    P(S_StudentReady);    //等待最后一个学生来唤醒
    发卷子;
        for(i = 1; i <= N; i++)   
        V(S_ExamBegin);
        P(S_ExamOver);    //等待考试结束
        封装试卷;
        P(S_Door);
        出门;         V(S_Door);
}
 
 
 
     5某商店有两种食品A和B,最大数量均为m个。 该商店将A、B两种食品搭配出售,每次各取一个。为避免食品变质,遵循先到食品先出售的原则。有两个食品公司分别不断地供应A、B两种食品(每次一个)。为保证正常销售,当某种食品的数量比另一种的数量超过k(k<m)个时,暂停对数量大的食品进货,补充数量少的食品。
    (1) 问共需设置几个进程?
    (2) 用P、V操作解决上述问题中的同步互斥关系。
 
    解:
 
semaphore  S_BuffNum_A;  //A的缓冲区个数, 初值m
semaphore  S_Num_A;      // A的个数,初值为0
semaphore  S_BuffNum_B;  //B的缓冲区个数, 初值m
semaphore  S_Num_B;      // B的个数,初值为0
 
void  Shop( ) {
    while(1)
    {         P(S_Num_A);
        P(S_Num_B);
        分别取出A、B食品各一个;
        V(S_BuffNum_A);
        V(S_BuffNum_A);
        搭配地销售这一对食品;
    }  }
 
// “A食品加1,而B食品不变”这种情形允许出现的次数(许可证的数量),其值等于//k-(A-B),初值为k
semaphore  S_A_B;
// “B食品加1,而A食品不变”这种情形允许出现的次数(许可证的数量),其值等于//k-(B-A),初值为k
semaphore  S_B_A;
 
void  Producer_A( ) {
    while(1)
    {         生产一个A食品;
        P(S_BuffNum_A);
        P(S_A_B);
        向商店提供一个A食品;
        V(S_Num_A);
        V(S_B_A);
    }  }
 
void  Producer_B( ) {
    while(1)
    {         生产一个B食品;
        P(S_BuffNum_B);
        P(S_B_A);
        向商店提供一个B食品;
        V(S_Num_B);
        V(S_A_B);
    }  }
 
 
    6:在一栋学生公寓里,只有一间浴室,而且这间浴室非常小,每一次只能容纳一个人。公寓里既住着男生也住着女生,他们不得不分享这间浴室。因此,楼长制定了以下的浴室使用规则:
     (1)每一次只能有一个人在使用;
     (2)女生的优先级要高于男生,即如果同时有男生和女生在等待使用浴室,则女生优先;
     (3)对于相同性别的人来说,采用先来先使用的原则。
 
    假设:
    (1)当一个男生想要使用浴室时,他会去执行一个函数boy_wants_to_use_bathroom,当他离开浴室时,也会去执行另外一个函数boy_leaves_bathroom;
    (2)当一个女生想要使用浴室时,会去执行函数girl_wants_to_use_bathroom,当她离开时, 也会执行函数girl_leaves_bathroom;
 
    问题:请用信号量和P、V操作来实现这四个函数(初始状态:浴室是空的)。
 
    解:
 
信号量的定义:
semaphore  S_mutex;  // 互斥信号量,初值均为1
semaphore  S_boys;   // 男生等待队列,初值为0
semaphore  S_girls; // 女生等待队列,初值为0
 
普通变量的定义:
int  boys_waiting = 0;  // 正在等待的男生数;
int  girls_waiting = 0; // 正在等待的女生数;
int  using = 0;         // 当前是否有人在使用浴室;
 
void  boy_wants_to_use_bathroom ( ) {
    P(S_mutex);
    if((using == 0) && (girls_waiting == 0))
        {
            using  =  1;
            V(S_mutex);
        }
    else
        {
            boys_waiting ++;
            V(S_mutex);
            P(S_boys);
        }
}
 
void  boy_leaves_bathroom ( ) {
    P(S_mutex);
    if(girls_waiting  >  0)  // 优先唤醒女生
        {
            girls_waiting --;
            V(S_girls);
        }
    else  if(boys_waiting  >  0)
        {
            boys_waiting --;
            V(S_ boys);
        }
        else   
            using  =  0;     // 无人在等待
            V(S_mutex);
}
 
void  girl_wants_to_use_bathroom ( ) {
    P(S_mutex);
    if(using == 0)
    {
        using  =  1;
        V(S_mutex);
    }
    else
    {
        girls_waiting ++;
        V(S_mutex);
        P(S_girls);
    }
}
 
void  girl_leaves_bathroom ( ) {
    P(S_mutex);
    if(girls_waiting  >  0)  // 优先唤醒女生
    {
        girls_waiting --;
        V(S_girls);
    }
    else  if(boys_waiting  >  0)
        {
            boys_waiting --;
            V(S_ boys);
        }
        else   
            using  =  0;     // 无人在等待
            V(S_mutex);
}
 
 
 
 
 
 
 
 
再附上几个例子:
********************************************************************************************************
 
用PV原语实现进程的互斥
  由于用于互斥的信号量sem与所有的并发进程有关,所以称之为公有信号量。公有信号量的值反映了公有资源的数量。只要把临界区置于P(sem)和V(sem)之间,即可实现进程间的互斥。就象火车中的每节车厢只有一个卫生间,该车厢的所有旅客共享这个公有资源:卫生间,所以旅客间必须互斥进入卫生间,只要把卫生间放在P(sem)和V(sem)之间,就可以到达互斥的效果。以下例子说明进程的互斥实现。
例1:      生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:     (1)进程A专门拣黑子,进程B专门拣白子;     (2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;
 
    分析:     第一步:确定进程间的关系。由功能(2)可知进程之间是互斥的关系。     第二步:确定信号量及其值。由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。
 
    实现:
begin     s:semaphore;     s:=1;     cobegin         process A         begin             L1: P(s);             拣黑子;             V(s);             goto L1;         end;          process B         begin             L2:P(s);             拣白子;             V(s);             goto L2;         end;     coend; end;
 
  判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。确定信号量的值是一个关键点,它代表了可用资源实体数。如下实例:
 
 
例2:      某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。每个购票者可看成一个进程。
 
    分析:第一步:确定进程间的关系。售票厅是各进程共享的公有资源,当售票厅中多于20名购票者时,厅外的购票者需要在外面等待。所以进程间是互斥的关系。第二步:确定信号量及其值。只有一个公有资源:售票厅,所以设置一个信号量s。售票厅最多容纳20个进程,即可用资源实体数为20,s的初值就设为20。
 
    实现:
 
begin      s:semaphore;     s:=20;     cobegin         process PI(I=1,2,……)         begin P(s);             进入售票厅;             购票;             退出;             V(s);         end;     coend;
end; 
 
    当购票者进入售票厅前要执行P(s)操作,执行后若s大于或等于零,说明售票厅的人数还未满可进入。执行后若s小于零,则说明售票厅的人数已满不能进入。这个实现中同时最多允许20个进程进入售票厅购票,其余进程只能等待。
 
用PV原语实现进程的同步
  与进程互斥不同,进程同步时的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关,所以称该信号量为私有信号量。利用PV原语实现进程同步的方法是:首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。下面我们将例1增添一个条件,使其成为进程间是同步的。
例3:      在例1的基础之上再添加一个功能:   (3)当一个进程拣了一个棋子(黑子或白子)以后,必让另一个进程拣一个棋子(黑子或白子)。
 
    分析:     第一步:确定进程间的关系。由功能(1)(2)(3)可知,进程间的关系为同步关系。第二步:确定信号量及其值。进程A和B共享箱子这个公有资源,但规定两个进程必须轮流去取不同色的棋子,因而相互间要互通消息。对于进程A可设置一个私有信号量s1,该私有信号量用于判断进程A是否能去拣黑子,初值为1。对于进程B同样设置一个私有信号量s2,该私有信号量用于判断进程B是否能去拣白子,初值为0。当然你也可以设置s1初值为0,s2初值为1。
 
    实现:
 
begin     s1,s2:semaphore;     s1:=1;s2:=0;     cobegin         process A             begin             L1: P(s1);             拣黑子;             V(s2);             goto L1;         end;             process B         begin             L2:P(s2);             拣白子;             V(s1);             goto L2;         end;     coend; end;
 
  另外一个问题就是P原语是不是一定在V原语的前面?回答是否定的。下面看一个例子:
例4:     设在公共汽车上,司机和售票员的活动分别是:司机:启动车辆,正常行车,到站停车。售票员:上乘客,关车门,售票,开车门,下乘客。用PV操作对其控制。
 
    分析:     第一步:确定进程间的关系。司机到站停车后,售票员方可工作。同样,售票员关车门后,司机才能工作。所以司机与售票员之间是一种同步关系。     第二步:确定信号量及其值。由于司机与售票员之间要互通消息,司机进程设置一个私有信号量run,用于判断司机能否进行工作,初值为0。售票员进程设置一个私有信号量stop,用于判断是否停车,售票员是否能够开车门,初值为0。
    实现:
begin
    stop ,run:semaphore     stop:=0;run:=0;     cobegin         driver:
        begin             L1: P(run);             启动车辆;             正常行车;             到站停车;             V(stop);             goto L1;         end;         conductor:
        begin             L2:上乘客;             关车门;             V(run);             售票;             P(stop);             开车门;             下乘客;             goto L2;         end;     coend; end;
 
  用PV操作还可以实现进程同步与互斥的混合问题,典型的如:多个生产者和多个消费者共享容量为n的缓存区。这个例子在很多书中都有介绍,在这里就不说了。
 


-The End-

原文: http://blog.csdn.net/yeyuangen/article/details/7361976

2014-10-13 10:53:28 Augus3344 阅读数 7164
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7534 人正在学习 去看看 朱有鹏

    尽管自己看了书,老师讲了课,以为对PV操作理解了,但是遇到题的时候还是不会思考。下面这道题,花了很长时间才弄明白,现在把思路写出来,大家共同探讨下。


大家都来思考:

    信号量S1S2S3S4分别代表什么含义?

 

误区:

    把S1S2S3S4当成是P1P2P3P4的信号量

 

关键点:

    1.P1执行不需要信号量的制约

    2.信号量初始值为0

    3.结合前驱图

    4.从简单入手(P4

 

我的思路:

    根据图中P2执行完后V(S3)P3执行完后V(S4),结合前驱图,P2P3之前,P3P4之前,可以容易得出,d处应为P(S4)

    那么c呢,从前驱图可以看到,P1P2均有一个指向P3的箭头,所以c处不仅含有P(S3),还有另一个P操作,是P1执行后V的;

    而P2的前驱是P1,故P1执行完后需要V一个供P2执行P操作。

 

答案:

    aV(S1)V(S2)    bP(S1)    cP(S2)P(S3)    dP(S4)

 

感受:

    思路不清晰,思维局限,打不开,总觉得欠缺一点东西。审题的时候一定仔细,看懂每一句的含义。如果不会做,可以根据现有知识去推测,考场上不必弄明白每一道题的原理。

2020-01-19 19:33:42 qq_28816873 阅读数 1615
  • S5PV210的时钟系统-1.6.ARM裸机第六部分

    本期课程主要讲述S5PV210的时钟系统,通过8节课的讲解和实战,希望大家能够彻底掌握S5PV210(以及类似复杂度的SoC)的时钟体系结构,理解MUX开关、DIV分频器、PLL倍频锁相工作电路等在时钟设置中的作用。

    7534 人正在学习 去看看 朱有鹏

S5PV210的启动详解2

上一篇启动详解1我们介绍到了S5PV210_IROM_APPLICATION NOTE_REV 0.3
的2.1节 启动顺序(Operating Sequence )
下面我们来详细的看一下iROM执行BL0时具体做了哪些初始化

2.2 iROM(BL0) boot-up sequence (Refer 2.3 V210 boot-up diagram)

  1. Disable the Watch-Dog Timer
  2. Initialize the instruction cache
  3. Initialize the stack region (see “memory map” on chap 2.5)
  4. Initialize the heap region. (see “memory map” on chap 2.5)
  5. Initialize the Block Device Copy Function. (see “Device Copy Function” on chap 2.7)
  6. Initialize the PLL and Set system clock. (see “clock configuration” on chap 2.11)
  7. Copy the BL1 to the internal SRAM region (see “Device Copy Function” on chap 2.7)
  8. Verify the checksum of BL1.
    If checksum fails, iROM will try the second boot up. (SD/MMC channel 2)
  9. Check if it is secure-boot mode or not.
    If the security key value is written in S5PV210, It’s secure-boot mode.
    If it is secure-boot mode, verify the integrity of BL1.
  10. Jump to the start address of BL1

翻译如下:

  1. 关闭看门狗定时器

  2. 初始化 指令高速缓冲存储器

  3. 初始化栈区

  4. 初始化堆区

  5. 初始化块设备复制函数

  6. 初始化锁相环并设置系统时钟

  7. 将BL1复制到内部SRAM(iRAM)区域

  8. 验证BL1的校验和
    如果校验和失败,iROM将尝试第二次启动

  9. 检查是否是安全启动模式
    如果安全密钥写入了S5PV210,那么它是安全启动模式
    如果是安全启动模式,则验证BL1的完整性

  10. 跳转到BL1的起始地址

2.3启动引导图

V210 boot-up diagram

在这里插入图片描述

启动介质的启动顺序

下面这张图描述了启动介质的启动顺序,当USB启动作为最后一次的启动介质启动失败时,Bootstop ,就彻底失败了
在这里插入图片描述

IROM启动模式的特性

在这里插入图片描述

以下几点是值得注意的:

  1. 当系统处于唤醒状态的时候只可以直接唤醒的,无需重复启动
  2. 原理图来看,这里的OMpin设置的SD卡或eMMC启动是从SD0启动的
  3. S5PV210是通过OMpin 来选择第一次(1st) 启动介质的,也就是开发板上的SD0,当第一次启动失败时,2nd启动无法选择启动介质,只能是从SD/MMC的第二通道启动,因此,我们如果想让S5PV210芯片从SD2启动,我们务必将 emmc 中已存在的 bootloader 破坏掉!
    在这里插入图片描述在这里插入图片描述

下面来看一下九鼎创展的开发板使用手册,对照Application Note来看一下这个开发板是如何设置启动介质的

在这里插入图片描述
OM[5:0]引脚应直接与VDDSYS或GND连接,它的目的是在进入休眠模式时将泄漏电流降到最低。但如果你必须有一个选择,你应该在它们间增加一个100KΩ以上的上拉或下拉电阻在这里插入图片描述

注:以上内容参考了 朱有鹏老师的PPT和文档

没有更多推荐了,返回首页