这是一个笼统的说法:Linux要有MMU才能跑,没有MMU的只能跑uclinux。但事实上自从2.6版本开始的Linux内核,arch/arm/Kconfig里就有了CONFIG_MMU的选项,因此严格地说,Linux内核早就能存活在没有MMU的ARM芯片上了。

uclinux严格意义上说是一个完整的发行版,它就是主流内核 + 大量应用程序。uclinux一直在慢慢悠悠地更新。最新的是2016年发布的4.4内核版本,然后直到现在再也没有更新了。

Linux内核里面MMU-less芯片的驱动日渐丰富,到了2015年内核4.2时代,里面竟赫然出现了STM32的配置和驱动!随后其STM32的驱动逐渐多了起来,从一开始的只有串口、pinctrl、RCC等的少量驱动,发展到支持I2C、DMA、定时器、ADC、DAC、LTDC、DCMI、USB、MII/RMII等等几乎所有STM32的外设;从一开始只支持stm32f429,到如今甚至已经支持stm32h7了,而现在2018年初h7芯片还基本买不到;stm32的设备树写法也改了一版。

真能叫Linux么?

Emcraft System推出不少STM32的SOM(system on module),并提供了他们的Linux BSP,内核有2.6、4.2、4.4等。他们的工程就是一个带有了bootloader的完整的发行版,应用程序也不仅仅是busybox,不过他们更愿意把它称为uclinux,可能是他们应用程序的来源就是uclinux。

Linux只是一个内核,uclinux是一个完整的发行版,就像buildrootyocto这样的发行版;但是uclinux太众所周知了,以至于大家都把MMU-less的Linux发行版都称为uclinux。

目前我的429板子上跑的是最低配置的Linux发行版,只有区区一个busybox。以开源的自由的精神,叫uclinux还是叫Linux其实并不需要学术上的争论233

没MMU的片子跑Linux,何用之有?

最大的理由是,Linux下应用简直太丰富了。玩单片机如果不仅满足于让电机动起来(不过控制算法的确有很多文章可做),自然要玩些系统性的东西;如果仅是一个小实时系统,要带上文件系统、网络协议栈、USB设备之类的,则都是体力活,更不用说搭个小服务器了(或许你要远程访问它,或者要它连服务器);而在Linux世界里面这些都不是问题。跑上Linux,单片机的负担重了点,但程序员的负担就轻了不少。

当年不少性能强劲的MMU-less的芯片促使了uclinux的迅速发展,比方说blackfin那些数百兆主频的DSP;而如今数百兆主频的ARM Cortex M系列单片机也并不少见,更有甚者如NXP准备推出1.2GHz主频的所谓跨界单片机,计算性能想必大大强于数百兆的Cortex A5/A7。单片机已非当年十几兆主频的吴下阿蒙。

想要比ARM9之流稍微强大一点的计算性能,又要比Cortex A5之流更低的功耗,还要比传统的SBC更为简单的开发模式,那么无MMU配置的Linux想必是极好的选择。

为什么选择STM32F429?

429是当年的旗舰芯片,外设丰富,计算性能也相当不错(至少强于AT91SAM9260了)。目前主流内核对它支持相当好,基本所有外设都支持了。stm32f429-discovery开发板口碑不错,价格还不贵(要知道单片机评估板都特别特别特别贵),它可能是目前恰好能跑通主流Linux内核的最低配置的板子了。不少开源STM32的项目,但凡需要那么一点计算性能的,选型基本上从429往上走。

有人在OpenMV上弄uclinux尝鲜,据说1秒钟之内就启动完毕了。。寻常的ARM9板子哪能秒启动。。。应该感谢当年那些逮着uclinux到处移植的极客们,让内核里面有了F1、F2、F4的基本驱动

OpenMV uclinux
OpenMV uclinux

uclinux下移动的企鹅
uclinux下移动的企鹅

油管视频

性能几何?

实话说,Linux的性能比不上裸机程序和真正的嵌入式实时操作系统,这个根深蒂固为服务器设计的内核考虑的都是无数个CPU、无数内存、无数存储设备,以致于被人吐槽为怪物;比方说,Con Kolivas对它的CFS调度器相当不满,然后他自己写了个BFS,称为“脑残调度器”。越是新版本的内核,占用资源越大(回报是功能越齐全,漏洞越得到修补)。

就拿同一块STM32F429板子来说,只带有串口驱动的话:

内核版本 镜像大小 BogoMIPS
uclinux 2.6.33 700KB 168.34
Linux 4.2.8 1.1MB ~110
Linux 4.13.3 1.5MB ~110

BogoMIPS是个挺娱乐的参数,内核启动时候自行测量,以校准udelay等延时的参数,数值越高意味着单位时间内跑的指令越多,意味着性能越强。参考AT91SAM9260这个ARM9芯片,时钟频率同样是180MHz,同样跑2.6的内核,而且它还有cache,但它的BogoMIPS只有八九十。所以可以说,Cortex M4性能还是挺强的。

在2015年的ELC中有人做了一份如何优化uclinux的报告,还有讲义可供下载,干货满满。

裁剪提示

因为f429没有cache,所以内核一定要塞进片内flash,否则在片外SDRAM上运行的性能感人:BogoMIPS只有个位数,刷屏时候能体会到相当明显的卡顿,并且摄像头会抱怨DMA下溢,USB会枚举不到设备。如果是f7的芯片大可不必担心,即使在片外SDRAM里跑,其BogoMIPS据说都可达三百余。

因此f429的芯片只能选i系列的带2MB片内flash版本的才够用;f7的片子就随便啦。