ARM9

新唐作为微控制器及微处理器的领导厂商之一,除了在微控制器系列有上百款的产品可供选择,在微处理器方面也有许多出色的产品。本篇文章一次整理所有新唐的微处理器系列,让开发人员能够快速选出适合自己的开发平台。

新唐 Arm9 微处理器

新唐NuMicro Arm9 微处理器主要分为三大类,NUC970/980 的工业控制系列、N9H emWin HMI系列及N329 影音产品系列。主频从 200MHz 到 300MHz,支持JPEG 及 H.264 编译码器,最高达 1024 x 768 的屏分辨率,多种硬件加解密引擎及多种外设接口,全系列产品皆采用 LQFP 封装,内置最小 2MB 到最大 128MB DRAM,协助客户整体降低硬件开发成本及生产维护返修费用。


NUC970/ NUC980

NUC970 及 NUC980 系列可应用于工业控制环境,产品包括工控人机显示接口、物联网网关、网络打印机、智能电表、新能源设备等应用。NUC970/980系列具备最多11组UART,其他接口包括USB、I2C、SPI、PWM、CMOS及EBI等,提供工业产品的多种协议沟通需求及子系统对接应用。NUC970 支持最高达 1024 x 768 分辨率的RGB 显示接口,NUC980 虽不带屏,但可支持最高达 4组 CAN 总线接口,并针对外设接口优化,提高传输效率,以下为NUC970/980参考选型表


N9H

N9H 系列主要锁定 HMI人机接口产品,可应用于智能家居设备、白色家电显示屏、工业显示单元等。新唐自SEGGER取得emWin软件库的授权,此软件库能让开发人员透过窗口接口进行HMI的GUI接口设计,让毫无GUI经验的软件人员也能快速规划好产品的显示效果,并进行功能代码撰写,缩短产品的设计时间,尽速将产品推向市场。N9H 系列可依据主频速度、屏分辨率、音视频功能进行细分,参考选型表如下


N329

N329系列主要锁定入门级消费型影音产品,芯片内部包含音视频编译码器、2D 图像处理器、RGB LCD输出接口及Stereo DAC等功能,参考选型表如下:


新唐NuMicro Arm9 系列提供多种芯片供硬件选择,软件则提供Linux、FreeRTOS及裸机系统等方案,此外,NuMicro Arm9 系列也提供多种开发平台供初期立项评估,包括NuMaker NUC980 Industrial IoT开发板、NuMaker emWin N9H系列开发板等,若项目初期仅需要一两套平台进行原型验证,可上新唐天猫旗舰店购买,省下评估初期的洗版打件时程及费用。

来源:新唐MCU

围观 180

1、ARM处理器解析

ARM9、ARM11是哈佛结构,5级流水线结构,所以性能要高一点。ARM9和ARM11大多带内存管理器,跑操作系统好一点,ARM7适合裸奔。我们惯称的 ARM9系列中又存在ARM9与ARM9E两个系列,其中ARM9 属于ARM v4T架构,典型处理器如ARM9TDMI和ARM922T;而ARM9E属于ARM v5TE架构,典型处理器如ARM926EJ和ARM946E。因为后者的芯片数量和应用更为广泛,所以我们提到ARM9的时候更多地是特指ARM9E系列处理器(主要就是ARM926EJ和ARM946E这两款处理器)。下面关于ARM9的介绍也是更多地集中于ARM9E。

2、ARM7处理器和ARM9E处理器的流水线差别

对嵌入式系统设计者来说,硬件通常是第一考虑的因素。针对处理器来说,流水线则是硬件差别的最明显标志,不同的流水线设计会产生一系列硬件差异。

