进入嵌入式

我正在努力熟悉嵌入式领域,但在购买时间和设备方面也只有有限的资源。

  • 什么是一种很好的语言来包围嵌入式,而不需要投入太多时间来使用特定于嵌入式的语言? 我最熟悉PHP,Java,Actionscript,但遗憾的是知道很少C.我记得曾经在某处读过有人使用PERL来编程嵌入式系统,但不确定这是否真的可行。

  • 可以在不需要通过模拟器等购买芯片等的情况下完成学习吗?

  • 有人可以推荐一个简化的路线图,以显示一个人如何得到sarted? 我有点不确定从哪里开始。

你需要知道C(但每个程序员都需要知道C!)

大多数这些平台都有一个模拟器/ emualtor,但由于重点是学习真正的应用程序和真正的问题(这与现实世界的时间问题有关),那么你需要一个真正的电路板。

你可能也想要一个示波器(一个非常便宜的第一手慢模拟示波器会做)并且有一些想法如何使用它。

最简单的方法可能是Arduino ,也许更专业,但稍微更难的是Launchpad MSP430

有一些嵌入式编程课程从一个平台和一个风格延伸到另一个平台和风格,但它确实是一个广泛的领域。 不同的处理器可能需要非常不同的策略,不同的应用程序可以规定不同的固件设计策略和不同的微控制器。 这里有一些东西可以帮助你入门….

MSP430

德州仪器(TI)有几种非常便宜的USB开发套件,他们称之为EZ430,它们基于MSP430系列微控制器。 最简单的有一个msp430 f2013,它有2K的闪存程序空间,3×128字节的可用用户闪存(另外128字节页面存在,但它很特别),128字节的RAM(是的,128字节,但它足够用于很多东西)和16个CPU寄存器(其中一些是特殊用途,如堆栈指针,指令指针,状态寄存器,也许还有一两个)。 MSP430还具有多个存储器映射的特殊function寄存器,用于配置和控制内置外设。 MSP430是von Newman处理器,所以一切都在一个地址空间内。 这些程序员和包含msp430 f2013的可移动标签(印刷电路板)的成本约为20美元。 对于大约10美元,您可以使用msp430 2012获得3个替换选项卡,这与2013年(主要是)引脚兼容并且具有一些不同的外围设备。 这些标签有一个LED,一个按钮和几个大通孔(印刷电路板上的孔),它们连接到处理器的引脚。 即使您以前从未焊接过,这些过孔也很容易焊接成电线 – 由于毛细管作用,过孔只是吸收熔化的焊料,而当它很热时,您可以将电线的末端刺入其中。

他们还有一些与802.15.4无线电相似的套件。 即使您对收音机不感兴趣,您仍然可能对这些问题感兴趣,因为他们的程序员还有一个UART从可移动标签上拉过来,并且与上面提到的其他套件上使用的标签兼容。 这些套件还包含至少一个额外的可编程板和一个电池组。 (这些套件中的一个可能包含更多,但我现在没有我的,而且不会查找它)。

他们还有一个套件,可编程手表作为目标平台。 我从未有过这些,但他们有显示器,加速度计和其他一些很酷的东西,但这可能会让你的第一个项目不堪重负。 我建议使用之前的套件来开始使用MSP430s。

您可以以IAR的Embedded Workbench kickstart(4 kb程序空间限制)IDE,Code Composer Studio(也是有限的程序大小,但我认为更高的限制)和gcc / gdb的forms为MSP430提供免费的C编译器和开发环境。 MSP430。 IAR的kickstart很容易快速上手,虽然它并不完美。 您可能会发现必须将其关闭,拔下USB EZ430,重新启动IAR,然后重新插入以重新启动它。 或者也许一些不同的订单会更好地为您服务。

TI还在命名错误的文件中提供了许多示例(所有可下载的文件都不会被严格命名)。 请注意 – 类似的MSP430可能具有用于类似外设的不同器件控制寄存器接口,这可能会造成混淆。 确保您正在阅读的任何文档或示例确实适用于您正在使用的微控制器。

