问题详情
问题的起因在
https://blog.csdn.net/qq_42907191/article/details/120734795.
中断操作信号量/消息队列时,应该被唤醒的线程却被延迟唤醒了。
解决方法
在中断操作信号量/消息队列后,调用portYIELD_FROM_ISR()
是否切换线程由IsScheduler
决定
int H_TS_SemaphoreGive_ISR(void* Sem){
BaseType_t IsScheduler;
BaseType_t r;
r=xSemaphoreGiveFromISR(Sem,&IsScheduler);//操作结束后 IsScheduler指示是否有线程解阻塞
if(r==pdTRUE){
portYIELD_FROM_ISR(IsScheduler);//让FreeRTOS自己决定是否调度
return 0;
}
return -1;
}
修改之后,OLED刷屏的帧数达到了166Hz,并且不会频率不会剧烈抖动,稳定在166上下。