代码改变世界

PSOS通信,同步,互斥

2010-11-19 16:16  Jeff  阅读(553)  评论(0编辑  收藏  举报
        PSOS的应用程序通常分割为一组任务和中断服务程序(ISR)。为实现任务到任务以及ISR到任务的通信、同步和互斥, pSOS提供三种机制:消息队列、事件和信号量。 消息队列          消息队列由q_create调用创建,输入参数有用户指定的名字和几个特征, 包括任务等待队的排队规则是FIFO还是优先级、消息队列长度是否受限以及消息 缓冲区是否私有等。消息队列具有两类用户,即发送者和接收者,它们可以是任务或ISR。          发送消息的调用有三种:q_send,q_urgent和q_broadcast。当消息到达队列时没有等待任务,则拷贝到消息缓冲区,然后将其插入消息队列。q_send将消息插入消息队列之尾,q_urgent则将其插入队列之首。q_broadcast将消息广播给所有正在等候的任务,这是用单个系统调用唤醒多个任务的有效 手段。          从消息队列中接收消息的唯一调用是q_receive,若当时没有消息,则任务可直接等待、超时等待或无条件返回。如任务直接等待,则按FIFO或优先级顺序排入等待队列。          消息是固定长度的含有4个长字的结构。消息的内容可以 装载数据、数据指针、数据尺寸、发送任务的Tid,响应队列的Qid(消息队标识)或上述诸项的某些组合,它也可纯粹用来同步而不带任何消息。 当消息到达队列而无等待任务,消息需拷贝到消息缓冲区并排入消息队。消息缓冲区为五个长字,增加的那个长字由pSOS+用作链指针域。 事件          pSOS提供一组由事件同步的机制,每个任务均有32个事件标志,构成一个按位操作的32位字。其中的高16位保留给系统使用,低16位事件标志完全由用户定义。         任务之间和任务与ISR之间由事件来同步的系统调用有:                 ev_receive 获取或等候事件                 ev_send 将事件发送到指定任务         ev_send用来把一个或几个事件发送给另一任务,而任务可通过ev_receive去获取一个或几个属于自已的事件,而且可选择等待、带时超的等待或不等待。事件的一个重要特点是任务可以等待一个事件、几个事件中的一个或者几个事件中的全部。         任务和ISR均可将一个或几个事件送往另一任务,若目标任务并未等待事件或 它所等事件与送来的事件不符,则ev_send将这些事件位打开,即使它们挂起;若目标任务正在等待送来事件中的一些或全部,则等待任务解锁并进入就绪,而其余不匹配的事件仍被挂起。 事件与消息的不同之处有:             (1) 事件可用于任务同步,但不能直接携带信息;             (2) 事件是点对点的,即必须指明具体接收任务,而消息是送往消息队列的,不需要了解具体接收任务,因此可以多点对多点。             (3) ev_receive一次可等待多个事件,而q_receive一次只能从消息队中接收一条消息。             (4) 消息可自动缓冲和排队,而事件既不计数也不排队。若一个事件已经挂起而第二个同类事件送往同一任务,则第二事件将丢失 信号量          pSOS提供一组熟悉的信号量操作,有关的系统调用有:                    sm_create 创建信号量                    sm_ident 获取信号量ID                    sm_delete 删除信号量          sm_p 获取或等待信号量          sm_v 返回信号量          信号量由sm_create动态创建,其输入参数有用户指定的名字、初始计数和几个特征,包括等待任务的排队规则是FIFO还是优先级;返回信号量标识(SMid)。初始计数应该反映该资源可占用的有效标签数。          PSOS提供两个传统的P和V操作。sm_p请求使用信号量,若信号量计数非零,则其值减1,同时操作成功;否则,调用任务可选择等待、带超时等待或直接返 回,如果选择等待,则按FIFO或优先级顺序排队。          sm_v返回信号量,若无任务等候,则信号量计数增一。若有任务等待,则等待队列的第一个任务脱离等待队列并变为就绪。