第一篇:ARM学习方法
ARM学习方法
一步一步学习uCOS和ARM体系结构的心得
学习必备条件:
1、一块开发板——例如44B0开发板,建议初学者不要去购买那些ARM9体系结构的,因为作为初学者来说ARM9体系的东西是很复杂的,买块ARM7的就可以了(先入门,然后再提高);
2、学习必备书籍
《Pointer on C》中文名字叫《C和指针》(美)里科|译者:徐波 前提你的了解C指针吧(这本书时非常经典的书籍,完全可以看中文版的,作者翻译的非常到位)
《嵌入式实时操作系统μCOS-II(第二版)》--邵贝贝翻译的(不能不承认邵贝贝是一个非常好的翻译者)
《μC/OS-Ⅱ标准教程》--杨宗德
对于英文不好的朋友可以购买《ARM体系结构与编程》--杜春蕾(该书其实还是有很多翻译错误的,大家在看的时候要注意一下,但是不可否认的是这本书到目前为止算得上是我见过最好的讲解关于ARM体系结构的书籍了)
对于英文过关的兄弟姐妹可以直接看
《ARM+Architecture+Reference+Manual(2nd+Edition)》
3、有条件的兄弟姐妹可以选购一个仿真器 JLINK V8全功能版(这个的感谢中国的优秀工程师,是他们把原价1999多的JLINK变成了几十元钱的东西
4、开发环境--MDK350或者IARARM
如果要熟悉这些开发环境,就需要好好读一些这些开发环境的手册资料,不好意思,这个就只有英文的了。
以上4个条件具备下来,可能也不会超过500元钱。
下面来讲讲我的学习经历:
我刚开始学习的时候,自己走了不少弯路,这里就省略不说了。
第一步:在开发板上跑跑简单程序
因为你有开发板,所以你就先在网上找一下对应开发板上的ARM芯片的datasheet,你都不先搞懂芯片的手册,又谈何让自己实现很多功能呢。
熟读数据手册后,就尽可能的在开发板上实现芯片对应的每个功能,像GPIO实验,UART通讯,I2C,ADC,DAC,PWM,RTC,SPI等等。自己写自己的程序,然后在开发板上好好实践一下。
当每个功能模块都实现以后,建议你让你的开发板实验一下多个功能复合使用,比如用UART打印出ADC的值什么的。
第二步:学习uCOS
鉴于你已经购买了《嵌入式实时操作系统μCOS-II(第二版)》,除开以下三个文件:
1、OS_CPU_C.c2、OS_CPU.H,3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编)
这三个文件的处理机制暂时可以不用先了解怎么做的,怎么移植的,以后再说
第一次读这本书时,搞清楚什么是任务,什么是前后台,为什么要在系统中加入嵌入式操作系统。
第二次读这本书时,详细了解他的TCB(Task Control Block)和ECB(Event Control
Block)的数据结构,搞清楚整个uCOS的实现机制(这里不要先就去看uCOS的移植,这样只会让你云里雾里的)
第三次读这本书是,详细了解信号量,互斥信号量、消息队列、邮箱和时间标志组
鉴于你又购买了《μC/OS-Ⅱ标准教程》,你 可以想在VC++ 6.0开发环境下实现对信号量,互斥信号量、消息队列、邮箱和事件标志组的上机实验代码。
如果还是不能了解uCOS怎么工作的,建议你多看几遍(我可是足足看了6、7遍了,书都翻得脱页了。汗说明我很笨,希望各位看官都比我聪明,呵呵)
第三步:建立对uCOS的初步认识
在网上下载对应你的开发板ARM芯片移植好了文件OS_CPU_C.c,OS_CPU.H,OS_CPU_A.asm(当然有的开发板已经提供了这样的基础实验)
在你的开发板上跑跑uCOS,建立起自己对于uCOS在ARM7开发板上的认识。
在你所购买的ARM7开发板上编写一个自己跑uCOS得任务(这里先不要去搞中断,初学者对于uCOS下的中断程序设计根本就搞不清楚)
第四步:熟悉ARM体系结构
因为是基于ARM7的移植,建议英文不好的去看看这本书《ARM体系结构与编程》(虽然这本书的作者在翻译时有很多操作,但是还是建议初学者去购买来好好看看),对于英文好的直接在网上下载《ARM+Architecture+Reference+Manual(2nd+Edition)》看就可以了
在看这个《ARM体系结构与编程》或
《ARM+Architecture+Reference+Manual(2nd+Edition)》时,务必注意多看几次,了解以下几个方面的知识:
1、ARM模式下的指令集
2、Thumd模式下的指令集
3、异常模式及进入异常时ARM如何处理
4、一定能熟悉ARM中的汇编指令
5、熟悉CPSR,R0-R7,R8-R14,R15及在各个模式下,这些寄存器的映射。熟悉以后,再来自己做uCOS的移植了。
第五步:uCOS移植
当然在自己编写代码做移植uCOS之前,有必要看看别人的移植代码。
其实对于uCOS的移植,我们只需要编写关键的三个文件,文件如下:
1、OS_CPU_C.c(堆栈初始化操作OSTaskStkInit函数)
2、OS_CPU.H:完成在该芯片下的数据定义,比如什么unsigned char 之类的,注意一下OS_STK和OS_CPU_SR的定义,定义下关中断和开中断的方式,有三个只能选择1个,ARM芯片一般是定义为第三种方式
3、OS_CPU_A.asm(这个是MDK环境下的汇编文件)或OS_CPU_A.a(这个是IAR开发环境下的汇编),这个文件的内容就多了,要做以下几个函数的重写:
1、OSStartHighRdy函数
2、任务级的任务切换函数OSCtxSw,3、中断级的任务切换OSIntCtxSw,其实只要写好了OSCtxSw,OSIntCtxSw自然就copy一下就完了(copy的时候记者要把保存当前任务的寄存器去掉就可以了。第六步:测试自己的uCOS移植代码
第七步:在自己写的uCOS移植代码中跑跑任务。
[分享]ARM初学者学习ARM的步骤
很多人学完单片机就想学arm,但不知如何去学~现在列出一下学习这方面的步骤-----基于linux系统的学习步骤如下:(一步步来哦:)
其实这也只是个基础,以后实际做项目了还要去学很多
1、Linux 基础
安装Linux操作系统
Linux文件系统
Linux常用命令
Linux启动过程详解
熟悉Linux服务 能够独立安装Linux操作系统
能够熟练使用Linux系统的基本命令
认识Linux系统的常用服务 安装Linux操作系统
Linux基本命令实践
设置Linux环境变量
定制Linux的服务 Shell 编程基础使用vi编辑文件
使用Emacs编辑文件
使用其他编辑器
2、Shell 编程基础
Shell简介
认识后台程序
Bash编程熟悉Linux系统下的编辑环境
熟悉Linux下的各种Shell
熟练进行shell编程熟悉vi基本操作
熟悉Emacs的基本操作
比较不同shell的区别
编写一个测试服务器是否连通的shell脚本程序
编写一个查看进程是否存在的shell脚本程序
编写一个带有循环语句的shell脚本程序
3、Linux 下的 C 编程基础
linux C语言环境概述
Gcc使用方法
Gdb调试技术
Autoconf
Automake
Makefile
代码优化 熟悉Linux系统下的开发环境
熟悉Gcc编译器
熟悉Makefile规则编写Hello,World程序
使用 make命令编译程序
编写带有一个循环的程序
调试一个有问题的程序
4、嵌入式系统开发基础
嵌入式系统概述
交叉编译
配置TFTP服务
配置NFS服务
下载Bootloader和内核
嵌入式Linux应用软件开发流程
熟悉嵌入式系统概念以及开发流程
建立嵌入式系统开发环境制作cross_gcc工具链
编译并下载U-boot
编译并下载Linux内核
编译并下载Linux应用程序
4、嵌入式系统移植
Linux内核代码
平台相关代码分析
ARM平台介绍
平台移植的关键技术
移植Linux内核到 ARM平台 了解移植的概念
能够移植Linux内核移植Linux2.6内核到 ARM9开发板
5、嵌入式 Linux 下串口通信
串行I/O的基本概念
嵌入式Linux应用软件开发流程
Linux系统的文件和设备
与文件相关的系统调用
配置超级终端和MiniCOM 能够熟悉进行串口通信熟悉文件I/O 编写串口通信程序
编写多串口通信程序
6、嵌入式系统中多进程程序设计
Linux系统进程概述
嵌入式系统的进程特点
进程操作
守护进程
相关的系统调用了解Linux系统中进程的概念
能够编写多进程程序编写多进程程序
编写一个守护进程程序
sleep系统调用任务管理、同步与通信 Linux任务概述 任务调度
管道
信号
共享内存
任务管理 API 了解Linux系统任务管理机制
熟悉进程间通信的几种方式
熟悉嵌入式Linux中的任务间同步与通信
编写一个简单的管道程序实现文件传输
编写一个使用共享内存的程序
7、嵌入式系统中多线程程序设计
线程的基础知识
多线程编程方法
线程应用中的同步问题了解线程的概念
能够编写简单的多线程程序编写一个多线程程序
8、嵌入式 Linux 网络编程
网络基础知识
嵌入式Linux中TCP/IP网络结构
socket 编程
常用 API函数
分析Ping命令的实现
基本UDP套接口编程
许可证管理
PPP协议
GPRS 了解嵌入式Linux网络体系结构
能够进行嵌入式Linux环境下的socket 编程
熟悉UDP协议、PPP协议
熟悉GPRS 使用socket 编写代理服务器
使用socket 编写路由器
编写许可证服务器
指出TCP和UDP的优缺点
编写一个web服务器
编写一个运行在 ARM平台的网络播放器
9、GUI 程序开发
GUI基础
嵌入式系统GUI类型
编译QT
进行QT开发熟悉嵌入式系统常用的GUI
能够进行QT编程使用QT编写“Hello,World”程序调试一个加入信号/槽的实例
通过重载QWidget 类方法处理事件
10、Linux 字符设备驱动程序
设备驱动程序基础知识
Linux系统的模块
字符设备驱动分析
fs_operation结构
加载驱动程序了解设备驱动程序的概念
了解Linux字符设备驱动程序结构
能够编写字符设备驱动程序编写Skull驱动
编写键盘驱动
编写I/O驱动
分析一个看门狗驱动程序
对比Linux2.6内核与2.4内核中字符设备驱动的不同 Linux 块设备驱动程序块设备驱动程序工作原理
典型的块设备驱动程序分析
块设备的读写请求队列了解Linux块设备驱动程序结构
能够编写简单的块设备驱动程序比较字符设备与块设备的异同编写MMC卡驱动程序
分析一个文件系统
对比Linux2.6内核与2.4内核中块设备驱动的不同
11、文件系统
虚拟文件系统
文件系统的建立
ramfs内存文件系统
proc文件系统
devfs 文件系统
MTD技术简介
MTD块设备初始化
MTD块设备的读写操作了解Linux系统的文件系统了解嵌入式Linux的文件系统
了解MTD技术
能够编写简单的文件系统为 ARM9开发板添加 MTD支持移植JFFS2文件系统
通过proc文件系统修改操作系统参数
分析romfs 文件系统源代码
创建一个cramfs 文件系统
第二篇:ARM学习心得
ARM linux学习心得(zt)
2008-08-13 13:55
由于很多人总问这个问题,所以这里做一个总结文档供大家参考。
这里必须先说明,以下的步骤都是针对Linux系统的,并不面向WinCE。也许你会注意到,现在做嵌入式的人中,做linux研究的人远比做WinCE的人多,很多产家提供的资料也是以linux为主。我一直很难理解,其实WinCE的界面比linux的界面好看多了,使用起来也很方便,更为重要的是,WinCE的开发和Windows下的开发基本一样,学起来简单得多,但是学linux或者使用linux做嵌入式的人就是远比WinCE多。在和很多工作的人交流时我了解到,他们公司从没考虑使用WinCE,因为成本高,都是使用linux进行开发。我读研究生的的实验室中也没有使用WinCE的,大都研究linux,也有少部分项目使用vxwork,但是就没有听说过使用WinCE的,原因就是开源!当然现在WinCE6.0听说也开源,不过在成本和资源上linux已经有了无人能挡的优势。与此相对应的是,越来越多的电子厂商已经开始使用linux开发产品。举个例子,Google近期开发的智能手机操作系统Android其实就是使用linux-2.6.23内核进行改进得到的。
第一,学习基本的裸机编程。
对于学硬件的人而言,必须先对硬件的基本使用方法有感性的认识,更必须深刻认识该硬件的控制方式,如果一开始就学linux系统、学移植那么只会马上就陷入一个很深的漩涡。我在刚刚开始学ARM的时候是选择ARM7(主意是当时ARM9还很贵),学ARM7的时候还是保持着学51单片机的思维,使用ADS去编程,第一个实验就是控制led。学过一段时间ARM的人都会笑这样很笨,实际上也不是,我倒是觉得有这个过程会好很多,因为无论做多复杂的系统最终都会落实到这些最底层的硬件控制,因此对这些硬件的控制有了感性的认识就好很多了
学习裸机的编程的同时要好好理解这个硬件的构架、控制原理,这些我称他为理解硬件。所谓的理解硬件就是说,理解这个硬件是怎么组织这么多资源的,这些资源又是怎么由cpu、由编程进行控制的。比如说,s3c2410中有AD转换器,有GPIO(通用IO口),还有nandflash控制器,这些东西都有一些寄存器来控制,这些寄存器都有一个地址,那么这些地址是什么意思?又怎么通过寄存器来控制这些外围设备的运转?还有,norflash内部的每一个单元在这个芯片的内存中都有一个相应的地址单元,那么这些地址与刚刚说的寄存器地址又有什么关系?他们是一样的吗?而与norflash相对应的nandflash内部的储存单元并不是线性排放的,那么s3c2410怎么将nandflash的地址映射在内存空间上进行使用?或者简单地说应该怎么用nandflash?再有,使用ADS进对ARM9行编程时都需要使用到一个初始化的汇编文件,这个文件究竟有什么用?他里面的代码是什么意思?不要这个可以吗?
诸如此类都是对硬件的理解,理解了这些东西就对硬件有很深的理解了,这对以后更深一步的学习将有很大的帮助,如果跳过这一步,我相信越往后学越会
觉得迷茫,越觉得这写东西深不可测。因为,你的根基没打好。
不过先声明一下,本人并没有使用ADS对ARM9进行编程,我是学完ARM7后直接就使用ARM9学linux系统的,因此涉及使用ADS对ARM9进行编程的问题我很难回答^_^,自己去研究研究吧。
对于这部分不久将提供一份教程,这个教程中的例程并不是我为我们所代理的板子写的,是我在我们学院实验室拿的,英培特为他们自己的实验箱写的,不过很有借鉴意义,可以作为一份有价值的参考。
第二,使用linux系统进行一些基本的实验。
在买一套板子的时候一般会提供一些linux的试验例程,好好做一段时间这个吧,这个过程也是很有意义的,也是为进一步的学习积累感性认识,你能想象一个从没有使用过linux系统的人能学好linux的编程吗?好好按照手册上的例程做一做里面的实验,虽然有点娃娃学走路,有点弱智,但是我想很多高手都会经历这个过程。
在这方面我们深蓝科技目前没有计划提供相应的例程,主要是开发板的提供商会提供很丰富的例程,我们不做重复工作,只提供他们没有的、最有价值的东西给大家。
第三,研究完整的linux系统的的运行过程。
所谓完整的linux系统包括哪些部分呢?
三部分:bootloader、linux kernel(linux内核)、rootfile(根文件系统)。那么这3部分是怎么相互协作来构成这个系统的呢?各自有什么用呢?三者有什么联系?怎么联系?系统的执行流程又是怎么样的呢?搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统就打下了另一个重要的根基。介绍这方面的资料网上可以挖掘到几吨,自己好好研究吧。第四,开始做系统移植。
上面说到完整的linux有3部分,而且你也知道了他们之间的关系和作用,那么现在你要做的便是自己动手学会制作这些东西。
当然我不可能叫你编写这些代码,这不实现。事实上这个3者都能在网下载到相应的源代码,但是这个源代码不可能下载编译后就能在你的系统上运行,需要很多的修改,直到他能运行在你的板子上,这个修改的过程就叫移植。在进行移植的过程中你要学的东西很多,要懂的相关知识也很多,等你完成了这个过程你会发现你已经算是一个初出茅庐的高手了。
在这个过程中如果你很有研究精神的话你必然会想到看源代码。很多书介绍你
怎么阅读linux源代码,我不提倡无目的地去看linux源代码,用许三多的话说,这没有意义。等你在做移植的时候你觉得你必须去看源代码时再去找基本好书看看,这里我推荐一本好书倪继利的《linux内核的分析与编程》,这是一本针对linux-2.6.11内核的书,说得很深,建议先提高自己的C语言编程水平再去看。
至于每个部分的移植网上也可以找到好多吨的资料,自己研究研究吧,不过要提醒的是,很多介绍自己经验的东西都或多或少有所保留,你按照他说的去做总有一些问题,但是他不会告诉你怎么解决,这时就要靠自己,如果自己都靠不住就找我一起研究研究吧,我也不能保证能解决你的问题,因为我未必遇到过你的问题,不过我相信能给你一点建议,也许有助你解决问题。
这一步的最终目的是,从源代码的官方主页上(都是外国的,悲哀)下载标准的源代码包,然后进行修改,最终运行在板子上。
盗用阿基米德的一句话:“给我一根网线,我能将linux搞定”。
第五,研究linux驱动程序的编写。
移植系统并不是最终的目的,最终的目的是开发产品,做项目,这些都要进行驱动程序的开发。
Linux的驱动程序可以说是五花八门,linux2.4和linux2.6的编写有相当大的区别,就是同为linux2.6但是不同版本间的驱动程序也有区别,因此编写linux的驱动程序变都不是那么容易的事情,对于最新版本的驱动程序的编写甚至还没有足够的参考资料。那么我的建议就是使用、移植一个不算很新的版本内核,这样到时学驱动的编程就有足够的资料了。
这部分的推荐书籍可以参考另一篇文章《推荐几本学习嵌入式linux的书籍》。第六,研究应用程序的编写。
做作品做项目除了编写驱动程序,最后还要编写应用程序。现在的趋势是图形应用程序的开发,而图形应用程序中用得最多的还是qt/e函数库。我一直就使用这个函数库来开发自己的应用程序,不过我希望你能使用国产的MiniGUI函数库。盗用周杰伦的广告词就是“支持国产,支持MiniGUI”。MiniGUI的编程比较相似Windows下的VC编程,比较容易上手,效果应该说是相当不错的,我曾使用过来开发ARM7的程序。不过MiniGUI最大的不好就是没有像qtopia这样的图形操作平台,这大大限制了他的推广,我曾经幻想过与北京飞漫公司(就是MiniGUI的版权拥有者)合作使用MiniGUI函数库开发像qtopia这样的图形操作平台,不过由于水平有限这只能是幻想了,呵呵。
完成这一步你基本就学完了嵌入式linux的全部内容了。
还有一个小小的经验想和大家分享。我在学习嵌入式linux的过程中很少问人,客观原因是身边的老师、同学师兄都没有这方面的高手,主观原因是我不喜欢问人,喜欢自己研究解决问题。这样做有个好处,就是可以提高自己解决问题的能力,因为做这些东西总有很多问题你难以理解,别人也没有这方面的经验,也不是所有问题都有人给你答案,这时必须要自己解决问题,这样,个人的解决问题能力就显得非常关键了。因此我的建议就是一般的问题到网上搜索一下,确实找不到答案了就问问高手,还是不行了就自己去研究,不要一味去等别人帮你解决问题。
记住,问题是学习的最好机会。
第三篇:arm心得.
心得体会(许晶)
本次实习时间是一周,我们组所选的题目是直流电动机转速控制设计,其要求有:硬件部分要求在LPC2100系列ARM的最小系统的基础上,设计通过按键控制直流电动机速度的驱动电路,要求通过LPC2100内置的PWM发生器控制直流电动机;并将电动机速度通过串口送至PC机。软件部分要求设计以上功能的脱机运行程序,并在试验室调试通过。我负责的是硬件部分。首先我将系统分为两部分。一是电动机控制驱动电路;二是ARM最小系统。在电动机驱动中,直流电机控制使用了H桥驱动电路,控制口线为P0.21、P0.22。在ARM最小系统中,分为5部分:电源电路、复位电路、JTAG接口电路、RS232串口电路、时钟电路。
在制作原理图中,我查阅了实验指导书和课本。我所选用的是2114板子。因为LPC2114是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-STM CPU的微控制器,并带有128/256 k字节(kB)嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
在这个过程中,我注意到了许多问题。通过最小系统的制图,我对一些问题逐渐了解,不像刚开始学习一样,感觉什么也不懂,硬装知识。我画了5部分,这几个部分让我对书上的内容更加深了学习。如:时钟电路中,我就把时钟系统和晶体振荡两节课程,重新学习。
而在软件设计中,在我的搭档编程完之后,我也对程序进行了研究。在主程序中,我们用的是i、j表示速度与方向,正转为“+”、反转为“—”;最小速度为1,最大速度为4。先让电机正向慢慢的加速,加到正传的最大速后,在按下就变成反转,然后在依次加速,往返循环,直至没有按键按下。所运用的是,调节PWM的占空比就能达到电机的速度调节。
我们组在硬件中遇到的问题并不多,主要是在画各部分原理图时找器件很不熟练,不能很快的找到。这说明我不经常用软件。其实这个软件制图很方便,各种器件几乎都能找到,找不到时也可以在上面画图。
软件中,程序在编译正确后,下载方面出现了许多问题,如连接不上;不能生成hex文件等。其实这些问题,都是因为我们对软件不熟悉所造成的。在我们多次调试、链接之后,终于完成。
经过一周实习,是我对ARM系统有了更深刻的认识。因为前期大家都找工作的原因,我并没有特别认真的学习,而这次的实习,可以让我重新再次拿起课本,认真学习。并且使我感触最深的是,由于嵌入系统的广泛应用,我应该更好的去学习它、掌握它。像掌握办公自动化一样,成为必不可少的技术。
第四篇:ARM命名规则
ARM==Advanced RISC Machines
它开创了一种崭新的商业模式,实现了无厂房式工厂,依靠出售芯片技术知识产权的授权来盈利。
其次,ARM是一种architecture,同MIPS、PowerPC、X86等并列。谈到架构,这实际上本身就是一个很复杂的概念。就现在的理解来看,架构是一种系统设计蓝图,规划了方方面面的技术规范。应该说,架构是理论,那么采用同样的架构,实现的形式可以不相同。这也就是为什么同一架构会有那么多衍生的处理器实现。
ARM可以看作是一种技术,是RISC的代表。应该说,ARM公司位于产业链的最上层,盈利也最多。中国国内的一些OEM厂商,只是处于下游的小鱼,盈利有限。中国的信息产业要想发展,就必须有自己的核心技术。写到这里,希望龙芯带给我们的,是梦想的接近,甚至是实现!(龙芯是兼容MIPS架构)
二、命名规则
这里提到的命名规则,应该分成两类。
一类是基于ARM Architecture的版本命名规则;
另一类是基于ARM Architecture版本的处理器系列命名规则。
Naming of ARM Architecture versions | ARMv | n | variants | x(variants)| 分成四个组成部分:
ARMv--固定字符,即ARM Version n--指令集版本号。迄今为之,ARM架构版本发布了7个系列,所以n=[1:7]。其中最新的版本是第7版,具体看ARM官方网站。variants--变种。
x(variants)--排除x后指定的变种 常见的变种有:
T--Thumb指令集 M--长乘法指令 E--增强型DSP指令 J--Java加速器Jazelle SIMD--ARM媒体功能扩展
例如,ARMv5TxM表示ARM指令集版本为5,支持T变种,不支持M变种。
Naming of ARM Processor 采用上述的架构,形成一系列的处理器。有时候还要区分处理器核和处理器系列。不过,在这里其实不用区分太细,毕竟这是功能的小部分的变化,核心是相同的。
规则:ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S} x--处理器系列
y--存储管理/保护单元 z--cache T--支持Thumb指令集 D--支持片上调试 M--支持快速乘法器
I--支持Embedded ICE,支持嵌入式跟踪调试 E--支持增强型DSP指令 J--支持Jazelle F--具备向量浮点单元VFP-S--可综合版本
ARM体系结构处理器自诞生以来,不断发展与创新,ARM体系的指令集功能形成了多种版本,为了适合不同的应用场合,各个版本又增加了新的变种,这些变种为该版本的指令集增加了新的功能。不同版本的指令集应用于不同的处理器,这也就形成了ARM处理器系列,ARM系列处理器不同版本实现技术、性能、应用场合个不相同。
ARM体系结构的基本版本 1 版本1 该版本的原型机是ARM1,没有用于商业产品。包括下列指令: l 除乘法指令之外的基本的数据处理指令。
l 基于字节、字和多字的存储器访问指令(Load/Store)。l 包括子程序调用指令BL在内的跳转指令。l 供操作系统使用的软件中断指令SWI。本版本中地址空间是26位,目前已经不再使用。2 版本2 对V1版进行了扩展,包含了对32位结果的乘法指令和协处理器指令的支持。版本2a是版本2的变种,ARM3芯片采用了版本2a,是第一片采用片上Cache的ARM处理器。版本2a增加了合并Load和Store(SWP)指令。与版本V1相比,增加了以下指令: l 乘法指令和乘加指令。l 支持协处理器操作指令。
l 对于FIQ模式,提供了额外的两个备份寄存器。l SWP指令和SWPB指令。
本版本中地址空间是26位,目前已经不再使用。3 版本3 ARM公司第一个微处理器ARM6核心是版本3的,它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU。
版本3的变种版本有版本3G和版本3M。版本3G是不与版本2a向前兼容的版本3,版本3M引入了有符号和无符号数乘法和乘加指令,这些指令产生全部64位结果。
版本3版较以前的版本有较大的改动,主要包括: l 处理器的地址空间扩展到32位,但除了版本3G外的其他版本是向前兼容的,支持26位的地址空间。
l 当前程序状态信息从原来的R15寄存器移到当前程序状态寄存器CPSR中(Current Program Status Register)。l 增加了程序状态保存寄存器SPSR(Saved Program Status Register)。l 增加了两种异常模式,使操作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。
l 增加了MRS/MSR指令,用于访问新增的CPSR/SPSR寄存器。l 修改了原来的从异常中返回的指令。4 版本4 版本4增加了下列指令:
l 有符号和无符号的半字读取和写入指令。l 带符号的字节读取和写入指令。
l 增加了处理器的系统模式(特权模式)。在该模式下,使用的是用户模式下的寄存器。
l 为结构定义的操作预留一些SWI(软中断指令)空间
版本4中明确定义了哪些指令会引起未定义指令异常,不再强制要求与以前的26位地址空间兼容。
ARMv4T在ARMv4的基础上增加了Thumb指令集:处理器有了Thumb状态,并且有了在ARM状态和Thumb状态切换的指令,处理器在ARM状态执行ARM指令集,在Thumb状态执行Thumb指令集。
ARMv4和ARMv4T结构的处理器得到了广泛的应用。SA-
110、SA-1110等是基于ARMv4的;ARM7TDMI、ARM720T、ARM9TDMI、ARM940T、ARM920T、Intel的StrongARM等是基于ARMv4T版本。5 版本5 版本5在版本4的基础上增加或修改以下指令:
l 提高了T变种中ARM/Thumb混合使用的效率。
l 对于T变种的指令和非T变种的指令使用相同的代码生成技术。l 增加了前导零计数(CLZ)指令,该指令可以使整数除法和中断优先级排队操作更为有效。
l 增加了软件断点(BKPT)指令。
l 为协处理器设计提供了更多可选择的指令。
l 更加严格的定义了乘法指令对条件标志位的影响。l 带状态切换的子程序调用(BLX)指令。版本5包括v5TE和v5TEJ,v5TE在v5T的基础上增加了信号处理(DSP)指令集,v5TEJ除了具备v5T的功能外,还可以执行JAVA字节代码,是在ARM上执行JAVA指令的效率提高了5-10倍,并且降低了功耗。ARM1020T 是ARMv5T的。
ARM9E-S、ARM966E-S、ARM1020E、ARM 1022E以及XScale是ARMv5TE的。ARM9EJ-S、ARM926EJ-S、ARM7EJ-S、ARM1026EJ-S是基于ARMv5EJ的。6 版本6 ARM体系版本6是2001年发布的。其目标是在有效的芯片面积上为嵌入式系统提供更高的性能。ARMv6 包含了ARMv5TEJ的所有指令。为了使现有的软件,开发方法、设计技术可再利用,ARMv6兼容了ARMv5的内存管理和异常处理。ARMv6主要在多媒体处理、存储器管理、多处理器支持、数据处理、异常和中断响应等方面做了改进。
l SIMD(单指令多数据)指令,可使音视频处理能力提高2-4倍。l Thumb-2新指令集,混合执行AMR和Thumb代码,可以提供ARM指令级别的性能和Thumb指令级别的代码密度。l 混合大小端和非对齐存储访问支持
l TrustZone安全技术,在硬件上提供可信区域和不可信区域,两个区域里运行的代码有不同的权限。让经过认证的代码运行在可信区域,未经过认证的代码运行在不可信区域,从而提高系统的安全性。采用ARMv6核的处理器是ARM11系列。
ARM1136J(F)-S基于ARMv6主要特性有SIMD、Thumb、Jazelle、DBX、(VFP)、MMU。ARM1156T2(F)-S基于ARMv6T2 主要特性有SIMD、Thumb-
2、(VFP)、MPU。ARM1176JZ(F)-S基于ARMv6KZ 在 ARM1136EJ(F)-S 基础上增加MMU、TrustZone。ARM11 MPCore基于ARMv6K 在ARM1136EJ(F)-S基础上可以包括1-4 核SMP、MMU。7 版本7 2004年发布了新的ARMv7体系结构。全新的ARMv7是基于ARMv6的,ARMv7采用了Thumb-2技术,体积比32位ARM代码减小31%,性能比16位Thumb代码高出38%。同时,ARMv7保持了对已有ARM代码的兼容性。此外,ARMv7还支持改良的运行环境,以迎合不断增加的JIT(Just In Time)和DAC(DynamicAdaptive Compilation)技术的使用。ARMv7的增加的特性有:
l 改进的Thumb-2指令集。
l NEON多媒体技术,将DSP和多媒体处理能力提高了近4倍。l VFPv3改良的浮点运算。l 动态编译支持。ARM体系结构的变种 Thumb指令集(T变种)
Thumb指令集是将ARM指令集中的一部分指令重新编码形成的一个子集, Thumb指令长度是16位的。使用Thumb指令可以得到比ARM指令更高的代码密度,这有助于减小系统的存储器容量,从而降低系统的成本。另外,对于数据线是8或16位的系统,使用Thumb指令集可以取得好于使用ARM指令集的性能。在ARM体系命名中通用“T”来表示该版本支持Thumb指令集。在ARMv4T中使用v1版Thumb指令集;ARMv5T使用v2版的Thumb指令集。和Thumb v1相比Thumb v2 具有如下特点:
l 通过对指令的修改,来提高ARM指令和Thumb指令混合使用是的效率。l 增加软件断点指令。
l 严格定义了Thumb乘法指令对条件标志位的影响。与ARM指令集相比,Thumb指令集具有以下局限性:
l 完成相同的操作,Thumb指令通常需要更多的指令。
l Thumb指令集没有包含进行异常处理时需要的一些指令,异常返回时需要从ARM状态返回。2 长乘法指令(M变种)
M变种增加了两条用于进行长乘法的ARM指令。其中一条用于实现32位整数乘以32位整数,生成64位整数的长乘法操作;另一条指令用于实现32位整数乘以32位位整数,然后加上32位整数,生成64位整数的长乘加操作。3 增强型DSP指令(E变种)
l E变种包含了一些附加的指令,这些指令用于增强处理器对一些典型的DSP算法的处理性能。主要包括:
l 几条新的实现16位数据乘法和乘加操作的指令 l 实现饱和的带符号数的加减法操作的指令。所谓饱和的带符号数的加减法操作是在加减法操作溢出时,结果并不进行卷绕(Wrapping around),而是使用最大的整数或最小的负数来表示。
l 进行双字数据操作的指令,包括双字读取指令LDRD、双字写入指令STRD和协处理器的寄存器传输指令MCRR/MRRC。l Cache预取指令PLD 4 Java加速器Jazelle(J变种)
ARM的Jazelle技术将Java的优势和先进的32位RISC芯片完美地结合在一起。Jazelle技术提供了Java加速功能,可以得到比普通Java虚拟机高得多的性能。与普通的Java虚拟机相比,Jazelle使代码运行速度提高了8倍,而且功耗降低了80%,Jazelle技术使得程序员可以在一个单独的处理器上同时运行Java应用程序、已经建立好的操作系统、中间件以及其他的应用程序。与使用协处理器和双处理器相比,使用单独得处理器可以在提供高性能的同时,保证低功耗和低成本。ARM体系版本4TEJ最早包含了J变种,用字符J表示J变种。5 SIMD变种(ARM媒体功能扩展)
ARM媒体功能扩展SIMD技术极大地提高了嵌入式应用系统的音频和视频处理器能力,它可使微处理器的音频和视频性能提高4倍。新一代的Internet应用产品、移动电话和PDA等设备终端需要提供高性能的流式媒体,包括音频和视频等。而且这些设备需要提供更加人性化的界面,包括语言输入和手写输入等。这样,就对处理器的数字信号处理能力提出了很高的要求,同时还必须保证低功耗。ARM的SIMD媒体功能扩展为这些应用系统提供了解决方案,它为包括音频和视频处理在内的应用系统提供了优化功能,其主要特点如下: ●使处理器的音频和视频处理的性能提高了2~4倍。
●可同时进行2个16位操作数或者4个8位操作数的运算。●用户可自定义饱和运算的模式。
●可进行2个16位操作数的乘加/乘减运算及32位乘以32位的小数乘加运算。●同时8 /16位选择操作。
ARM11是基于ARMv6架构建成的。基于ARMv6架构的处理器包括ARM1136J(F)‐S,ARM1156T2(F)‐S,以及ARM1176JZ(F)‐S。ARMv6是ARM进化史上的一个重要里程碑:从那时候起,许多突破性的新技术被引进,存储器系统加入了很多的崭新的特性,单指令流多数据流(SIMD)指令也是从v6开始首次引入的。而最前卫的新技术,就是经过优化的Thumb‐2指令集,它专为低成本的单片机及汽车组件市场。
基于从ARMv6开始的新设计理念,ARM进一步扩展了它的CPU设计,成果就是ARMv7架构的闪亮登场。在这个版本中,内核架构首次从单一款式变成3种款式。1)款式A:设计用于高性能的“开放应用平台”--越来越接近电脑了。
2)款式R:用于高端的嵌入式系统,尤其是那些带有实时要求的--又要快又要实时。
3)款式M:用于深度嵌入的,单片机风格的系统中--本书的主角。让我们再进距离地考察这3种款式:
1)款式A(ARMv7‐A):需要运行复杂应用程序的“应用处理器”。支持大型嵌入式操作系统,比如Symbian,Linux,以及微软的WindowsCE和智能手机操作系统WindowsMobile。这些应用需要劲爆的处理性能,并且需要硬件MMU实现的完整而强大的虚拟内存机制,还基本上会配有Java支持,有时还要求一个安全程序执行环境。典型的产品包括高端手机和手持仪器,电子钱包以及金融事务处理机。
2)款式R(ARMv7‐R):硬实时且高性能的处理器。标的是高端实时市场。那些高级的玩意,像高档轿车的组件,大型发电机控制器,机器手臂控制器等,它们使用的处理器不但要很好很强大,还要极其可靠,对事件的反应也要极其敏捷。3)款式M(ARMv7‐M):认准了旧世代单片机的应用而量身定制。在这些应用中,尤其是对于实时控制系统,低成本、低功耗、极速中断反应以及高处理效率,都是至关重要的。
Cortex系列是v7架构的第一次亮相,其中Cortex‐M3就是按款式M设计的。到目前为止,Cortex‐M3也是款式M中被抚养成人的独苗。其它Cortex家族的处理器包括款式A的Cortex‐A8(应用处理器),款式R的Cortex‐R4(实时处理器)。
处理器命名法
以前,ARM使用一种基于数字的命名法。在早期(1990s),还在数字后面添加字母后缀,用来进一步明细该处理器支持的特性。就拿ARM7TDMI来说,T代表Thumb指令集,D是说支持JTAG调试(Debugging),M意指快速乘法器,I则对应一个嵌入式ICE模块。后来,这4项基本功能成了任何新产品的标配,于是就不再使用这4个后缀--相当于默许了。但是新的后缀不断加入,包括定义存储器接口的,定义高速缓存的,以及定义“紧耦合存储器(TCM)”的,于是形成了新一套命名法,这套命名法也是一直在使用的。表一:ARM处理器名字
Jazelle是ARM处理器的硬件Java加速器。
MMU,存储器管理单元,用于实现虚拟内存和内存的分区保护,这是应用处理器与嵌入式处理器的分水岭。电脑和数码产品所使用的处理器几乎清一色地都带MMU。但是MMU也引入了不确定性,这有时是嵌入式领域--尤其是实时系统不可接受的。然而对于安全关键(safety‐critical)的嵌入式系统,还是不能没有内存的分区保护的。为解决矛盾,于是就有了MPU。可以把MPU认为是MMU的功能子集,它只支持分区保护,不支持具有“定位决定性”的虚拟内存机制。
到了架构7时代,ARM改革了一度使用的,冗长的、需要“解码”的数字命名法,转到另一种看起来比较整齐的命名法。比如,ARMv7的三个款式都以Cortex作为主名。这不仅更加澄清并且“精装”了所使用的ARM架构,也避免了新手对架构号和系列号的混淆。
第五篇:arm对讲机报告
《嵌入式实训课》 课程设计报告
设计题目: 基于ARM的网络对讲机
专 业 电子信息科学与技术 班 级 091 学 号 200916022118 学生姓名 大石头
2012年 6 月 10 日
摘要
语音对讲系统是现代智能化服务的一个重要组成部分,它对于提高社会高效率和方便还有安全监控力度提高,在现代社会语音对讲机在小区等一些工程中高效率的提高的人们方便和减轻了很多事情的工作量。本设计首先是用网线使用UDP协议将两个ARM机连接起来,通过麦克风传递给dev/dsp声卡的数据然后通过网线传送到另外一台ARM机的接收端通过dev/dsp声卡播放来实现对讲的功能。由这样的思路来实现对讲机的功能。
目录
一、前言...................................................................................................................4
二、系统的总体设计.................................................................................................4(一)功能描述.....................................................................................................4(二)系统基本功能图..........................................................................................5
三、相关技术综述.....................................................................................................5(一)Linux操作系统...........................................................................................5 1.Linux的历史...........................................................................................5 2.Linux具有以下一些特点:......................................................................6(二)声卡驱动.....................................................................................................7(三)(四)
四、(一)(二)(三)(四)UDP协议.....................................................................................................8 Socket套接字.............................................................................................9 SamSung公司s3c6410微处理器简介...........................................................9 SamSung公司s3c6410微处理器功能特性...................................................11 系统设计器件.............................................................................................11 电源及复位电路........................................................................................12 系统的硬件设计.................................................................................................9 3.电源电路...............................................................................................12 4.复位电路...............................................................................................12(五)系统时钟电路............................................................................................13(六)(七)系统存储器电路........................................................................................14 IIS数字音频电路.....................................................................................15 5.下面是WM9714芯片和音频线路输入的原理图:.....................................16 6.下图是mic座原理图:..........................................................................17 7.下图为MIC输入座的俯视图:................................................................17(八)网卡电路...................................................................................................17
五、系统的软件设计...............................................................................................19(一)总体设计流程图........................................................................................19(二)(三)(四)声卡部分...................................................................................................19 网络连接部分............................................................................................22 总体部分...................................................................................................23
六、系统测试..........................................................................................................24(一)Linux系统移植安装..................................................................................24(二)(三)七、八、九、交叉编译环境搭建.....................................................................................24 声卡的初始化参数.....................................................................................24 参考文献..........................................................................................................24 总结与心得体会...............................................................................................25 致谢.................................................................................................................26
一、前言
对讲机对大家来说一点也不陌生。现在小区和写字楼很多场所的保安人员都佩戴有对讲机。它给我们的日常生活带来了便利。对讲机的英文名称是 two way radio,它是一种双向移动通信工具,在不需要任何网络支持的情况下,就可以通话,没有话费产生,适用于相对固定且频繁通过话的场合。对讲机已经有很长的一段历史了,大部分的对讲机是基于模拟电路的集成芯片技术。功能比较单一,价格也不菲。今天我们设计的对讲机是应用了现在主流处理器arm的技术。
首先,我们在arm开发板烧入了linux系统,在开发的时候无论是系统还是代码,都增加了可移植性。另外便于扩展我们目前没考虑后期需要的模块。比如,pc对各个对讲机的数据监控,lcd显示等等。Arm的开发灵活的特点让这些都变成了可能。另外,从经济方面来看,现在arm芯片的价格相对来说也不高,在市场方面带来价格上的优势。
二、系统的总体设计
(一)功能描述
在6410开发板上写入linux系统后,对dev/dsp声卡进行编写程序。程序分为录音,放音,网络数据传输等几部分。首先,第一块arm(以后称为arm1)在按键按下的情况下,麦克风工作,此时对声卡进行读写,并将数据经网路传给另一块arm(以后成为arm2,设计过程中用pc代替)。此时如果arm2的按键没有按下的情况下将网络传过来的数据写入声卡,此时喇叭发出声音。相对的过程同上依次重复下去
4(二)系统基本功能图
三、相关技术综述
(一)Linux操作系统
1.Linux的历史
Linux它起源于Unix。是一种可自由发布的、多用户、多任务的优秀操作系统。
UNIX稳定性高、可扩展性强,在金融、电信、能源等一些关键性部门得到广泛的应用。
1991年,芬兰赫尔辛基大学的学生Linus Torvalds,受Minix系统的启发,推出一个新的UNIX的变种。他给Internet上的新闻组comp.os.minix发了一封信,声称其开发了一个免费的操作系统,并欢迎其他的开发者研究他的工作、提出修改意见。
在芬兰最大的FTP站点上,Linus建立了一个名为Linux的目录存放他的源文件,意思是“Linus的Minix”,于是,Linux就这样被命名了。
许多程序员获得了Linux的源代码。随着他们不断将原商用UNIX的特性和产品加入到Linux中来,Linux不断发展壮大,到现在为止,已成为具有全部UNIX特征的操作系统。
2.Linux具有以下一些特点:
(1)兼容UNIX:Linux是UNIX的完整的实现,它混合了BSD UNIX和System V这两个UNIX版本的最优良的特性。UNIX中的绝大多数命令都可以在Linux中找到、并有所加强;其可靠性、稳定性、以及强大的网络功能也得到体现。
(2)价格低廉:是一种免费的、公开源码的自由软件。它是根据GNU通用公共许可证(GNU General Public License,GPL)发布的。
根据GPL,用户可以改变任何源代码,甚至可以销售Linux。但有一个前提,如果以盈利为目的,则必须提供系统的源代码,以便其他人也能进一步的修改并销售。
Linux是由志愿者免费开发和维护的,甚至Linux下的许多应用软件都是根据GPL发布的、免费的自由软件。用户只需花费下载费用,完全可以搭建一套全免费的、与商用系统性能相当的系统。
(3)强大的网络功能: Linux的开发是通过Internet进行的,支持网络的功能在开发的早期就已经加入了。
6(4)可靠性好:比Windows更可靠。
Linux对应用程序使用的内存进行了保护,应用程序无法访问系统分配的区域以外的其他内存,因此,一个软件的错误操作不会造成整个系统的瘫痪(在Windows系统中经常出现的)。
在安全方面,由于源码被公开,可消除系统中是否有“后门”的疑惑。而且,由于一旦发现漏洞就可以马上修改源代码,所以安全性要远高于Windows系统。
(5)可移植性好:Linux几乎可以运行在任何的计算机系统之上。
(二)声卡驱动
声卡驱动程序提供的/dev/dsp 是用于数字采样(sampling)和数字录音(recording)的设备文件,它对于Linux下的音频编程来讲非常重要:向该设备写数据即意味着激活声卡上的D/A转换器进行放音,而向该设备读数据则意味 着激活声卡上的A/D 转换器进行录音。目前许多声卡都提供有多个数字采样设备,它们在Linux下可以通过/dev/dsp1 等设备文件进行访问。
DSP是数字信号处理器(Digital Signal Processor)的简称,它是用来进行数字信号处理的特殊芯片,声卡使用它来实现模拟信号和数字信号的转换。声卡中的DSP设备实际上包含两个组成部分:在以只读方式打开时,能够使用A/D 转换器进行声音的输入;而在以只写方式打开时,则能够使用D/A转换器进行声音的输出。严格说来,Linux下的应用程序要么以只读方式打开/dev/dsp 输入声音,要么以只写方式打开/dev/dsp 输出声音,但事实上某些声卡驱动程序仍允许以读写的方式打开/dev/dsp,以便同时进行声音的输入和输出,这对于某些应用场合(如IP 电话)来讲是非常关键的。
在从DSP设备读取数据时,从声卡输入的模拟信号经过A/D 转换器变成数字采样后的样本(sample),保存在声卡驱动程序的内核缓冲区中,当应用程序通过read 系统调用从声卡读取数据时,保存在内核缓冲区中的数字采样结果将 被复制到应用程序所指定的用户缓冲区中。需要指出的是,声卡采样频率是由内核中的驱动程序所决定的,而不取决于应用程序从声卡读取数据的速度。如果应用程序读取数据的速度过慢,以致低于声卡的采样频率,那么多余的数据将会被丢弃;如果读取数据的速度过快,以致高于声卡的采样频率,那么声卡驱动程序将会阻塞那些请求数据的应用程序,直到新的数据到来为止。
在向DSP设备写入数据时,数字信号会经过D/A转换器变成模拟信号,然后产生出声音。应用程序写入数据的速度
同样应该与声卡的采样频率相匹配,否则过慢的话会产生声音暂停或者停顿的现象,过快的话又会被内核中的声
卡驱动程序阻塞,直到硬件有能力处理新的数据为止。与其它设备有所不同,声卡通常不会支持非阻塞(non-blocking)的I/O 操作。
无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),默认为8 位无符号数据、单声道、8KHz采样率,如果默认值无法达到要求,可以通过ioctl 系统调用来改变它们。通常说来,在应用程序中打 开设备文件/dev/dsp 之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。
(三)UDP协议
UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协 8 议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
(四)Socket套接字
套接字(socket)是套接口描述字的简称。和文件句柄相似,SOCKET提供了一种通讯机制,是linux的一种通讯方式。应用程序创建了一个套接字后,就能够获得这种机制提供的网络服务功能。对于服务器来说,它提供了监听网络的连接请求;对于客户机来说,它可以连接到一个给定的主计算机和特定的端口上。客户端和服务器端可以通过套接字对象来发送和接收数据。套接字提供了分别基于连接的协议(TCP)等和无连接的协议(UDP)等,以满足网络连接的可靠性、稳定性以及高速性的要求。
四、系统的硬件设计
(一)SamSung公司s3c6410微处理器简介
随着微电子技术的快速发展,ARM处理器经历了包括ARM7、ARM9在内的多个发展历程,而ARM11的成熟应用必将为嵌入式的发展带来新的活力,使更高端的产品应用成为可能。
与ARM9的5级流水线相比,ARM11拥有一条具有独立的load-store和算术 流水的8级流水线,在同样工艺下,ARM11处理器的性能与ARM9相比大约提高 了40%。ARM11执行ARMv6架构的指令,ARMv6指令包含了针对媒体处理的单指令流多数据流(SIMD)扩展,采用特殊的设计,以改善视频处理性能。为了能够进行快速浮点运算,ARM11增加了向量浮点单元。所有这些结构上的提高,都是ARM9处理器不可比拟的。
ARM11为便携式和无线应用,提供了从未有过的高超性能,并且使我们主要关心的成本和功耗减到最小。ARM11的微架构保证了系统性能可以从基本的350-500MHz范围扩展到最终的1GHz以上。其微架构的高效率表现,允许开发者根据不同的应用来调节时钟频率和电源电压,从而在性能和功耗之间达到最佳的折衷。例如,一个基于ARM11的微架构的处理器在1.2V工作电压下,使用0.13um工艺实现,其功率将不会超过0.4mW/MHz。
ARM11微处理器是一种高性能、低功耗的‘准64位’微处理器!对于目前大多数嵌入式应用,一个真正的64位处理器仍然被认为是不必要的,其巨大的功耗和面积让人难以接受。对此,ARM11选择了一个折中的方案,以较小的代价,部分实现了一个64位微架构。ARM11只在处理器整数单位和高速缓存之间,以及在整数单位和协处理器之间实现了64位数据总线。这些64位数据道路允许处理器在一个时钟周期中同时获取两条指令,还允许在一个时钟周期执行多个数据读写指令。这使得ARM11在执行很多特定序列的代码时能够达到非常高的性能,特别是那些允许数据搬移与数据处理并行处理的代码序列。
S3C6410是由三星公司推出的一款低功耗、高性价比的RSIC处理器,它基于ARM11内核(ARM1176JZF-S),可广泛应用于移动电话和通用处理等领域;S3C6410为2.5G和3G通信服务提供了优化的硬件性能,内置强大的硬件加速器:包括运动视频处理、音频处理、2D加速、显示处理和缩放等;集成了一个MFC(Multi-Format video Codec)支持MPEG4 /H.263/H.264编解码和VC1的解码,能够提供实时的视频会议以及NRSC和PAL制式的TV输出;除此之外,该处理器内置一个采用最先进技术的3D加速器,支持OpenGL ES 1.1/ 2.0和D3DMAPI,能实现4M triangles/s的3D加速;同时,S3C6410包含了优化的外部存储器接口,该接口能满足在高端通信服务中的数据带宽要求。由于以上突出的性能表现,10 著名的苹果公司手机IPHONE就是基于S3C6410处理器。
(二)SamSung公司s3c6410微处理器功能特性
S3C6410 是一个 16/32 位 RISC 微处理器,旨在提供一个具有成本效益、功耗低,性能高的应用处理器解决方案,像移动电话和一般的应用。它为 2.5G 和 3G 通信服务提供优化的 H /W 性能,S3C6410 采用了64/32 位内部总线架构。该 64/32 位内部总线结构由 AXI、AHB 和 APB 总线组成。它还包括许多强大的硬件加速器,像视频处理,音频处理,二维图形,显示操作和缩放。一个集成的多格式编解码器(MFC)支持 MPEG4/H.263/H.264 编码、译码以及 VC1 的解码。这个 H/W 编码器/解码器支持实时视频会议和 NTSC、PAL 模式的 TV 输出。
S3C6410 有一个优化的接口连线到外部存储器。存储器系统具有双重外部存储器端口、DRAM 和 FLASH /ROM/ DRAM 端口。DRAM 的端口可以配置为支持移动 DDR,DDR,移动 SDRAM 和 SDRAM。FLASH/ROM/DRAM端口支持 NOR-FLASH,NAND-FLASH,ONENAND,CF,ROM 类型外部存储器和移动 DDR,DDR,移动 SDRAM 和SDRAM。
为减少系统总成本和提高整体功能,S3C6410 包括许多硬件外设,如一个相机接口,TFT 24 位真彩色液晶显示控制器,系统管理器(电源管理等),4 通道 UART,32 通道 DMA,4 通道定时器,通用的 I/O 端口,IIS 总线接口,IIC 总线接口,USB 主设备,在高速(480 MB/S)时 USB OTG 操作,SD 主设备和高速多媒体卡接口、用于产生时钟的 PLL。
S3C6410 提供了丰富的内部设备,下面我们从它的整体特性、多媒体加速特性、视频接口、USB 特征、存储器设备、系统外设以及它的系统管理等方面来详细的介绍 S3C6410 处理器的特性
(三)系统设计器件
Samsung S3C6410处理器
256M字节NAND Flash(SLC)
12MHz、48MHz、27MHz、32.768KHz时钟源;
1个100M网口,采用DM9000AE,带连接和传输指示灯
2个3.5MM标准立体声音频插座。其中包括1个音频输出插座,可与耳机连接;1个话筒输入插座。另有插针形式提供了Line In(四)电源及复位电路
3.电源电路
4.复位电路
系统复位按键使用轻触开关,复位芯片选择MAX811t,专业复位芯片可保证系统的稳定可靠。
复位芯片MAX811设计原理图如下:
(五)系统时钟电路 主晶振(12MHZ)原理图:
网卡晶振原理图:
(六)系统存储器电路
使用了256M Bytes NAND FLASH,型号为K9F2G08U0B(另有MLC结构2G Bytes NAND FLASH的K9GAG08U0D供用户选择),片选信号使用CSn2。NAND FLASH 存储器主要用于存放内核代码、应用程序、文件系统和数据资料。
NAND FLASH设计原理图:
(七)IIS数字音频电路
音频功能使用S3C6410处理器的AC97总线。外接WM9714音频芯片,实现集成音频输出、Line in输入和Mic输入功能。音频输出和MIC输入以及LINE IN均采用标准音频插座。
5.下面是WM9714芯片和音频线路输入的原理图:
6.下图是mic座原理图:
7.下图为MIC输入座的俯视图:
(八)网卡电路
我们在系统集成一个100M以太网接口,通过DM9000AE芯片来扩展。在开发过程中,以太网接口可以用来连接PC机下载文件;在Linux的系统开发时,可以用来挂载NFS网络文件系统。使用时,需通过交叉网线直接连接PC机,也可以使用直连网线连接交换机或路由器。
DM9000AE设计原理图如下:
五、系统的软件设计
(一)总体设计流程图
(二)声卡部分
对声卡进行编程时首先要做的是打开与之对应的硬件设备,这是借助于open系统调用来完成的,并且一般情况下使用的是/dev/dsp 文件。采用何种模 19 式对声卡进行操作也必须在打开设备时指定,对于不支持全双工的声卡来说,应该使用只读或者只写的方式打开,只有那些支持全双工的声卡,才能以读写的方式打开,并且还要依赖于驱动程序的具体实现。Linux允许应用程序多次打开或者关闭与声卡对应的设备文件,从而能够很方便地在放音状态和录音状态之间进行切换,建议在进行音频编程时只要有可能就尽量使用只读或者只写的方式打开设备文件,因为这样不仅能够充分利用声卡的硬件资源,而且还有利于驱动程序的优化。下面的代码示范了如何以可写可读方式打开声卡进行放音(playback)操作:
fd = open(“/dev/dsp”, O_RDWR);
if(fd < 0)
{
perror(“open of /dev/dsp failed”);
exit(1);
}
运行在Linux内核中的声卡驱动程序专门维护了一个缓冲区,其大小会影响到放音和录音时的效果,使用ioctl 系统调用可以对它的尺寸进行恰当的设置。调节驱动程序中缓冲区大小的操作不是必须的,如果没有特殊的要求,一般采用默认的缓冲区大小也就可以了。但需要注意的是,缓冲区大小的设置通常应紧跟在设备文件打开之后,这是因为对声卡的其它操作有可能会导致驱动程序无法再修改其缓冲区的大小。下面的代码示范了怎样设置声卡驱动程序中的内核缓冲区的大小:
#define LENGTH 3 /* 存储秒数 */ #define RATE 8000 /* 采样频率 */ #define SIZE 8 /* 量化位数 */ #define CHANNELS 1 /* 声道数目 */ /* 用于保存数字音频数据的内存缓冲区 */ unsigned char msg[LENGTH*RATE*SIZE*CHANNELS/8];
接下来要做的是设置声卡工作时的声道(channel)数目,根据硬件设备和驱动程序的具体情况,可以将其设置为0(单声道,mono)或者1(立体声,stereo)。下面的代码示范了应该怎样设置声道数目:
arg = CHANNELS;
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if(status ==-1)
perror(“SOUND_PCM_WRITE_CHANNELS ioctl failed”);
if(arg!= CHANNELS)
perror(“unable to set number of channels”);
采样格式和采样频率是在进行音频编程时需要考虑的另一个问题,声卡支持的所有采样格式可以在头文件soundcard.h 中找到,而通过ioctl 系统调用则可以很方便地更改当前所使用的采样格式。下面的代码示范了如何设置声卡的量化位数:
/* 设置采样时的量化位数 */ arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if(status ==-1)
perror(“SOUND_PCM_WRITE_BITS ioctl failed”);
if(arg!= SIZE)
perror(“unable to set sample size”);
声卡采样频率的设置也非常容易,只需在调用ioctl 时将第二个参数的值设置为SNDCTL_DSP_SPEED,同时在第三个参数中指定采样频率的数值就行了。对于大多数声卡来说,其支持的采样频率范围一般为5kHz到44.1kHz 或者48kHz,但并不意味着该范围内的所有频率都会被硬件支持,在Linux下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz和44100Hz。下面的代码示范了如何设置声卡的采样频率:
/* 设置采样时的采样频率 */ arg = RATE;
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if(status ==-1)
perror(“SOUND_PCM_WRITE_WRITE ioctl failed”);
(三)网络连接部分 Socket套接字初始化:
addr_len=sizeof(struct sockaddr_in);bzero(&addr,sizeof(addr));addr.sin_family=AF_INET;addr.sin_port=htons(REMOTEPORT);addr.sin_addr.s_addr=inet_addr(REMOTEIP);
(四)总体部分 客户端:
从声卡读取声音信号放到缓存中
status = read(fd, msg, sizeof(msg));
if(status!= sizeof(msg))
perror(“read wrong number of bytes”);将缓存中的数组发到服务端:
sendto(s,msg,sizeof(msg),0,&addr,addr_len);
服务端:
从客户端接收数据:
len= recvfrom(mysock,msg,sizeof(msg),0,&addr,&addr_len);将接收的数据写入声卡,声音回放
status = write(fd, msg, sizeof(msg));/* 回放 */
if(status!= sizeof(msg))
perror(“wrote wrong number of bytes”);
六、系统测试
(一)Linux系统移植安装
我们在成功试验时使用了ubuntu10.4版本。之前曾经尝试过很多版本的linux,由于无法安装dsp驱动不得一次又一次的装系统,在这个阶段花费了很长一段时间。
(二)交叉编译环境搭建
由于在开发主机上安装的交叉编译器与arm里面烧写的linux版本不对应,造成开发调试的程序无法正常运行。经过访问论坛找到合适版本的交叉编译器。问题得到了解决。
(三)声卡的初始化参数
读写声卡,要有特定的格式(format),默认为8 位无符号数据、单声道、8KHz采样率。虽然默认值可以达到我们pc机的要求,但是默认值无法达到我们开发板的要求。在开发过程中,开发板部分噪声特别大。严重影响产品效果。
我们翻阅了资料,得知可以通过ioctl 系统调用来改变它们。在不断的调试中,不断地得到老师的帮助。我们最终得到了我们的理想音质效果。
七、参考文献
[1]孙琼.嵌入式Li舢x应用程序开发详解.北京:人民邮电出版社,2007.9 [2]马忠梅.ARM&Linux嵌入式系统教程.北京:北京航空航天大学出版社,2004 [3]于明.范书瑞.曾祥烨.ARM9嵌入式系统设计与开发教程.北京:电子工业 出版社.2006 24 [4]张景璐.ARM9嵌入式系统设计与应用案例.北京:中国电力出版社.2008 [5]李亚锋.ARM嵌入式Linux设备驱动实例开发.北京:中国电力出版 社.2008 [6]张琦文.谢建雄.谢劲心.ARM嵌入式常用模块与综合系统设计实例精讲. 北京:电子工业出版社.2006 [7]孙秋野.孙凯.冯健.ARM嵌入式系统开发典型模块.北京:人民邮电出版 社.2007 [8]封景刚.吴宝江.ARM嵌入式系统开发完全入门与主流实践.北京:电子 工业出版社.2008 [9]田泽.ARM9嵌入式Linux开发实验与实践.北京:北京航空航天大学出 版社.2006 [10]华清远见嵌入式培训中心.嵌入式Linux C语言应用程序设计.北京: 人民邮电出版社出版社.2007 [11]冯国进.嵌入式Linux驱动程序设计从入门到精通.北京:清华大学出 版社.2008 [12]罗苑棠.杨宗德.嵌入式Linux应用系统开发实例精讲.北京:电子工业 出版社.2007 [13]杨树青,王欢.Linux环境下C编程指南.北京:清华大学出版社,2007 [14]李俊.嵌入式Linux设备驱动开发详解.北京:人民邮电出版社,2008 [15] 龙跃.基于嵌入式系统的网络音响设计与实现.华中科技大学硕士论 文,2007 [16]陈莉君.Linux操作系统内核分析.北京:人民邮电出版社,2000 [17J卢军.Linux 0.Ol内核分析与操作系统设计:创造你自己的操作系统. 北京:清华大学出版社,2004
八、总结与心得体会
这次设计有很重要的意义,而且任务很重,但在这次设计中也学到了很多以前课堂没有的知识。虽然之前有学过有关于ARM方面的知识,不过到实际用的时 25 候发现了很多问题存在,不免有很大的压力。
这是我们大学重要的设计之一;我们仔细阅读老师给的资料,并按照实验步骤进行,尽管如此但在实践过程中还是遇到了很多的问题,不过经过指导老师的细心讲解,让我学到了很多东西。有些之前我们学过的知识要点,不过有一段时间间隔了,很多的知识要点有不同程度的遗忘,我们通过网络所搜,和同学一起讨论问题。时间过得很快,短短两周工程训练;在这两周时间里,我学到了很多东西,对于linux操作系统,以前了解过一些这方面的知识,但并没有实践过;安装ubuntu软件的时候,出现了系统卡机;在这次工程训练中安装交叉编译环境让我有很大的压力,遇到了很多的问题,在网上也查了很多的资料,最后是在同学的帮助下完成的。安装完成编译环境后,设置共享文件时出现了问题,而且连U盘都不能在linux系统中读出来,开始的时候并不知道怎么样设置共享,我试图使用网络传输。不过后来,在同学的指导下完成了设置共享文件,真的很感谢那位同学。使用ARM开发板的时候,挂接U盘,一开始不知道怎们样把U盘中的文件拷贝到开发板上,后来在知道里面搜索到了,相关的指令;在这次工程训练中让我受益非浅。功放电路的制作并不是很难,但放出来的音效并不是很理想,我试图通过改变电路的参数改善音频效果,但效果并不是很理想,可能是初始化设置参数的缘故。
在这次工程训练中学到了很多,更多的了解到了有关于ARM11方面的知识;学会了独立思考,独立解决问题;通过和同学交流,共同学习,共同进步;同时也了解到了怎样更好的通过网络查找自己需要的资料,在这次设计中由于时间原因,没有实现同步发送。还有初始化不太准确造成有噪声
九、致谢
首先感谢的是我的老师殷群老师,殷老师的学术感染力使我受益匪浅,在这学年当中,我得到了殷老师始终如一的指导、关心和照顾。殷老师学识渊博,治学严谨,在这学年的学习中,事无巨细,殷老师都能给我最细致和耐心的指导,生活中,殷老师的和善豁达,平易近人的作风也为我如何待人接物,为人处事做 了最好的诠释,其人格魅力也无形而有力的指引着我做人做事的方式,为我在以后的工作学习中树立了榜样。