其他小系统

你可以使用许多其他处理器系列和套件,你至少应该对它们有所了解。

AVR – Atmel的8/16位哈佛架构。 哈佛指代代码和工作记忆的单独地址空间。 它有32个8位寄存器,其中一些可以成对使用,作为16位寄存器。 这是一款非常受欢迎且非常酷的处理器。 一些最小的只有寄存器没有额外的RAM,这是可怕的。 Atmel还有一个AVR32,它与AVR完全不同。 除非您使用能够加载新代码的现有引导加载程序,否则需要为这些代码获取JTAG单元。

8051 – 这是一个古老的山丘和屁股的痛苦,直到你终于理解它。 它是一个8/16位处理器,对如何进行16位数学运算有更多限制,并且只有1对寄存器可以充当指针。 它有3个独立的地址空间(堆栈,全局内存和代码)和许多奇怪的(与其他架构相比)function。 如果您使用C编程,那么低级别的东西对您来说可能没什么意义,除非非常简单的C操作可以变成比您想象的更多的代码。 你很可能不希望从这一个开始。

螺旋桨 – Parallax非常有趣的多核处理器,与其他处理器非常不同。 它有几个核心,主要独立工作,可用于模拟外围设备或执行更传统的计算任务。 虽然我愿意,但我从未使用过其中的一种。 从来没有一个似乎适合它的任务。 他们有自己的高级语言来编程它们以及处理器的汇编语言。

更大的系统

在您离开8/16/24位处理器之后,您开始模糊嵌入式和桌面级编程之间的界限,即使它是技术嵌入式的。

AVR32 – 这些有两个主要版本。 一个是哈佛建筑,另一个是冯纽曼。 von Newman版本本质上是一个比ARM更好的ARM,但它并不像ARM那样受欢迎。 尽管我可以说它设计时考虑到了“运行Linux”,但并没有以任何疯狂的方式与它联系在一起。 您曾经能够获得廉价的开发板,并且代码通常几乎像从一台PC复制到另一台PC一样容易加载,尽管您可能会利用uboot和tftp来完成一些工作。 只有当你搞砸启动加载器时才需要JTAG。 我认为所有这些都支持原生JAVA加速。 http://www.AVR32.org

ARM – 最流行的嵌入式处理器。 这些有很多版本。 有些没有MMU(内存管理单元),有些则没有。 对他们说太多了。 有些版本具有原生JAVA加速function,但我认为ARM领主并不能自由地讲述如何使用它的所有细节,因此您必须找到一个知道如何使用它的JVM。 许多供应商都在制造它们,包括Atmel,飞思卡尔,英特尔等等。

MIPS – 一个非常RISC的处理器。 最好的。

还有很多其他的。

编程风格

我可以写3本书,但一般规则是让事情变得简单,因为应用程序可以让你。 例外情况是,如果您可以轻松使用操作系统,则可能希望在简化任务时使用它。

在回答这个问题时你需要知道的第一件事是“什么是”嵌入式系统? GENERAL定义将是专用于单个特定目的的计算机系统。 这并不限制您可以使用的硬件类型,因为事实上“嵌入式PC”已经使用了多年。 QNX实时操作系统自80年代初就已存在,多年来一直用于嵌入式应用的工业PC中。 我个人用于钢厂XRAY厚度计的控制系统。 另一方面,我目前使用TI DSP而没有任何OS支持,只使用256K的Ram。 另一个例子是你车的钥匙链。 旧的用于使用Microchip的PIC单片机。 (这实际上就是公司的名字。)

有些人将iPhone称为嵌入式系统,但由于您可以加载应用程序以执行任何操作,我倾向于说它是具有电话function的掌上电脑。 OLD DUMB手机只是一部手机而非PDA,是一种嵌入式系统。 这只是一点哲学。

作为一般规则,您需要掌握一些用于嵌入式系统编程的概念,并且大多数概念都可以在PC上进行探索。

