vxWorks中的logMsg机制的实现

来源:互联网 发布:linux下find命令详解 编辑:程序博客网 时间:2024/05/24 15:42
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);    }




原创粉丝点击