ARM

ARM中有5种异常模式,有7种中断源。这7种中断源中有些中断是我们希望发生的,但有些中断是我们不希望发生的。

我们希望发生的中断:

软中断:属于svc模式,通过SWI指令便可以产生软中断,进入到svc模式。

irq中断:属于irq模式,当产生普通的外部中断时,处理器便进入到IRQ模式。

fiq中断:属于fiq模式,当产生高优先级外部中断时,处理器便进入到FIQ模式。

我们不希望发生的中断:

复位:属于svc模式,当系统上电时便会产生复位中断,系统进入到svc模式。复位中断不需要中断返回。

取指中止中断:属于abt模式,当预取指发生错误时,便产生取指中止中断,进入到abt模式。

数据中止中断:属于abt模式,当访问数据存储器时,便产生数据中止中断,进入到abt模式。

未定义指令中断:属于und模式,当执行到一条未定义指令时,便产生未定义指令中断,系统进入到und模式。

中断的优先级:

ARM中有6个优先级。各个中断的优先级顺序如下:(1 6 6s 5 2 4 3)

复位: 1
数据中止中断:2
fiq中断:3
irq中断:4
预取址中止中断:5
未定义指令中断和软中断:6

关于各种中断在中断返回时还需要给LR减去一个不同的偏移量的问题我觉得没必要深入研究了,这还要涉及到ARM指令的流水线技术,平时写中断代码都是用C写的,没必要知道这个。用到时再去查表即可。

ARM中的异常和中断

处理器在进入异常和退出异常时所做的工作:

进入异常时:

1、将要返回处的地址保存在对应异常模式的LR中。(复位不需要保存返回地址)
2、将cpsr的内容复制到对应异常模式的spsr中。
3、强制修改cpsr的内容,进入到相应异常模式以及根据需要修改某些位。
4、强制PC从相应的中断向量地址处进行取址。

注:以上这些步骤都是有cpu自动完成的,也就是当有中断产生时,硬件就会自动完成上述步骤。

退出异常时:

1、将LR中保存的地址赋给PC。
2、将spsr的内容恢复给cpsr。
3、将irq中断禁止位清零。

注:只需要在异常处理程序中写一句返回指令(如上面的表4.1所示)即可全部实现上述的步骤。

转自: frank_yxs

围观 3
65

机载电台担负着空空和地空之间通信,为保证电台性能,需要对其进行定检。基于单片机的检测仪存在测量速度慢、可扩展性差的问题;而基于PXI仪器或VXI仪器的检测仪存在着功耗大、体积大、价格高等缺点。为解决上述问题,利用基于ARM处理器来实现电台检测控制器成为重要的发展方向,ARM是一种高性能、低功耗的RISC结构处理器,由于其出色的性能被广泛应用于工业控制、无线通讯、成像和安全、网络应用等方面,采用基于ARM的电台检测控制器具有可移植性强、可扩展性好、抗干扰能力强等优点。

1 硬件设计

良好的硬件设计是是解决基于单片机、PXI、VXI等系统的电台检测仪问题的关键。为实现硬件结构的模块化设计,硬件主要分为两大部分:主控制器电路和调理电路。为设计一个具有高性能、低功耗、可扩展性好和低成本检测仪,主控制器的选择至关重要,为满足检测仪的可扩展性设计主控制器必须具备网络功能、USB存储、串行通信、SPI通信、I2C通信、模数转换等功能模块,为满足人机交互设计的要求,还必须具备必要的频率预置电路、显示电路等。具备这么多功能的控制器以及满足高性能、低功耗等性能的控制器只有ARM处理器才能完成。根据某电台的电气特性,主控器和电台之间的通信还必须进行必要的电平转换,另外电台输出的响应信号不能直接送到主控制器,还必须进行必要的分压网络、阻抗匹配等电路设计,这就需要调理电路。主控制器电路和调理电路相配合来完成电台的检测工作,根据电台测试需求设计的硬件整体结构如图1所示。

基于ARM的某机载电台检测控制器设计

1.1 主控制器

主控制是电台检测控制器的核心,担负着信息采集、存储、网络功能以及和电台通信等重要任务,主控制的好坏也直接决定了系统性能,经对比选择飞利浦公司的LPC2388作为该电台的主控制器,该器件是基于ARM7TDMI-S内核的处理器,具有太网控制器、USB控制器、I2C、串行接口等丰富的外设,可以满足该检测仪的需求。

1.2 存储电路

为满足可扩展性、测试结果可存储的要求,检测控制器要把每次对某型电台测量的结果保存下来,这就需要有主控制器和无线电综合测试仪之间能进行通信,某无线电综合测试仪对外通信有串口通信方式,在测量时可以把通信控制接口连接到无线电综合的串口线上,这样就可以把测试结果读到控制系统内部,想把该信息存储下来,存储器就必须满足可擦写,为节省控制器的宝贵的通用I/O口,选择具有12C通信存储功能CAT24WC64作为E2PROM,该器件负责保存电台性能测试结果,最多保存50次电台测试结果,超过50次,系统自动把原来存储的测试结果擦除掉然后再存储。

当需要查看系统电台测试结果时通过3种方法来实现:
1)把USB存储设备插入USB存储接口电路,系统会自动识别该设备,然后选择存储测试结果按键就可以把保存测试结果保存到USB存储设备;
2)通过网络接口和计算机相连接,然后用远程控制的方式来读取测试结果;
3)利用串行通信方式把信息读到计算机中。

1.3 USB存储接口电路

USB接口电路是完成和USB存储设备通信的窗口,LPC2388内部具有兼容USB2.0协议的控制器,这种控制器为USB接口设计提供方便。为满足系统可靠性,在D+和D-线上分别串接上一只33 Ω的电阻,在D+上还要增加一只1.5 kΩ上拉电阻,为表明USB存储设备连接上,在Ul_UPLED引脚上增加一个指示灯,当USB存储设备连接,指示灯亮。

1.4 网络接口电路

为满足远程控制需要,检测控制器就应该具备网络控制接口。LPC2388具有10/100 Mb/s以太网通信速率,为保证可靠传输,通过内部集成了16 KB字节的以太网控制器专用SDRAM、以太网控制器和ARM7内核之间使用高速AHB总线通信,并且使用了专用DMA进行数据传输来实现。处理器内部使用的以太网控制器使用RMII接口,通过与外围电路PHY芯片DM916lA进行通信就可以实现以太网通信功能。

1.5 频率形成电路

电台检测仪要想充分地检测电台性能,应检测多个频率点处电台性能,这样就要求检测仪能够输出频率可变的控制码,频率控制码的形成就需要频率形成电路。频率形成电路就是通过脉冲整形、计数,最后进过缓冲送到主控制器。脉冲形成电路利用自复位开关来实现,整形电路利用MAX708计数和缓冲电路分别利用54HCl90和54LVC245来实现,为节省处理器宝贵的I/O口资源,采用模拟总线的方式来实现,通过锁存、译码电路来控制频率码的形成。

1.6 显示、键盘电路

显示电路是人机交互的窗口,直接显示了当前检测仪所处的状态和电台检测结果。当检测的电台不能满足性能要求时,直接显示错误结果;键盘电路完成检测仪部分功能的输入。为保证检测仪显示结果的可靠性,检测仪显示电路采用抗干扰性强的LED数码管显示,LED数码管的驱动器选用ZLG7290,ZLG7290利用三线串行码与ARM处理器进行信息交互,其动态显示功能降低了系统功耗。ZLG7290除了用来驱动显示数码管外,电台检测的部分输入也通过其键盘接口来实现,其电路图如图2所示。

基于ARM的某机载电台检测控制器设计

1.7 其他电路

一个系统能可靠工作,必须有一系列诸如晶体振荡、看门狗、电源等电路保证,提供系统工作所必需的时钟、监视电路,晶体振荡电路提供必须的时钟信号,看门狗电路在程序运行出现异常时,把微控制器提供复位信号,增加了系统的鲁棒性:电源电路为整个系统电源,采用转换效率高的DC/DC开关电源,按功能为系统设计供电,即为控制电路电源和调理电路独立供电:增加了系统的抗干扰性。

1.8 调理电路

检测控制器的工作状态和工作时序由主控制器来完成,然而这只是检测控制器检能正常工作的一个方面,另外一个重要方面就是调理电路,其主要由继电器阵列、分压网络、模拟开关、电平转换等部分组成。控制器输出的信号一般不能直接加到电台内部,这主要有两方面原因:1)检测控制器输出的串口数据为单端输出,而该电台所需要的信号为差分信号;2)控制器输出的信号电平和格式完全正确,为保证系统的抗干扰性,在控制器的输出端和电台输入端一般要加一个缓冲器,增加系统模块之间的隔离度。检测控制器面板的所有控制信息经过处理器处理后通过串口发送给电台,而电台所需要的为差分信号,利用DSl6F95来实现信号电平方式的转换。检测控制器除了测试收发机性能外还可以测试控制盒的性能,另外也可以利用控制来控制收发机,从而模拟机上控制盒控制收发机,在控制盒控制和检测控制器本身信号不能同时发送到电台,这就需要继电器阵列来完成检测仪和控制盒之间的转换。另外,为监控电台工作电压,检测仪要分时显示出工作电压,而工作电台27V以及内部收发控制电压等也要显示,这些电压需要分压网络经过分压后送到数控模拟开关,控制器轮流监视各路电压。

