首先,我想指出我在RTOS业务方面很陌生。
我在STM32L151VC手臂处理器上使用FreeRTOS。 我正在使用二进制信号量在中断和某个任务之间进行同步(信号量状态表明DMA已完成其操作)。现在,xSemaphoreGiveFromISR()命令与正在运行并再次运行的所需任务之间传递的时间约为50 [us]。这对我来说似乎太长了,不是吗?
我想说,对于这个测试,我只使用了1个任务(和IDLE任务),我的cpu clk是24 [MHz]。我已经在FreeRTOS和StackOverflow网站上查找了一些答案,并没有找到任何答案。 我只发现一个声明,这个动作应该少于1 [我们]。
我的问题是,有没有人遇到过类似的问题? 任何人都知道如何解决这个时间开销问题?
感谢所有帮助者..
答案 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而不是信号量 - 这些可能会降低开销。