完善资料让更多小伙伴认识你,还能领取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()`的问题。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
OV7670摄像头使用串口发送数据到另一个板子上的lcd,出现花屏
694 浏览 1 评论
512 浏览 0 评论
423 浏览 0 评论
STM32CUBEMX(12)--IIC,12864OLED(0.96寸)移植
579 浏览 0 评论
STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式
542 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-16 02:31 , Processed in 0.370305 second(s), Total 41, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号