2 软件架构设计

电台检测控制器属于典型的嵌入式控制系统,其性能设计的好坏直接关系到系统是否能够可靠工作。嵌入式软件设计和普通的PC机软件差别较大,由于检测仪控制关系复杂,再加上网络接口、USB存储驱动、中断时间控制、定时器设计、串行通信等因素,对软件架构的要求较高,必须考虑软件和硬件检测协调,另外软件还必须满足可测性、可移植性、健壮性等设计,要综合考虑多种因素。该电台检测控制器的软件流程如图3所示。系统上电后经过初始化配置,然后选择测量控制方式,若是远程控制则启动网络连接,用计算机来控制检测控制器进行工作,进入收发机性能测试,测试的结果通过网络存储到远程计算机中;若是手动测试,则判断测量方式是测控、外控还是测控,如果是内控,则由检测控制器控制收发机,在无线电综合测试仪的配合下测量收发机主要性能,通过读取无线电综合测试仪的测试结果可以把结果保存下来,在保存结果时,如果USB存储设备存在,则把结果存在其中,反之,则存于内部的可擦写的E2PROM中;若是测控,则检测控制器测量控制盒状态,并把结果保存起来;如果是外控,则在控制盒的控制下测量收发机性能,检测控制器通过读无线电综合测试仪结果同样把测试结果保存下来。

基于ARM的某机载电台检测控制器设计

3 结束语

基于ARM实现的电台检测控制器硬件设计灵活,软件架构设计良好,实现了软件与硬件平台的无缝结合,具有高性能、低功耗、可移植性好、可扩展性好,实现了对电台的检测与控制。通过网络接口,可以实现远程控制,并可以实时读取测量结果:通过增加USB存储接口,在手动测试的情况下还可以把测量数据直接保存下来,极大地提高了测试结果的处理速度,具有广阔的经济效益和军事效益。

转自: 广电电器

围观 5
84

介绍了一个简单的可调实时时钟系统的设计。设计中采用了Atmel32位的ARM微处理器作为控制驱动器件,实现了对DS1307实时时钟芯片的时间信息采样和液晶显示,并通过键盘来调节时间信息。通过实际的测试,该模块得到稳定的运行。

实时日历时钟在测控系统和智能显示中得到了广泛的应用。通过软件编程和CPU中断构造软时钟是一种较为常用的方法,时钟计时无需外围硬件支持,但是此种方法的弊端是计时精度会受到CPU主晶振、起振电容以及掉电的影响,而导致计时精度不高。因此采用硬件设计实时时钟是一种更为可靠的方式。

DS1307是I2C接口的8引脚实时时钟芯片,片内含有8个特殊功能寄存器和56bit的SRAM。它是一款按BCD码存取、低功耗的时钟/日历芯片,已被应用到人造板尺寸检测以及电控单元中。

1、硬件设计

设计的可调实时时钟系统原理框图如图1所示。采用了Atmel32位ARMRISC处理器中的一员,即AT91SAM7S256微处理器来驱动DS1307时钟芯片和液晶模块,并接收键盘中断来实现时间可调的功能。

基于ARM和DS1307的实时时钟系统设计

1.1 芯片与单片机的接口与连线

若要驱动DS1307芯片,一种方式是使用I2C总线虚拟技术,另一种是采用带I2C接口的单片机。AT91SAM7S256微处理器外围电路中具有两线接口(TWI),它与I2C接口相互兼容,很适合典型的处理器应用,因此系统中采用了此接口实现芯片与CPU的通信。

基于ARM和DS1307的实时时钟系统设计

DS1307使用到了32768Hz的晶振,BAT1为电池电源。I2C总线内部是双向传输电路,端口输出为开漏结构,因此接入了上拉电阻。SQW/OUT端是方波输出端,通常情况下该引脚接到能产生电平变化中断请求的输入口。

1.2 液晶显示电路

与传统的数码管相比,液晶显示具有功耗低、体积小、显示内容丰富、人机交互性好等优点。设计中使用到了的LM256160点阵液晶显示模块。利用该模块灵活的接口方式和简单方便的操作指令,可为用户提供良好的日期、时间显示和调节界面。

1.3 按键调节电路

为实现时间的可调,系统中设计了键盘输入电路。键盘包括调节模式进入键、“0~9”的数字输入键、清除键以及确认键。用户按下调节模式进入键便可以开始进行时间的设置和调节,如输入“20150920151000”代表设置时间为2015年9月20日15时10分0秒,再按下确认键便将数据信息写入到DS1307芯片中进行计数。

2、软件设计

系统的软件设计主要包括了主程序、DS1307驱动模块,液晶驱动模块、键盘中断处理模块四大部分,程序流程如图3所示。主程序中首先完成外设时钟的使能、I/O口的使能、TWI口的使能以及液晶的初始化。初始化工作完成后,处理器通过TWI接口读取DS1307中的时钟信息,数据通过液晶进行显示。当接收到外部按键中断请求时,处理器进行相应的键值中断响应,将设置好的数据写入到DS1307芯片中并返回。

基于ARM和DS1307的实时时钟系统设计

DS1307在TWI总线上是从器件,地址(SLA)固定为“11010000”,时钟信息(年、月、日、星期、时、分、秒)分别放在地址为06H~00H的时间相关寄存器中。芯片的读写主要使用到了TWI口低层驱动函数中的intAT91F_TWI_ReadByte(constAT91PS_TWIpTwi,intmode,inTInt_address,char觹data2read,intnb)和intAT91F_TWI_WriteByte(constAT91PS_TWIpTwi,intmode,inTInt_address,char觹data2send,intnb)。读写函数使用到了四个入口参数,constAT91PS_TWIpTwi是设置TWI口的基地址,intmode为主机模式,inTInt_address为器件寄存器的地址,char觹data2read是待写入数据或待读取存放的地址,intnb为写入或读取的字节数。需要注意一点是,数据是以BCD码存取的,因此在读取或写入之前需要十进制到BCD码的相互转换处理。

3、运行结果

系统的运行效果以液晶屏显示效果为准,如图4与图5所示。图4为设置时钟信息界面,设置完毕按回车键时钟开始计时,并跳转到运行显示界面。图5为设置好初始时间为2015年9月20日15时10分0秒后,时钟运行了15分38秒的显示效果。

基于ARM和DS1307的实时时钟系统设计

4、结束语

设计的可调实时时钟系统避免了系统掉电与晶振电路的影响,芯片的驱动通过采用ARM系列微处理器中TWI接口并调用相关的低层驱动程序,减少了采用总线虚拟技术的程序量。经过实际的调试,系统得到了预期的结果。该实时时钟可用于系统主界面的日期与时间显示,并为以时间为单位的事务处理提供时间基准。

转自: elecfans.com

围观 5
143

您是否有遇到使用中的程序无故丢失?产品调试非常稳定,布置到现场后频繁系统崩溃和数据遗失,亦或产品应用一年后批量涌现存储器件损坏?本文将深入探明这些问题的原因及提供参考解决方案。

Nand-Flash/eMMC(带有Flash控制器的Nand-Flash)作为一种非线性宏单元模式存储器,为固态大容量存储的实现提供了廉价有效的解决方案。Nand-Flash存储器具有容量大,改写速度快等优点,适用于大量数据的存储,因而越来越广泛地应用在如嵌入式产品、智能手机、云端存储资料库等业界各领域。

ARM平台数据为何莫名其妙就丢了?

一、存储器件使用寿命

使用了Nand-Flash的主板出现丢数据掉程序现象,是一个让无数工程师毛骨悚然的事故。眼看着程序用着用着就消失了,只能干着急也无法下手。有经验的工程师手起刀落换上一颗新物料,熬夜补代码继续撑过半个项目周期。回头无处发泄还要大刀阔斧换厂商、换品牌。与其换几片Nand-Flash还能负担得起,但毕竟这是一个无底洞,不如去深入探明问题原因,不然散尽家财也无法弥补亏空。

器件数据手册中通常描述Nand-Flash的块擦写寿命达10万次,EMMC的块擦写最高也会有1万次;同理,EEPROM、SD卡、CF卡、U盘、Flash硬盘等存储介质在都存在写寿命的问题。在文件系统向写数据的底层存储器块写数据时,常规会先将块里的数据读出来,擦除块干净后,将需要写入的数据和之前读出来的块数据一起在回写到存储器里面去,如果文件系统写平衡没有处理好,特别是要求1分钟以内要记录一次数据这样频繁的擦写块操作,就有可能将Nand-Flash或EMMC的块写坏。

二、存储器件掉电丢数据