编辑:推荐C或C ++的原因是C本身是为了进行系统编程而设计的。 C ++保留了它的所有优点,但增加了OOP编程的function。 某些系统可能需要某些ASM。 然而,许多芯片供应商(如TI)提供的工具基本上可以用C ++完成整个系统。 :结束编辑

很多简单的嵌入式系统看起来或多或少都是这样的:

While(true) // LOOP FOREVER... There is no command prompt { // Typically you want I/O to occur on fixed "timebase." wait(timerTick); readDigitalIO(&dioStruct); readAnalogIO(&aioStruct); // Combine current system state with input values // and do some useful calculations. (ie Analog input to temperature calc) Process(dioStruct,aioStruct,&CurrentState); // This can be a serial output/audio buzzer/leds/motor controller // or Whatever the system REQUIREMENT call for. driveOutputs(CurrentState); // The watchdog timer resets your system if it gets stuck. petWatchDogTimer(); } 

这里没有任何东西你无法使用PC。 (无论如何,仍然有一个并行端口的PC。这或多或少只是一个DIO端口。)在没有操作系统的简单系统上,这可能就是全部。 在基于RTOS的系统上,您可能有几个任务看起来都有点simalar,但在任务之间来回传递数据。

当你必须与你自己的硬件接口时,有趣的部分就出现了,我大学gradle后的第一份工作就是在QNX下为数据采集板编写设备驱动程序。

处理硬件或设备驱动程序的基本概念(您可以通过黑客攻击可自由使用的Linux设备驱动程序代码来体验),大多数硬件看起来像程序员只是另一个内存地址。 这称为“内存映射I / O”。 这是什么意思? 让我们以串口为例:

 // Serial port registers definition: typedef struct { unsigned int control; // Control bits for the port. unsigned int baudDiv; // Baud rate divider. unsigned int status; // READ Status bits/ Write resets fifos; char TXdata; // The head of the hardware TX fifo. char RXdata; // The tail of the hardware RX filo. } serRegs; // Using the volatile keyword to indicate the hardware can change the value // independantly from the software. volatile serRegs *Ser1 = (serRegs *)0x8000; // Hardware exists at a specific location in memory. volatile serRegs *Ser2 = (serRegs *)0x8010; // Hardware exists at a specific location in memory. // Bits bits 15-12 enable interupts and select interupt vector, // bits 11-8 enable,bits 7-4 parity,bits 3-0 stop bits. Ser1->status = 1; // Reset fifos. Ser1->baudDiv = CLOCKVALUE / 9600; // Set the baudrate 9600; Ser1->control = 0x1801; // Enable, 8 data, no parity, 1 stop bit. // Write out a "OK\r\n" message; (Normally this would be a loop.) Ser1->Txdata = 'O'; // First byte in fifo Transmission starts. Ser1->Txdata = 'K'; // Second byte in fifo still transmitting first byte Ser1->Txdata = '\r'; // Third byte in fifo still transmitting first byte Ser1->Txdata = '\n'; // Fouth byte in fifo still transmitting first byte 

通常你会有一个函数或一个中断处理程序来处理TX数据,但是例如我想指出硬件在软件继续运行时正在工作。 基本上硬件工作,我写一个地址的值,“STUFF”独立于软件发生。 这可能是嵌入式编程的关键概念之一,如何使计算机效果在现实世界中发生变化。

编辑:

如果你真的想买一块便宜的电路板,Micro开发人员目前的趋势是将一个开发套件放在usb拇指杆上。 此页面包含几个信息,范围从8位到ARM体系结构: http : //dev.emcelettronica.com/microcontrollers-usb-stick-tool

赛普拉斯PSOC是首批采用“FirstTouch入门套件”的公司之一。 PSOC是一个非常独特的部分,它有一个微控制器和“可配置的模拟和数字模块”,允许您使用gui下载ADC,串行端口或数字I / O并自动配置您的C app使用它。 PSOC也可以在DIP包装中使用,这使得它们可以在prototyper的面包板上轻松使用。

