FreeRTOS信号量开销时间

时间:2014-07-23 07:38:02

标签: embedded semaphore rtos freertos

首先,我想指出我在RTOS业务方面很陌生。

我在STM32L151VC手臂处理器上使用FreeRTOS。 我正在使用二进制信号量在中断和某个任务之间进行同步(信号量状态表明DMA已完成其操作)。现在,xSemaphoreGiveFromISR()命令与正在运行并再次运行的所需任务之间传递的时间约为50 [us]。这对我来说似乎太长了,不是吗?

我想说,对于这个测试,我只使用了1个任务(和IDLE任务),我的cpu clk是24 [MHz]。我已经在FreeRTOS和StackOverflow网站上查找了一些答案,并没有找到任何答案。 我只发现一个声明,这个动作应该少于1 [我们]。

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

感谢所有帮助者..

2 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

我之前在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库经过优化编译。

如果您不需要计数对象,可以尝试使用event flags而不是信号量 - 这些可能会降低开销。