在Atmega32上实现运行片外程序的猜想

        在讨论这个问题之前,可以先参考一下Linux是如何执行存储器上的程序。我们常见的程序基本上是一段机器代码储存在硬盘或者类似的低速存储器上。Linux可以通过虚拟内存技术,将这段程序代码复制到指定的RAM空间内。而我们常用的ARM芯片具有片外内存扩展功能,ARM的PC指针将指向复制的那一段机器代码并且运行直到结束。结束后Linux将这段代码从RAM中删除掉以便释放空间。Linux在程序的格式上用ELF编排,ELF定义了该程序如何被复制到虚拟内存(即片外RAM)上、如何调用Linux的系统头文件(例如printf)。

        AVR的Atmega32的问题在于不支持片外扩展存储器,也没有相关的汇编指令可以执行片外的机器代码。不仅如此,即便是从外部存储器取出来的机器代码也不可能复制到片内的flash rom(AVR给出的官方资料是片内ROM只能刷写10000次,而且只能通过ISP刷写)。这样以来貌似Atmega32无法实现执行片外程序的功能。有些人设想通过翻译器的原理来实现,但是对于片内资源如此紧张的单片机来说简直是天方夜谈。另外,翻译器使原本速度就不够快的单片机在翻译的过程中浪费了大量时间。

       说到这里,是不是觉得没有办法了。其实我最近想到了一个方法,我们不妨用最简洁的C程序去模拟一下单片机的内部运行结构。比如说从SD卡中读取一串机器代码,利用软件方法模拟片外扩展内存,将代码放置在片外RAM内。将这些机器代码从RAM中读出并且通过软件程序模拟单片机的汇编指令。上述所用到的寄存器组、PC,状态寄存器等都可以用片内的RAM来代替与指定。。。

      目前已经可以在SD卡上存入一个hex文件并且直接通过Atmega32运行。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值