假设您有一个相当简单和小型的微控制器,没有接口,没有计算机,没有调试器,编译器或汇编器。您能否以汇编形式编写代码,将其(手动)转换为机器代码,然后使用电压源向适当的引脚供电?
我知道您需要适当的I / O和内存才能真正执行任何操作,但是如果您如此倾向于并有时间,可以执行此操作吗?从历史上看,我猜想当没有计算机/编译器/汇编器开始时是如何做到的?随时将我链接到外部资源。谢谢!:)
假设您有一个相当简单和小型的微控制器,没有接口,没有计算机,没有调试器,编译器或汇编器。您能否以汇编形式编写代码,将其(手动)转换为机器代码,然后使用电压源向适当的引脚供电?
我知道您需要适当的I / O和内存才能真正执行任何操作,但是如果您如此倾向于并有时间,可以执行此操作吗?从历史上看,我猜想当没有计算机/编译器/汇编器开始时是如何做到的?随时将我链接到外部资源。谢谢!:)
Answers:
您能否以汇编形式编写代码,将其(手动)转换为机器代码,
是!
如果愿意,可以用二进制代码“超出您的头脑”编写代码。
很久很久以前,这就是我开始使用(然后)微处理器的方式。
我和朋友会用汇编语言编写代码,将其手动编译为机器代码(经过一些练习,您可以通过“检查”来完成),然后通过各种方式将其输入到处理器中。在我们构建的一个系统上,我们将在二进制(on-off)开关上设置地址,或者使用处理器的自动递增功能,在二进制开关上输入8个数据位,然后按“时钟”开关将数据输入内存。
使用串行SPI编程,在现代微控制器上只需更少的开关就可以实现等效功能-参见下文。
...然后使用电压源向适当的引脚供电?
是!
但这将非常缓慢!
许多现代微控制器都允许使用“ SPI”接口进行编程。
它通常由输入和输出数据线和一条“时钟”线,通常是一条复位线组成。
许多处理器允许SPI时钟和数据为“静态”,这意味着在位之间建立数据所需的时间没有限制。您可以使用由手动操作的开关驱动的数据线和时钟线对此类处理器进行编程。时钟线需要“无反弹”-您需要能够在每次操作的一次转换中将其设置为高电平或低电平-因此最小接口可能需要包括施密特触发的门。您可以“摆脱” RC延迟和按钮开关,但施密特触发的输入更为安全。数据线不需要跳动,因为它的状态仅在时钟沿读取。
某些接口是交互式的-数据在编程期间由处理器输出(例如,数据输出= MISO = AVR处理器上的主机输入串行输出)。要阅读此内容,您需要添加一个LED和一个电阻(如果驱动能力真的很低,则可能需要添加一个缓冲器或晶体管)。
MC6800:
来自半衰落的记忆(将近40年!)
LDI A,$ 7F ...... 86 7F ...... 1000 0110 0111 1111
STA,$ 1234 ...... B7 12 34 ... 1011 0111 0001 0010 0011 0100
LDI X,$ 2734 .. 。CE 27 34 ... 1100 1110 0010 0111 0011 0100
... ...
最初,在可编程机器中,程序被手动打孔到纸带或卡片中。后来,他们使用一台打字机进行打孔,甚至后来,计算机(当时已经广为人知)仍然可以打孔自己的纸带。
从字面上看,它是拿着卡片坐在那里,然后在其中手动打孔。
每列都是一条指令或数据位,由CPU的状态机解释以执行任务。
现在,如果所有的都是闪存,是的,首先将数据存储在其中通常需要一台计算机来完成。但这并不完全是100%正确的。
毕竟,计算机和硬件程序员会做什么,但要在正确的时间设置IO引脚的状态?因此,如果您确实有足够的自虐能力,则可以构建一个系统,该系统允许您以正确的方式将正确的指令发送到微控制器的编程引脚,以将一些指令安装到闪存中以执行。
也许涉及很多开关,一些移位寄存器,时钟发生器等。
我记得在大学时,我们有一个基于Z80的新型编程系统-一个单位的大小,包括一个Z80手提箱,一些少量的RAM,一堆7段LED显示屏和一大排开关。通过使用开关将指令手动加载到RAM中进行编程。
您说:“小型微控制器,没有接口,没有计算机,没有调试器,编译器或汇编器。” 好吧,您无需计算机,调试器,编译器或汇编器就可以解决问题,但是必须具有某种接口才能与微控制器连接才能加载程序。
首先,不要考虑任何高级语言,例如C。然后,最简单的方法是用汇编语言编写程序,但不要使用汇编程序将其转换为机器代码。而是在编程手册中查找每个汇编指令,找到其等效的十六进制编码,然后写下来。
您将必须分配自己的变量,因此可以在指令的操作数部分中填写适当的地址。还忘了使用堆栈和堆的工作量。完成后,您将拥有一个可以直接加载到微控制器的闪存中的机器程序-也不需要链接器。
由于几乎所有微控制器上都缺少外部地址和数据总线(因为它们占用了I / O端口和外围设备所需的太多引脚),因此实际上所有微控制器都通过如下特殊接口进行编程:
通常,左侧的“编程器”将连接到PC,该PC将下载由编译器/链接器生成的机器文件。
但是,如果程序员有键盘,例如下面的键盘:
然后,您可以将一个手动生成的程序的十六进制代码直接输入到编程器中,而无需使用您要查询的编译器,链接器或PC来对设备进行编程。(键盘也用于编辑十六进制文件,并生成校验和。)
很少有程序员会使用这种键盘。这可能不适合业余爱好者,因为它可能要花费几千美元。
这个特殊的程序员在将零件放到板上之前对其进行编程。接口和插座可用于多个PIC,以及Atmel AVR等。
实际上,诸如手动切换JTAG引脚之类的操作很容易出错。要输入任意大小的程序,将需要进行数千次切换。但从理论上讲,这是可能的。
如果允许您事先准备微控制器(或为其编写引导ROM),则可以轻松实现类似早期大型机上使用的外部拨动开关的功能。如果允许外部逻辑,甚至可以使用十六进制键盘来加快处理速度。
最后,尽管现在不那么普遍了,但是您可以购买带有自定义代码的基于ROM的微控制器。您必须预先提供一些资金并保证一定的数量,但是我看到客户这样做是为了节省大量生产的费用。在这种情况下,根本不需要外部信号即可对微控制器进行编程。该代码将内置到芯片的物理布局中。
当然,您也可以使用在外部存储器接口之外运行代码的微控制器,但这是在作弊。:-)
绝对。实际上,我参加的第一门微处理器课程(大约87课)使用了Motorola 68000开发板。我们将在汇编中计算代码,查找汇编的十六进制,然后在终端中键入该十六进制以对电路板进行编程。如果进行了编辑,则必须确保输入的代码比要替换的代码短,然后用NOP缓冲其余代码。如果coDE较长,则必须重新输入所有内容!我们学会了添加大量的NOP。
绝对。一旦有了实际指令的二进制格式(对于指定好的指令集很容易做到),您所需要做的就是实现编程协议。
例如,拿一些像 AVR Tiny 4。第14节详细介绍了编程接口,包括协议和物理层。它相对简单,只需要几个按钮和上拉/下拉电阻就可以发送/接收1或0。如果您有雄心壮志,请添加一些LED来回读输出。
最后剩下的问题是您是否可以足够快地完成它,这很幸运*,对于AVR Tiny 4(第16节),在编程时没有任何最低频率。
*注:根据数据表的规定。实际情况可能有所不同...我怀疑有人尝试过以mHz时钟速度对其进行编程。
随意将其自动化/尽可能少地完成所需的过程。无论如何,这就是大多数编程设备所要做的:使过程自动化。
不仅可以在没有计算机的情况下对微控制器进行编程,而且今天您实际上可以购买专门设计为使用硬件拨动开关编程的计算机。该工具包称为会员卡,它是1970年代COSMAC Elf计算机的再生产。该工具包在IEEE Spectrum杂志的最新文章中有所描述。也可以从PC编程会员卡的最新版本。
好的。怎么样了:如前所述,您可以用汇编器编写程序并自己查找操作码。如何在计算机中获取它:拿起旧的磁带播放器,取下播放头,但离开绞盘和压纸轮。这将是您的交通工具。如果您有线对线播放器,则可以将播放头保持在原位。
然后,取一长又窄的纸条,或什至更好的透明胶带。在这里编码程序。您可以使用要编程的针脚使用尽可能多的轨道。在一条轨道上,您定期放置黑点;这是你的时钟。在其他轨道上,您会根据数据和信号放置黑点或小条,并留空。您可以照亮整个物体,并用小型光电晶体管对其进行检测(或者将一个LED照在胶带上,并使用其他类似的LED来检测光),并使用晶体管驱动时钟和信号线。这会在磁带播放器上占用一些空间,这就是为什么您可能需要卸下播放头的原因。
当然,您也可以将信号编码为音频,但是解码要复杂一些。或者,您可以检测反射光而不是透射光。或者,您可以在深色胶带或纸胶带上打孔,而不是在透明胶带上打上黑色标记。随你。磁带播放器以恒定速度驱动磁带,因此您无需计算机即可输入时钟信号。
是。主要问题可能是与编程界面进行交互。如果您有简单的地址和数据总线,则事情会容易一些。您是否见过一些真正早期的计算机?通过前面的开关,程序一次输入一个指令到RAM中。
Digital Equipment的40年前的PDP-8微型计算机没有自动启动功能。程序通常是从打孔的纸带加载的,但是用于加载纸带的加载器必须在前面板开关上手动输入。
在Digital和PDP-8客户的站点(例如将它们用作当今的嵌入式控制器的OEM厂商)中,用户记住引导加载程序并相互竞争以最快的速度进入引导程序并不少见。装入机器。这些机器使用了磁芯记忆(手在世界上遥远的地方,由女性用细小的手指,用针和细细的线子绞在一起)。
由于磁存储器的内容是非易失性的,因此引导加载程序在掉电后仍可幸存,并且仅在初始组装后才需要手动输入,因此该加载程序被程序错误或使用加载程序空间所需的程序清除了。