让我们来比较一下ARM7和ARM9E的流水线,ARM9E从ARM7的3级流水线增加到了5级,ARM9E的流水线中容纳了更多的逻辑操作,但是每一级的逻辑操作却变得更为简单。比如原来 ARM7的第三级流水,需要先内部读取寄存器、然后进行相关的逻辑和算术运算,接着处理结果回写,完成的动作非常复杂;而在ARM9E的5级流水中,寄存器读取、逻辑运算、结果回写分散在不同的流水当中,使得每一级流水处理的动作非常简洁。这就使得处理器的主频可以大幅度地提高。因为每一级流水都对应 CPU的一个时钟周期,如果一级流水中的逻辑过于复杂,使得执行时间居高不下,必然导致所需的时钟周期变长,造成CPU的主频不能提升。所以流水线的拉长,有利于CPU主频的提高。在常用的芯片生产工艺下,ARM7一般运行在100MHz左右,而ARM9E则至少在200MHz以上。

3、ARM9E处理器的存储器子系统

像ARM926EJ 和ARM946E这两个最常见的ARM9E处理器中,都带有一套存储器子系统,以提高系统性能和支持大型操作系统。如图2所示,一个存储器子系统包含一个 MMU(存储器管理单元)或MPU(存储器保护单元)、高速缓存(Cache)和写缓冲(Write Buffer);CPU通过该子系统与系统存储器系统相连。

高速缓存和写缓存 的引入是基于如下事实,即处理器速度远远高于存储器访问速度;如果存储器访问成为系统性能的瓶颈,则处理器再快也是浪费,因为处理器需要耗费大量的时间在 等待存储器上面。高速缓存正是用来解决这个问题,它可以存储最近常用的代码和数据,以最快的速度提供给CPU处理(CPU访问Cache不需要等待)。

4、复杂处理器内部的存储器子系统

MMU则是用来支持存储器管理的硬件单元,满足现代平台操作系统内存管理的需要;它主要包括两个功能:一是支持虚拟/物理地址映射,二是提供不同存储器地址空间的保护机制。一个简单的例子可以帮助我们理解MMU的功能,在一个操作系统下,程序开发人员都是在操作系统给定的API和编程模型下开发程序;操作系统通常只开放一个确定的存储器地址空间给用户。这样就带来 一个直接的问题,所有的应用程序都使用了相同的存储器地址空间,如果这些程序同时启动的话(在现在的多任务系统中这是非常常见的),就会产生存储器访问冲 突。那操作系统是如何来避免这个问题的呢?

操作系统会利用MMU硬件单元完成 存储器访问虚拟地址到物理地址的转换。所谓虚拟地址就是程序员在程序中使用的逻辑地址,而物理地址则是真实存储器单元的空间地址。MMU通过一定的规则, 可以把相同的虚拟地址映射到不同的物理地址上去。这样,即使有多个使用相同虚拟地址的程序进程启动,也可以通过MMU调度把它们映射到不同的物理地址上 去,不会造成系统错误。

5、MMU的功能和作用

MMU 处理地址映射功能之外,还能给不同的地址空间设置不同的访问属性。比如操作系统把自己的内核程序地址空间设置为用户模式下不可访问,这样的话用户应用程序 就无法访问到该空间,从而保证操作系统内核的安全性。MPU与MMU的区别在于它只有给地址空间设置访问属性的功能而没有地址映射功能。

Cache以及MMU等硬件单元的引入,给系统程序员的编程模型带来了许多全新的变化。除了需要掌握基本的概念和使用方法之外,下面几个针对系统优化的点既有趣又重要:

1.系统实时性考虑因素
为保存地址映射规则的页表(Page Table)非常庞大,通常MMU中只是存储器了常用的一小段页表内容,大部分页表内容都存储于主存储器里面;当调用新的地址映射规则时,MMU可能需要 读取主存储器来更新页表。

这在某些情况下会造成系统实时性的丢失。比如当需要执行一段关键的程序代码时,如果不巧这段代码使用的地址空间不在当前MMU的 页表处理范围里面,则MMU首先需要更新页表,然后完成地址映射,接着才能相应存储器访问;整个地址译码过程非常长,给实时性带来非常大的不利影响。所以一般来说带MMU和Cache的系统在实时性上不如一些简单的处理器;不过也有一些办法能够帮助提高这些系统的实时效率。

