大家好,感谢社区提供的板卡。这次的使用对象是安富莱的STM32-V6板卡。由于之前用过安富莱的V4板卡,所以安富莱给我留下了很深的印象,他们开发板的资料很过硬,售后完善,线上QQ技术支持也很给力,作为学习,确实是一款很不错的板卡。唯一的是,安富莱很少出视频,其主要是编写PDF教学手册和程序例程。
另外他们的按键检测代码,很紧凑,有单发、连发、长按、短按、上升沿触发、下降沿触发等功能,是我见到最棒的按键检测代码。
STM32-V6是一款基于STM32F429单片机的开发板,整板采用4层板设计,本次选择它的目的,除了测试其能做常用外设开发驱动,安富莱还对它做了一个示波器的例程。虽然示波器的性能不强,但是去十分有意思。另外其支持VNC虚拟屏幕功能。开发者可以不用LCD显示屏幕,直接使用PC屏幕作为自己的开发板屏幕,十分方便。所以这个板子真的很强大。
拿到板子,在我查看他们的网络示波器例程后,发现安富莱只做了基于RTX的例程,并没有做基于uCOS、FreeRTOS的例程,这样我感到很奇怪。因为安富莱的每个例程都会做三个OS版本,唯独这个例程却只制作了一个基于RTX的。他们的技术支持回复是:“FreeRTOS的性能不行,所以对这个网络示波器的的应用来说,没有制作这方面的例程”,这让我感到很疑惑,FreeRTOS作为一款开源RTOS,性能真有这么差么?到底他们之间的差距又有多大?
所以才有这次做UCOS-II、UCOS-III、FreeRTOS、RTX系统性能对比测试,本次我只是站在一个使用者的角度,测试四个RTOS单一的系统调度性能。尽量使4个RTOS处在同一水平上测试:
l 使用相同的硬件平台和相同的资源
l 单片机都使用相同的主频,只是单片机的Uart资源
l 4个RTOS并非都裁剪到极致,保留信号量、队列、消息等功能。
l 都使用相同的时间片1mS、任务数量、任务堆栈设置一样大小。
l 使用相同的编译工具MDK4.7,采用相同的优化等级。
l 测试任务代码逻辑以及优先级关系保持一致。
本次测试的系统版本为:
RTX V4.73
FreeRTOS V8.2.3
uCOS-II V2.92.11
uCOS-III V3.05.00
测试方法是,主要使用RTOS的信号量,测试RTOS任务切换速度。建立三个任务。
任务A:接收到任务B发的信号量B2A之后,发送信号量A2B;任务优先级率高
任务B:接收到任务A发的信号量A2B之后,发送信号量B2A,并计数;任务优先级低
主任务:初始化时,发送一次信号量B2A,是AB任务开始循环执行。并计时1S,打印出任务切换次数。任务优先级最高。
由于我个人对uCOS和FreeRTOS比较熟悉,所以就先做了uCOS-II的测试。
一、uCOS-II任务信号量测试
程序的移植过程就不在这里说了,直接开始测试上代码:
建立任务堆栈和信号量,以及任务切换次数计数变量。
编写起始任务,这个任务的优先级最高。
任务A,任务优先级略高。其中红色框起来的代码是测试时候使用的。在任务B中也有类似的代码。
任务B,任务优先级低,但是比系统空闲任务要高。
在任务AB中框起来的代码主要是进行验证程序写的准确性,如果将上文中红色框中注释掉的代码恢复。按照1S的时间来算:A任务获取到信号量,延时100MS,在发送信号量给B;任务B获取到信号量,延时100MS,在发信号给A。AB任务循环,花掉大约是200MS的时间,最后主任务在1S的时间内,计数应该是5次才对。
实际程序也确实是5次,可以证明该例程无误,后面测试的OS调度能力的时候,只需要去掉任务AB中的100MS的延时和printf打印即可。
同样的程序,我做了四份,分别基于UCOS-II、UCOS-III、FreeRTOS、RTX这个四个RTOS系统
测试代码截图:
注释掉RTOS任务AB中的延时和串口打印,使用相同的优化等级,分别编译烧录测试代码,串口打印如下:
上图都是在1秒的时间,AB任务调用的次数:
可以看到,就任务切换速度而言,在STM32单片机上RTX确实要快很多,RTX是Keil开发的一款RTOS,而Keil早在2005年就被ARM收购,对ARM芯片的支持和优化应该也是被安排到日程的。
经过这次测试,虽然RTX在任务切换上的速度上确实要优秀很多,但不能说RTX就是这四款RTOS中最优秀的系统,本次测试也仅仅是单一的一个方面,我相信FreeRTOS以及其他的OS都有它自己的独到优势。
我们作为开发使用者,没有必要去纠结哪个是最强的RTOS,我们只需要找到合适我们项目,方便我们开发的RTOS即可。