⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c04f_event.c

📁 Tornado的源代码资源包
💻 C
字号:
/* C04f_event.c P115 */

/* 头文件 */ 
#include "vxWorks.h" 
#include "semLib.h" 
#include "eventLib.h"
 
/* 宏定义 */ 
#define STACK_SIZE  20000 /* 分配给任务的堆栈大小 */
#define DELAY_TICKS 50    /* 信号量释放事件的间隔时间 */

/* 全局变量 */
int     tidEventReceiver;  /* 事件接收任务的ID*/
int     tidSemHandler;     /* 信号量处理任务的ID*/
SEM_ID  semIdEventSender;  /* 信号量资源ID,用来发送事件*/

/* 函数声明 */
STATUS  eventReceiver(void);
void    semHandler(void) ;
void    progStop(void);

/******************************************************************
*
* progStart - 启动实例程序
*
* 负责创建信号量与任务
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
    /* 创建一个初始状态为空的二进制信号量资源,
     * 用于反复释放事件
     */ 
    semIdEventSender = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
    if (semIdEventSender == NULL) 
    {
        return (ERROR); 
    }

    /* 创建事件接收任务 */
    tidEventReceiver = taskSpawn("tEventReceiver", 200, 0, 
                                 STACK_SIZE,
                                 (FUNCPTR)eventReceiver,
                                 0,0,0,0,0,0,0,0,0,0);
    /* 创建信号量处理任务 */
    tidSemHandler = taskSpawn("tSemHandler", 220, 0, 
                              STACK_SIZE,
                              (FUNCPTR)semHandler,
                              0,0,0,0,0,0,0,0,0,0);
    return (OK);
}

/******************************************************************
*
* eventReceiver - 接收事件
*
* 完成在信号量上的注册工作,
* 并完成接收事件的工作,包括来自信号量的事件与来自progStop()的事件
*
* RETURNS: OK, ERROR
*/
STATUS eventReceiver(void) 
{ 
    int     result;         /* 函数返回结果 */
    UINT32  eventsReceived; /* 用来保存接收到的事件 */
        
    /* 向信号量semIdEventSender进行注册 */
    result = semEvStart(semIdEventSender, VXEV01, 
                        EVENTS_OPTIONS_NONE);
    if (result == OK)
    {
        printf("\ntEventReceiver: semEvStart() succ!\n");
    }
    else
    {
        printf("\ntEventReceiver: semEvStart() failed!\n");
        return ERROR;
    }

    /* 接收、处理事件 */
    FOREVER
    {
        result = eventReceive(VXEV01 | VXEV02, EVENTS_WAIT_ANY, 
                              WAIT_FOREVER, 
                              &eventsReceived);
        if (result == OK) 
        {
            printf("\ntEventReceiver: received events(VXEV%02d)!\n",
                   eventsReceived);

            if ((eventsReceived & VXEV01) != 0)
            {
                /* 收到VXEV01,信号量变为可用 */
                printf("\ntEventReceiver: semphone free!\n");
            }

            if ((eventsReceived & VXEV02) != 0)
            {
                /* 收到VXEV02,停止实例程序 */

                /* 解除注册关系 */
                result = semEvStop(semIdEventSender);
                if (result == OK)
                {
                    printf("\ntEventReceiver: semEvStop succ!\n");
                }
                else
                {
                    printf("\ntEventReceiver: semEvStop fail!\n");
                    printf("\nterrno = %d\n", errnoGet());
                }

                /* 杀死tSemHandler */
                taskDelete(tidSemHandler);
                /* 释放信号量 */
                semDelete(semIdEventSender);
                /* 自杀 */
                taskDelete(tidEventReceiver);
            }
        }
    }
    
    return (OK);
}

/******************************************************************
*
* semHandler - 处理信号量
*
* 通过反复释放、获取信号量,使得信号量周期释放事件 
*
* RETURNS: N/A
*/
void semHandler(void) 
{ 
    FOREVER
    {
        /* 释放信号量,将信号量变为可用 */
        semGive(semIdEventSender);

        /* 获取信号量,将信号量变为不可用 */
        semTake(semIdEventSender, NO_WAIT);

        taskDelay(DELAY_TICKS);
    } 

    return;
} 

/******************************************************************
*
* progStop - 停止实例程序 
*
* 调用本函数来结束本实例程序. 
*
* RETURNS: N/A
*/
void progStop(void)
{
    /* 向tEventReceiver发事件VXEV02
     * 将结束实例的工作交给tEventReceiver处理
     */ 
    eventSend(tidEventReceiver, VXEV02); 
    
    printf("BYE!\n");

    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -