ARM

为了达到节省能源、降低排放的目标,电子控制技术在货车、工程车以及农用车的柴油机上得到快速发展和应用。随着机车电控化技术发展,车载定位终端的数据采集交互速度以及运行的稳定性已成为衡量该设备的一个重要指标。为进一步提升车载定位终端的实时性和稳定性,文中设计了一种基于ARM处理器和μC/OS—II操作系统的车载定位终端。应用ARM处理器实现数据交互的高速性,应用μC/OS—II操作系统解决程序运行的稳定性问题。

1 、车载终端整体结构及功能介绍

车载定位终端主要由CPU(包括S3C44BOX芯片,2MbyteNorFlash和8MByteSDRAM),GPS卫星数据接收电路,GPRS无线数据上传电路和CAN控制器及数据收发模块组成。如图1所示:来自车载电瓶的+12 V直流电经过车载定位终端上的电压转换电路,转换成+5 V、+4.2 V和+3.3 V的直流电分别向车载定位终端的CAN数据收发模块、S3C44BOX芯片、GPS卫星数据接收电路和GPRS无线数据传输电路供电;CAN数据收发模块通过CAN总线接收ECU、EGR、TCU等车载控制器发来的反应电控车工况的数据,CAN总线末端的两个120欧电阻为阻抗匹配电阻;GPS则实时接收卫星数据并将这些数据按照NMEA-0183协议输出给CPU;CPU通过应答机制接收CAN数据收发模块传来的数据,通过中断方式实时接收GPS发来的数据并通过相应算法对接收到的卫星数据进行处理,之后将所有数据按照固定的格式进行打包并发送给GPRS;GPSR接收到相应的数据包后,通过无线方式实时上传给监控中心。

基于ARM和μC/OS-II的车载定位终端的设计

在车载定位终端的实际应用之中,影响数据交互速度的主要因素取决于CPU的处理速度,电控车工况信息读取以及GPS卫星数据接收的实时性;影响稳定性的主要因素是硬件的抗电磁干扰性能及μC/OS—II操作系统对不同优先级任务的合理调度分配。下文将围绕CPU电路、GPS卫星数据接收电路、GPRS无线数据上传电路以及系统软件等几个主要影响因素进行阐述和分析。

2 、硬件电路的设计

1)S3C44BOX处理器

S3C44BOX处理器是Samsung公司推出的采用了ARM7TDMI内核的16/32位RISC处理器。该处理器拥有丰富的内置部件:8KBcache,LED控制器,SDRAM控制器,5通道PWM定制器,PLL倍频器,IIC总线接口,IIS总线接口,2通道UART,4通道DMA和8通道10位AD转换器。这些部件使得S3C44BOX处理器在保证高性能的同时(最高运行速度达66 MHz),最大限度的降低了设计开发的成本。相较于传统的8位单片机,S3C44BOX处理器可较大程度的提升车载定位终端对数据处理速度的需求。

2)GPS抗电磁干扰电路

如图2,GPS电路的核心器件为GS-89M-J模块。该模块采用了最新的MTK3329芯片作为主控芯片,定位精度小于10 m圆周误差,定位时间在热启动模式下仅为1 s。MIC29302BU模块是一款大电流高稳定性的电压调节模块,主要用于向GS-89M-J模块提供4.2 V的工作电压,模块中的5脚位为可调输出引脚,在可调模式下,该引脚输出固定的1.25 V的直流电压,为了保证该模块能够提供稳定的4.2 V电压,设计中使用电阻值分别为43 K和100 K的精密电阻R521X和R525X组成了串联电压提升电路,以实现模块的输出引脚输出4.2 V的直流电压S3C44BOX通过向该模块的1引脚(EN端-使能输出端,高电平有效)输出高电平或低电平来控制该模块的工作与否;电容C564、极性电容C562、电阻R550和R551所组成的地分离电路,主要用于将GPS电路和车载终端上的其它电路进行隔离,以防止GPS电路与其它电路因为公共阻抗耦合引起交叉干扰;出于保证车载定位终端运行稳定性考虑,通过S3C44BOX芯片的一个通用I/O引脚和三极管Q501、电阻R502、R505、R507组成GS-89M-J复位控制电路,以确保GS-89M-J在程序跑飞时主控芯片能及时对其进行复位操作;本设计中选用的GPS天线的阻抗值为50欧姆,由于GPS信号为1575. 42 MHz的高频载波信号,在传输过程中,容易因传输线的特征阻抗与终端阻抗不匹配造成信号反射,为防止该现象发生,本设计中用于连接GPS天线和GS-89M-J模块RF_IN引脚的射频线的特性阻抗值为50欧姆;GS-89M-J模块实时接收来自卫星的信号同时对其进行解算,并将解算结果按照NMEA0183协议打包成GPGGA、GPGSA、GPGSV、GPRMC、GPVTG和GPGLL7帧数据输出给S3C44BOX。S3C44BOX通过串口中断方式实时接收GS-89M-J发来的数据帧。

