求助!如何将执行线程中的告警信息传递到另一个线程中再执行rt_kprintf()
问题是这样的,在tcp server的发送和接收线程速度较高,如果在线程内部直接调用rt_kprintf()会导致丢包,幁校验失败甚至系统运行不稳定等问题。我的想法是将这些信息放在一个循环缓冲中,用另外一个低优先级的线程来取,但是不知道如果有多个参数需要打印的话,参数该怎么传递?
倒是也有笨办法,建立一个比较复杂的结构体可以解决,但是我还是想看看大家有更好的办法么? 你这个就是写syslog了
简单点就是定义一个结构体,把格式化好的文本封装起来, 比如文本长度,log等级之类
用消息队列发给log任务
由log任务处理打印或是写盘 嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。 串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。 回复【3楼】yuhui
-----------------------------------------------------------------------
世间安得双全法,不负如来不负卿? 回复【2楼】tiancaigao7天才杨威利
嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。
-----------------------------------------------------------------------
邮箱会丢东西的 特别是很多任务并发请求的时候
【3楼】 yuhui
串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。
----------------------------------------------------------------------
别当调试口是看电子书,如果你打算把每个TCP包dump出来 那就得用别的方法了
【4楼】 aureoleday
世间安得双全法,不负如来不负卿?
-----------------------------------------------------------------------
果断双休 欢喜佛
回复【5楼】mail2li
回复【2楼】tiancaigao7天才杨威利
嗯,或者利用消息队列或者邮箱,将需要发送的内容或者他们的地址发送过去,另外的线程收到信号量之后发送出去也可以。
-----------------------------------------------------------------------
邮箱会丢东西的 特别是很多任务并发请求的时候
【3楼】 yuhui
串口速度跟不上的话,如果你的调试信息输出很频繁,大缓冲也有溢出的时候,要么丢网络包,要么丢调试信息。
自古忠孝不能两全啊。。。
----------------------------------------------------------------------
别当调试口是看电子书,如果你打算把每个tcp包dump出来 那就得用别的方法了
【4楼】 aureoleday
世间安得双全......
-----------------------------------------------------------------------
我感觉邮箱和消息队列类似,都有容量限制,因此如果消费速度小于产出速度的话,都会丢失消息。而且我看资料感觉消息队列和邮箱的区别在于,邮箱传递的是消息指针,或者是一个规定4个字节的信息,而消息队列传递的是消息本身。也就是一个是传址,一个是传值。不知道我理解的对不对? 回复【6楼】tiancaigao7天才杨威利
-----------------------------------------------------------------------
其实 就是队列可以自己把数据拷贝走 免得留在别地儿的数据莫名其妙的叫人给踩坏了 看到这个问题就想到原来社招时常问的问题:如何设计一个log系统。。。然后很多人止步于此 回复【8楼】ffxz
-----------------------------------------------------------------------
能说说要点么? 用一个懒办法解决了,用sprintf()传到一个循环队列,然后再背景进程中取出来write_dev(),呵呵。
页:
[1]