aureoleday 发表于 2011-12-15 09:17:07

求助!如何将执行线程中的告警信息传递到另一个线程中再执行rt_kprintf()

问题是这样的,在tcp server的发送和接收线程速度较高,如果在线程内部直接调用rt_kprintf()会导致丢包,幁校验失败甚至系统运行不稳定等问题。
我的想法是将这些信息放在一个循环缓冲中,用另外一个低优先级的线程来取,但是不知道如果有多个参数需要打印的话,参数该怎么传递?

倒是也有笨办法,建立一个比较复杂的结构体可以解决,但是我还是想看看大家有更好的办法么?

mail2li 发表于 2011-12-15 10:22:45

你这个就是写syslog了
简单点就是定义一个结构体,把格式化好的文本封装起来, 比如文本长度,log等级之类
用消息队列发给log任务
由log任务处理打印或是写盘

tiancaigao7 发表于 2011-12-15 11:06:56

嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。

yuhui 发表于 2011-12-15 11:46:18

串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。

aureoleday 发表于 2011-12-15 14:02:51

回复【3楼】yuhui
-----------------------------------------------------------------------

世间安得双全法,不负如来不负卿?

mail2li 发表于 2011-12-15 15:00:53

回复【2楼】tiancaigao7天才杨威利
嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。
-----------------------------------------------------------------------
邮箱会丢东西的 特别是很多任务并发请求的时候
 
【3楼】 yuhui
        串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。
----------------------------------------------------------------------
别当调试口是看电子书,如果你打算把每个TCP包dump出来 那就得用别的方法了

【4楼】 aureoleday
世间安得双全法,不负如来不负卿?
-----------------------------------------------------------------------
果断双休 欢喜佛
 

tiancaigao7 发表于 2011-12-15 18:54:29

回复【5楼】mail2li
回复【2楼】tiancaigao7天才杨威利
嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。
-----------------------------------------------------------------------
邮箱会丢东西的 特别是很多任务并发请求的时候
 
【3楼】 yuhui
串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。
----------------------------------------------------------------------
别当调试口是看电子书,如果你打算把每个tcp包dump出来 那就得用别的方法了
【4楼】 aureoleday
世间安得双全......
-----------------------------------------------------------------------

我感觉邮箱和消息队列类似,都有容量限制,因此如果消费速度小于产出速度的话,都会丢失消息。而且我看资料感觉消息队列和邮箱的区别在于,邮箱传递的是消息指针,或者是一个规定4个字节的信息,而消息队列传递的是消息本身。也就是一个是传址,一个是传值。不知道我理解的对不对?

mail2li 发表于 2011-12-16 11:12:49

回复【6楼】tiancaigao7天才杨威利
-----------------------------------------------------------------------

其实 就是队列可以自己把数据拷贝走 免得留在别地儿的数据莫名其妙的叫人给踩坏了

ffxz 发表于 2011-12-16 12:08:06

看到这个问题就想到原来社招时常问的问题:如何设计一个log系统。。。然后很多人止步于此

mail2li 发表于 2011-12-16 12:45:33

回复【8楼】ffxz
-----------------------------------------------------------------------

能说说要点么?

aureoleday 发表于 2011-12-18 00:13:31

用一个懒办法解决了,用sprintf()传到一个循环队列,然后再背景进程中取出来write_dev(),呵呵。
页: [1]
查看完整版本: 求助!如何将执行线程中的告警信息传递到另一个线程中再执行rt_kprintf()