首先我要说明的是,我对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库是经过优化编译的。
如果您不需要计数对象,您可以尝试使用事件标志而不是信号量-这些可能具有更低的开销。