完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教各位,rt-thread软件定时器大家一般怎么用 ? 跟踪进去一般是 定时器里发送 消息时出错 |
|
相关推荐
8个回答
|
|
如果你这么用,实际处理任务的线程除了等待定时器消息队列没有其它消息,如果你现在是这样的,还不如用 rt_thread_mdelay 呢。
软定时器的回调函数里执行的操作尽量不要时间超过 1 个tick ,超过就可能引起定时器逐渐后移。我有篇文章专门讲这个的。里面也提到了解决办法。 最后说这个挂断的问题。即便消息队列容量小,引起的后果也仅仅是丢 timeout 频次。高度怀疑消息队列用法错了。 |
|
|
|
主任务里除了要接收这个定时器发来的定时时间到的消息外,还要接收处理其他的消息,所以用rt_thread_mdelay不太合适
手册中一再强调,定时器里不要有延时的操作,但像我这种应用(需要定时处理一些耗时的事情)应该怎么用定时器 ? 消息队列用错的问题,我们自己定义了一个固定的消息结构: typedef struct { UINT8 msgID ; UINT32 msgParam1; UINT32 msgParam2; }taskMsg , *ptaskMsg ; // 定时器里发送消息: static rt_err_t _send_mq_msg( rt_mq_t mq , UINT8 id, UINT32 p1, UINT32 p2) { taskMsg msg = {0x00}; //_ASSERT( !mq ); if( !mq ) return -1 ; msg.msgID = id ; msg.msgParam1 = p1 ; msg.msgParam2 = p2 ; return rt_mq_send( mq , (void *) &msg, sizeof(taskMsg) ); } 主任务申请消息队列: if( _mq ) rt_mq_delete( _mq ); _mq = rt_mq_create("mq", sizeof(taskMsg), 8, RT_IPC_FLAG_FIFO ); _ASSERT( !_mq ); 主任务等待消息队列: while(1) { if( RT_EOK == rt_mq_recv( _mq , (void *)&msg, sizeof(taskMsg), rt_tick_from_millisecond(1000))) { .... } } |
|
|
|
他强调不用执行长时间操作,就是因为,定时间隔会被偷偷延长。这个问题我解决了。
消息队列的用法也没错,看来你也没搞错消息体的大小。 timer 线程栈是多少?不会是 256 吧 |
|
|
|
Timer任务 栈空间现在已经改成 8K了,还是一样会出错
|
|
|
|
|
|
|
|
你先检查一下你定时器的超时时间是多少,单位是时钟节拍(ms),然后看看你的消息队列创建了一个多大的,是不是定时器周期太快把mq发满了,然后你的recv端用的是阻塞读取,send这边也是阻塞发送,这就会导致卡死了。
|
|
|
|
消息队列比较大,定时器周期最快30ms,定时器任务优先级默认很高,应该不是阻塞的问题,就算是阻塞也不应该导致出错
|
|
|
|
这里说的阻塞指的是recv()和send()阻塞接收和发送。
看你目前的需求和其他楼层的回复,我觉得你可以直接用定时器来计数,这也是最普遍的用法,定时器超时设置成30ms,timeout()回调里只进行计数++,单独拿一个线程去检测数值到达你的要求然后再向消息队列发送数据。 如果这样还出错的的话,我觉得就应该是程序的其他地方问题,不是定时器的问题了。 我如果这样用的话就是在线程的开始创建一个定时器,用来计数,然后再线程的while中不断检测定时器计数的值,到达目的清空一次。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
565 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2147 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1211 浏览 0 评论
1741 浏览 0 评论
1454 浏览 0 评论
74780 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:13 , Processed in 0.768424 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号