文件系统向存储器写数据时,常规是先将块里的数据读出来,擦除块干净后,将需要写入的数据和之前读出来的块数据一起在回写到存储器里面去。如果设备在擦除块过程中或者在回写数据过程中意外发生断电甚至电压不稳定,均会造出数据丢失或者损坏。如果丢失的数据是文件系统的FAT表,则会造成文件系统崩溃。这就是引起系统程序无法启动灾难性后果的原因。

三、系统数据保护方案

很多时候,产品在未出厂前烧录程序、反复测试,无论怎样折腾也不会出现丢程序的情况。这可能的因素是测试设备保证了稳定的运行中电源输出,因此系统运行中正常的Flash保护机制是可靠执行的。

相对于用户实际使用而言,想避免Flash损坏的情况。需要严格遵守产品说明使用,尤其注意避免在Flash擦除或写入过程中人为地突然掉电。这是存储器件用法的一个大忌,即使完好的器件,如此不规范的使用也会大大缩短其寿命。而且不同环境下的电源系统五花八门,在电源不满足功率要求情况下程序对于电源低电量的检测阈值较低,此时强制启动系统或执行写操作更会加剧系统耗电波动,巨大的纹波也会引起CPU对存储的误操作。

解决此问题对于软件方面而言:

• 调试系统或现场使用时,建议使用软件复位,避免人为频繁的通过断电实现复位操作;有断电必要时,将打印信息添加如“系统加载完成”、“数据保存完毕”等指示说明后操作;
• 软件采取Flash均衡保存算法,高效地调整更改数据时擦除的Flash区域大小;
• 可将数据先写入内存或者铁电存储器,然后定期的再将数据搬移到大的存储器里面,减少直接断Nand-Flash、EMMC擦写次数;
• 在程序中加入或者提高电源电量检测的阈值,程序上保证所有电源系统下的芯片在此阈值上均可以正常工作。
• 读写过程中仔细对坏块表进行维护更新,避免程序写入坏块。读取数据时对ECC校验,确保读取数据无误。

从硬件角度考虑需要注意:
• 用法上避免在Flash擦除或写入过程中人为突然掉电;
• 设计好处理控制核心的电源系统,防止CPU等在启动、运行中,电源系统因瞬时变化引起的纹波等情况;
• 搭配掉电检测电路,在检测到外部电源掉电的同时,及时迅速关闭文件系统,停止向文件系统内写数据的操作;
• 添加文件系统电源域UPS电源,乃至整机掉电续航工作电源;
• 对于使用EEPROM等小容量存储的用户而言,可以考虑使用高可靠性的铁电材料加工制成的铁电非易失性存储器FRAM来替换。FRAM可以像RAM一样快速读写。数据在掉电后可以保存10年,且其读写寿命高达100亿次,比EEPROM和其他非易失性记忆体系统可靠性更高,结构更简单,功耗低等优点。

ARM平台数据为何莫名其妙就丢了?

下面简介一款基于法拉电容的UPS电路设计思路,要点如下:
• 由于电容存在个体差异,电容存储电荷的速率不一样,存在过充造成电压超过耐压值的问题,电路中存在多颗法拉电容时需要做均压处理;
• 为保证电容能够充满电能,源端需采用恒流源充电;
• 为维持电容电压稳定,并降低充电电路功耗,需增加过压检测电路;
• 若对电压高于法拉电容本身电压上限的电源系统提供掉电续航时,Vcc_backup端需通过BOOST升压电路后以实现,且注意系统正常时(充电过程中)关断EN脚。
ARM平台数据为何莫名其妙就丢了?

系统电源正常时,充电电路即给UPS充电。系统电源掉电时,UPS放电给系统提供备用电能,建议UPS在掉电后能持续给文件系统供电能力不低于10秒,在10秒续航期间内,系统可以将电源异常状态上报、及时保持临时重要数据、关闭文件系统,保证系统稳定性,避免文件系统在掉电情况下出现损害,影响应用程序的正常启动。
ARM平台数据为何莫名其妙就丢了?

此外系统掉电情况需要掉电检测电路实现。使用一颗比较器器件即可,注意使用Output_VCC端供电,以确保外部掉电时,比较器仍然可以工作。比较器负端连接一个参考电压,参考电压由稳压二极管提供。正常供电时,比较器输出电压由升压电路的反馈端分压决定;掉电时,比较器输出低电平,此时处理器仍未掉电,收到状态信息可及时响应处理。另一路掉电检测可供其它功能使用。
ARM平台数据为何莫名其妙就丢了?

四、工业品质稳定可靠

在ARM内核核心板、开发板、工控机等领域,M6708核心板、M/A335x核心板、M/A28x核心板、EPC系列工控主板、IoT系列无线主板/网关、DCP系列经典工控机等产品中,核心板产品针对Nand-Flash有着完善的坏块管理、工控主板添加掉电保护等措施。例如在Linux系统下加固Flash驱动、对操作系统进行双备份;软件与硬件信号测试对Flash进行10万次掉电试验等。

同时,致远电子配备专业的EMC实验室、安规实验室、环境实验室等可实际模拟恶劣应用状况试验。结合优质供应商保证各产品分立器件均达到EMC工业三级标准,有良好的静电抗性、雷击浪涌抗性、电瞬变群脉冲抗性、以及极低的EMI传导骚扰情况;可实现-40℃~+85℃的工业级环境适应性。为从Flash至整套目标系统的可靠性安全稳定提供切实保障。

ARM平台数据为何莫名其妙就丢了?
围观 7
64

ARM处理器的工作状态

在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态。

《嵌入式系统开发与应用教程(第2版)》上介绍说:有两种状态ARM状态和Thumb状态,当时初学甚为不解,现在一知半解时再看忽然想到了显示中的例子:

ARM核就好比一个高中学校,那种包含普通高中和职业高中的。普通高中就相当于ARM状态,职业高中就相当于Thumb状态,这样还不能理解的话:可以认为 泡泡卡丁车 中普通模式和加速模式,,卡丁车加速要等到集气管加满,然后“ctrl”一下,就切换到了加速模式,气放完了就又回来了,不管加速模式还是普通模式都是在跑,只是速度不一样而已。

而ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运行程序,只不过指令长度不一样而已。这个概念对初学者相当重要,因为当ARM Thumb是什么还没弄清楚,怎么能理解两种状态呢?

他们之间的关系清楚了,这样就可以深入了解ARM状态是什么,Thumb状态是什么了。

另外:ARM的M系列主要用Thumb指令,ARM9和A系列主要用ARM指令

S3C2440.S启动代码中根本就没用Thumb指令。

ARM状态此时处理器执行32位的字对齐的ARM指令,Thumb状态此时处理器执行16位的,半字对齐的THUMB指令。 切换程序:从ARM到Thumb: LDR R0,=lable+1 BX R0 从ARM到Thumb: LDR R0,=lable BX R0

1,ARM状态

arm处理器工作于32位指令的状态,所有指令均为32位

2,thumb状态

arm执行16位指令的状态,即16位状态

3,thumb-2状态

这个状态是ARM7版本的ARM处理器所具有的新的状态,新的thumb-2内核技术兼有16位及32位指令,实现了更高的性能,更有效的功耗及更少地占用内存。总的来说,感觉这个状态除了兼有arm和thumb的优点外,还在这两种状态上有所提升,优化。

4,调试状态

处理器停机时进入调试状态。

5,arm与thumb间的切换

a,由arm状态切换到thumb状态

将寄存器的最低位设置为1

BX指令:R0[0]=1,则执行BX

R0指令将进入thumb状态

b,由thumb状态切换到ARM状态

寄存器最低位设置为0

BX指令:R0[0]=0,则执行BX

R0指令将进入arm状态

当处理器进行异常处理时,则从异常向量地址开始执行,将自动进入ARM状态。

注意:ARM处理器复位后开始执行代码时总是只处于ARM状态;

Cortex-M3只有Thumb-2状态和调试状态;

由于Thumb-2具有16位/32位指令功能,因此有了thumb-2就无需Thumb了。

另外,具有Thumb-2技术的ARM处理器也无需再ARM状态和Thumb-2状态间进行切换了,因为thumb-2具有32位指令功能。

总的说,arm状态与Thumb状态的本质区别就是指令的位数不同,arm是32位的指令状态,而thumb是16位 的指令状态,而thumb-2状态是arm状态和thumb状态的结合和优化。

转自: 又一个暑假

围观 6
68

DSP:

DSP(digital singnal processor)是一种独特的微处理器,有自己的完整指令系统,是以数字信号来处理大量信息的器件。一个数字信号处理器在一块不大的芯片内包括有控制单元、运算单元、各种寄存器以及一定数量的存储单元等等,在其外围还可以连接若干存储器,并可以与一定数量的外部设备互相通信,有软、硬件的全面功能,本身就是一个微型计算机。DSP采用的是哈佛设计,即数据总线和地址总线分开,使程序和数据分别存储在两个分开的空间,允许取指令和执行指令完全重叠。也就是说在执行上一条指令的同时就可取出下一条指令,并进行译码,这大大的提高了微处理器的速度。另外还允许在程序空间和数据空间之间进行传输,因为增加了器件的灵活性。

