完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在调用rt_workqueue_dowork函数时,经常出错,查看文档是“该工作项正在执行” 如果工作队列有工作正在执行,就不允许再次追加工作吗? 我打算使用工作队列释放内存垃圾的,经常添加不了队列,导致内存泄漏严重。 |
|
相关推荐
4个回答
|
|
确实是这样的,内存足够情况下建议不要用系统默认工作队列,有些组件用到了系统默认工作队列
自己创建一个单独的工作队列,并不要设置耗时操作。 或者通过事件队列自己实现一个啦,好奇释放内存为什么要交给另外一个线程来,为了实时性? 这样是很有风险的。 |
|
|
|
对,模拟GC,统一回收垃圾。
因为以太网包的很多对象是需要嵌套释放的,需要一层层解析下去进行深度释放,个人感觉会比较耗时,于是想在以太网帧的解析、路由、响应的线程之外,在闲时进行深度垃圾清理。 我在编写工业实时以太网项目的协议栈,响应速度要求很高。 在使用工作队列的时候,发现当正在闲时清理的时候,这时候有个高级线程打断进来,这个高级线程处理数据后,再次追加清理数据的工作,就会添加不了。 |
|
|
|
哇塞太高级了,你们要是严格按照OSI七层模型来的话,我感觉层与层之间的数据拷贝就会超级耗时,lwip就没有做严格的分层,层与层之间数据共享。
这个模拟gc,你要怎么保证处理完一包后通知gc线程处理,然后迅速到第二包时使用的指针是已经被释放的呀。可能处理线程比gc线程优先级高,中途打断,甚至gc线程根本没有运行。 个人感觉这样模拟gc挺不现实的 |
|
|
|
我放弃工作队列用邮箱实现了。
哪有什么数据拷贝,都是用结构体指针去传导。 #pragma pack(1) typedef struct { uint8_t destination[6]; uint8_t source[6]; uint16_t type; }EthFrameHeader; typedef struct { uint8_t headerLength:4; // *4 uint8_t version:4; uint8_t dsField; uint16_t totalLength; uint16_t id; uint16_t flag; uint8_t timeToLive; uint8_t protocol; uint16_t checksum; uint8_t srcIP[4]; uint8_t desIP[4]; }IPV4Header; #pragma pack() (EthFrameHeader*)buffer; 还有你说的什么gc不现实,为啥,开个低优先级线程,邮箱传过去就行。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
971 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
3205 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1434 浏览 0 评论
2085 浏览 0 评论
1604 浏览 0 评论
75224 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 09:31 , Processed in 0.766505 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号