Linux如何运行于8位AVR微控制器?

发布者:cocolang最新更新时间:2013-10-15 来源: eefocus关键字:Linux  AVR  微控制器 手机看文章 扫描二维码
随时随地手机看文章

      更新记录2

      太平洋夏令时(PDT),2012年4月3日凌晨1点:上传了新的源代码存档;使用内存的FPM(Fast Page Mode,快页模式)模式和修改后的i-cache(指令缓存)配置文件加快了仿真器频率(6.5KHz->10KHz);更新了移植指南,包括内核镜像、新的更小的ramdisk(虚拟磁盘)和新的完整镜像。

      更新记录1

      太平洋夏令时(PDT),2012年3月29日晚19点:上传了新的源代码存档;修改了Makefile,并且现在包含了一个移植指南,它可以帮助您将它移植到其他的开发板或CPU中。

      简介

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

      RAM(随即存取存储器)

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

      存储

      对于RAM需要工作在休眠状态,我们有两件事要处理。存储并不是太难解决的问题。使用SPI可以十分容易的与SD卡交互,我的项目中做到了这一点。一个1GB的SD卡可以工作的很好,虽然512MB就已经满足这一特殊的文件系统(Ubuntu Jaunty)。ATmega拥有一个硬件SPI模块,但无论出于何种原因,它工作的不是十分顺畅,因此我将这个接口进行位拆裂。它仍然足够块——大约200KBps。这对项目来说还非常有意义——它能够在有足够管脚的任何微控制器上实现,而不用使用其他硬件模块。

      CPU(中央处理单元)

      所有剩下的就是那个32位CPU和MMU需求。不过AVR没有MMU,并且它是8位的。为了克服这一困难,我编写了一款ARM仿真器。ARM是我最熟悉的架构,并且它足够简单,可以让我很舒服的为它编写出一个仿真器。为什么要编写一个,而不是移植一个呢?好吧,移植别人的代码是没有乐趣的,再加上我看到没有将仿真器轻松移植到8位设备上的书面资料。原因之一:AVR编译器坚持16位处理整数将会给你带来麻烦,如简单的“(1<<20)”,产生0。你需要用“1UL<<20”。不必要的说,困扰其他人的未知基本代码寻遍所有的地方,整数都被假定并将会失败,这将是一个灾难。另外,我想用这个机会编写一款很好的模块化ARM仿真器。所以我付诸行动。

      其他功能

      电路板通过一个串行端口和真实世界进行通信。目前,它通过串行端口连接到我PC运行的minicom上,但是它可测的替代连接是连接到电路上的一个键盘和一个字符LCD,可以使其完全独立。电路板上还有两个LED。它们指示SD卡的访问情况。一个代表读操作,一个代表写操作。电路板上还有一个按钮。当按下并按住1秒时它将使串行端口脱离仿真的CPU的当前有效速度。AVR的主频是24MHz(超过原有20MHz的轻微超频)。[page]

      它的速度有多快?

      uARM肯定没有速率守护进程。它花了大约2个小时启动到BASH提示符("init=/bin/bash"内核命令行)。然后用4个多小时启动整个Ubuntu("exec init"然后登陆)。启动X将消耗更长时间。有效的仿真CPU速度约为6.5KHz,这与你期望的在一个可怜的8位微控制器上仿真一个32位CPU和MMU是同等的水平。奇怪的是,一旦启动,该系统是有些可用的。您可以输入一个命令,并在一分钟之内得到答复。也就是说实际上你是可以使用它的。比如,今天我还用它来格式化我的SD卡。这绝对不是最快的,但我觉得它可能是最便宜、最慢、最简单的手工组装、最低的部件数量以及最低端的Linux PC。电路板是使用导线手工焊接的,甚至没有使用印刷电路板(PCB)的必要。

      仿真器的细节?

      仿真器是相当模块化的,允许它随意扩展仿真其他SoC(片上系统)和硬件配置。仿真的CPU是ARMv5TE。前一段时间,我开始进行支持ARMv6的工作,但是一直没有完成(从代码中可以看出来),因为不是很需要。仿真的SoC是PXA255。由于模块化的设计,你可以替换SoC.c文件,并使用相同的ARMv5TE核心编译一个完整的新的SoC,或者替换核心,或者按照意愿替换外设。这是有目的的,我的意思是这个代码也是一个关于ARM SoC如何工作的相当整洁的范例。CPU仿真器自身的代码并不是太整洁,那么,好吧,它是一个CPU模拟器。这是几年前花了超过6个月的空闲时间写的,然后就放在一边了。它最近复活是专门为了这个项目。仿真器实现了i-cache来提高速度。这给予了AVR很多帮助,使内部存储器能够以超过每秒5MB的速率访问,而不像我的外部RAM。我还没有抽出时间去实现d-cache(数据缓存),但是这已经在我的待办事项列表上了。访问块设备没有被仿真为SD设备。事实证明这太慢了。取而代之的是一个准虚拟化磁盘设备(pvdisk,参见pvDisk.tar.bz2,GPL许可证),我编写的时候使用了一个无效的操作码来调入仿真器并访问磁盘。我的镜像中的ramdisk(虚拟磁盘)加载这个pvdisk,然后改变根目录到/dev/pvd1。ramdisk被包含在了“rd.img”中。我使用的“机器类型”是PalmTE2。为什么?因为我非常熟悉这款硬件,它是我见到的第一款PXA255机器类型。

      Hypercall(超级调用)?

      有一些服务你可以通过使用一个特殊的操作码向仿真器发出请求。在ARM中它是0xF7BBBBBB,在Thumb中它是0xBBBB。挑选这些是由于它们所在的范围ARM保证是未定义的。超级调用号码通过寄存器R12被传递,参数通过寄存器R0-R3被传递,返回值被放置在R0中。
      调用:

  • 0 = 停止仿真
  • 1 = 打印十进制数
  • 2 = 打印字符
  • 3 = 获取RAM大小
  • 4 = 块设备操作(R0 = 操作,R1 = 扇区(sector)号)。请注意,这些不写入仿真的RAM,它们使用另一个超级调用填充了仿真用户访问的仿真器内部缓冲区,一次一个字。我的意思是实现DMA,但是还没有抽出时间去做。操作:

             0 = 获取信息(如果扇区号是0,返回扇区的数量;如果扇区号是1,以字节位单位返回扇区大小)
             1 = 扇区读取
             2 = 扇区写入

  • 5 = 块设备缓冲区访问(R0 = 值输入/值输出,R1 = 字数,R2 = 如果写入为1,其他情况为0)

      Thumb支持?

      完全支持Thumb。我欺骗了一下,解码每个Thumb指令字符串(instr)为等价的ARM指令字符串并执行,以此代替使用ARM仿真器函数。它不像它原来一样快,但是它简单并且代码小巧。可以使用256KB的查找表,但是我感觉256KB对于微控制器的闪存来说太大了。一些Thumb指令不能被转换为ARM指令,它们被正确处理代替。

      我想要建立一个!

      用于非商业目的,你肯定可以做到这一点。接线方式如下:

  • RAM的DQ0-DQ7连接AVR的C0-C7;
  • RAM的A0-A7连接AVR的A0-A7;
  • RAM的A8-A11连接AVR的B0-B3;
  • RAM的nRAM nRAS nCAS nWE连接AVR的D7 B4 B5;
  • SD的DI SCK DO连接AVR的B6 B7 D6;
  • LED的read write连接AVR的D2 D3(LED的其他管脚接地);
  • 按钮连接AVR的D4(其他管脚接地)。

      RAM可以是任何30引脚的16MB的SIMM,可以运行在每64毫秒4000个周期的CAS-before-RAS刷新频率下。我使用的(OWC)可以花几块钱在网上买到。原理图显示在这里,点击它查看大图或点击这里。

      源代码?

      这个代码有点儿乱,但是它可以工作。点击这里下载。许可证简单:用于非商业用途,只要你保留原有的许可证文件和源代码一起,并发布所有你的改动,那么我们都很酷!用于商业用途,请和我联系,我们将在一些事情上达成一致。要在PC上建立仿真器并进行尝试输入“make”。要运行使用“./uARM DISK_IMAGE”。要建立优化的PC版本使用“make BUILD=opt”。要建立AVR运行的版本使用“make BUILD=avr”。现在,它的编译目标是ATmega1284P。要以ATmega644为编译目标,除了要修改makefile,减少icache.h中的数字以便于i-cache足够小来配合644内部的RAM。在归档文件中还包括用于1284p最终的hex文件。

      启动过程

      要在AVR中保留代码空间,几乎没有启动代码存在于仿真器中。事实上,“ROM”总共50字节:8字节用来选择Thumb模式,一些Thumb代码要读取SD卡的第一个扇区并跳到Thumb模式(参看embeddedBoot.c)。SD卡的MBR有另一个bootloader(在Thumb模式下写入)。这个bootloader看着MBR,找到活动分区并加载它的内容到RAM的末尾。然后,它跳到目的RAM地址+512(参看mbrBoot.c)。这里运行着第三个,也是最大的bootloader,ELLE(参看ELLE.c)。这个bootloader重新定位了ramdisk,建立ATAGS,并调用内核。我提供了所有的二进制文件和源代码以便于大家能够按照意愿制作您自己镜像。启动过程会让人回忆起PC开机。:)包含的mkbooting.sh工具可以用来制作用于启动分区的工作镜像。一个完整的磁盘镜像?请点击:第一版镜像,第二版镜像。

      视频

      原始视频分为几个片段,因为我在录像时不得不更换几次照相机电池。然后,我把它们拼接在一起,创建了巨大的3个半小时时长的视频。视频的未剪辑版本?点击这里。然后我剪辑出有意思的部分,把它们加快了3倍(来适合YouTube视频长度限制)并制作了这段视频。在视频中可以看到一个时钟,显示从开始算起消耗的时间。

