Embedded FreeRTOS信号量开销时间

Embedded FreeRTOS信号量开销时间,embedded,semaphore,rtos,freertos,Embedded,Semaphore,Rtos,Freertos,首先,我想指出的是,我对RTOS业务相当陌生 我在STM32L151VC arm处理器上使用FreeRTOS。 我使用二进制信号量在中断和某个任务(DMA已完成其操作的信号量状态)之间进行同步。现在,从xsemaphoregivefromsr()命令到所需任务启动并再次运行的时间大约为50秒。这对我来说太长了,不是吗 我想声明,对于这个测试,我只使用了一个任务(和空闲任务),我的cpu时钟是24[MHz]。我在FreeRTOS和StackOverflow网站上寻找了一些答案,但没有找到任何答案。

首先,我想指出的是,我对RTOS业务相当陌生

我在STM32L151VC arm处理器上使用FreeRTOS。 我使用二进制信号量在中断和某个任务(DMA已完成其操作的信号量状态)之间进行同步。现在,从xsemaphoregivefromsr()命令到所需任务启动并再次运行的时间大约为50秒。这对我来说太长了,不是吗

我想声明,对于这个测试,我只使用了一个任务(和空闲任务),我的cpu时钟是24[MHz]。我在FreeRTOS和StackOverflow网站上寻找了一些答案,但没有找到任何答案。 我只发现了一个声明,说这项行动应该花费少于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,而无需胶水代码。这可能是之前我在STM32上评估FreeRTOS的原因,在我的例子中,使用ARM的RealView编译器以72MHz运行,并在编译器优化的构建中测量了15us左右的上下文切换时间。相比之下,Keil RTX为5us,Segger embOS为10us

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


中断和进入中断处理程序之间的时间很快-Cortex-M3可以直接运行C代码ISR,而无需胶水代码。这可能就是您在FreeRTOSConfig.h中将配置使用\u端口\u优化的\u任务\u选择设置为
1
的原因?如果是这样,那么任务选择将使用CLZ指令执行,而不是使用通用C算法,因此速度要快得多

给出信号量后,是否调用
portEND\u SWITCHING\u ISR(x)
,其中
x
是传递给信号量give函数的值?如果是这样,那么您的任务切换将立即发生,而不是等到下一个滴答声中断

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


您是否在FreeRTOSConfig.h中将
配置使用\u端口\u优化的\u任务\u选择设置为
1
?如果是这样,那么任务选择将使用CLZ指令执行,而不是使用通用C算法,因此速度要快得多

给出信号量后,是否调用
portEND\u SWITCHING\u ISR(x)
,其中
x
是传递给信号量give函数的值?如果是这样,那么您的任务切换将立即发生,而不是等到下一个滴答声中断

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


你好,克利福德。首先,谢谢你的及时答复。但我不明白。。。这意味着我想使用信号量进行消息传输,最大速率可能是1/50[us]=20k。不是很慢吗?顺便说一句,我使用的是IAR,带有介质优化功能。测量是用示波器完成的,在发出xsemaphoregivefromsr()命令和发出xSemaphoreTake()命令时,通过操纵GPIO来完成的。如果你只想在ISR和主程序循环之间使用一个易失性标志,那么它会非常快;可能是RTO的任务切换(也可能是调度程序)的重量使您的速度变慢了。如果您打算坚持使用RTOS,您能否使用更大的缓冲区以更少的上下文切换来移动数据?@user3239557:没有什么可以得到的,FreeRTOS的性能就是它的性能,这主要是由于它的实现。考虑使用事件标志而不是信号量(更新的答案)。嗨,克利福德。首先,谢谢你的及时答复。但我不明白。。。这意味着我想使用信号量进行消息传输,最大速率可能是1/50[us]=20k。不是很慢吗?顺便说一句,我使用的是IAR,带有介质优化功能。测量是用示波器完成的,在发出xsemaphoregivefromsr()命令和发出xSemaphoreTake()命令时,通过操纵GPIO来完成的。如果你只想在ISR和主程序循环之间使用一个易失性标志,那么它会非常快;可能是RTO的任务切换(也可能是调度程序)的重量使您的速度变慢了。如果您打算坚持使用RTOS,您能否使用更大的缓冲区以更少的上下文切换来移动数据?@user3239557:没有什么可以得到的,FreeRTOS的性能就是它的性能,这主要是由于它的实现。考虑使用事件标志而不是信号量(更新的答案)。