vxWorks中的logMsg机制的实现
来源:互联网 发布:linux下find命令详解 编辑:程序博客网 时间:2024/05/24 15:42
vxWorks中打印时可以使用log_msg来进行打印,当然了这是系统启动后才可以使用的。
这其实就是定义了一个全局的信息队列,当调用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); }
阅读全文
0 0
- vxWorks中的logMsg机制的实现
- VxWorks中logMsg与printf的区别
- VxWorks中logMsg与printf的区别
- Vxworks中printf()和logMsg()的区别
- VxWorks中logMsg与printf的区别
- 从printk和logMsg看linux和vxworks的设计理念差异
- VxWorks共享看门狗定时机制的设计与实现
- VxWorks的信号量机制分析
- MMU在VxWorks中的实现
- MMU在VxWorks中的实现
- 实现基于VxWorks的消息队列通信机制的C/S通信
- vxworks有关ifaddr的实现
- VxWorks的多任务通信机制
- PCI总线在VxWorks中的实现
- PCI总线在VxWorks中的实现
- VxWorks中的任务及调度(五):VxWorks任务调度机制
- vxWorks中的多核间的通信
- vxWorks中的中断的两条线路
- react 学习雷区
- 证书签名打包
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
- 远程拉取war文件,并启动tomcat,linux命令
- 各种最短路模板
- vxWorks中的logMsg机制的实现
- JS(十六)输入框校验动态绑定
- 第1章:阿里云机器学习实践之路 / 第5节:深度学习--使用TensorFlow实现图像分类
- iBaits中SqlMapClientTemplate的使用
- 开发漫谈:RedMonk编程语言流行榜出炉
- 0810 Java方法重写、方法重载、抽象方法
- session钝化与活化
- 开源网络库比较 ACE、ASIO、libevent
- SpringMVC4.0+maven 整合ueditor1.4