什么是用于教自己汇编语言的好嵌入式平台?

时间:2011-01-10 10:22:14

标签: embedded assembly

我有相当多的编程经验,但它都是高级语言。我最近选择了C,那个项目非常顺利,学习经验非常值得。

现在我想更进一步学习汇编语言,但理想情况下我想在嵌入式平台上学习,因为我看到了我未来的一些项目。问题是,哪个是初学者的最佳起点或“套件”?

我正在寻找一些相当容易组合的东西,可以做“真实世界”的事情,并且通常提供一个可以构建的良好基础。

5 个答案:

答案 0 :(得分:2)

AVR不是最好的指令集。我会保存它为第二或第三指令集。但最终你可能会在那里结束,因为arduino非常受欢迎,并且通过社区得到了很好的支持(虽然asm不是那个世界的例外)。

现在你可以以4.30美元的价格购买msp430主板,基本上TI正在花费这些费用来解决这些问题。 msp430是一个很好的学习指令集。

armmite pro不是一个坏的,arduino大小的板,但使用手臂而不是avr。手臂和拇指是很好的指令集。

对于几乎所有内容都有模拟器,如果不是,编写模拟器是了解事物如何工作的一种非常好的方法。如果没有别的,我通常建议你写一个反汇编程序。

使用C编译器的指令集也很好,你可以编写一些C代码,使用优化,看看输出什么类型的汇编程序,并学习汇编程序的不同内容。首先要学习效率和性能的一些技巧,以后你将能够胜过编译器,或者至少可以达到标准。所有提到的都有某种C编译器,avr和msp有办法让gcc工作,主线编译器支持arm和thumb。 Llvm自动是一个交叉编译器,所以你不必编译一个编译器来开始,msp430后端到llvm是实验性的,但应该工作或接近,arm和thumb后端很好(在clang中使用-m32以避免64位64位主机上的整数。)

stellaris芯片以前是杰出的微型,现在ti(德州仪器)很好,拇指/拇指2只。 mbed实际上非常好,除了蓝色LED(给我偏头痛)你不需要提交沙箱,插入USB,它像文件系统一样安装,将.bin文件复制到闪存,按下重置按钮它运行你的程序。

sparkfun.com是您的朋友,开发者工具,并且有很多基于微控制器的主板,来自所有玩家。我提到的msp430板大约是5美元的东西,armmite专业版,arduino的很多种,我推荐Lilly pad,它和arduino专业版的价格大致相同,但是已经有焊头用于小usb连续的东西,你也想购买。 stellaris没有代表sparkfun,但很多50美元的主板都是。

msp430主板,armmite pro,arduino主板,stellaris,mbed等需要通常通过usb线缆供电,或者有些需要基于ftdi的usb到串口的东西

如果你去模拟器路线,qemu支持许多指令集,arm / thumb。那里有gameboy和nds模拟器。想法nds模拟器,源代码形式为arm9和arm7配备了arm内核,但我并没有试图提取和使用它们。如果你想上学,那里有大量6502和z80模拟器,有些编译器信不信由你,当然是汇编程序。

我将学习的最后一个汇编程序是x86,可怕的指令集以及变量和微编码,你不会全面胜过编译器,是你当时的计算机,但是所有的x86计算机都不值得花时间。其他指令集更为重要(arm,thumb,thumb2,avr)。

答案 1 :(得分:0)

对于AVR嵌入式平台,您可以使用免费WinAVR,它集成了模拟器,因此即使没有真正的电路板也可以轻松学习ASM。您可以找到ASM教程here。可以找到AVR的快速启动指南here。例如,所有Arduino CPU板都内置了AVR,因此您有很多选择。

答案 2 :(得分:0)

我有点偏向低端的14位PIC指令集(Microchip)和高端的ARM指令集。两者都相对简单,但功能强大。 PIC 18F系列具有更强大的指令集,但在美学上我并不喜欢它。

答案 3 :(得分:0)

  

现在我想进一步学习汇编语言

这是真的更进一步,还是退步?可以说,这是一条通向更深层次理解的道路,但这并不是提高生产力的途径。


没有一种“汇编语言”,每个处理器架构都有自己的指令集,所以学习 汇编语言只能让你编程特定目标(尽管它也会为你提供一般技能)在低级编程和理解处理器如何工作)。您生成的代码也将特定于一个体系结构,因此您在代码中的所有工作和投入将远远低于高级语言。如果最终你选择的架构变得过时(并且有许多架构已经过时),那么除了它可能提供的一般技能之外,你对该架构的装配技能在很大程度上变成了冗余知识(学习新的指令集和架构会更快)

除非你要做很多汇编程序并且对某个特定的指令集非常熟练(并且有充分的理由这样做),否则学习汇编程序的价值有限。如果您正在实现启动代码来初始化处理器并为C或C ++代码建立运行时环境,这很有用,但这可能主要由芯片或工具供应商提供,而您不需要完整的未完成使用或改编此类代码的架构或指令集。