关键字:Linux  AVR  微控制器 引用地址:Linux如何运行于8位AVR微控制器?

上一篇:基于AVR实现USB2.0无线测控网络
下一篇:Linux已被移植到Atmel的ATmega微控制器

推荐阅读最新更新时间:2024-03-16 13:28

嵌入式Linux下的I2C设备驱动程序设计
  0 引言   由于I2C总线的通用性,Linux作为一款优秀的 嵌入式操作系统 ,也必须要对其要有很好的支持。在Linux内核源码中对I2C总线的驱动是基于总线设备驱动模型的,其驱动程序用到了特殊的几个数据结构,对I2C总线协议进行了更抽象更通用的定义,极大的增加了设备驱动的可移植性。要编写出自己的I2C 设备驱动程序,必须对这种内核I2C总线驱动的架构有深刻的理解。   1 I2C总线的硬件构成   I2C 总线协议只有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL)。SDA 负责数据的传输,SCL 负责数据传输的时钟同步。I2C 设备通过这两条总线连接到处理器的I2C总线控制器上,不同设备之
[嵌入式]
基于单片机和GPRS的矿区铁路道口监测系统
1、引言 矿区铁路是衔接国家铁路与矿区的中间环节,是铁路运输网的重要组成部分。据有关资料统计,目前国内矿区铁路超过2万公里且其沿线附近通常分布着多个道口。由于道口大多分布在远离市区的矿山企业内部,并且其数量多、分散以及道口之间的距离长,加上矿区内各种运输工具的交叉作业及车辆、人员的不固定的流动,使矿区铁路道口的安全管理成为十分突出的问题。为使各级矿区管理部门能及时、准确掌握各个道口的的安全情况,本文以 Atmega128和MC55为核心,设计一套铁路道口监测系统,实现对铁路道口监测管理的自动化、数字化和网络化。这对保证矿区正常生产、提高矿山企业经济效益和通过道口车辆、行人安全具有重要意义。 2、系统组成 整个系统由道口监控中
[单片机]
基于<font color='red'>单片机</font>和GPRS的矿区铁路道口监测系统
Atmel三款带10位ADC的AVR单片机
Atmel三款带10位ADC的AVR单片机Atmel今天宣布推出针对电池充电器、传感器终端和低端马达控制应用的 AVR(R) 闪存微控制器系列的三个新成员。 三款最新14管脚 tinyAVR(R) 产品加入到广泛的 AVR 闪存微控制器系列中。三款设备都具有管脚兼容的特点,仅在闪存、EEPROM 和静态随机存取存储器 (SRAM) 的存储容量上有所不同。ATtiny24 的自编程闪存容量为 2 KB,而 ATtiny44 和 ATtiny84 则分别为 4 KB 和 8 KB。这三款新设备在 20 MHz 工作频率下的吞吐量均可达到 20 MIPS(每秒百万指令)。 由于具备与生俱来的低功耗特点和三种可单独选择的低功耗休眠模式,
[单片机]
AVR单片机—(五)、ATMEGA16的USART与PC机串行通信—03
五、ATMEGA16的USART与PC机串行通信 五—(03)、PC机发送控制指令控制单片机工作~(这个控制还是比较简单的~~ ,不过个人认为还是有水平的~) 还是先上图片~~,然后程序,程序师模块化的,我尽量贴全点~~ 然后就是程序了 IAR5_2.c //------------------------------------------------------------------------------ //控制指令的定义(个人感觉这个才是真正应用呢~~给力~) //上位机界面中,用户需要输入控制下位机的指令 //由于传送的数据比较简单,因此控制指令也可定义的相对简单一些((*^__^*) 嘻嘻……,那本书上
[单片机]
<font color='red'>AVR</font><font color='red'>单片机</font>—(五)、ATMEGA16的USART与PC机串行通信—03
基于AVR的铅酸蓄电池管理系统设计
在工业过程或实验室里,经常需要对多种信号进行同时采集及监测,以便实现性能分析、过程 控制 、系统恢复等目的。目前,常用的数据采集装置,多采用 单片机 实现,软件多采用单任务顺序机制,这使得系统不仅处理能力有限,而且存在稳定性差的问题。以 嵌入式 计算机为核心的 嵌入式 系统由于具有体积小、性能好、功耗低、可靠性高以及面向行业应用的突出特征,成为继 I T网络技术之后,又一个新的技术发展方向 。 本文以嵌入式 S3C2410为核心芯片,设计和实现了一种高速、高精度且具有一定处理能力的数据采集处理系统,并将其应用于工业过程水位和温度的实时监测。 2. 系统总体设计 本设计采用以 ARM9为核心的 S3C2410作为数据采集与处理
[电源管理]
恩智浦携手NTRU提升微控制器安全性
恩智浦半导体 与领先的嵌入式安全软件解决方案供应商 NTRU ,共同发布了首款用于通用型 ARM7 微控制器的基于软件的加密解决方案。软件加密微控制器可用于多种应用,包括信用卡读卡器、门禁系统、 ATM 和机顶盒。通过这种基于软件加密的技术,用户能够升级已安装使用了微控制器的应用的安全性能,从而抵御可能的攻击。 NTRU 业务发展副总裁 Sheila Walker 表示:“在一个日益互联的世界中,各种业务都需要验证并保护其信息安全,加密和安全解决方案就显得尤为重要。即使对于可能携带或传输敏感信息的低成本应用,嵌入式产品设计师们都迫切需要采用复杂的加密技术。” 恩智浦基于 ARM 的微控制器采用了应用中编程(
[新品]
ARM单片机的复位电路介绍
无论在移动电话,高端手持仪器还是嵌入式系统,32 位单片机ARM 占据越来越多的份额,ARM 已成为事实的高端产品工业标准.由于ARM 高速,低功耗低,工作电压导致其噪声容限低,这是对数字电路极限的挑战,对电源的纹波,瞬态响应性能,时钟源的稳定度,电源监控可靠性等诸多方面也提出了更高的要求.ARM 监控技术是复杂并且非常重要的分立元件实现的监控电路,受温度,湿度,压力等外界的影响大而且对不同元件影响,不一致较大板面积,过多过长的引脚容易引入射频干扰,功耗大也是很多应用难以接受.而集成电路能很好的解决此类问题.目前也有不少微处理器中集成监控电路,处于制造成本和工艺技术原因,此类监控电路大多数是用低电压CMOS 工艺实现的.比起用高电
[单片机]
ARM<font color='red'>单片机</font>的复位电路介绍
串行接口键盘控制器SK5278及其在单片机系统中的应用
摘要:SK5278是一种可管理16个按键的键盘控制器,该器件内部具有去抖动处理电路,可直接输出按键的键值编码,并采用串行方式与单片机或微处理器进行接口,使用该器件可简化单片机系统软硬件的键盘接口。文中给出了该器件的特点、管脚说明和使用方法,并以AT89C2051单片机为例给出了相应的接口电路及相应程序。 关键词:键盘控制 串行接口 单片机 SK5278 对于以单片机为核心构成的智能仪器、仪表、工控设备及家用电器而言,构成人机交互的键盘接口电路是必不可少的,而相应的键盘管理软硬件设计却比较麻烦。简单的矩阵键盘存在着占用CPU软硬件资源多、响应速度慢、监控软件编制复杂等问题,专用的键盘接口器件如INTE8279、HD7219又往往
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved