完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
如题,我在中断里是这段代码: if(exti_interrupt_flag_get(INT_EXTI_LINE) == SET) 其中,Receive(); 是一段有临界区代码的函数,是关于SPI通信的。 然后我运行程序,一直卡在Receive()里面的xTaskResumeAll() 这是什么原因呢?求教大佬
|
|
相关推荐
1个回答
|
|
在FreeRTOS中,中断服务例程(ISR)应该尽量避免执行复杂的任务,因为这可能会导致中断响应时间变长,从而影响系统的实时性能。在中断中调用具有任务级临界段代码的函数可能会导致一些问题,例如任务调度器的死锁。
关于您的问题,卡在`xTaskResumeAll()`的原因可能是由于在中断中调用了具有任务级临界段代码的函数,导致调度器无法正常工作。在FreeRTOS中,中断服务例程应该遵循以下原则: 1. 尽可能短:中断服务例程应该尽可能短,以减少对中断响应时间的影响。 2. 避免使用阻塞调用:中断服务例程中应避免使用可能导致阻塞的调用,例如`xTaskCreate()`或`xQueueGenericSend()`等。 3. 避免使用调度器API:中断服务例程中应避免调用调度器API,例如`xTaskCreate()`、`vTaskDelay()`等。 针对您的问题,建议您采取以下措施: 1. 将`MCP2515_Receive()`函数中的临界区代码移出中断服务例程,例如使用信号量或事件标志通知任务进行处理。 2. 在中断服务例程中,仅执行必要的操作,例如清除中断标志、设置事件标志等。 3. 在任务中处理`MCP2515_Receive()`函数的临界区代码,例如通过检查事件标志或信号量的状态来判断是否需要执行SPI通信。 通过这种方式,您可以确保中断服务例程尽可能短,同时避免在中断中调用具有任务级临界段代码的函数,从而解决卡在`xTaskResumeAll()`的问题。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
请问ad9910芯片的ram模式在接收数据时为什么会出现一段方波?
1646 浏览 1 评论
723 浏览 0 评论
不懂真得问!FREERTOS在中断里面,可以调用有任务级临界段代码的函数吗?
1569 浏览 1 评论
1842 浏览 1 评论
2013 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-6-21 14:00 , Processed in 0.908151 second(s), Total 44, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191