其工作原理是接收模拟信号,转换为0或1的数字信号,再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,源源超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。

DSP芯片,由于它运算能力很强,速度很快,体积很小,而且采用软件编程具有高度的灵活性,因此为从事各种复杂的应用提供了一条有效途径。其主要应用是实时快速地实现各种数字信号处理算法。根据数字信号处理的要求,DSP芯片一般具有如下主要特点:

(1)在一个指令周期内可完成一次乘法和一次加法;
(2)程序和数据空间分开,可以同时访问指令和数据;
(3)片内具有快速RAM,通常可通过独立的数据总线在两块中同时访问;
(4)具有低开销或无开销循环及跳转的硬件支持;
(5)快速的中断处理和硬件I/O支持;
(6)具有在单周期内操作的多个硬件地址产生器;
(7)可以并行执行多个操作;
(8)支持流水线操作,使取指、译码和执行等操作可以重叠执行。

当然,与通用微处理器相比,DSP芯片的其他通用功能相对较弱些。

DSP优势在于其有独特乘法器,一个指令就可以完成乘加运算,但GPP(通用处理器)处理一般是用加法代替乘法,要n多cpu周期,尽管cpu主频很快,但还是要相当时间,这一点现在的GPP已经基本上可以做到内部单周期运算乘加指令了。

数字信号处理是一种通过使用数学技巧执行转换或提取信息,来处理现实信号的方法,这些信号由数字序列表示。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用

ARM:

ARM ( Advanced RISC Machines ),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。1991 年 ARM 公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用 ARM技术知识产权( IP )核的微处理器,即我们通常所说的 ARM 微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于 ARM 技术的微处理器应用约占据了 32 位 RISC 微处理器 75 %以上的市场份额, ARM 技术正在逐步渗入到我们生活的各个方面。 ARM 公司是专门从事基于 RISC 技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的 ARM 微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的 ARM 微处理器芯片进入市场。目前,全世界有几十家大的半导体公司都使用 ARM 公司的授权,因此既使得 ARM 技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。

ARM最大的优势在于速度快、低功耗、芯片集成度高,多数ARM芯片都可以算作SOC,基本上外围加上电源和驱动接口就可以做成一个小系统了。

基于ARM核心处理器的嵌入式系统以其自身资源丰富、功耗低、价格低廉、支持厂商众多的缘故,越来越多地应用在各种需要复杂控制和通信功能的嵌入式系统中。

ARM与DSP的比较:

区别:

由于两大处理器在各自领域的飞速发展,如今两者中的高端或比较先进的系列产品中,都在弥补自身缺点、且扩大自身优势,从而使得两者之间的一些明显不同已不再那么明显了,甚至出现两者部分结合的趋势(如ARM的AMBA总线,可以把DSP或其他处理器集成在一块芯片中;又如DSP中的两个系列OMAP和达芬奇系列,就是直接针对两者的广泛应用而将两者结合在一起,从而最大发挥各自优势),另外,两者各自不同系列的产品侧重点也不尽相同,所以这里讨论的是一些传统意义上比较。

总的来说主要区别有:

ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面,它的速度和数据处理能力一般,但是外围接口比较丰富,标准化和通用性做的很好,而且在功耗等方面做得也比较好,所以适合用在一些消费电子品方面;

而DSP主要是用来计算的,比如进行加密解密、调制解调等,优势是强大的数据处理能力和较高的运行速度。由于其在控制算法等方面很擅长,所以适合用在对控制要求比较高的场合,比如军用导航、电机伺服驱动等方面。

如果只是着眼于嵌入式应用的话,嵌入式CPU和DSP的区别应该只在于一个偏重控制一个偏重运算了。

另外:

内核源码开放的Linux与ARM体系处理器相结合,可以发挥Linux系统支持各种协议及存在多进程调度机制的优点,从而使开发周期缩短,扩展性增强。

详细来说:

DSP的优势主要是速度,它可以在一个指令周期中同时完成一次乘法和一次加法,这非常适合快速傅立叶变换的需求。DSP有专门的指令集,主要是专门针对通讯和多媒体处理的;而ARM使用的是RISC指令集(当然ARM的E系列也支持DSP指令集)是通用处理用的。

存储器架构和指令集特点不一样

单片机为了存储器管理的方便(便于支持操作系统),一般采用指令、数据空间统一编码的冯·诺依曼结构。 DSP为了提高数据吞吐的速度,基本上都是指令、数据空间独立的哈佛结构。

单片机对于数字计算方面的指令少得多,DSP为了进行快速的数字计算,提高常用的信号处理算法的效率,加入了很多指令,比如单周期乘加指令、逆序加减指令(FFT时特别有用,不是ARM的那种逆序),块重复指令(减少跳转延时)等等,甚至将很多常用的由几个操作组成的一个序列专门设计一个指令可以一周期完成(比如一指令作一个乘法,把结果累加,同时将操作数地址逆序加1),极大的提高了信号处理的速度。由于数字处理的读数、回写量非常大,为了提高速度,采用指令、数据空间分开的方式,以两条总线来分别访问两个空间,同时,一般在DSP内部有高速RAM,数据和程序要先加载到高速片内ram中才能运行。DSP为提高数字计算效率,牺牲了存储器管理的方便性,对多任务的支持要差的多,所以DSP不适合于作多任务控制作用。

1 对密集的乘法运算的支持

GPP不是设计来做密集乘法任务的,即使是一些现代的GPP,也要求多个指令周期来做一次乘法。而DSP处理器使用专门的硬件来实现单周期乘法。DSP处理器还增加了累加器寄存器来处理多个乘积的和。累加器寄存器通常比其他寄存器宽,增加称为结果bits的额外bits来避免溢出。同时,为了充分体现专门的乘法-累加硬件的好处,几乎所有的DSP的指令集都包含有显式的MAC指令。

2 存储器结构

传统上,GPP使用冯.诺依曼存储器结构。这种结构中,只有一个存储器空间通过一组总线(一个地址总线和一个数据总线)连接到处理器核。通常,做一次乘法会发生4次存储器访问,用掉至少四个指令周期。

大多数DSP采用了哈佛结构,将存储器空间划分成两个,分别存储程序和数据。它们有两组总线连接到处理器核,允许同时对它们进行访问。这种安排将处理器存贮器的带宽加倍,更重要的是同时为处理器核提供数据与指令。在这种布局下,DSP得以实现单周期的MAC指令。

还有一个问题,即现在典型的高性能GPP实际上已包含两个片内高速缓存,一个是数据,一个是指令,它们直接连接到处理器核,以加快运行时的访问速度。从物理上说,这种片内的双存储器和总线的结构几乎与哈佛结构的一样了。然而从逻辑上说,两者还是有重要的区别。

GPP使用控制逻辑来决定哪些数据和指令字存储在片内的高速缓存里,其程序员并不加以指定(也可能根本不知道)。与此相反,DSP使用多个片内存储器和多组总线来保证每个指令周期内存储器的多次访问。在使用DSP时,程序员要明确地控制哪些数据和指令要存储在片内存储器中(CMD文件的编写)。程序员在写程序时,必须保证处理器能够有效地使用其双总线。

此外,DSP处理器几乎都不具备数据高速缓存。这是因为DSP的典型数据是数据流。也就是说,DSP处理器对每个数据样本做计算后,就丢弃了,几乎不再重复使用。

3 零开销循环

如果了解到DSP算法的一个共同的特点,即大多数的处理时间是花在执行较小的循环上,也就容易理解,为什么大多数的DSP都有专门的硬件,用于零开销循环。所谓零开销循环是指处理器在执行循环时,不用花时间去检查循环计数器的值、条件转移到循环的顶部、将循环计数器减1(逆序加减指令)。

与此相反,GPP的循环使用软件来实现。某些高性能的GPP使用转移预报硬件,几乎达到与硬件支持的零开销循环同样的效果。

4 定点计算

大多数DSP使用定点计算,而不是使用浮点。虽然DSP的应用必须十分注意数字的精确,用浮点来做应该容易的多,但是对DSP来说,廉价也是非常重要的。定点机器比起相应的浮点机器来要便宜(而且更快)。为了不使用浮点机器而又保证数字的准确,DSP处理器在指令集和硬件方面都支持饱和计算、舍入和移位。

发展趋势:

DSP是否将作为手机的心脏生存下去,目前的争论非常激烈。今天的手机生产采用的是双核方式:DSP芯片处理通信,如调制解调器功能和语音处理等;一块通用处理器(通常是ARM设计的RISC处理器)负责处理手机上运行的各种程序,如用户界面和控制协议堆栈等。随这两种处理器的功能日益强大,或许它们中的一方将会接管另一方目前执行的功能。但问题在于:是ARM取代DSP,还是DSP挤掉ARM?

