:Linux是否能在8位MCU上运行?

我们经常可以看到初学者在单片机论坛中询问他们是否可以在他们微不足道的小的8位微机中运行Linux 。这些问题的结果通常是带来笑声 。我们也经常看到 , 在Linux论坛中 , 询问Linux运行的最低要求是什么 。常见的答案是Linux需要一个32位架构和一个MMU(存储器管理单元) , 并至少1MB的RAM来满足内核的需求 。
本项目旨在(并且成功)粉碎这些概念 。下图中您所看到的开发板基于ATmega1284P 。我(歪果仁)还制作了一块基于ATmega644a的开发板 , 也同样获得了成功 。该开发板没有使用其他处理器 , 启动Linux 2.6.34内核 。事实上 , 它甚至可以运行一个完整的Ubuntu栈 , 包括X(如果你有时间等它启动)和gnome 。
:Linux是否能在8位MCU上运行?
文章图片

文章图片

【:Linux是否能在8位MCU上运行?】RAM(随即存取存储器)
是的 , 没错 , 完整的Linux安装需要数兆字节的RAM和32位带有MMU的CPU 。本项目拥有这一切 。首先 , 让我们访问RAM 。正如您所看到的 , 在电路中有一块古董级的30引脚SIMM内存模块 。这些是基于80286的PC曾经使用的 。它通过接口和ATmega连接 , 我写代码来访问它并按照规格刷新它(SDRAM需要恒定速率刷新以避免丢失数据) 。它到底有多快呢?刷新中断每62ms发生一次 , 占用时间1.5ms , 因此占用3%以下的CPU 。访问RAM , 为了便于编程 , 一次访问一个字节 。这样产生的最大带宽约为300KBps 。
:Linux是否能在8位MCU上运行?
文章图片

文章图片

存 储
对于RAM需要工作在休眠状态 , 我们有两件事要处理 。存储并不是太难解决的问题 。使用SPI可以十分容易的与SD卡交互 , 我的项目中做到了这一点 。一个1GB的SD卡可以工作的很好 , 虽然512MB就已经满足这一特殊的文件系统(Ubuntu Jaunty) 。ATmega拥有一个硬件SPI模块 , 但无论出于何种原因 , 它工作的不是十分顺畅 , 因此我将这个接口进行位拆裂 。它仍然足够块——大约200KBps 。这对项目来说还非常有意义——它能够在有足够管脚的任何微控制器上实现 , 而不用使用其他硬件模块 。
CPU(中央处理单元)
所有剩下的就是那个32位CPU和MMU需求 。不过AVR没有MMU , 并且它是8位的 。为了克服这一困难 , 我编写了一款ARM仿真器 。ARM是我最熟悉的架构 , 并且它足够简单 , 可以让我很舒服的为它编写出一个仿真器 。为什么要编写一个 , 而不是移植一个呢?好吧 , 移植别人的代码是没有乐趣的 , 再加上我看到没有将仿真器轻松移植到8位设备上的书面资料 。原因之一:AVR编译器坚持16位处理整数将会给你带来麻烦 , 如简单的“(1:Linux是否能在8位MCU上运行?
文章图片

文章图片

其他功能
电路板通过一个串行端口和真实世界进行通信 。目前 , 它通过串行端口连接到我PC运行的minicom上 , 但是它可测的替代连接是连接到电路上的一个键盘和一个字符LCD , 可以使其完全独立 。电路板上还有两个LED 。它们指示SD卡的访问情况 。一个代表读操作 , 一个代表写操作 。电路板上还有一个按钮 。当按下并按住1秒时它将使串行端口脱离仿真的CPU的当前有效速度 。AVR的主频是24MHz(超过原有20MHz的轻微超频) 。
它的速度有多快?
uARM肯定没有速率守护进程 。它花了大约2个小时启动到BASH提示符("init=/bin/bash"内核命令行) 。然后用4个多小时启动整个Ubuntu("exec init"然后登陆) 。启动X将消耗更长时间 。有效的仿真CPU速度约为6.5KHz , 这与你期望的在一个可怜的8位微控制器上仿真一个32位CPU和MMU是同等的水平 。奇怪的是 , 一旦启动 , 该系统是有些可用的 。您可以输入一个命令 , 并在一分钟之内得到答复 。也就是说实际上你是可以使用它的 。比如 , 今天我还用它来格式化我的SD卡 。这绝对不是最快的 , 但我觉得它可能是最便宜、最慢、最简单的手工组装、最低的部件数量以及最低端的Linux PC 。电路板是使用导线手工焊接的 , 甚至没有使用印刷电路板(PCB)的必要 。


推荐阅读