一个简单的办法是在需要的时候关闭MMU和Cache,这样就变成一个简单处理器了,可以马上提高系统实时性。当然很多情况下这不可行;在ARM的MMU和 Cache设计中,有一个锁定的功能,就是说你可以指定某一块页表在MMU中不会被更新掉,某一段代码或数据可以在Cache中锁定而不会被刷新掉;程序 员可以利用这个功能来支持那些实时性要求最高的代码,保证这些代码始终能够得到最快的响应和支持。

2.系统软件优化
在嵌入式系统开发中,很多系统软件优化的方法都是相同和通用的,多数情况下这种规则也适用于ARM9E架构上。如果你已经是一个ARM7的编程高手,那么恭 喜你,以前你掌握的优化方法完全可以用在新的ARM9E平台上,但是会有一些新的特性需要你加倍注意。最重要的便是Cache的作用,Cache本身并不 带来编程模型和接口的变化,但是如果我们考察Cache的行为,就能够发现对于软件优化,Cache是有比较大的影响的。

Cache 在物理上就是一块高速SRAM,ARM9E的Cache组织宽度(cache line)都是4个word(也就是32个字节);Cache的行为受系统控制器控制而不是程序员,系统控制器会把最近访问存储器地址附近的内容复制到 Cache中去,这样,当CPU访问下一个存储器单元的时候(这个访问既可能是取指,也可能是数据),可能这个存储器单元的内容已经在Cache里了,所 以CPU不需要真的到主存储器上去读取内容,而直接读取Cache高速缓存上面的内容就可以了,从而加快了访问的速度。

从Cache的工作原理我们可以看 到,其实Cache的调度是基于概率的,CPU要访问的数据既可能在Cache中已经存在(Cache hit),也可能没有存在(Cache miss)。在Cache miss的情况下,CPU访问存储器的速度会比没有Cache的情况更坏,因为CPU除了要从存储器访问数据以外,还需要处理Cache hit或miss的判断,以及Cache内容的刷新等动作。只有当Cache hit带来的好处超过Cache miss带来的牺牲的时候,系统的整体性能才能得到提高,所以Cache的命中率成为一个非常重要的优化指标。

根据Cache行为的特点,我们可以直观地得到提高Cache命中率的一些方法,如尽可能把功能相关的代码和数据放置在一起,减少跳转次数;跳转经常会引起 Cache miss。保持合适的函数大小,不要书写太多过小的函数体,因为线性的程序执行流程是最为Cache友好的。循环体最好放置在4个word对齐的地址,这 样就能保证循环体在Cache中是行对齐的,并且占用最少的Cache行数,使得被多次调用的循环体得到更好的执行效率。

6、性能和效率的提升

前面介绍了ARM9E相比于ARM7性能上的提高,这不仅表现在ARM9E有更快的主频、更多的硬件特性上面,还体现在某些指令的执行效率上面。执行效率我 们可以用CPU的时钟周期数(Cycle)来衡量;运行同一段程序,ARM9E的处理器可以比ARM7节省大约30%左右的时钟周期。

效率的提高主要来自于ARM9E对于Load-Store指令执行效率的增强。我们知道在RISC架构的处理器中,程序中大约有30%的指令是Load- Store指令,这些指令的效率对系统效率的贡献是最明显的。ARM9E中有两个因素帮助提高Load-Store指令的效率:

1)ARM9内核是哈佛架构,拥有独立的指令和数据总线;相对应,ARM7内核是指令和数据总线复用的冯诺依曼架构。

2)ARM9的5级流水线设计把存储器访问和寄存器写回放在不同的流水上面。

两者结合,使得在指令流的执行过程中每个CPU时钟周期都可以完成一个Load或Store指令。下面的表格比较了ARM7和ARM9处理器之间的Load -Store指令。从中可以看出所有的Store指令ARM9比ARM7省1个周期,Load指令可以省2个周期(在没有互锁的情况下,编译工具能够通过 编译优化消除大多数的互锁可能)。