如果将这三者结合起来,即由DSP结合采样电路采集并处理信号,由ARM处理器作为平台,运行Linux操作系统,将经过DSP运算的结果发送给用户程序进行进一步处理,然后提供给图形化友好的人机交互环境完成数据分析和网络传输等功能,就会最大限度的发挥三者所长。

转自: leoking01-博客园

围观 7
184

ARM工作模式根据功能不同,可分为7类:

User Mode:用户模式。操作系统的Task一般以这种模式执行。User Mode是ARM唯一的非特权模式,这表示如果CPU处于这种模式下,很多指令将不能够执行,因此操作系统的资源得以保护。

• System Mode:这是V4及其以上版本所引入的特权模式。
• IRQ Mode:中断模式。中断(不包括软中断)处理函数在这种模式下执行。
• FIQ Mode:快速中断模式。除了多了几个寄存器外,其他同IRQ一样。
• Supervisor Mode:监视模式。软中断(SWI)处理函数在这种模式下执行。
• Abort Mode:所有同内存保护相关的异常均在这种模式下执行。
• Undefined Mode:处理无效指令的异常处理函数在这种模式下执行。

ARM工作模式也可分为3大类:

• 用户模式:User Mode
• 系统模式:System Mode
• 异常模式:所有其它5种模式

为什么可以把7类功能不同的模式分为3大类呢?

这是由于异常模式同用户模式和系统模式有一个不一样的地方,那就是,当CPU产生中断或异常而自动切换到相应异常模式后,CPU会根据产生中断或异常的原因执行相应得中断或异常向量。这些向量的位置是CPU事先定义好的,目前有两种选择:

(1) 处于内存低地址0x00000000~0x0000001c,这种情况被称之为Low vector

(2) 处于内存高低之0Xffff0000~0xffff001c,这种情况被称之为High vector。

一般的操作系统会在这些异常向量地址处放置一条跳转指令。至于到底是使用Low vector,还是使用High vector,由CPU自己决定,ARM规范不做任何限制。

程序可以通过读取CPSR的MODE域来判断CPU当前的执行模式。

如何看待ARM的各种模式?
要回答这个问题,我们要看不同模式下,有哪些东西不同。归纳来说,有如下两个方面的不同:

(1) 物理寄存器不同
(2) 权限不同

如果将User Mode作为参考模式,那么:

(1) System Mode:寄存器一样,仅仅是权限不同

(2) 其他Exception Mode:寄存器不一样,权限也不一样

从权限的角度看,System Mode和其他Exception Mode(FIQ,IRQ,Supervisor,Abort,Undefined)是一样的,他们之间的区别仅仅是寄存器方面有一些差别。

从寄存器角度看,我们可以将CPSR中的MODE域看作一个类似于片选的东西,当其值不一样,所选中的寄存器也不一样。

虽然指令中的寄存器是一样的,但是经过MODE域的片选后,实际就指向不同的物理寄存器了。

必须要特别注意,SYSTEM模式和USER模式除了权限不一样外,其他都一样,这样可以让操作系统自由访问16个寄存器(包括状态寄存器)。

那么,模式切换是如何进行的呢?

(1) 执行SWI或Reset指令。如果在User模式下执行SWI指令,CPU就进入Supervisor模式。当然,在其它模式下执行SWI指令,也会进入Supervisor模式,补过一般操作系统不会这么做。因为除了User模式是非特权模式下,其他模式都属于特权模式(这说明ARM只有两种执行态,不想Dummy的X86,定义了4种执行态)。执行SWI一般是为了访问系统资源,在特权模式下可以访问所有的系统资源。SWI指令一般用来用来为操作系统提供API接口。

(2) 有外部中断发生。如果发生了外部中断,CPU就会进入IRQ或FIQ模式,具体是哪种模式,得看外部的中断源是接到CPU的那个Pin。

(3) CPU执行过程中产生异常。最典型的异常是由于MMU保护所引起的内存访问异常,此时CPU会切换到Abort模式。如果是无效指令,则会进入Undefined模式。

从上面我们发现,有一种模式是CPU无法自动进入的,这种模式就是System模式。要进入System模式必须由程序员自己编写指令来实现。其实很简单,在任何特权模式下改变CPSR的MODE域为System模式所对应得数字即可。进入System模式一般是为了利用“System 模式”和“User 模式”下的寄存器是一样的。因此一般操作系统在通过SWI进入Supervisor模式后,做一些简单处理后,就进入System模式。

另外,在任何特权模式下,都可以通过修改CPSR的MODE域而进入其他模式。不过需要注意的是,由于修改的CPSR是该模式下的影子CPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行到某个断点并切换到新模式。

存储器格式(字对齐)

Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。

存储器格式:

1、大端格式:高字节在低地址,低字节在高地址;

2、小端格式:高字节在高地址,低字节在低地址;

指令长度:  Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字节对齐,半字需要2字节对齐。

注:所谓的指令长度是一条完整的指令的长度,而不是单纯的mov这3个字母长度。

ARM体系的CPU有两种工作状态

1、ARM状态:处理器执行32位的字对齐的ARM指令;

2、Thumb状态:处理器执行16位的、半字对齐的Thumb指令;

在程序运行的过程中,可以在两种状态之间进行相应的转换。处理器工作状态的转变并不影响处理器的工作模式和相应寄存器中的内容。CPU上电处于ARM状态。

寄存器

ARM有31个通用的32位寄存器,6个程序状态寄存器,共分为7组,有些寄存器是所有工作模式共用的,还有一些寄存器专属于每一种工作模式:

R13——栈指针寄存器,用于保存堆栈指针;

R14——程序连接寄存器,当执行BL子程序调用指令时,R14中得到R15的备份,而当发生中断或异常时,R14保存R15的返回值;

R15——程序计数器;

快速中断模式有7个备份寄存器R8—R14,这使得进入快速中断模式执行很大部分程序时,甚至不需要保存任何寄存器;其它特权模式都含有两个独立的寄存器副本R13、R14,这样可以令每个模式都拥有自己的堆栈指针和连接寄存器。

当前程序状态寄存器(CPSR)

CPSR中各位意义如下:

T位:1——CPU处于Thumb状态, 0——CPU处于ARM状态;

I、F(中断禁止位): 1——禁止中断, 0——中断使能;

工作模式位:可以改变这些位,进行模式切换。

转自: steed-博客

围观 12
170

ARM Linux启动过程分析是本文要介绍的内容,嵌入式 Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。

本文以S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux的启动过程。

1、引 言

Linux 最初是由瑞典赫尔辛基大学的学生 Linus Torvalds在1991 年开发出来的,之后在 GNU的支持下,Linux 获得了巨大的发展。虽然 Linux 在桌面 PC 机上的普及程度远不及微软的 Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来 Linux 在嵌入式领域的迅猛发展,更是给 Linux 注入了新的活力。

一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader), Linux 内核,文件系统,应用程序。

其中 bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。

Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。

根文件系统是 Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。

应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。

从以上分析我们可以看出 bootloader 和 Linux 内核在嵌入式系统中的关系和作用。

Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核。在嵌入式系统开发的过程中,很大一部分精力都是花在bootloader 和 Linux 内核的开发或移植上。

如果能清楚的了解 bootloader 执行流程和 Linux的启动过程,将有助于明确开发过程中所需的工作,从而加速嵌入式系统的开发过程。而这正是本文的所要研究的内容。

2、Bootloader

(1)Bootloader的概念和作用

Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的 BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。由此可见,bootloader 和 Linux 内核有着密不可分的联系,要想清楚的了解 Linux内核的启动过程,我们必须先得认识 bootloader的执行过程,这样才能对嵌入式系统的整个启过程有清晰的掌握。

(2)Bootloader的执行过程

不同的处理器上电或复位后执行的第一条指令地址并不相同,对于 ARM 处理器来说,该地址为 0x00000000。对于一般的嵌入式系统,通常把 Flash 等非易失性存储器映射到这个地址处,而 bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 bootloader。而因为存储 bootloader的存储器不同,bootloader的执行过程也并不相同,下面将具体分析。

嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Flash 又分为 Nor Flash 和Nand Flash 两种。 它们之间的不同在于: Nor Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而Nand Flash并不支持XIP,所以要想执行 Nand Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。

实际应用中的 bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用 Linux 内核等基本任务外,还可以执行很多用户输入的命令,比如设置 Linux 启动参数,给 Flash 分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux 内核的目的,所有的 bootloader都必须具备以下功能 :

初始化 RAM

因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。

初始化串口

串口在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 bootloader 必须要完成的工作,但是通过串口输出信息是调试 bootloader 和Linux 内核的强有力的工具,所以一般的 bootloader 都会在执行过程中初始化一个串口做为调试端口。

检测处理器类型

Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。