基于ARM和μC/OS-II的车载定位终端的设计

3)GPRS抗电磁干扰电路

如图3,GPRS电路的核心器件是SIM900模块。SIM900采用省电技术设计,在睡眠模式下耗流仅为1.0 mA,同时该模块嵌入了TCP/IP协议,提高了用户应用该模块进行数据无线传输的开发效率。

电路中的NC7WZ07为高速电平转换芯片,通过该芯片可将SIM900输出的4.2 V串行信号转换为S3C44BOX可接收的3.3 V串行信号,实现SIM900和S3C44BOX的无障碍通信;电路中的MOLEX-91228为SIM卡座,为防止SIM卡受到静电放电和高频信号的干扰,此处选用SMF05C对SIM卡进行保护;为防止来自SIM900的特高频信号在传至SIM卡时形成信号反射,降低信号质量,这里选用22欧的电阻R614和R613对二者进行阻抗匹配;S3C44BOX通过向SIM900的1引脚(PWRKEY引脚-电开关引脚)发送脉宽为1 s的高电平,便可控制该模块的关闭与打开;S3C44BOX通过向SIM900的14引脚(NRESET引脚-低电平复位引脚)发送一个高电平,便可对该模块进行复位操作;与GPS电路一样,GPRS电路中的用于连接GPRS天线与SIM900 RF_ANT引脚的射频线的特性阻抗为50 Ω;SIM900通过串口接收来自S3C44B OX的数据包,并通过GPRS网络将数据包上传至监控中心。

基于ARM和μC/OS-II的车载定位终端的设计

3、 系统软件设计

为实现车载定位终端数据处理的实时性和运行的稳定性,确保电控车工况信息读取任务和GPS卫星数据接收任务能在第一时间内完成,本设计引入了μC/OS—II操作系统。μC/OS—II能够根据任务的优先级动态地切换任务,保证系统对实时性的要求。

如图4所示为系统主函数流程图,系统上电,经过对S3C44BOX的时钟电路以及相关寄存器配置完成对S3C44BOX的初始化操作,之后调用OSInit()函数完成对μC/OS—II的初始化操作,接着系统通过OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8U prio)函数创建车载定位终端的应用任务,最后通过OSStart()函数调用任务调度函数OSCtxSw()开始任务调度。各应用任务间的同步及数据交互通过信号量和消息邮箱来完成。

基于ARM和μC/OS-II的车载定位终端的设计

基于车载定位终端的主要功能,该车载定位终端应用程序主要包括3个任务和2个中断。分别是电控车工况信息读取任务(void VehInf Read_ Task(void*pada)),该任务主要用来接收来自ECU、EGR等车载控制器传来的反应车辆工作状况的信息,如:发动机冷却液温度、发动机润滑油压力、发动机曲轴转速、发动机凸轮轴转速、废气后处理阀门开度等等,由于车载定位终端要同时接收多个车载控制器的数据,为确保车载定位终端能够精确识别各车载控制器上传的数据,此处采用主叫-应答机制实现车载定位终端和各车载控制器间的数据通信;GPS卫星数据处理任务(void SatDatPro_Task(void*pada))则主要对GS-89M-J模块传来的数据帧进行筛选并从筛选出来的数据帧中提取车辆位置的信息;GPRS数据上传任务(void DatSend_Task(void*pada))则主要将车辆工况信息和位置信息按照固定数据帧格式进行打包并通过SIM900以无线方式上传给监控中心;CAN接收中断函数(void_irq CANRev(void))是由CAN收发器触发的,CAN收发器每接收到一帧来自各车载控制器的数据时,中断即被触发,该中断函数主要将接收到数据帧通过消息邮箱传送给电控车工况信息读取任务;串口接收中断函数(void_irq Seri Rev(void))则主要是在GS-89M-J完成卫星信号解算并向S3C44BOX的串口进行数据输出时被触发的。

影响车载定位终端实时性的主要因素是对GPS卫星数据的处理速度,因此车载定位终端中各任务的优先级分配如下表(优先级值越小则对应的优先级越高)。

基于ARM和μC/OS-II的车载定位终端的设计

4 、结束语

文中所设计的车载定位终端应用ARM处理器和μC/OS—II操作系统最大限度地保证了终端数据交换的实时性与运行的稳定性。经证实,该车载定位终端在货车、工程车、农用车等领域拥有广阔的应用前景。

