FreeRTOS信号量开销时间



首先我要说明的是,我对RTOS业务是一个新手。

我在STM32L151VC臂处理器上使用FreeRTOS。我使用二进制信号量在中断和某些任务之间进行同步(DMA已完成其操作的信号量状态)。现在,从xSemaphoreGiveFromISR()命令到所需任务启动并再次运行之间经过的时间大约是50[us]。我觉得太长了,不是吗?

我想声明,对于这个测试,我只使用了1个任务(和IDLE任务),我的cpu时钟是24[MHz]。我在FreeRTOS和StackOverflow网站上寻找一些答案,但没有找到任何答案。我只发现了一个声明,这个动作需要不到1[us]。

我的问题是,有人遇到过类似的问题吗?有人知道如何解决这个时间开销问题吗?

是否在FreeRTOSConfig.h中将configUSE_PORT_OPTIMISED_TASK_SELECTION设置为1 ?如果是这样,那么任务选择将使用CLZ指令执行,而不是通用的C算法,因此快得多。

给出信号量后,是否调用portEND_SWITCHING_ISR( x ),其中x是信号量给出函数传递的值?如果是这样,那么你的任务切换将立即发生,而不是等到下一个tick中断。

顺便说一下-为了获得最佳效果-在FreeRTOS支持论坛上询问FreeRTOS支持问题,因为每天使用FreeRTOS的人都可以在那里给您提供专家建议

http://www.freertos.org/FreeRTOS_Support_Forum_Archive/freertos_support_forum_archive_index.html

我以前在STM32上评估过FreeRTOS,在我的情况下,使用ARM的RealView编译器在72MHz下运行,并在编译器优化的构建中以15us的顺序测量了上下文切换时间。相比之下,Keil RTX为5us, Segger embOS为10us。

事实上,你的时钟频率较低,你的工具链可能不同,你可能或可能没有应用优化(至少对FreeRTOS库),我认为50us是完全合理的。在Cortex-M3可实现的1.2MIPS/MHz下,这相当于大约1440条指令,但不清楚您如何测量此时间以及可能携带的开销。

中断和进入中断处理程序之间的时间将很快- Cortex-M3可以直接运行C代码isr,而不需要粘合代码。这可能就是<1us所指的。

你可以通过在空闲循环中禁用WFI来略微改善时间(以更高的功耗为代价),并且你应该确保FreeRTOS库是经过优化编译的。

如果您不需要计数对象,您可以尝试使用事件标志而不是信号量-这些可能具有更低的开销。

最新更新