设置 Linux启动参数

Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。目前传递启动参数主要采用两种方式:即通过 struct param_struct 和struct tag(标记列表,tagged list)两种结构传递。struct param_struct 是一种比较老的参数传递方式,在 2.4 版本以前的内核中使用较多。从 2.4 版本以后 Linux 内核基本上采用标记列表的方式。但为了保持和以前版本的兼容性,它仍支持 struct param_struct 参数传递方式,只不过在内核启动过程中它将被转换成标记列表方式。标记列表方式是种比较新的参数传递方式,它必须以 ATAG_CORE 开始,并以ATAG_NONE 结尾。中间可以根据需要加入其他列表。Linux内核在启动过程中会根据该启动参数进行相应的初始化工作。

调用 Linux内核映像

Bootloader完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到 Linux 内核执行之前 CUP的寄存器必须满足以下条件:r0=0,r1=处理器类型,r2=标记列表在 RAM中的地址。

3、Linux内核的启动过程

在 bootloader将 Linux 内核映像拷贝到 RAM 以后,可以通过下例代码启动 Linux 内核:call_linux(0, machine_type, kernel_params_base)。

其中,machine_tpye 是 bootloader检测出来的处理器类型, kernel_params_base 是启动参数在 RAM 的地址。通过这种方式将 Linux 启动需要的参数从 bootloader传递到内核。

Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。

根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。

zImage 是 Image经过压缩形成的,所以它的大小比 Image 小。但为了能使用 zImage,必须在它的开头加上解压缩的代码,将 zImage 解压缩之后才能执行,因此它的执行速度比 Image 要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用 zImage 可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

对于 ARM 系列处理器来说,zImage 的入口程序即为 arch/arm/boot/compressed/head.S。它依次完成以下工作:开启 MMU 和 Cache,调用 decompress_kernel()解压内核,最后通过调用 call_kernel()进入非压缩内核 Image 的启动。下面将具体分析在此之后 Linux 内核的启动过程。

(1)Linux内核入口

Linux 非压缩内核的入口位于文件/arch/arm/kernel/head-armv.S 中的 stext 段。该段的基地址就是压缩内核解压后的跳转地址。如果系统中加载的内核是非压缩的 Image,那么bootloader将内核从 Flash中拷贝到 RAM 后将直接跳到该地址处,从而启动 Linux 内核。不同体系结构的 Linux 系统的入口文件是不同的,而且因为该文件与具体体系结构有关,所以一般均用汇编语言编写。对基于 ARM 处理的 Linux 系统来说,该文件就是head-armv.S。该程序通过查找处理器内核类型和处理器类型调用相应的初始化函数,再建立页表,最后跳转到 start_kernel()函数开始内核的初始化工作。

检测处理器内核类型是在汇编子函数__lookup_processor_type中完成的。通过以下代码可实现对它的调用:bl __lookup_processor_type。__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中。其中r8 保存了页表的标志位,r9 保存了处理器的 ID 号,r10 保存了与处理器相关的 struproc_info_list 结构地址。

检测处理器类型是在汇编子函数 __lookup_architecture_type 中完成的。与__lookup_processor_type类似,它通过代码:“bl __lookup_processor_type”来实现对它的调用。该函数返回时,会将返回结构保存在 r5、r6 和 r7 三个寄存器中。其中 r5 保存了 RAM 的起始基地址,r6 保存了 I/O基地址,r7 保存了 I/O的页表偏移地址。当检测处理器内核和处理器类型结束后,将调用__create_page_tables 子函数来建立页表,它所要做的工作就是将 RAM 基地址开始的 4M 空间的物理地址映射到 0xC0000000 开始的虚拟地址处。对笔者的 S3C2410 开发板而言,RAM 连接到物理地址 0x30000000 处,当调用 __create_page_tables 结束后 0x30000000 ~ 0x30400000 物理地址将映射到0xC0000000~0xC0400000 虚拟地址处。

当所有的初始化结束之后,使用如下代码来跳到 C 程序的入口函数 start_kernel()处,开始之后的内核初始化工作:

b SYMBOL_NAME(start_kernel)

(2)start_kernel函数

start_kernel是所有 Linux 平台进入系统内核初始化后的入口函数,它主要完成剩余的与硬件平台相关的初始化工作,在进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个 Linux 内核便启动完毕。该函数所做的具体工作有:
调用 setup_arch()函数进行与体系结构相关的第一个初始化工作;
对不同的体系结构来说该函数有不同的定义。对于 ARM 平台而言,该函数定义在arch/arm/kernel/Setup.c。它首先通过检测出来的处理器类型进行处理器内核的初始化,然后通过 bootmem_init()函数根据系统定义的 meminfo 结构进行内存结构的初始化,最后调用paging_init()开启 MMU,创建内核页表,映射所有的物理内存和 IO空间。

a、创建异常向量表和初始化中断处理函数;

b、初始化系统核心进程调度器和时钟中断处理机制;

c、初始化串口控制台(serial-console);

d、ARM-Linux 在初始化过程中一般都会初始化一个串口做为内核的控制台,这样内核在启动过程中就可以通过串口输出信息以便开发者或用户了解系统的启动进程。

e、创建和初始化系统 cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。

f、初始化内存管理,检测内存大小及被内核占用的内存情况;

g、初始化系统的进程间通信机制(IPC);

当以上所有的初始化工作结束后,start_kernel()函数会调用 rest_init()函数来进行最后的初始化,包括创建系统的第一个进程-init 进程来结束内核的启动。Init 进程首先进行一系列的硬件初始化,然后通过命令行传递过来的参数挂载根文件系统。最后 init 进程会执行用 户传递过来的“init=”启动参数执行用户指定的命令,或者执行以下几个进程之一:

1 execve("/sbin/init",argv_init,envp_init);
2 execve("/etc/init",argv_init,envp_init);
3 execve("/bin/init",argv_init,envp_init);
4 execve("/bin/sh",argv_init,envp_init)。

当所有的初始化工作结束后,cpu_idle()函数会被调用来使系统处于闲置(idle)状态并等待用户程序的执行。至此,整个 Linux 内核启动完毕。

4. 结论

Linux 内核是一个非常庞大的工程,经过十多年的发展,它已从从最初的几百 KB 大小发展到现在的几百兆。清晰的了解它执行的每一个过程是件非常困难的事。但是在嵌入式开发过程中,我们并不需要十分清楚 linux 的内部工作机制,只要适当修改 linux 内核中那些与硬件相关的部分,就可以将 linux 移植到其它目标平台上。通过对 linux 的启动过程的分 析,我们可以看出哪些是和硬件相关的,哪些是 linux 内核内部已实现的功能,这样在移植linux 的过程中便有所针对。而 linux内核的分层设计将使 linux 的移植变得更加容易。

转自: 王小波的博客

围观 15
154

引 言

运动控制器是运动控制系统的核心部件。目前,国内的运动控制器大致可以分为3类:

第1类是以单片机等微处理器作为控制核心的运动控制器。这类运动控制器速度较慢、精度不高、成本相对较低,只能在一些低速运行和对轨迹要求不高的轮廓运动控制场合应用。

第2类是以专用芯片(ASIC)作为核心处理器的运动控制器,这类运动控制器结构比较简单,大多只能输出脉冲信号,工作于开环控制方式。由于这类控制器不能提供连续插补功能,也没有前馈功能,特别是对于大量的小线段连续运动的场合不能使用这类控制器。

第3类是基于PC总线的以DSP或FPGA作为核心处理器的开放式运动控制器。这类开放式运动控制器以DSP芯片作为运动控制器的核心处理器,以PC机作为信息处理平台,运动控制器以插件形式嵌入PC机,即“PC+运动控制器”的模式。这样的运动控制器具有信息处理能力强,开放程度高,运动轨迹控制准确,通用性好的特点。但是这种方式存在以下缺点:运动控制卡需要插入计算机主板的PCI或者ISA插槽,因此每个具体应用都必须配置一台PC机作为上位机。这无疑对设备的体积、成本和运行环境都有一定的限制,难以独立运行和小型化。

针对这些问题,设计了一种基于ARM+DSP的嵌入式运动控制器。该控制器将嵌入式CPU与专用运动控制芯片相结合,将运动控制功能以功能模块的方式嵌入到ARM主控板的架构,把不需要的设备裁减掉,既兼顾功能又节省成本。该控制器是一种可以脱离上位机单独运行的一种独立型运动控制器,具有良好的应用前景。

1 嵌入式运动控制器的硬件平台设计

嵌入式运动控制器的硬件主要包括两个部分:ARM主控板和DSP运动控制板。这两块控制板通过通用I/O口以总线的方式连接在一起。在设计时,可以分别对ARM主控板和DSP运动控制板进行设计,最后再调试。这种将ARM主控板和DSP运动控制板分开设计和调试的硬件方案,将设计难点分散,使设计和调试更简单。

1.1 ARM主控板部分

本系统采用的ARM芯片为Samsung公司推出的16/32位RISC处理器S3C2440A,主频为400 MHz,最高频率可达533 MHz。ARM主控板以嵌入式处理器S3C2440A为核心,外扩存储器和通用设备接口。ARM主控板的硬件结构框图如图1所示。