来源:网络

围观 299

目前市场上大部分的图像采集与处理系统是基于DSP 芯片的,这种图像采集与处理系统成本高、功耗高、体积约束等特点并不适用于一些简单的应用。随着USB 摄像头的普及和基于ARM 的嵌入式芯片的快速发展,将二者结合的便携性越来越受人们欢迎。本文介绍了一种基于三星S3C2440A 芯片的嵌入式USB 摄像头图像采集与显示方案,该方案具有良好的可移植性和扩展性,并且成本、大小和实时处理都能够满足市场需求。

1 系统架构

系统通过当前市场上应用最广泛的中芯微公司生产的zc301p 芯片的USB 摄像头进行图像采集,然后将图像信息传送到ARM 芯片中进行处理,最终通过基于Qt/Embedded 编写的图形显示程序在LCD 上实时显示。系统的整体架构如图1 所示。

基于ARM的嵌入式USB图像采集与显示方案

2 视频图像采集

系统采用中芯微公司生产的zc301p 芯片的USB 摄像头作为图像采集设备,并介绍了基于Video4Linux 编程协议进行视频图像采集的一般过程。

2.1 USB 摄像头驱动

Linux 内核能够很好地支持OHCI(开放式主机控制接口协议),并且能够很好地支持包括OV511系列摄像头在内的各种各样的USB 设备,但是并不包括zc301pUSB 摄像头。直到后来2.6.27 版本左右的内核中才增加了针对zc301 系列芯片的驱动,统称为Linux UVC.本文采用的是Linux2.6.32.2 版本内核,只需要对内核进行简单的配置,就可以实现功能了。

在配置菜单选项中,设备驱动是最重要的配置项。选择的配置项如下:

  DevICe Drivers - - - >
  Multimedia devices - - - >
  Video For Linux
  Enable Video For Linux API 1(DEPRECAteD)
  Video capture adapters - - - >
  V4L USB devices - - - >
  USB Video Class (UVC)
  UVC input events device support
  GSPCA based webcams - - - >
  ZC3XXX USB CAMEra Driver
  USB ZC0301 [P]Image Processor and Control
  Chip support

现在,内核被配置成可以支持Video4Linux 的视频接口,并且加入了支持zc301pUSB 摄像头的驱动程序。

2.2 基于Video4Linux 的视频图像采集程序设计

Video4Linux(简称V4L)为目前市场常见的电视捕获卡和并口及USB 口的摄像头提供统一的编程接口。在Linux 内核中它为用户空间提供统一的编程接口,V4L 分为两层:底层是音频和视频设备驱动程序的内核;上层为系统提供一些API 接口信息。视频图像采集流程如图2 所示。

基于ARM的嵌入式USB图像采集与显示方案

(1)打开视频设备。

在Linux 中视频设备是被作为设备文件来执行的,本文USB 摄像头的设备文件名为/dev/video0.

int my_v4l_open (char*dev,my_v4l_STruct*vd) 函数用于打开视频设备并初始化摄像头设备,该函数调用open 函数可以读设备文件,成功返回设备描述符,失败返回- 1.主要程序代码如下:

  int my_v4l_open(char*dev,my_v4l_struct*vd){
  if((vd- >fd=open(vd- >videodevice,O_RDWR))= =- 1){
  printf(“ERROR opening V4L interface”);
  exit(1);}
  ……}

(2)读设备信息。

