在FreeRTOS中,任务的调度是通过中断来实现的,因此中断处理函数内的代码需要小心地遵循FreeRTOS的规范。当在一个中断中调用FreeRTOS API函数时,必须确保中断服务程序(ISR)的优先级低于配置的configMAX_SYSCALL_INTERRUPT_PRIORITY。
已经将安全调用API函数的中断优先级设置为4,这是一个安全的优先级。在TIMER7_BRK_TIMER11_IRQn 中断中启用了一个优先级为9的中断,就可能导致问题。
FreeRTOS使用一个名为configMAX_SYSCALL_INTERRUPT_PRIORITY的配置项来定义最大的系统调用中断优先级。在FreeRTOS中,ISR中调用的FreeRTOS API函数应该以更低的优先级运行,以确保它们不会被系统调用中断打断。
请确保configMAX_SYSCALL_INTERRUPT_PRIORITY配置正确。默认情况下,该值为configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,这可能在FreeRTOS配置文件中定义。确保没其他中断的优先级高于此值。
如果中断优先级设置正确,但问题仍然存在,您可能需要考虑以下几点:
是否在中断中使用了不安全的操作: 检查TIMER7_BRK_TIMER11_IRQHandler中是否包含可能破坏FreeRTOS内部状态的操作。
是否有优先级反转的问题: 如果有其他任务具有更高的优先级,并且它们与MyApplicationTask_Handler任务竞争资源,可能会导致优先级反转的问题。考虑使用二值信号量等机制来避免这种情况。
配置文件是否正确: FreeRTOS的配置文件正确匹配硬件需求。
调试FreeRTOS的问题需要仔细检查中断优先级和调度相关的配置。
确保中断配置是符合FreeRTOS规范的,且没有与FreeRTOS API调用冲突的情况。
|