当前位置:   article > 正文

FreeRTOS调度性能测试(线程切换耗时测试)_freertos 性能测试

freertos 性能测试

FreeRTOS调度性能测试

如何测试

创建两个线程AB和两个二值信号量ab
A线程等待信号量a,等到信号量后向信号量b释放信号量;
B线程等待信号量b,等到信号量后向信号量a释放信号量。

初始状态下这两个线程都在等待自己的信号量,此时只需要第三个线程向其中一个信号量释放信号量,这两个线程就会无限重复互相调度了,此时空闲线程无执行的机会。

为了保证结果能通过其他线程发送,这两个线程优先级要设置为最低。

测试条件

使用STM32F411,运行在96MHz下,FLASH的指令预取,指令缓存,数据缓存都使能,SysTick中断频率为1ms

测试结果

相关测试工程在:https://gitee.com/H0x9DEFA478/FreeRTOS_Test_STM32_F411.git.

该工程使用USART2(PA2 PA3)发送测试结果,使用25MHz晶振
有兴趣的可以自行测试

测试结果

ARM编译器V5

配置条件:
占位线程数量Stress_IsExtThread==0

                                   -O3优化+时间优化                  -O0优化

Thread(Stress_IsTestISR==0)    avg:11112.99/100ms 9.00us     avg:8866.50/100ms 11.3us

SVC_ISR(Stress_IsTestISR!=0)   avg:9931.70/100ms 10.1us      avg:8062.62/100ms 12.4us
*后面us为单位的为每次调度所用的时间 100000us/cnt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

基础配置下的结果用于后面的对比,仅本条有-O0的测试结果(每次都测-O0优化太麻烦了)

配置条件:
占位线程数量Stress_IsExtThread==48

                                   -O3优化+时间优化 
			
Thread(Stress_IsTestISR==0)    avg:11099.80/100ms 9.01us

SVC_ISR(Stress_IsTestISR!=0)   avg:9880.88/100ms 10.12us
  • 1
  • 2
  • 3
  • 4
  • 5

由于中断切换测试是使用SVC中断模拟的,传递要调用的参数到SVC造成了额外的耗时,(SVC_ISR的)结果可能偏低。

由于我的测试需要SVC中断来模拟调度中断,并且测试代码在另一个RTOS的测试中已经写好了,但FreeRTOS占用了SVC中断,但仅在开始第一个线程的时候使用了一次,所以我索性直接把RTOS底层改了一下,让它仅使用PendSV。(FreeRTOS使用SVC启动第一个线程的目的是为了减轻后续的调度负担,增强性能,但这种措施节省出的性能及其有限,我修改之后的代价只是PendSV中断中仅多进行了一次指针读取函数指针操作,对于后续的链表操作、堆栈操作而言就是九牛一毛)

  • 阻塞线程的增多仅会略微降低调度速度。
  • 在编程中, 可认为线程切换耗时为10us(在M4@96MHz下)来判断是否要将中断中的应用程序下放到线程中。在中断频率接近(大于)10us时就要好好斟酌了。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/254763
推荐阅读
相关标签
  

闽ICP备14008679号