想象你的嵌入式控制器坐在关闭的电路中……

  1. 施加Vcc电源并且复位电路断言reset信号。

  2. 时钟已达到运行速度和电压稳定,因此reset被置低。

  3. 现在,您的控制器将其指令指针设置为“复位向量”,即该特定芯片上的物理地址0xE0000000 。 控制器在该位置获取指令。

  4. 中断被禁用,第一项业务是初始化寄存器,例如堆栈指针。 在某些芯片上,有标志位(例如,x86方向标志)需要清零或设置。

  5. 一旦寄存器和标志位设置正确,就可以运行中断服务程序。 到目前为止,当我们通过首先将一些GPIO引脚切换到外部中断控制器来启用中断时,我们必须运行代码到位置0xE0000072 ,然后启用CPU中断屏蔽。

  6. 此时,“设备驱动程序”的等价物以中断服务程序的forms运行。 假设C环境有一个与这些例程的数据结构的接口匹配的库,那么现在我们的引导加载程序代码可以跳转到某些C对象代码的main()函数。

换句话说,将我们从上电带到main()并处理低级I / O的代码写在您选择的芯片特有的汇编程序中。 这意味着如果您希望在嵌入式编程中具有多种function,则必须知道如何从复位向量开始实现汇编代码。

实际情况是,业余爱好者嵌入式编程没有时间来实现所有ISR和引导加载程序代码。 出于这个原因,许多人使用可用于特定芯片的标准软件框架。 其他人使用自定义语言芯片,如BASICstamp。 BASICstamp是一个嵌入式芯片,可以在板上托管BASIC语言解释器。 口译员和所有ISR都是为您预先编写的。 BASIC环境使您能够控制I / O引脚,读取电压,您可以通过嵌入式控制器进行组装,但速度稍慢。

至于语言,C可能是最重要的语言。 从Java开始,您应该能够适应,但请记住,很多高级Java都无法使用。 那里有很多教科书,但我推荐Kernighan和Ritchie编写的原版C编程书http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)

有关嵌入式C的精彩介绍,您可以尝试Michael J Pont的书:

http://www.amazon.com/Embedded-C-Michael-J-Pont/dp/020179523X

至于您可以从Microchip开始的嵌入式方面,IDE可以使用合理的模拟器进行开发,并且c编译器对于稍微有限的学生版c18和c30编译器是免费的,IDE安装程序也会询问您是否想安装你可以使用的第三方HI-TECH C编译器。 至于处理器,我建议选择标准的18系列PIC,例如PIC18F4520。

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002

无论芯片制造商是什么,您都必须了解数据表。 您不必一次学习所有内容,但需要手工完成!

与大多数编程一样,嵌入式也倾向于围绕:

1)初始化资源,在这种情况下,而不是来自数据存储的数据来自计算机寄存器。 只需包含处理器头文件(.h),它将允许您以端口(通常是字节)或引脚(位)的forms访问它们。 此外,微处理器还在芯片上提供了有用的资源,如定时器,模数转换器(ADC)和串行通信系统(UART)。 请记住,芯片本身就是一种资源,需要先进行初始化。

2)使用资源。 C将允许您尽可能地使数据全局化,并且每次都可以访问所有内容! 避免这种诱惑并保持模块化,就像Java会鼓励你一样(尽管为了速度,你可能需要对这些规则稍微松一些)。

但是他们确实有一个额外的武器叫做中断,它可以用来提供实时行为。 这些可以被认为有点像OnClick()事件。 中断可以由外部事件(例如按钮或从另一个设备接收字节)和内部(定时器,传输完成,ADC转换完成)​​生成。 保持中断服务程序(ISR)简短和甜蜜,使用它们来处理实时事件(例如,接收一个字节并将其存储在缓冲区中然后引发标志)但允许后台代码处理它(例如检查接收到的字节)标志,如果设置则读取接收到的字节)。 并记住ISR例程和后台例程使用的变量的所有重要volatile

