完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
portBase_TYPE vTaskResumeFromISR(xTaskHandle pxTaskToResum)
这个函数是用来唤醒某个任务的。 但是使用教程里面有这样的描述: vTaskResumeFromISR()不应该用于任务和中断同步,因为可能会在中断发生期间,任务已经挂起——这 样导致错过中断。使用信号量做为同步机制将避免这种偶然性。 这里我没看太懂,带FromISR后缀的函数都是可以放心的在中断里面调用的吧,教程里面说的任务和中断同步是怎样的一种用法,和在中断里面唤醒一个任务有什么不同吗? “因为可能会在中断发生期间,任务已经挂起”,但是就是任务已经挂起才需要唤醒他的吧,这样又会错过什么中断呢? 我在百度也没找到相关的说明,请前辈们指点下,这个函数使用的限制具体是什么?相关的问题需要查看哪些资料? |
|
相关推荐
2个回答
|
|
你用的系统的版本太旧了吧,建议v8.2之前的都不要用了,尤其是v7版本的BUG太多,在v8打后的版本才修正过来
v9版本的源码里面是 xTaskResumeFromISR,官网给出的解释是: 意思大概跟你看的教程大致相同,并非是这个函数不能调用,而是这个函数在某个很特殊的情况下不能在中断里面用于实现任务同步—— 任务正在使用vTaskSuspend来挂起某个任务,在未完全成功挂起前产生了中断,并在中断里调用了xTaskResumeFromISR,这时将导致恢复失败! 至于为何会丢失中断,依小灯愚见,不妨先看看源码: 源码在执行任务恢复前必须先判断任务是否被挂起:if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE ) 结合上面提到的情况,由于任务未被成功挂起前有可能产生中断,导致在中断里误判为任务还未被挂起,因此“丢失”了中断,任务恢复失败 再看看任务挂起的源码,整个挂起过程是在临界区里完成的,中断被屏蔽掉,理论上系统不会进入中断啊! 但别言之过早了,凡事也有例外,因为FreeRTOS在CM3上的移植并不是采用简单的关中断,而是采用了中断阈值屏蔽 关于中断阈值屏蔽,小灯在一篇帖子里面有提及过,请楼主自行查阅: http://www.openedv.com/thread-77593-1-1.html 归纳的来讲就是在CM3中并非所有的中断都交由FreeRTOS来管理,哪怕系统进入了临界区也无法阻止这部分中断的产生和执行 如果你一不小心在这些不受FreeRTOS管理的中断里面使用xTaskResumeFromISR来恢复某个任务,如果恰巧碰到了上面所说 的那种特殊情况——正在挂起某任务但还未完成,那么调用xTaskResumeFromISR将会恢复失败,也就是丢失中断! 因此最安全的做法还是使用信号量,为何?因为信号量的发送并不受临界区的影响,哪怕系统正在处于临界区,此时在中断里 发送一个信号量,信号量一样能正确的给出,不会丢失! 小灯在实际项目中也是偏向使用二值信号量来唤醒/挂起某个任务,不会使用xTaskResumeFromISR等不常用的函数 下面给出官方提供的一个使用例子: |
|
|
|
多谢您的指教,非常有用
|
|
|
|
只有小组成员才能发言,加入小组>>
702 浏览 0 评论
1111 浏览 1 评论
2476 浏览 5 评论
2811 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2654 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
658浏览 9评论
666浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
788浏览 6评论
633浏览 5评论
677浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 06:59 , Processed in 1.045476 second(s), Total 83, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号