赞
踩
创建两个线程A
和B
和两个二值信号量a
,b
。
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
基础配置下的结果用于后面的对比,仅本条有-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
由于中断切换测试是使用SVC中断
模拟的,传递要调用的参数到SVC造成了额外的耗时,(SVC_ISR
的)结果可能偏低。
由于我的测试需要SVC中断来模拟调度中断,并且测试代码在另一个RTOS的测试中已经写好了,但FreeRTOS占用了SVC中断,但仅在开始第一个线程的时候使用了一次,所以我索性直接把RTOS底层改了一下,让它仅使用PendSV。(FreeRTOS使用SVC启动第一个线程的目的是为了减轻后续的调度负担,增强性能,但这种措施节省出的性能及其有限,我修改之后的代价只是PendSV中断中仅多进行了一次指针读取函数指针操作,对于后续的链表操作、堆栈操作而言就是九牛一毛)
10us
(在M4@96MHz下)来判断是否要将中断中的应用程序下放到线程中。在中断频率接近(大于)10us时就要好好斟酌了。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。