广告

原创 OSSemPend和OSSemPost

2010-7-6 10:38 1766 1 1 分类: MCU/ 嵌入式
typedef struct {
    INT8U   OSEventType;                   /* Type of event control block (see OS_EVENT_TYPE_???)      */
    INT8U   OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
    INT16U  OSEventCnt;                    /* Semaphore Count (not used if other EVENT type)           */
    void   *OSEventPtr;                    /* Pointer to message or queue structure                    */
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
} OS_EVENT;

主要看的是OSEventCnt,这个是资源数目,创建的时候使用OSSemCreate (INT16U cnt)把cnt传递给它。
当需要使用这个资源的时候,需要先调用OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
如果资源数目大于0,申请资源成功,资源数目减1,然后返回
如果资源数目等于0,则要等待,timeout定义了超时时间,如果等待的周期数小于timeout,则返回继续执行,否则err = OS_TIMEOUT
在检测到资源数目等于0进行等待的时候会进行任务切换OS_Sched();

还有一个函数是OSSemPost (OS_EVENT *pevent),这个函数是释放资源,执行后资源数目会加1


在使用某个信号量之前需要创建它,创建时候唯一的参数就是资源的数目,如果是一块缓冲区,这个数目应该是缓冲区的大小,如果是比如串口资源,则资源数目应该待于1

所以在调用OSSemPend()时,一定要检测它的返回类型,即err,如果不检测它的话,没有什么意义,这个有几种类型,分别是
OS_ERR_PEND_ISR      
OS_ERR_PEVENT_NULL   没有创建该信号量
OS_ERR_EVENT_TYPE    OSEventType类型不匹配
OS_NO_ERR            成功
OS_TIMEOUT           超时

如果你直接使用的话,应该会返回第二种。
广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
aas7502987 2012-04-07 11:48
51/STC最小系统板资料(更新中)
图片欣赏    淘宝网址:http://item.taobao.com/auction/item_detail.htm?item_num_id=9073446988  二   程...
aas7502987 2011-10-13 22:59
YL-3 资料
YL-3数码管模块资料:YL-3 串行数码管资料.zip...
aas7502987 2011-09-24 09:10
USB转TTL小板驱动
xp系统驱动:XP系统支持STC下载的PL-2303HX新版驱动.rar WIN7系统驱动:WIN7系统支持STC下载的PL2303HX驱动.rar...
aas7502987 2011-05-24 22:48
STM32F103RBT6最小系统原理图 PCB
STM32F103RBT6最小系统板原理图 PCB 附件:做好的成品板:淘宝链接网址:http://item.taobao.com/item.htm?id=8864376956...
aas7502987 2011-05-08 12:53
YL-16 STM32F103最小系统板资料(更新中)
二 数据手册:  USB协议中文版:attachment download  中文数据手册:attachment downloadSTM32选型手册:attachment downloadSTM32勘...
aas7502987 2011-03-20 13:27
DS18B20温度测量模块
DS18B20 数码管温度显示程序:...
我要评论
0
1
广告