综合各种因素,ARM9E处理器拥有非常强大的性能。但是在实际的系统设计中,设计人员并不总是把处理器性能开到最大,理想情况是把处理器和系统运行频率降低,使得性能刚好能满足应用需求;达到节省功耗和成本的目的。在评估系统能够提供的处理器能力过程中,DMIPS指标被很多人采用;同时它也被广泛应用于不同处理器间的性能比较。

但是用DMIPS来衡量处理器性能存在很大的缺陷。 DMIPS并非字面上每秒百万条指令的意思,它是一个测量 CPU运行一个叫Dhrystone的测试程序时表现出来的相对性能高低的一个单位(很多场合人们也习惯用MIPS作为这个性能指标的单位)。因为基于程 序的测试容易受到恶意优化的干扰,并且DMIPS指标值的发布不受任何机构的监督,所以使用DMIPS进行评估时要慎重。例如对Dhrystone测试程 序进行不同的编译处理,在同一个处理器上运行也可以得出差别很大的结果。

DMIPS 另外一个缺点是不能测量处理器的数字信号处理能力和Cache/MMU子系统的性能。因为Dhrystone测试程序不包含DSP表达式,只包含一些整型 运算和字符串处理,并且测试程序偏小,几乎可以完整地放在Cache里面运行而无需与外部存储器进行交互。这样就难以反映处理器在一个真实系统中的真正性 能。

一种值得鼓励的评估方法是站在系统的角度看问题,而不仅仅拘泥于CPU本身;而系统性能评估最好的测试向量就是用户应用程序或相近的测试程序,这是用户所需的最真实的结果。

7、ARM9E处理器的DSP运算能力

伴随应用程序的多样化和复杂化,诸如多媒体、音视频功能在嵌入式系统里面也是全面开花。这些应用需要相当的DSP处理能力;如果是在传统的RISC架构上实 现这些算法,所需的资源(频率和存储器等)会非常不经济。ARM9E处理器一个非常重要的优势就是拥有轻量级的DSP处理能力,以非常小的成本(CPU增 加功能需要增加硬件)换来了非常实用的DSP性能。

因为CPU的DSP能力并不直接反映在像DMIPS这样的评测指标中,同时像以前的ARM7处理器中也没有类似的概念;所以这一点对所有使用ARM9E处理器进行开发的人来说,都是需要注意的一个要点。

ARM9E的DSP扩展指令,主要包括三个类型:

1)单周期的16x16和32x16 MAC操作,因为数字信号处理中甚少32位宽的操作数,在32位寄存器中可以对操作数分段运算显得非常有用。

2)对原有的算术运算指令增加了饱和处理扩展,所谓饱和运算,就是当运算结果大于一个上限或小于一个下限时,结果就等于上限或是下限;饱和处理在音频数据和视频像素处理中普遍使用,现在一条单周期饱和运算指令就能够完成普通RISC指令“运算-判断-取值”这一系列操作。

3)前导零(CLZ)运算指令,提高了归一化和浮点运算以及除法操作的性能。

以流行的MP3解码程序为例。整个解码过程中前端的三个步骤是运算量最大的,包括比特流的读入(解包)、霍夫曼译码还有反量化采样(逆变换)。ARM9E的 DSP指令正好可以高效地完成这些运算。以44.1 KHz@128 kbps码率的MP3音乐文件为例,ARM7TDMI需要占用20MHz以上的资源,而ARM926EJ则只要小于10MHz的资源在 从ARM7到ARM9的平台转变过程中,有一件事情是非常值得庆幸的,即ARM9E能够完全地向后兼容ARM7上的软件;并且开发人员面对的编程模型和架 构基础也保持一致。但是毕竟ARM9E中增加了很多新的特性,为了充分利用这些新的资源,把系统性能优化好,需要我们对ARM9E做更多深入地了解。

转自:嵌入式资讯精选

围观 564

随着ARM处理器应用的范围的不断深入,根据需求的不同ARM提供的外设也越来越丰富,常用的通信接口有RS232、RS485、CAN、以太网等。RS485总线凭其传输距离远、抗干扰能力强、价格低廉等优点在各种工业场合得到广泛的应用。设计使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建具有电源隔离、电气隔离、总线保护的RS485总线接口,通过对嵌入式Linux系统RS232驱动程序的修改,使的在通过该修改后的串口驱动程序发送数据时,自动控制IO来实现RS485通信的方向控制,从而简化了RS485通信的控制流程,Linux下RS485通信程序通过对该串口的读写,实现与RS485总线上的其他设备通信。