ARM+PCL6045B的嵌入式运动控制器设计

通过通用I/O接口与DSP运动控制板通信,实现ARM主控板与运动控制板之间数据的实时双向传送;外部NAND Flash存储器(64 MB),用于存储系统参数及运动指令;NOR Flash存储器(2 MB),用于存放系统运行程序;SDRAM存储器(64 MB),用于存放临时数据;通过串口、以太网接口、USB接口与上位机系统通信,实现两者之间数据的传送;通过LCD接口,实现320×240分辨率液晶屏的图形与字符显示,并具有触摸屏接口,提供友好的人机交互界面;通过I/O扩展接口,提供可编程的数字I/O通道;通过JTAG接口与PC机通信,实现系统运行程序的仿真调试及下载,软件升级接口。

1.2 DSP运动控制板部分

本系统DSP运动控制芯片选用PCL6045B。PCL6045B是一种功能十分强大的DSP运动控制芯片。芯片能够控制四轴,并实现两轴到四轴直线差补、两轴圆弧差补。所有插补计算由芯片完成,上位机只需写入圆弧的参数即可,其多轴插补控制功能特别优秀。系统硬件采用主从式双CPU结构模式。主CPU为ARM处理器,负责键盘、显示、网络通信等管理工作;从CPU为PCL6045B运动控制芯片,专门负责运动控制的处理工作。PCL6045B与ARM的通信是靠读写I/O总线上的几个地址来进行指令和数据的传输。控制系统硬件结构框图如图2所示。

ARM+PCL6045B的嵌入式运动控制器设计

1.3 ARM处理器与运动控制芯片的连接

通过设置引脚IF0与IF1,PCL6045B芯片与不同的CPU相连,如表1所列。

ARM+PCL6045B的嵌入式运动控制器设计

本系统设置IF1:IF0=0:1,CPU连接如图3所示。

ARM+PCL6045B的嵌入式运动控制器设计

2 嵌入式运动控制器的软件设计

本系统可根据被控对象的特征设计不同的模块化用户软件,来满足不同的运动控制任务。模块化软件恰好是Linux操作系统的优点。Linux还可以根据用户的需求实现内核的裁减和定制,源码开放,网络支持功能强大,价格上也更具有竞争优势等。所以该控制器选用Linux作为片上系统(SoC)。但是,Linux并不是一个实时操作系统,因此,通过实时内核补丁RTAI(Real Time Application In-terface),在硬件平台的基础上增加一个实时内核,将Linux内核当作它的优先级最低的任务执行,从而保证运动控制系统的实时性。系统的控制软件分为两个区域:非实时域和实时域。非实时域是建立在普通Linux内核基础上的,其主要包括系统初始化和通信模块。

①系统初始化:进行微处理器的硬件初始化,包括输入/输出接口的配置、具体总线通信方式的配置以及伺服系统相关的接口参数配置。

②通信模块:负责运动控制卡和上位机之间的坐标值、速度值、数控系统的I/O接口状态、报警状态以及数据链表的传输。

实时域建立在RTAI实时内核的基础上。其实时任务通过实时进程的方式来完成,一种为周期性(peri_odic)实时进程,另一种为一次性(one shot)实时进程。实时域主要包括如下4个周期性实时线程:

①状态检测线程(rt_monitor_thread)。本任务对设备运行状态进行检测,负责从I/O端口读入各个连接的I/O设备值,然后将状态写入状态检测缓冲区中,对设备急停、伺服报警、限位信号进行判断,并进行相应的处理。

②插补线程(rt_interpolation_thread)。从译码缓冲区中顺序取得插补数据,然后根据是直线或者圆弧进行插补,插补得到下个周期应该到达的理论坐标值。

③位置控制线程(rt_position_thread)。读取计数器中编码器的数值,得到实际的位置,并与插补器中的理论位置坐标作比较。根据差值调节PID参数,并将具体脉冲输出数写入对应的PWM口的脉冲数寄存器中。

④功能控制线程(rt_function_thread)。功能控制任务利用RTAI实时管道来传递命令和状态信息的功能。通过管道的命令设置实现Linux操作系统对实时部分RTAI的访问,从而实现运动控制器的运行、暂停、给定速度等状态设置。

2.1 软件平台的建立

软件平台是系统应用程序开发的基础。本系统软件平台主要包括:ARM-Linux的移植、串行接口驱动开发、USB接口驱动开发、LCD接口驱动开发、触摸屏接口驱动开发、以太网接口驱动开发、文件系统的移植等。这些软件的开发和移植在很多文献中有详细的说明。

2.2 运动控制函数库的设计

通用运动控制器的功能主要取决于运动控制函数库。要做成一个开放式的运动控制器,必须编写丰富的运动控制函数库,以满足不同的应用要求。运动控制函数库要为单轴及多轴的步进或伺服控制提供许多运动函数,如单轴驱动、两轴直线插补、3轴直线插补、圆弧插补等等。另外,为了配合运动控制系统的开发,还编写了一些辅助函数,如中断处理、编码器反馈、间隙补偿、通用开关量的输入输出等。这样,用户在开发应用程序时就不必再关心底层的东西,只需根据控制系统的要求编制人机界面,并调用运动控制函数库中的函数,就可以开发出满足要求的多轴运动控制系统。

2.3 对Ljnux进行实时化改造

由于Linux不是一个实时操作系统,所以,利用实时内核补丁RTAI(Real Time Application Interface)。RTAI的安装和使用详见参考文献[7]。该控制器所使用的Linux开发环境为ELDK(Embedded Linux DevelopedKit)3.0。Linux内核为Linuxp pc_2_4_devel,而RTAI的版本为24.1.12。由Linux中的init_module()和cleanup_modtde()两个函数加载和卸载实时任务模块,通过这两个函数进行实时线程及其处理函数的创建和回收。其关键程序如下:
ARM+PCL6045B的嵌入式运动控制器设计

2.4 应用软件设计

应用软件主要包括人机交互界面的设计、数控指令的编译解释、按键功能的实现、运动状态的监视等。通过操作系统ARM-Linux,可方便地实现上述功能,并进行多任务的调度。运动控制器根据输入的数控指令文件,将其存入NAND Flash中。ARM处理器通过对数控指令进行译码、速度预处理、粗插补计算等,调用运动控制函数,进而发出控制指令控制步进或伺服系统去控制执行部件进行动作,从而达到实现运动控制的目的。

结 语

本文综合应用ARM嵌入式系统技术、DSP运动控制技术等多种技术开发出高性能的嵌入式运动控制器。该控制器相比传统的基于PC机的运动控制器,具有成本低、体积小、功耗低、功能丰富、运行稳定的特点和优势。以ARM微控器和PCL6045B为核心的嵌入式运动控制器,采用Linux操作系统,经过对其进行实时化改造,使系统能很好地进行多任务处理,保证了系统的实时性。该控制器能够实现高速和高精度的运动控制需求,具有良好的运动控制性能。该运动控制器的设计,为读者提供了一种良好的解决方案,在运动控制领域具有广阔的应用前景。

来源: 中国百科网

围观 8
157

运动控制系统已被广泛应用于工业控制领域。近年来,工业控制对运动控制系统的要求越来越高。传统的基于PC及低端微控制器日渐暴露出高成本、高消耗、低可靠等问题,已经不能满足现代制造的要求 。随着嵌入式技术的日益成熟,嵌人式运动控制器已经初露锋芒。基于ARM技术的微处理器具有体积小、低成本、低功耗的特点,决定其在运动控制领域具有良好的发展前景。

PCL6045BL是一种新型专用DSP运动控制芯片,它具有强大的数据处理能力和较高的运行速度,可以实现高精度的多轴伺服控制。为解决精密制造对低成本、可移植性强的通用型多轴数控系统的迫切需求,文中给出一种基于ARM 微处理器S3C2440与DSP专业运动控制芯片PCL6045BL构成的嵌入式四轴运动控制器。该运动控制器具有高性能、低成本、体积小、可独立运行等特点,可以满足运动控制系统高速、高精度的 要求。它可广泛应用于雕刻机、机器人、绣花机以及数控加工等工业控制领域。

为解决精密制造对低成本、可移植性强的通用型多轴数控系统的迫切需求,给出一种基于ARM微处理器S3C2440和专用DSP运动控制芯片PCL65045BL组合的嵌入式四轴运动控制器。硬件上该控制器采用ARM+DSP的主从式双CPU结构,结合ARM在人机界面显示、通信接口方面的优势以及PCL6045BL高控制精度的优点。软件上在S3C2440上移植μC/OS-II实时操作系统来管理运动控制系统。该控制系统通用性较强,可广泛应用于雕刻机、机器人、绣花机以及数 控加工等工业控制领域。

1 系统总体设计

嵌入式四轴运动控制器主要由硬件部分和软件部分构成。

硬件主要包括S3C2440嵌入式主控板和PCL6045BL运动控制板两个部分。S3C2440嵌入式主控板和PCL6045BL运动控制板之间通过通用的IDE通信接口进行连接。

