FreeRTOS在中断上下文中设置事件组,调度很慢的的解决方法
当前在stm32mp157的M4内核中使用freertos,一直在定时器和外部输入中断的回调函数中设置事件组的位,在其他任务中,获取阻塞等待该该事件组,一直用的都比较稳定,最近软件增加了两个任务,突然发现在中断回调函数中设置的事件,在任务中很难被响应,甚至不响应,经过多方面的查找资料和测试,终于发现了解决方法,具体如下:
1、在freertos中,中断的回调函数,虽然不是中断函数本身,但是也处于中断的上下文,所以需要使用中断安全的接口;
2、在中断中调用设置事件组的接口xEventGroupSetBitsFromISR()时,该函数并不会直接修改事件组,而是向freertos的守护任务(Daemon Task)发送一个命令,让守护任务进行处理;
3、由于守护任务的优先级比较低,所以当任务比较多时,就会有延时,具体的处理流程如下图所示:
所以,就会出现在中断中设置事件组,其他任务响应很慢,而在任务重设置事件组,则响应很快的情况。
怎么解决呢?很简单,在中断中,不要使用事件组,而改用任务通知;