我正在努力熟悉嵌入式领域,但在购买时间和设备方面也有限的资源.
什么是一种很好的语言来包围嵌入式,而不需要花太多时间学习嵌入式特定语言?我最熟悉PHP,Java,Actionscript,但遗憾的是知道很少C.我记得曾经在某处读过有人使用PERL编程嵌入式系统,但不确定这是否真的可行.
可以在不需要通过模拟器等购买芯片等的情况下完成学习吗?
有人可以推荐一个简化的路线图,以显示一个人如何得到sarted?我有点不确定从哪里开始.
Martin Becke.. 25
你需要知道C(但每个程序员都需要知道C!)
大多数这些平台都有一个模拟器/ emualtor,但是由于重点是学习真正的应用程序和真正的问题(这些都与现实世界的时序问题有关),那么你需要一个真正的电路板.
你可能也想要一个示波器(一个非常便宜的第一手慢模拟示波器会做)并且想知道如何使用它.
最简单的方法可能是Arduino,也许更专业,但更难一点是Launchpad MSP430
你需要知道C(但每个程序员都需要知道C!)
大多数这些平台都有一个模拟器/ emualtor,但是由于重点是学习真正的应用程序和真正的问题(这些都与现实世界的时序问题有关),那么你需要一个真正的电路板.
你可能也想要一个示波器(一个非常便宜的第一手慢模拟示波器会做)并且想知道如何使用它.
最简单的方法可能是Arduino,也许更专业,但更难一点是Launchpad MSP430
有一些嵌入式编程课程从一个平台和一个风格延伸到另一个平台和风格,但它确实是一个广泛的领域.不同的处理器可能需要非常不同的策略,不同的应用程序可以规定不同的固件设计策略和不同的微控制器.这里有一些让你入门的东西......
MSP430德州仪器(TI)有几种非常便宜的USB开发套件,他们称之为EZ430,它们基于MSP430系列微控制器.最简单的有一个msp430 f2013,它有2K的闪存程序空间,3x128字节的可用用户闪存(另外128字节页面存在,但它很特别),128字节的RAM(是的,128字节,但它足够用于很多东西)和16个CPU寄存器(其中一些是特殊用途,如堆栈指针,指令指针,状态寄存器,可能还有一两个).MSP430还具有多个存储器映射的特殊功能寄存器,用于配置和控制内置外设.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的形式获得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个独立的地址空间(堆栈,全局内存和代码)和许多奇怪的(与其他架构相比)功能.如果您使用C编程,那么低级别的东西对您来说可能没什么意义,除非非常简单的C操作可以变成比您想象的更多的代码.你很可能不希望从这一个开始.
螺旋桨 - Parallax非常有趣的多核处理器,与其他处理器非常不同.它有几个核心,它们主要独立工作,可用于模拟外围设备或执行更传统的计算任务.虽然我愿意,但我从未使用过其中的一种.从来没有一个似乎适合它的任务.他们有自己的高级语言来编程它们以及处理器的汇编语言.
更大的系统在您离开8/16/24位处理器之后,您开始模糊嵌入式和桌面级编程之间的界限,即使它是技术嵌入式的.
AVR32 - 这些有两个主要版本.一个是哈佛建筑,另一个是冯纽曼.von Newman版本本质上是一个比ARM更好的ARM,但它并不像ARM那样受欢迎.尽管我可以说它设计时考虑到了"运行Linux",但并没有以任何疯狂的方式与它联系在一起.您曾经能够获得这些便宜的开发板,并且代码通常几乎像将文件从一台PC复制到另一台PC一样容易加载,尽管您可能会使用uboot和tftp来完成一些工作.只有在搞砸启动加载程序时才需要JTAG.我认为所有这些都支持原生JAVA加速.www.AVR32.org
ARM - 最流行的嵌入式处理器.这些有很多版本.有些没有MMU(内存管理单元),有些则没有.对他们说太多了.有些版本具有本机JAVA加速功能,但我认为ARM领主并不能自由地告知如何使用它的所有细节,所以你必须找到一个知道如何使用它的JVM.许多供应商都在制造它们,包括Atmel,Freescale,Intel和许多其他供应商.
MIPS - 一个非常RISC的处理器.最好的.
还有很多其他的.
编程风格我可以写3本书,但一般规则是让事情变得简单,因为应用程序可以让你.例外情况是,如果您可以轻松使用操作系统,则可能希望在简化任务时使用它.
在回答这个问题时你需要知道的第一件事是"什么是"嵌入式系统?GENERAL定义将是专用于单个特定目的的计算机系统.这并不限制您可以使用的硬件类型,因为事实上"嵌入式PC"已经使用了多年.QNX实时操作系统自80年代初就已存在,多年来一直用于嵌入式应用的工业PC中.我个人用于钢厂XRAY厚度计的控制系统.另一方面,我目前使用TI DSP而没有任何操作系统支持,只使用256K的Ram.另一个例子是你车的钥匙链.旧的用于使用Microchip的PIC单片机.(这实际上就是公司的名字.)
有些人将iPhone称为嵌入式系统,但由于您可以加载应用程序以执行任何操作,我倾向于说它是具有电话功能的掌上电脑.OLD DUMB手机只是一部手机而非PDA,是一种嵌入式系统.这只是一点哲学.
作为一般规则,您需要掌握一些嵌入式系统编程概念,其中大部分都可以在PC上进行探索.
编辑:推荐C或C++的原因是C本身是为了进行系统编程而设计的.C++保留了它的所有优点,但增加了OOP编程的功能.某些系统可能需要某些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. (i.e. 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,但在任务之间来回传递数据.
当你必须与你自己的硬件接口时,有趣的部分就出现了,我大学毕业后的第一份工作就是在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的面包板上轻松使用.
想象你的嵌入式控制器坐在关闭的电路中......
施加Vcc电源并且复位电路断言reset
信号.
时钟已达到运行速度和电压稳定,因此reset
无效.
现在,您的控制器将其指令指针设置为"复位向量",这是0xE0000000
该特定芯片上的物理地址.控制器在该位置获取指令.
中断被禁用,第一项业务是初始化寄存器,例如堆栈指针.在某些芯片上,有标志位(例如,x86方向标志)需要清零或设置.
一旦寄存器和标志位设置正确,就可以运行中断服务程序.到目前为止,0xE0000072
当我们通过首先将一些GPIO引脚切换到外部中断控制器来启用中断时,我们必须运行代码到关于位置,然后启用CPU中断屏蔽.
此时,"设备驱动程序"的等价物以中断服务程序的形式运行.假设C环境有一个与这些例程的数据结构的接口匹配的库,那么现在我们的引导加载程序代码可以跳转到main()
某些C对象代码的功能.
换句话说,将我们从上电引入main()
并处理低级I/O的代码写入您选择的芯片所特有的汇编程序中.这意味着如果您希望在嵌入式编程中具有多种功能,则必须知道如何从复位向量开始实现汇编代码.
实际情况是,业余爱好者嵌入式编程不允许有时间实现所有ISR和引导加载程序代码.出于这个原因,许多人使用可用于特定芯片的标准软件框架.其他人使用自定义语言芯片,如BASICstamp.BASICstamp是一个嵌入式芯片,可以在板上托管BASIC语言解释器.口译员和所有ISR都是为您预先编写的.BASIC环境使您能够控制I/O引脚,读取电压,您可以通过嵌入式控制器进行组装,但速度稍慢.