软件方面在硬件平台的基础上移植S3C2440实时嵌入式操作系统,设计Boot Loader、外设驱动以及运动控制系统的应用程序。采用上述的软硬件平台,嵌入式运动控制器可以达到开放性能好、精度高的要求。本嵌入式四轴运动控制器的结构如图1所示。

ARM+DSP的嵌入式四轴运动控制器设计
图1 嵌入式四轴运动控制器的构成

ARM具有丰富的片内外围电路,如USB接口、IIS接口、LCD控制器等,在人机界面的显示、通信接口以及系统移植方面具有更强大的功能。PCL6045BL运动控制芯片速度快,可靠性高,性能好,在运动控制方面有很大的优势。

实时操作系统μC/OS-II包含了实时内核、任务管理、时间管理、任务间通信同步和内存管理等功能,可以使各个任务独立工作,互不干涉,很容易实现准时而且无误地执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化 。将S3C2440处理器、PCL6045BL 以及μC/OS-II三者的优势应用到本嵌入式四轴运动控制器中可以使其具有强大的功能,并缩短开发时间。

本嵌入式四轴运动控制器以S3C2440为主控平台,在ARM上移植μC/OS-II实时操作系统来进行人机界面的显示、I/O的管理、任务问的通信、指令的编译等工作。PCL6045BL运动控制模块主要负责位置控制,插补驱动,速度控制。用户的指令通过S3C2440指令编译系统的编译,通过与PCL6045BL之问的专用通信接口来控制DSP运动控制芯片发出脉冲以达到使伺服电机高速运行。

2 系统硬件设计

2.1 系统硬件平台设计

在控制系统中,以S3C2440处理器为主控核心,PCL6045BL运动控制芯片为从CPU,构建的嵌入式运动控制器结构如图2所示。

ARM+DSP的嵌入式四轴运动控制器设计
图2 系统硬件

S3C2440是一款16/32位ARM920T RISC处理器,它实现了MMU、AMBA总线和独立的16 KB指令和16 KB数据哈佛结构的缓存,每个缓存均为8个字长度的流水线。S3C2440提供全面的、通用的片上外设,不需要配置额外的部件。PCL6045BL运动控制芯片,由NPM公司生产,是一种通过总线接收CPU命令、并产生脉冲控制步进电机或脉冲驱动型伺服电机的CMOS大规模集成芯片,可提供多种输出运动控制功能,包括连续、定长、回原点等输出方式。PCL6045BL可以实现2~4轴线性插补及任意两轴圆弧插补。在这种主从结构框架基础上,主CPU S3C2440主要负责数据的存储、人机界面的显示、网络通信等管理工作。从CPU PCL6045BL输出的脉冲发送给4个轴的伺服驱动器。S3C2440只需要通过发送简单的指令给PCL6045BL,便可实现各种控制功能。

2.2 ARM 与PCL6045BL的连接

PCL6045 BL与ARM的通信是通过读写I/O总线上的几个地址来进行指令和数据的传输。PCL6045BL每个轴的内部寄存器地址由A0、A1 和A2地址线输人决定,其控制地址范围由输入端子A3和A4进行选择。因此在这种主从结构的设计中,ARM与PCL6045BL的连接如图3所示。

ARM+DSP的嵌入式四轴运动控制器设计
图3 PCL6045BL与S3C2440的接口电路

2.3 I/O接口电路

嵌入式四轴运动控制器与伺服电机之间是通过I/O接口电路进行连接的。I/O接口电路主要任务是完成输入信号的光电隔离以及对输出脉冲的驱动。设计中采用光电耦合器将PCL6045BL芯片与后面的伺服电机驱动器以及其他控制反馈等线路隔离。由于光耦合器输入输出问互相隔离,电信号传输具有单向性等特点,因而具有良好的电绝缘能力和抗干扰能力。又由于光耦合器的输入端属于电流型工作的低阻元件,因而具有很强的共模抑制能力。将PCL6045BL的输出信号(如CP、CW等)和输入信号(如报警、限位等)都使用光耦器件与PCL6045BL隔离,这样能有效地防止干扰信号进入主芯片损坏PCL6045BL。

3 软件设计

系统软件部分由μC/OS-II实时嵌入式操作系统及相关应用软件组成。μC/OS-II实时嵌入式操作系统仅仅提供了一个任务调度的实时内核,因而需要自行开发一系列与系统运行相关的设备驱动程序、API函数及应用程序,才能将μC/OS-II扩展为一个完整、实用的实时操作系统。

3.1 Boot Loader的设计

嵌入式系统中,通常并没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Boot Loader来完成。Boot Loader是系统加电后运行的第一段代码,负责初始化系统并启动操纵系统,相当于PC机的程序。Boot Loader初始化硬件设备,建立内存空间的映射图,为最终调用操作系统内核准备好正确的环境。

Boot Loader分为阶段1和阶段2两个部分,与CPU核以及存储设备密切相关的处理工作通常都放在阶段1中,且可以用汇编语言来实现;而阶段2则通常用C语言来实现一般的流程以及对板级的一些驱动支持。

阶段1主要进行定义入口、设置中断向量、系统寄存器配置、初始化寄存器等操作。而阶段2主要完成调用初始化函数、初始化闪存设备、初始化内存分配函数等操作。Boot Loader是嵌入式系统软件开发的第一个环节,把实时操作系统和硬件平台紧密地结合起来,对于嵌入式系统的软件开发尤为重要。

3.2 μC/OS-II在S3132440的移植

嵌入式实时操作系统μC/OS-II是一个源代码公开的多任务实时操作系统内核,它简化了应用软件的设计,使控制系统的实时性得到保障。良好的多任务设计,有助于提高控制系统的稳定性和可靠性。所谓移植,就是通过修改操作系统内核与处理器相关部分的源代码,使一个实时内核能在微处理器或微控制器上运行。μC/OS-II的文件系统结构包括核心代码部分,配置代码部分,处理器相关代码部分,如图4所示。其中处理器相关代码部分包括OS_CPU.H,OS_CPU.A.ASM,OS_CPU.C.C 3个文件。将μC/OS-II移植到S3C2440只需要修改与处理器相关的代码即可。

ARM+DSP的嵌入式四轴运动控制器设计

3.3 系统应用程序设计

实时应用程序的设计过程包括如何把问题分割为多个子任务,每个子任务都是整个系统的一部分,都被赋予一定的优先级,有自己的一套CPU寄存器和堆栈空间。一个任务,也叫一个线程,是一个简单的程序,该程序可以认为CPU完全只属于自己。在本设计中将任务划分为人机界面的设计、数控指令编译解释、伺服单元采集任务、状态监视等。μC/OS-II可以按照优先级启动各个任务,并通过内核来完成任务之间的调度。系统的基本流程如图5所示。

S3C2440根据系统的应用程序对指令进行解释,调用运动控制函数,继而PCL6045BL发出脉冲控制伺服电机去控制执行机构动作,实现运动控制的结果。

ARM+DSP的嵌入式四轴运动控制器设计
图5 用户程序流程

3.4 NC代码解释

运动控制器接受来自上位机发送过来的加工文件,但加工文件指令在程序中不能直接被识别,在执行指令之前必须先对其进行解析译码。解释器的主要功能就是将用户程序以程序段为处理单位,将程序中的轮廓信息、运行速度和辅助功能信息,转换成嵌入式运动控制器能够执行的格式。解释过程主要包括数控文件的读入、词法分析、语法分析以及加工信息存储数据结构等过程,如图6所示。

ARM+DSP的嵌入式四轴运动控制器设计
图6 程序处理流程

4 实例分析

上位机通过RS485总线与S3C2440连接,把NC指令文件输入到ARM 中,经过NC代码解释器,变成PCL6045BL能够识别的代码,从而完成规定的运动控制功能。用NC代码编写如下加工程序:

N001 COO X15 Y25//起始点选定

N002 G18//XY平面选择

N003 G90 G01 X15 Y5//准备直线插补

N004 X30 Y5//(15,5)到(30,5)

N005 X30 Y15//前行至点(30,15)

N006 X45 Y15//前行至点(45,15)

N007 X45 Y5//前行至点(45,5)

N008 X60 Y5//前行至点(60,5)

N009 X60 Y25//前行至点(60,25)

N010 X15 Y25//回到始点(15,25)

根据上面所给的代码可以完成如图7所示的多点之间直线插补的功能。

ARM+DSP的嵌入式四轴运动控制器设计
图7 多线段直线插补运动轨迹

5 结语

该运动控制器的硬件结构是基于微处理器S3C2440和PCL6045BL运动控制芯片设计的,它较好地发挥了ARM处理器的高性能、低成本和运动控制芯片的高可靠性、开发周期短的优点;在控制器硬件平台上移植μC/OS-II实时操作系统既能使整个软件系统结构简结、层次清晰,又能很好地达到运动控制实时性的要求。

来源: elecfans.com

围观 13
156

页面

订阅 RSS - ARM