1通信接口的硬件设计

S3C2440处理器片内集成了丰富的外设资源,可以方便的实现嵌入式应用中的各种接口通信。设计中用到了Samsung-ARM9-S3C2440,其片内集成的3个UART,在设计中UART0用于嵌入式Linux操作系统的控制台(console)接口,UART1作为RS232接口与其他RS232接口设备通信,UART3用作RS485的数据通信接口。由于ARM9处理器的IO电平与RS485的电气标准不同,RS485采用差分信号负逻辑,+2~+6V表示“0”,-6~-2V表示“1”。为了达到RS485总线的电气特性标准,所以必须要外接电平转换芯片[1,3-5],同时考虑工业应用环境恶劣等因素,需要考虑RS485总线的电源隔离、电气隔离、总线保护等因素,设计中用到广州周立功的RSM485模块。

RSM485隔离收发器模块,是集成电源隔离、电气隔离、RS485接口芯片,总线保护器件于一身。该模块采用灌封工艺,具有很好的隔离特性,隔离电压高达2500VDC,最多支持400个节点,最高通信波特率115200。

图1为系统中利用S3C2440中的UART2实现半双工的RS485总线的原理图,在同一时刻里数据只能往一个方向传输。其中的引脚CON为接收、发送控制脚,现在将其与S3C2440的IO引脚相连,由该引脚的电平控制芯片数据的方向。要发送数据时将其置0,接收数据时将其置1。

基于ARM9与LINUX的RS485总线的通信接口设计
图1S3C2440-485接口

2软件设计

2.1RS485通信设计

图2中首先打开驱动部分针对RS485通信修改过的串口2,设置其串口参数,此时串口2处于RS485总线接收模式,然后向总线上第一个设备节点发送数据读取指令,完成select函数调用图1S3C2440-485接口初始化后,select函数根据用户设定的超时时间,等待设备返回数据,若select函数返回异常,则重新进行初始化,若在设定时间内,未接受到从设备的数据,select函数返回超时,则重设下一从设备节点等待超时时间,并发送下一设备数据读取指令,重新进入select等待设备返回数据;若在设定时间内,接到从设备返回数据,则从串口接收缓冲读取数据,并完成用户协议数据解析,完成一次主从设备的数据通信,然后轮询到下一设备。

基于ARM9与LINUX的RS485总线的通信接口设计
图2RS485通信软件流程

2.2RS485驱动设计

设计中使用ARM9处理器S3C2440内部集成的UART外设和RSM485模块构建而成,其驱动程序与RS232驱动程序相比多了一个通信方向控制引脚的控制,所以在Linux操作系统中,完全可以借助内核的串口驱动添加方向控制IO相关代码即可实现[4,6,7]。在linux2.6.32内核源码中,串口驱动相关代码在文件linux-2.6.32.2/drivers/seria/samsung.c中,为了实现RS485的通信,修改部分主要包括3个部分:

(1)在串口驱动的初始化代码中加入RS485通信方向控制IO口设备的初始化工作,关键代码片段为:

