嵌入式实时操作系统uC/os-II(十七)-信号量集操作

  1. 创建信号量

任务可以通过调用OSFlagCreate()来创建一个信号量集。该函数的原型如下:

OS_FLAG_GRP          *OSFlagCreate(

                                               OS_FLAGS         flags,                  //信号的初始值

                                              INT8U                *err

                                     )

函数OSFlagCreate()的源码如下:

         OS_FLAG_GRP  *OSFlagCreate (OS_FLAGS flags, INT8U *err)

         {

             OS_FLAG_GRP *pgrp;

                   #if OS_CRITICAL_METHOD == 3    /* Allocate storage for CPU status register   */

                        OS_CPU_SR    cpu_sr = 0;

                   #endif

         if OS_ARG_CHK_EN > 0

         if (err == (INT8U *)0) {                               /* Validate 'err'  */

        return ((OS_FLAG_GRP *)0);

         }

      #endif

    if (OSIntNesting > 0) {       /* See if called from ISR ...          */

        *err = OS_ERR_CREATE_ISR;    /* ... can't CREATE from an ISR   */

        return ((OS_FLAG_GRP *)0);

    }

    OS_ENTER_CRITICAL();

    pgrp = OSFlagFreeList;      /* Get next free event flag                        */

    if (pgrp != (OS_FLAG_GRP *)0) {    /* See if we have event flag groups available      */

       /* Adjust free list                                */

        OSFlagFreeList       = (OS_FLAG_GRP *)OSFlagFreeList->OSFlagWaitList;

        pgrp->OSFlagType     = OS_EVENT_TYPE_FLAG;  /* Set to event flag group type                    */

        pgrp->OSFlagFlags    = flags;   /* Set to desired initial value   */

        pgrp->OSFlagWaitList = (void *)0;  /* Clear list of tasks waiting on flags   */

#if OS_FLAG_NAME_SIZE > 1

        pgrp->OSFlagName[0]  = '?';

        pgrp->OSFlagName[1]  = OS_ASCII_NUL;

#endif

        OS_EXIT_CRITICAL();

        *err                 = OS_NO_ERR;

    } else {

        OS_EXIT_CRITICAL();

        *err   = OS_FLAG_GRP_DEPLETED;

    }

    return (pgrp);          /* Return pointer to event flag group     */

}

从函数的源代码中可知,创建信号量集的函数主要做了两项工作:一是从空标志组链表中取下一个标志组,同时给成员OSFlagTypeOSFlagFlags赋初值;二是令指向等待任务链表的指针OSFlagWaitList为空指针

  1. 请求信号量

                   任务可以通过调用函数OSFlagPend()请求一个信号量集。函数的原型如下:

                   OS_FLAGS         OSFlagPend(

                                                        OS_FLAG_GRP          *pgrp,

                                                        OS_FLAG                    flag,                    //滤波器

                                                        INT8U                         wait_type,        //逻辑运算类型

                                                        INT16U                       timeout,

                                                        INT8U                         *err

                                                        )

                   函数参数flags是用来给等待任务链表节点成员OSFlagNodeFlags赋值的;参数 wait_typde应该是表7-1所列举的常数之一。

                   函数调用成功后,将返回标志组成员OSFlagFlags的值。

                   任务可以通过调用函数OSFlagAccept()函数无等待地请求一个信号量集。该函数的原型如下:

                   OS_FLAGS                  OSFlagAccept(

                                                        OS_FLAG_GRP          *pgrp,

                                                        OS_FLAGS                 flags,

                                                        INT8U                         wait_type,        //逻辑运算类型

                                                        INT8U                         *err

                                               )

  1. 向信号量集发送信号

          任务可以通过调用函数OSFlagPost()向信号量集发送信号量。函数的原型如下:

                   OS_FLAGS                  OSFlagPost(

                                                        OS_FLAG_GRP          *pgrp,

                                                        OS_FLAGS                  flag,

                                                        INT8U                         opt,

                                                        INT8U                         *err

                                                        )

         所谓任务向信号量集发送信号,就是对信号量集标志组中的信号量进行置1(置位)或置0(复位)的操作。至于对信号量集中的那些信号进行操作,由函数中的参数flags来指定;对指定的信号量置1还是置0,由函数中的参数opt来指定(opt = OS_FLAG_SET为置1操作;opt=OS_FLAG_CLR为置0操作)

  1. 查询信号量集的状态

                   调用函数OSFlagQuery()可以查询一个信号量集的状态。该函数的原型如下:

                   OS_FLAGS         OSFlagQuery(

                                                        OS_FLAG_GRP          *pgrp,

                                                        INT8U                         *err

                                               )

  1. 删除信号量集

                   调用函数OSFlagDel()可以删除一个信号量集。该函数的原型如下:

                   OS_FLAG_GRP          *OSFlagDel(

                                                                 OS_FLAG_GRP          *pgrp,

                                                                 INT8U                         opt,

                                                                 INTU8                         *err

                                                        )       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值