使用汇编程序的一个经常建议的论点是性能,但一般来说,优化编译器将生成几乎与专家汇编程序员一样或几乎同样有效的代码,并且通常比不熟练的程序员更有效。您可以看到,就目标指令集和体系结构而言,编译器本质上是一个专家系统。它通常知道每个可用指令及其执行时间,每个寄存器,每个寻址模式,并理解流水线,缓存和分支预测机制等。在一个复杂的处理器上,编译器的专业知识将超过所有最专业的全职汇编程序员,在简单的处理器上,无论如何都可以获得更少的东西。

汇编程序可能有用的一个方面是利用编译器或其库可能无法触及的某些处理器的各个方面。例如,在DSP处理器上使用汇编程序是很常见的,但即使使用优化的DSP库(通常用汇编程序编写),或者编译器识别并可以优化的编译器扩展或语言习惯,这在很大程度上是不必要的,并且学习a具有SIMD和并行执行功能的DSP指令集是一项重大投资。

上次需要使用汇编程序而不是C运行时启动代码时,是将代码从一个ARM定义移植到一个带有VFP协处理器的新定义器;虽然重新编译的库使用了VFP,但sqrt()函数是使用收敛算法而不是硬件sqrt指令实现的。一个功能,一个或两个装配线;我当然不需要学习 ARM指令集来实现这一目标。

我详细了解的唯一装配语言是Z80和8051.那是很久以前的事了,我已经完全放弃了,现在知识已经基本上已经过时了。然而,所学的一般技能确实允许我调整系统并按照已经描述的方式进行电路板启动,但是作为一个招募其他嵌入式系统开发人员的人,我不会那么多地关注候选的装配技能。

我认为使用汇编语言你需要旅游/短语书级别的知识才能在你需要的时候得到,或者说它就像一个本地的这样你的技能就具有真正的价值,中间的任何东西都没什么价值。

那就是说,如果你必须,或者觉得有必要,我建议使用ARM Cortex M3设备。不太可能很快就会过时(来自多个被许可方供应商的设备),并且足够复杂和现代化,无法为其他架构提供良好的基础。

答案 4 :(得分:0)

比学习汇编程序更重要的是,至少要学习两个。现有体系结构有很多种,并且知道几个程序集看起来是避免过度概括假设的好方法。

许多装配课程都使用MIPS。 MIPS指令集很简单,高端PIC微控制器(来自Microchip)使用它。 MIPS处理器常见于家用路由器中。 OpenWRT是许多基于Linux的家用路由器的替代固件。与OpenWRT兼容的路由器价格为50美元,是进入嵌入式系统世界的一种便宜而简单的方法。

许多移动平台,特别是手机,都使用ARM处理器(实际上,所有智能手机和平板电脑都使用ARM衍生产品,但我读到大约15%的廉价非智能手机仍使用其他东西,通常是MIPS )。 ARM平台有点复杂;有几个指令集(原始的26位ARM,32位ARM,Thumb,Thumb-2)和几个调用约定(ATPCS,AAPCS ...)。基于ARM的开发套件可以从几个供应商处购买,例如Gumstix。有一些基于ARM的路由器运行OpenWRT,但它们比基于MIPS的路由器更不常见。

汽车和飞机行业似乎非常喜欢其嵌入式系统的PowerPC处理器。此外,目前的主要游戏机都使用PowerPC架构(PS3,Xbox 360,Wii)。对于PowerPC开发平台,我建议购买旧的Mac,例如在Ebay或翻新的电脑经销商处。有来自Low End Mac的指针;寻找配备G3或G4的机器。我在Ebay买了一台基于G3的“翻盖”iBook,价格为60美元;有了NetBSD,这是一个完美的基于PowerPC的开发平台。

任何PC中的x86 CPU也应该进行研究,只要因为它如此普遍。您正在使用的机器,打赌它是PC或者2005年之后的Mac,是您的开发平台,因此价格便宜(您已经拥有硬件)。指令集“不优雅”。不要把它当作你的第一次集会,但要看看你的第二次或第三次集会。每隔一年左右,x86处理器就开发出一套新的附加指令,所以现在它们有数百个指令,这些指令可能非常庞大;我建议从original 80386的说明开始。

已经使用了一些其他架构,并且仍然用于嵌入式产品,例如68000,但他们更罕见。请注意,我在这里谈论“大”嵌入式产品。还有一些较小的系统,如AVR,前MIPS PIC,80C51 ......这取决于当你说“嵌入式”时,你会想到“家用路由器”或“可编程烤箱”。

无论如何,我还建议使用QEMU。 QEMU是一个软件模拟器。它能够在基本PC上运行功能齐全的虚拟ARM或基于MIPS的计算机,并配有操作系统(例如Debian Linux)。它无法帮助您进行与时序相关的优化,但它使开发和校正测试变得更加容易。