int my_v4l_get_capability (my_v4l_struct*) 函数的功能是读取设备基本信息, 它利用ioctl(vd_fd,VIDIOCGCAP,&(vd- >capability) 来读取有关摄像头的信息。该函数成功返回后将这些信息从内核空间拷贝到用户程序空间capability 各成员分量中,使用printf 函数就可得到各成员分量信息。具体如下:

  int my_v4l_get_capability(my_v4l_struct*){
  if(ioctl(vd- >fd,VIDIOCGPICT,&(vd- >capability))<0){
  printf(“error:v4l_get_capabilityn”);
  exit(1);}
  return 0;}

(3)视频图像采集。

本文通过mmap 方式来采集视频图像信息。为了获得映射的帧缓冲信息,my_v4l_mmap_init(my_v4l_struct*)函数需先初始化缓冲区,并进行内存与缓冲区的绑定,其中函数mmap 用于将文件fd与video_mbuf 绑定实现映射,函数mmap()返回值是系统实际分配的起始地址。函数my_v4l_mmap_init()的部分代码实现如下:

  void my_v4l_mmap_init(my_v4l_struct*vd){
  ……
  ioctl(vd- >fd,VIDIOCGMBUF,&(vd- >mbuf));// 初始化video_mbuf 以得到所映射的buffer的信息
  vd- >pframebuffer= (unsigned char*)mmap (0,
  vd- >videombuf.size,
  PROT_READ|PROT_WRITE,MAP_SHARED,vd- >fd,0);
  /* 把文件fd 与video_mbuf 绑定,实现映射*/
  vd- >mmapsize=vd- >videombuf.size;
  vd- >vmmap.height=vd- >HDRheight;
  vd- >vmmap.width=vd- >hdrwidth;
  vd- >vmmap.format=vd- >formaTIn;
  vd- >vmmap.frame=0;
  ……}

然后利用驱动程序的ioctl () 函数的VIDIOCMCCAPTURE 和VIDIOCSYNC 命令来获取图像。其中ioctl (vd- >fd,VIDIOCMCAPTURE,&(vd- >mmap)) 开始一帧图像的采集,是非阻塞的;ioctl(vd- >fd,VIDIOCSYNC,&frame)用于判断一帧图像采集过程结束与否,frame 是当前采集的帧的序号。

采集工作结束后调用munmap 取消文件fd 与video_mbuf 的绑定。

  munmap(vd- >map,vd- >mbuf.size);

(4)关闭设备在视频采集完成后,必需关闭视频设备。
  close(vd- >fd);

3 基于Qt/Embedded 图像显示程序的编写

基于嵌入式Linux 常见的GUI 系统有MiniGUI、MicroWindows、OpenGUI和基于Framebuffer[5]的Qt/Embedded[4].Qt 是诺基亚开发的一个跨平台的C++ 图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的功能,并且是完全面向对象的,很容易扩展,允许真正的组件编程。正是基于以上优点,本文采用Qt/Embedded 开发平台,并将基于Qt 的图形界面Qtopia 移入我们的文件系统中。

为了避免由于图像数据量大而在目标板上显示闪烁的问题,本文采用双缓冲技术实现采集图像显示,采用的是QPixmap 对象。QPixmap 是Qt 为图像处理提供的类,主要用于图像的绘制。实现双缓冲时,先把要显示的内容绘制在这个QPixmap pixmap 对象上,然后再用一步操作把pixmap 绘制在屏幕上。基于Qt 图像显示及辅助框线绘制的部分代码段如下:

  QPixmap pix (width (),height ());// 定义一个QPixmap 用于在上面绘制图像及框线
  QPainter p(&pix);// 定义绘制工具
  QPainterQPen pen (yellow,3,DotLine);// 定义一个画笔的属性,如颜色、粗细、线条样式
  p.drawImage (0,0,img);// 把摄像头采集到的图像绘制到QPixmap 上
  p.setPen(pen);// 设置画笔属性
  p.moveTo(50,330);// 设置画笔笔尖起始位置
  p.lineTo(150,50);// 开始绘制框线
  p.lineTo(490,50);
  …略
  p.end();// 在QPixmap 上的所有绘制任务结束
  p.begin(this );// 准备把QPixmap 绘制到屏幕上
  p.drawPixmap (0,0,pix);// 绘制QPixmap 到屏幕操作,图像显示到LCD 上

图像数据的连续采集和显示是通过定时器实现的,QTimer 类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用VIDIOCMCAPTURE 函数完成对图像的采集,并通过QPixmap 类将图像显示到LCD上。至此就可以通过基于Qt 编写的图形界面程序,将USB 摄像头采集的视频图像在LCD 上实时显示。

4 结论

本文基于ARM9 处理器和嵌入式Linux 操作系统,详细介绍了一种USB 摄像头图像采集与显示的通用方法。Linux 代码完全开源,系统具有良好的移植性,可方便地进行各种扩展,采用Qt 进行人机界面的设计能够极大地节省开发成本和周期。本方案经推广可用于工业控制、智能交通、小区监控等领域。

转自: eeworld.com

围观 467

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

围观 472

机载电台担负着空空和地空之间通信,为保证电台性能,需要对其进行定检。基于单片机的检测仪存在测量速度慢、可扩展性差的问题;而基于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存储接口,在手动测试的情况下还可以把测量数据直接保存下来,极大地提高了测试结果的处理速度,具有广阔的经济效益和军事效益。

转自: 广电电器

围观 377

介绍了一个简单的可调实时时钟系统的设计。设计中采用了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

围观 242

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

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平台数据为何莫名其妙就丢了?
围观 606

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状态的结合和优化。

转自: 又一个暑假

围观 526

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-博客园

围观 842

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-博客

围观 718

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 的移植变得更加容易。

转自: 王小波的博客

围观 650

页面

订阅 RSS - ARM