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);
}