vxWorks中的logMsg机制的实现

vxWorks中打印时可以使用log_msg来进行打印,当然了这是系统启动后才可以使用的。

这其实就是定义了一个全局的信息队列,当调用log_msg时,信息就写入到这个队列中,然后相关的信息就会被打印出来。

 

先看一下这个队列被实现的函数调用:

usrRoot-->logInit

 

STATUS logInit

    (

    int fd,             /*信息被输出到那里,一般h就死指向console设备*/

    int maxMsgs         /*队列最多可以设置的信息数量*/

    )

    {

/*创建这个存储信息的队列*/

    logMsgQId = msgQCreate (maxMsgs, sizeof (LOG_MSG), MSG_Q_FIFO);

/*创建一个任务logTask,专门处理这些任务*/

    logTaskId = taskSpawn ("tLogTask", logTaskPriority,

               logTaskOptions, logTaskStackSize,

               (FUNCPTR)logTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

/*初始化一个信号量*/

    semMInit (&logFdSem, mutexOptionsLogLib);

/*设置最后信息输出时,输出到那里,这里的fd时文件描述符*/

    logFdSet (fd);

/*向 logMsgQId发送信息的函数*/

    _func_logMsg = (FUNCPTR) logMsg;

    return (OK);

    }

 

 

这下初始化就完成了,在看一下处理信息的任务,以及增加信息和处理信息的函数。

 

 

/*任务logTask*/

void logTask (void)

    {

    static int oldMsgsLost;

    int newMsgsLost;    /* used in case logMsgsLost is changed during use */

    LOG_MSG msg;

    char *  checkName;

    char    tname [VX_TASK_NAME_LENGTH + 1];

/*这里是死循环,z一直等待处理信息*/

    FOREVER

    {

    tname [VX_TASK_NAME_LENGTH] = EOS;

/*读取队列中的信息*/

    if (msgQReceive (logMsgQId, (char *) &msg, sizeof (msg),

             WAIT_FOREVER) != sizeof (msg))

        lprintf ("logTask: error reading log messages.\n", 0, 0, 0, 0, 0,0);

    else

        {

/*如果id==-1,则是中断*/

        if (msg.id == -1)

        {

        lprintf ("interrupt: ", 0, 0, 0, 0, 0, 0);

        }

        else

        {

/*任务的id不正确或者任务名字为空则任务dead*/

        if ((taskIdVerify (msg.id) != OK)||

            ((checkName = taskName (msg.id)) == NULL))

            {

            lprintf ("%#x (): task dead", msg.id, 0, 0, 0, 0, 0);

            }

/*否则就把任务的名字放入到tname数组中*/

        else

            {

            strncpy (tname, checkName, VX_TASK_NAME_LENGTH);

            lprintf ("%#x (%s): ", msg.id, (int)tname, 0, 0, 0, 0);

            }

        }

/*信息打印的格式为空,则打印格式为空*/

        if (msg.fmt == NULL)

        lprintf ("<null \"fmt\" parameter>\n", 0, 0, 0, 0, 0, 0);

/*使用lprintf函数正常打印信息*/

        else

        {

        lprintf (msg.fmt, msg.arg[0], msg.arg[1], msg.arg[2],

                  msg.arg[3], msg.arg[4], msg.arg[5]);

        }

        }

    }

    }

 

 

/*向队列发送信息的函数*/

int logMsg

    (

    char *fmt,  /* format string for print */

    int arg1,   /* first of six required args for fmt */

    int arg2,

    int arg3,

    int arg4,

    int arg5,

    int arg6

    )

    {

    int timeout;

    LOG_MSG msg;

    if (_WRS_INT_CONTEXT ())

    {

    msg.id = -1;

    timeout = NO_WAIT;

    }

    else

    {

    msg.id = taskIdSelf ();

    timeout = WAIT_FOREVER;

    }

    msg.fmt    = fmt;

    msg.arg[0] = arg1;

    msg.arg[1] = arg2;

    msg.arg[2] = arg3;

    msg.arg[3] = arg4;

    msg.arg[4] = arg5;

    msg.arg[5] = arg6;

/*向队列发送信息*/

    if (msgQSend (logMsgQId, (char *) &msg, sizeof (msg), timeout,

          MSG_PRI_NORMAL) != OK)

    {

        vxAtomicInc (&logMsgsLost); /* atomic increment */

    return (EOF);

    }

    return (sizeof (msg));

    }

 

 

LOCAL void lprintf

    (

    char *fmt,    /* format string for print */

    int arg1,    /* optional arguments to fmt */

    int arg2,

    int arg3,

    int arg4,

    int arg5,

    int arg6

    )

    {

    FAST int ix;

    semTake (&logFdSem, WAIT_FOREVER);

/*显示信息*/

    for (ix = 0; ix < numLogFds; ix++)

    fdprintf (logFd [ix], fmt, arg1, arg2, arg3, arg4, arg5, arg6);

    semGive (&logFdSem);

    }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值