无论如何,阅读,我推荐www.ganssle.com一般的建议。

祝好运!

  1. 嵌入式计算的范围已经变得非常广泛,因此答案在某种程度上取决于您的目标是什么类型的设备。 一方面,有8位控制器只有几KB内存,通常完全用汇编或C编程。另一方面,路由器等处理器相当强大(200 MHz和几MB RAM)并不常见)并经常运行像Linux这样的操作系统,这意味着您可以使用几乎任何语言,尽管C和Java是最常见的。

  2. 最好买一个真正的芯片和实验。 所涉及的大部分工作通常是了解设备以及如何与设备进行交互,因此使用模拟器会破坏目的。

什么是一种很好的语言来包围嵌入式,而不需要投入太多时间来使用特定于嵌入式的语言?

正如每个人都会建议的那样:C。现在,根据您要深入挖掘所选平台的深度,您可能还需要一些assembly,但不要害怕:通常您只会使用一点。

如果你正在学习C,我个人的建议是:按照你在assembly中的方式工作; 编程语言不会给你很多抽象,所以想一想内存管理。 当你学会了如何做到这一点时,就会向抽象方向迈进,过得开心。

C ++在嵌入式平台上也很受欢迎,但恕我直言很难,除非你很清楚如何在C语言中编程,你也可以理解它的抽象概念。

当您对C / C ++充满信心时,您可能会开始使用嵌入式操作系统。 您会注意到它们与您选择的操作系统完全不同(例如,并非所有操作系统都有C标准库 ,在用户空间和内核空间之间进行处理和拆分)。

您将学习如何构建交叉编译器,如何搞乱链接器脚本,二进制格式的技巧和许多很酷的东西。

从理论的角度来看,还有很多东西:如果你学习计算机科学,你可以获得嵌入式系统的硕士学位。

可以在不需要通过模拟器等购买芯片等的情况下完成学习吗?

是的:许多操作系统可以在qemu等模拟器上运行。

有人可以推荐一个简化的路线图,以显示一个人如何得到sarted? 我有点不确定从哪里开始。

尝试获得一个简单的操作系统,可以在模拟器上运行,破解它并跟随你的好奇心。 不要害怕乱糟糟的代码。

1)大多数时候,通常是低端嵌入式系统,你需要知道C.

我仍然会建议您使用一个vanilla开发板来熟悉工作流程以及使用嵌入式系统(例如调试和交叉编译)的棘手部分。 如果你只依赖于模拟器,你将遇到麻烦。

您可以尝试使用The Linux Stamp,它并不昂贵且对初学者有好处,但您确实需要一些关于Linux的先验知识。

2)对于高端嵌入式系统,一个很好的例子是来自HTC的智能手机(CPU速度可以达到1Ghz)或其他一些Android手机,它运行速度很快,你甚至可以在上面编写Java代码。

  • C和特定于芯片的组件。

  • 不,你真的需要一个真正的芯片。 模拟器不是真实的东西。 你需要能够处理按键抖动,电压时髦等。

  • Arduino是嵌入式爱好者的当前潮流。 我个人而言,我不是哈佛建筑的忠实粉丝。 但是你会在那里找到大量的帮助。 我使用XCore进行论文工作,我发现编写多核东西非常容易。 我建议从AVR32开始,然后从那里开始。

正如其他人所说,你需要知道C.

看一下廉价开发板的AVR蝴蝶。

Smileymicros有一个简单的工具包,包含开发板和书籍: http ://www.smileymicros.com/index.php?module = pagemaster&PAGE_user_op = view_page&PAGE_id = 41

即将推出的Raspberry Pi板看起来像是一种非常便宜的方式进入这个领域。

是的,Arduino将是最佳选择。 同意..便宜(约20美元开始),并有很好的API来开始高级function。 C是必须的,不能避免它。 但如果你能用其他语言编程,那么你将会很好。

我的建议是从http://www.sparkfun.com开始购买大量的工作示例和有用的提示,了解要购买的设备。