if(port-》line==2){//如果初始化的是串口2

s3c2410_gpio_cfgpin(S3C2410_GPH0,S3C2410_GPH0_OUTP);//将GPG2,设为输出功能

s3c2410_gpio_setpin(S3C2410_GPH0,0);//设为高电平,使串口启动时处于接收数据状态。

RS485方向控制IO口初始化使用到了2个内核函数(在arch/arm/plat-s3c24xx/gpio.c),其函数原型为:

voids3c2410_gpio_cfgpin(unsignedintpin,unsignedintfunc-TIon)

此函数的功能是设置引脚的功能,参数pin是要设置的引脚,对应着是GPH0也即是S3C2410_GPH0引脚,参数funcTIon是要设置引脚的功能,设置中用到的是输出功能,所以该值是S3C2410_GPH0_OUTP.

voids3c2410_gpio_setpin(unsignedintpin,unsignedintx)

此函数的功能是设置引脚的输出值,参数pin是要设置的引脚,参数x是要设置引脚的输出值0或者1.

(2)在串口数据开始发送前,将方向控制IO置0,使的RSM485处于发送状态,关键代码片段如下:

if(port-》line==2){s3c2410_gpio_setpin(S3C2410_GPH0,1);//设为低电平,使串口启动时处于接收数据状态。

udelay(30);//等待方向IO控制脚状态稳定}

在设置方向控制IO口状态后,加入一定延时,等待方向IO控制脚状态稳定,避免出现由于方向控制状态不稳定导致发送数据出错。

(3)在串口数据发送完成后,自动进入到数据接收模式,关键代码片段为:

if(port-》line==2){

while(!(rd_regl(port,S3C2410_UTRSTAT)&0x04));//等待串口发送完成,这句千万不能少

s3c2410_gpio_setpin(S3C2410_GPH0,0);}

由于S3C2440处理器自带串口带有硬件缓冲区,串口驱动中,数据发送完成是指数据已有驱动程序全部写入到发送缓冲中,但此时串口数据并为正在发送出去,所以必须等待数据完全发送完成后,再将方向控制IO口置1。

2.3Linux下RS485通信编程

RS485驱动程序修改完成后,可以像操作串口一样操作RS485接口。在嵌入式Linux系统下,串口的设备文件位于/dev目录下,可以使用文件打开、读写函数[2,8,9]直接操作RS485设备。设备打开和读写部分关键代码片段为:

intfd=open(Dev,O_RDWR|O_NOCTTY);//打开设备……

nread=read(fd,s1_buf,64);//读取设备数据……

write(fd,send_buff,6);//写入发送数据

在设计中,ARM9作为RS485通信的主控设备与个从设备进行通信,主控设备从每个从设备读取数据时,主设备先向该设备发送数据读取命令,然后设备等待从设备返回数据。所以在实际应用中,因合理设置等待从设备返回数据的等待时间。在设计中使用select函数来实现等待延时,关键代码为:

switch(select(max_fd,&fds,NULL,NULL,&TImeout))//select使用

{case-1:break;//select错误,退出程序

case0:Find_endp(&pth_endp_line1);

send_buff[1]=pth_endp_line1.index+1;

send_buff[4]=send_buff[1]+1;

write(fd1,send_buff,6);

TImeout.tv_sec=time1;

timeout.tv_usec=time2;break;//超时,再次轮询

default:if(FD_ISSET(fd1,&fds))//串口1数据

{nread=read(fd1,s1_buf,64);

if(nread》=20)

{i2c_led_set(8,1);

Value_t=myrount(Value_t,100);

Value_h=myrount(Value_h,100);

Value_p=myrount(Value_p,100);

Value_pt=myrount(Value_pt,100);

}}}//endswitch

3实验结果及应用

基于ARM9与LINUX的RS485总线的通信接口设计
图3RS485接口应用

设计成功应用到环境参数采集系统中,系统中主要有采集节点、采集终端、数据服务器组成,如图3所示。采集节点负责完成气压、温度、湿度参数的采集;采集终端通过RS485总线从分个采集节点读取采集数据,并通过以太网将采集数据上报到数据服务器;数据服务器完成数据的存储,并为其他形式的应用提供应用接口。在设计中主设备循环轮询RS485总线上所有设备,每间隔1s主控设备ARM发送1次数据读取指令,读取指令中包含了从设备识别码,符合识别码的从设备立即返回采集数据。如果数据出错主设备将丢弃该数据包,等待下一次轮询,所以在通信程序设计时未考虑数据包错误重发机制。设计达到预期目标。尽管偶尔有误码出现,但设计中避免了涉及linux内核复杂代码的的修改,仍不失为有实用价值的设计方法。

来源: 快易购

围观 588
订阅 RSS - ARM9