zoukankan      html  css  js  c++  java
  • uc/os 信号量管理

    //通过OSSemCreate()建立信号量
    OS_EVENT *OSSemCreate(INT16U cnt)
    {
    #if OS_CRITICAL_METHOD==3
    OS_CPU_SR cpu_sr;
    #endif
    OS_EVENT *pevent;

    if(OSIntNesting>0) //判断是否被中断服务子程序调用
    {
    return ((OS_EVENT*)0);
    }
    OS_ENTER_CRITICAL();
    pevent=OSEventFreeList;//试图从空闲事件控制块联表中得到一个事件控制块ECB
    if(OSEventFreeList!=(OS_EVENT *)0)
    {
    OSEventFreeList=(OS_EVENT *)OSEventFreeList->OSEventPtr;
    //对空闲事件控制联表的指针进行调整,使它指向下一个空闲的事件控制块
    }
    OS_EXIT_CRITICAL();

    if(pevent!=(OS_EVENT *)0)
    {
    pevent->OSEventType=OS_EVENT_TYPE_SEM;//如果由任务控制块可用,就将该任务的事件类型设置OS_EVENT_TYPE_SEM
    pevent->OSEventCnt=cnt;//将信号的初始值存入事件控制块
    pevent->OSEventPtr=(void*)0;//将OSEventPtr初始化NULL
    OS_EventWaitListInit(pevent);//对事件控制块的等待任务列表进行初始化
    }
    return (pevent); //返回给调用函数一个指向事件控制块的ECB的指针
    }


    //通过OSSemPost()等待一个信号量
    void OSSemPend(OS_EVENT *prevent,INT16U timeout,INT8U *err)
    {
    #if OS_CRITICAL_METHOD==3
    OS_CPU_SR cpu_sr;
    #endif

    if(OSIntNesting>0) //检查OSSemPend是否由中断服务子程序调用_
    {
    *err=OS_ERR_PEND_ISR;
    return;
    }
    #if OS_ARG_CHK_EN>0
    if(pevent==(OS_EVENT *)0)
    {
    *err=OS_ERR_EVENT_TYPE;
    return;
    }
    if(pevent->OSEventType!=OS_EVENT_TYPE_SEM)
    {//检查指针pevent所指的任务控制块是否是由OSSemCreate();建立
    *err=OS_ERR_EVENT_TYPE;
    return;
    }
    #endif
    OS_ENTER_CRITICAL();
    if(pevent->OSEventCnt>0) //如果信号量当前可用,即信号量的计数值大于0,将信号量的计数值减一,然后函数返回“无措”的错误代码
    {
    pevent->OSEventCnt--;
    OS_EXIT_CRITICAL();
    *err=OS_NO_ERR;
    return;
    }
    OSTCBCur->OSTCBStat|=OS_STAT_SEM;//将任务控制块的状态标志OSTCBStat置1,把任务置于睡觉的状态
    OSTCBCur->OSTCBDly=timeout; //将等待时间置入任务控制块中
    OS_EventTaskWait(pevent); //真正将任务置入睡民状态的操作在OSEventTaskWait()函数中执行

    OS_EXIT_CRITICAL();
    OS_Sched(); //当前任务不是就绪态,所以任务调度函数将下一个
    OS_ENTER_CRITICAL();
    if(OSTCBCur->OSTCBStat&OS_STAT_SEM)
    {
    OS_EventTO(pevent);
    OS_EXIT_CRITICAL();
    *err=OS_TIMEOUT;
    return;
    }
    OSTCBCur->OSTCBEventPtr=(OS_EVENT *)0;
    OS_EXIT_CRITICAL();
    *err=OS_NO_ERR;
    }
    Live together,or Die alone!
  • 相关阅读:
    Confluence 6 从一个备份中获得文件附件
    Confluence 6 从其他备份中恢复数据
    Confluence 6 从生产环境中恢复一个测试实例
    从 Confluence 5.3 及其早期版本中恢复空间
    Confluence 6 恢复一个空间的问题解决
    Confluence 6 从一个 XML 备份中导入一个空间
    Confluence 6 恢复一个空间
    Confluence 6 恢复一个站点有关使用站点导出为备份的说明
    网易蜂巢(云计算基础服务)MongoDB服务重磅来袭
    pdfjs viewer 开发小结
  • 原文地址:https://www.cnblogs.com/hzhida/p/2395681.html
Copyright © 2011-2022 走看看