第一篇:2016arm嵌入式学习心得
2016arm嵌入式学习心得
嵌入式ARM学习心得【1】
本人大学学的是电子信息科学与技术专业,其实这个专业和嵌入式没有多大的关系,要说有关系就是简单的讲了下C语言语法,学完之后还不知道什么是C语言,只记住了,char,int,string等占几个字节,if,for,while循环什么的,感觉也就能算一些小学就会的题目,全国计算机等级二级也就糊涂的过了。
我这个专业没学过C++,一开始不知道什么是向对象,什么叫面向过程,这可能让大家笑话了。不过这说的是实话,大学的时候比较喜欢动手,喜欢硬件方面的东西,也喜欢看书。在大一的时候就听学长说,单片机很难学,在没事的时候就从图书管借了本关于51的书,一开始还真是不怎么懂,然后硬着头皮去看,当我把51的结构看完了,就不像一开始那样一头雾水了,自己在纸上把51的结构图默画一遍,然后再把各个寄存器功能写一下,各个功能口的结构也画一遍,然后就不觉得51有什么难了。其实有些时候不是这个东西你不会,而是在不会的时候自己先告诉自己这个太难了,自己先放弃了。我们学习51芯片,是为了以后的打基础,知道是怎么通过配置寄存器来实现功能。大二下学期的时候,我们开了51的课,这个课几乎就没怎么去,因为我认为没有必要去听自己会的东西了。后来听别人说avr的资源会比51的丰富的很多,所以就想试试,看看有什么难的,就从网上买了本马潮老师《AVR单片机嵌入式系统原理与应用实践》,一边看书,一边想自己画一个板了,一开始想实现一个点阵屏,实现滚动效果,后来想想做个板也花不少钱呢,为什么不多加一些功能呢,还能多学到些知识,所以就加了温感,红外,铁电存储器等并把所有的扩展口都扩展了出来,备以后用,那时还挺自豪的呢,同学们都很羡慕,不过现在想想其实也没什么了。大学也听说过嵌入式这个词,不过不太明白是什么意思,09年的时候从网上找到中嵌视频,有四张DVD(大约13G),下载下来后,从头到尾的看了一遍,没什么印象,只记得讲一些不知所云的函数,然后莫名其妙的讲怎么使用那个44b0的开发板,不过听完了,还是有很大收获的,就有一种想装一个linux的冲动,我是大二下学期才有的自己电脑,不过电脑的配置比较低,1g内存,跑虚拟机就像个蜗牛,所以就想着怎么才能装个linux,自己用XP习惯了,如果全换了又舍不得,那时从书上知道linux的文件系统和windows不一样,只有一个根分区,所以也害怕一装linux全盘就被格式化了,不过最后还是欲望战胜了担心,买了张redhat9的光盘,小心的装这个系统,里边的英文也不是太难,还是知道大概意思的,所以一步步的装,最后装到我的硬盘的最后空间,重新启动,竟可以选择进入哪一个系统了,从这之后,自己就不害怕怎么装系统了,应了那句言,纸上得来终觉浅,绝知此事要躬行。所以我认为,买一个开发板是完全有必要的,拿到实物操作一下就不会感觉太抽象了。
后来也想学学arm,但不知道arm是什么东西,所以就买了本《从51到arm》,讲的是关于arm的大体结构,看完后感觉,原来arm就是一个速度更快,接口更丰富的单片机啊。
如果想做linux设备驱动的同学应该对arm硬件有一些了解。如果对驱动不感兴趣,完全没有必要去看。交叉编译器会帮我们做好这些事情,他比我们更了解arm结构。大三下学期开始准备考研了,所以自己这些兴趣就先放下了,报的北邮的信通学院通信专业,当时就是想一定要上个好学校好专业,也没想太多,结果考了的成绩差了点,没有被录取,也不想调剂一个二流的学校,然后就参加工作了,工作中每天都用的到开发板,当我看到一个小板上还可以跑系统的时候感觉很不可思议,以为要很大工程。后来边工作边学习,每天都要看电脑看到眼发疼,晚上也都差不多十二点时才睡觉。感觉到累,不过也感觉到自己在进步。
闲话有点多了,说了很多都是自己大学那点破事。
听很多的初学者说不知道从哪里开始,学习嵌入都要学哪些东西,从网上搜了一下,一大堆的东西要学,一下就推荐十几本书,说看完这本书怎么怎么样,看完那本书怎么怎么样,一下子就给初学者给吓住了,其实完全没必要把网上的那些东西全部看一遍,那样又费时,又感觉工程太大,让初学者没有信心去把每一种都看完。网上说的些方面都要知道,不一定全部都掌握,我们可以退成求其次,每一个都知道一些,当然会的越多越好。今天学点这个明天学点那,换着样来也不会觉得烦。而且还能感觉到每天都有收获。
下面给嵌入式初学者一些自己的我个人建议。
1、嵌入式涉及到很多的基础知识
c语言,关于C语言要知道基本的语法,什么是结构体,什么是共用体,有什么区别,不用强记一些二级考的东西,因在实际中用的很少。
c++要知道什么是类,怎么定义,继承,接口,要深刻理解,当然基本语法也是必不可少的。
操作系统原理也应该知道基本的原理的,我记得我大学没这个课还是去电信学院蹭别的专业的课呢,后来学习发现很多的东西都是在这个课上学到的。什么时间片啊,任务调度啊,都是在那里知道的。
Linux基本命令的使用(vi编辑器必须会用,因为在终端改文件的时候只能用这个),我们现在很多的人都习惯用鼠标了,很少用到命令,我们学习嵌入linux可要改改这个习惯了,linux用命令操作一是效率高,二是功能非常强大,远非图形界面能比的了的,其实我们用图形界面的操作都要转化为命令传给硬件的。
Linux文件系统的管理要清楚,哪个目录存放是什么东西,有什么用,文件权限管理等 Shell编程也要了解一些,在这给大家推荐一个教程,周朝剑的 shell编程,也就七八讲吧,讲的很全面。初学者看前4讲就可以了。Linux设备驱动的架构要了解,初学者可以以米尔的MYD-AM335X开发板上的led驱动分析一下,结合原理图和linux设备驱动相关书籍把每一行代码都分析明白。关于驱动给大家推荐一本书《LINUX设备驱动程序》中国电力出版社出版的,很经典的,初学者看可能看不太明白,不过要坚持看,最次也得把前6章看完了。
2、看书不要希望一次就会
一次就明白是什么意思,也不要死记硬背,看不明白也没关系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就记住了,遇到的少的,忘记也就忘记了。还有,不要直接阅读linux内核源代码,看一些自己把头撞破也想不明白的事,会打击初学者的积极性,要循序渐进,今天学个做个led,明天做个串口,后天说不定就做硬件编解码了。
3、你可以不接受培训,但是不能不买开发板
如果你想学习嵌入式一定要买块学习板,现在的开发板很便宜了,给我们初学者减轻了很多经济负担。看再多的视频,看再多的书,也不如自己动手试一下,看着很简单的东西,做起来就可能遇到很多的问题,遇到问题找到原因,解决问题,只有这样才能学到东西,记得我第一次写led的驱动,想自己试一下,网上也有人写过相关的代码,可是自己一试,就出了好多的问题,那个led弄了我一天才把led灯点亮。所以不要眼高手低。
还有关于培训,现在的培训机构很多,讲的也不错,老师也很好,但是有一个问题,太集中了,而且学生动手的机会也不太多,记得我们公司还招了一个在北京某个培训机构培训半年的员工呢,花了一万多,来了之后也没感觉有多高,问他都学了什么,也就是我前边说的那些基础知识,很多的东西还是不知道的,照着书弄个helloworld模块驱动两天没搞定。不是培训不好,但我个人见解效果并不是很好。记住:只有自己动手做过的东西才是自己的。
现在买一块开发板很便宜,飞凌的OK6410的开发板就不错,源码完全开放,而且资料也很丰富,完全能满足初学者学习用,有人说友善的板子也不错,我个人觉得友善的板子不错,但是不适合初学者,因为他的很多的东西是不给代码的,用过友善的板子的同学经常有这样的痛苦,想学一个东西,去找他的代码的时候,却找不到,很多友善提供的代码中很多的都是封装好的,只提供给客户一个库,初学者想要找代码的时候就不知道怎么办了。
4、不要好高骛远,要脚踏实地
对于初学者,还有一点小建议,我们拿到一个开发板,很兴奋也很激动,想法自然也很多,想用开发板实现自己的这个想法,实现那个想法,然后又不知道从何下手,然后就去论坛中发一个贴,“那个什么什么怎么实现啊,哪位大侠能详细说一下啊,跪求!”然后等着别人去回复。见没人回复就抱怨。有想法是好的,我们要实现自己的想法也是有前提的,首先,我们对这部分知识了解吗?如果不了解就去google一下(最好别用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到问题,再去发贴问,这样也显得咱们有水平。比如自己连串口是什么都不太清楚呢,就问串口通信怎么做啊,就是人家把代码给咱,咱也不明白是怎么回事啊。
5、多看代码,多写代码
见多识广,熟能生巧。多看代码,要从代码中读出代码的意思来。自己平时也要多写代码,多练习(这一点我做的不好,写的少)。写完已经晚上两点了,思路有些乱,有些也是个人的见解,在有些人看来可能是错误的,每个人有每个人的学习方法,但是我们的目的只有一个——希望我们学到更多的知识。嵌入式学习心得【2】
还记得老师第一次将一块天祥的2440开发板放到我面前时,我心里觉得这太神奇了,好漂亮的板子,怎么弄呢?老师大体给我讲了一下,但是以前连51单片机操作都不熟的我如何记得住老师说的呢?板子拿到手里,左手拿不知到怎么开始,右手拿也不知道如何入手啊。
然后我决定上网查一查这个东西如何转起来呢?搜到了天祥的视频教程,但其是加密的,唉......我大概就在网上搜了将近一周的时间,后来老师过来询问我的板子玩的如何了,我连工作环境都没有搭建起来,老师说我那里有视频,我觉得老师啊,你不早说啊。也许老师是故意的,因为将近一周的时间我了解了三星公司的芯片S3C2440A,知道了天祥开发板的原理,包括的外设,有了整体的认识。
我拿到视频后跟着视频一步一步地开始了我的嵌入式之旅...
第二篇:实习总结-嵌入式ARM
实训总结
班级 卓越1301姓名***
通过这段时间的学习使我学到了很多知识,并且了解到ARM的应用以及对开发板的应用,为以后的学习奠定了一定的基础。
嵌入式系统一般定义为以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统这是从技术角度。从系统角度上是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。
广义上讲,凡是带有微处理器的专用软硬件系统都可称为嵌入式系统。如各类单片机和DSP系统。这些系统在完成较为单一的专业功能时具有简洁高效的特点。但由于他们没有操作系统,管理系统硬件核软件的能力有限,在实现复杂多任务功能时,往往困难重重,甚至无法实现。从狭义上讲,我们更加强调那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的嵌入式系统。
嵌入式的应用也比较广泛涉及军事国防、工业控制、消费电子和网络。在家用方面更是数字电视、信息家电、智能玩具、手持通讯、存储设备的核心。
在ARM指令集中了解到ARM的寻址方式以及它的的特性,具有高效、快速的特点,还有Thumb指令集具有灵活、小巧的特点。
在这次实训中做了两个项目,一个是LED灯,实现LED灯的点亮是比较简单的,通过查找手册可以很快的了解到要使用的寄存器和方法,另一个项目是DS18B20这个比较复杂,除了要掌握对寄存器的使用,还要对了解对串口的初始化,读写字节等等。
感谢这次实训,通过这次的实训项目,使我大体了解制作项目的步骤,了解了嵌入式技术的掌握是需要一个过程的。实事求是的说,嵌入式技术的全面掌握是有相当难度的,通过积累和动手总会有收获的,从实验中也明白了一个大的项目并不是一个人可以完成的,团队协作很重要。
姓名:***
年级:卓越1301
2014-7-5
第三篇:嵌入式系统ARM实验报告
南京邮电大学通信与信息工程学院
实验报告
实验名称:实验一基于ADS开发环境的设计
实验二嵌入式Linux交叉开发环境的建立 实验三嵌入式Linux环境下的程序设计
课程名称嵌入式系统B
班级学号B13010711 姓名马俊民
开课时间 2015/2016学年第1学期
实验一基于ADS开发环境的程序设计
一、实验目的
1、学习ADS开发环境的使用;
2、学习和掌握ADS环境下的汇编语言及C语言程序设计;
3、学习和掌握汇编语言及C语言的混合编程方法。
二、实验内容
1、编写和调试汇编语言程序;
2、编写和调试C语言程序;
3、编写和调试汇编语言及C语言的混合程序;
4、编写程序测试多寄存器传送指令的用法。
三、实验原理
ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。
ADS用于无操作系统的ARM系统开发,是对裸机(可理解成一个高级单片机)的开发。ADS具有极佳的测试环境和良好的侦错功能,它可使硬件开发工作者更深入地从底层去理解ARM处理器的工作原理和操作方法,为日后自行设计打基础,为BootLoader的编写和调试打基础。
1.ADS软件的组成
ADS由命令行开发工具、ARM运行时库、GUI开发环境(CodeWarrior和AXD)、实用程序、支持软件等组成。
2.GUI开发环境
ADS GUI开发环境包含CodeWarrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。
使用汇编语言进行编程简单、方便,适用于初始化硬件代码、启动代码等。汇编语言具有一些相同的基本特征:
1.一条指令一行。
2.使用标号(label)给内存单元提供名称,从第一列开始书写。3.指令必须从第二列或能区分标号的地方开始书写。4.注释必须跟在指定的注释字符后面,一直书写到行尾。
在ARM汇编程序中,每个段必须以AREA作为段的开始,以碰到下一个AREA作为该段的结束,段名必须唯一。程序的开始和结束需以ENTRY和END来标识。嵌入式C语言设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。
四、实验过程与关键代码分析
1.创建项目工程
在File菜单中选择New命令,打开一个新建工程对话框。在Project选项卡下,选择ARM Executable Image, 然后在Project name文本框里输入项目名称,点击确定。弹出工程窗口。
选择File菜单中的New命令,选择File标签页,在File name文本框中输入要创建的文件名。汇编程序以.s结尾,c程序以.c结尾。在Location文本框中指定文件的存放位置,选中Add to Project,在Targets中选中DebugRel,单击确定关闭窗口。
2.用汇编语言设计程序实现10的阶乘
AREA EXAMPLE, CODE, READONLY ENTRY start MOV R0, #10 MOV R1, #1 LOOP MUL R0, R0, R1 SUB R0, R0, 1 CMP R0, #1 BHI LOOP END 在这个程序中,我们首先对R0和R1赋值,将R0作为一个变量,而R1作为一个存贮阶乘值的寄存器。在每进行一次乘法之后,将R0减1。同时在做完减法后进行判断,如果此时R0大于1,则返回继续乘法,否则结束程序,输出结果。
3.用调用子程序的方法实现1!+2!+3!+„+10!,代码如下: asmp.s
AREA JC, CODE, READONLY
EXPORT JCP
ENTRY JCP
ADD R3, R0, #1
MOV R2, #1
MOV R1, #1 LOOP MUL R0, R1, R2
MOV R1, R0
ADD R2, R2, #1
CMP R2, R3
BNE LOOP
NOP
NOP
MOV PC, LR
END
PROGC.c #include
int main(){ int res=0;int m=10;int i;for(i=1;i<=m;i++)
res=res+JCP(i);printf(“The result =%dn”,res);return 0;} 在这个程序中,主程序由c语言完成作求和,子程序由汇编语言写成作阶乘。
5.实现字符串的逆序复制TEXT1=“HELLO”=>TEXT2=“OLLEH”
AREA invstring, CODE, READONLY start
ADR R1,TEXT1
ADR R2,TEXT2
MOV R3, #0 LOOP
LDRB R0,[R1], #1
ADD R3,R3,#1
CMP R0,#0
BNE LOOP
SUB R1,R1,#2
LOOP1
LDRB R0,[R1], #-1
STRB R0,[R2], #1
SUB R3,R3, #1
CMP R3,#1
BNE LOOP1
MOV R5,#&55
TEXT1
TEXT2 NOP =“HELLO”,0 ALIGN =“OELLH” END
五、实验小结
在这次实验中,学会了如何使用汇编程序进行编程。对汇编程序编程一些基本的要求有了一定的了解,学习了C语言的语法和在其中调用汇编程序的方法。学会了利用CodeWarrior IDE开发C和ARM汇编代码。学会了在AXD中进行代码调试的方法和过程,对AXD的调试有初步的了解。,实验二嵌入式Linux交叉开发环境的建立
一、实验目的
1、掌握嵌入式Linux交叉开发环境的建立方法
2、学习和掌握Linux常用命令
3、学习和掌握vi编辑器的使用
二、实验内容
1、搭建嵌入式Linux交叉开发环境
2、熟悉Linux的常用命令
3、熟悉vi编辑器的常用命令
三、实验原理
Linux系统是UNIX系统的分支,是UNIX的微机版。Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术。Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。
Vi编辑器是所有UNIX和Linux下的标准编辑器。它包含3种工作模式。嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。
四、实验过程与关键代码分析
实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。接着需要
1.宿主机的环境搭建
下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHat Linux 9.0。
2.虚拟机中启动Linux操作系统
使用root登陆,用户名为root,密码为123456。之后对共享文件设置进行调整:打开settings界面,打开shared folders功能,同时将路径设置到有课前下载的软件的目录下。
3.开发工具软件的安装(1)安装gcc 打开Linux后,打开终端窗口,在共享的目录下找到install.sh并运行,命令如下: ls./ install.sh 安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s 目录下,同时自动配置编译环境,建立合适的符号链接。安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器。(2)配置PATH路径
vi.bash.profile 将里面PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;存盘后执行
source.bash_profile 以后armv4l-unknown-linux-gcc将被自动搜索到
4.宿主机上的开发环境配置(1)配置IP地址
ifconfig eth0 192.168.0.121 命令配置了宿主机的IP地址。然后打开网络配置窗口,重新探测MAC地址。重新激活。(2)关闭防火墙
单击“Red”菜单→“系统设置”→“安全级别”→打开“安全级别配置”窗口,选择“无防火墙选项。”(3)配置NFS。
单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始”(4)NFS设置
单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。
然后在NFS服务器中增加主机IP地址的链接许可和目录。完成配置。
5.目标机的信息输出
Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。区号、电话号码随意输入。设置每秒位数为“115200”,数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。单击“确定”。
6.程序的运行
打开超级终端,启动Linux,屏幕显示:
[/mnt/yaffs] 在超级终端上执行挂载命令:
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后可执行程序。
五、实验小结
在这次实验中,学会建立Linux交叉开发环境,学会了ls和vi,cd等常用的Linux命令,并掌握了Vi编辑器的使用方法。同时知道了如何在搭建失败时寻找错误进行排错。
实验三嵌入式Linux环境下的程序设计
一、实验目的
1、掌握嵌入式Linux环境下的程序设计方法
2、学会编写Makefile文件
二、实验内容
1、熟悉嵌入式教学实验箱的使用
2、编写C程序和Makefile文件
3、编译程序产生可执行程序
4、完成主机的挂载和程序的执行
三、实验原理
在嵌入式Linux环境下的程序设计方法有一下几个步骤:
1.编写源程序
2.编写Makefile文件 3.编译程序
4.运行和调试程序
5.将生产的可执行文件加入文件系统。
前三个步骤在宿主机上完成,后面的步骤在目标机上完成。
四、实验过程与关键代码分析
1.建立工作目录
mkdir hello cd hello
2.编写源程序
用vi编辑器编辑Hello.c文件
vi Hello.c 在Vi中输入源程序如下:
#include
printf(“hello world n”);}
3.编写Makefile文件
vi Makefile 在vi中编辑Makefile文件如下:
CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+=-static all: $(EXEC)$(EXEC):(OBJS)$(CC)$(LDFLAGS)–o $@ $(OBJS)clean:
-rm –f $(EXEC)*.elf *.gdb *.o
4.编译程序
在hello目录下运行“make”来编译程序。
make clean
make 编译成功后,生成可执行文件Hello.o。
5.下载调试
在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。接下来启动超级终端,建立通讯,挂载。
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后,进入/mnt/nfs,再进入/mnt/nfs/hello,直接运行刚刚编译生成的可执行文件Hello.o,查看运行结果
cd hello./hello 可以看见“Hello world”
只需要挂载一次便可,只要实验箱没有重启,就可以一直保持连接。反复修改、编译、调试,直至程序调试通过。
6.可执行文件加入文件系统
程序调试通过后,可以把可执行文件拖放到usr/bin目录下,然后使用mkcramfs制作工具生成新的文件系统。当系统启动后,就可以在相应目录下执行可执行程序hello.五、实验小结 在这次实验中,学会了在嵌入式Linux环境下设计程序。同时知道了如何对目标机进行挂载。以及如何在发现挂载不成功寻找错误进行修改。另外在编译文件时需要注意的也都有所了解。
实验四多线程程序设计
一、实验目的1、2、二、实验内容1、2、3、4、三、实验原理
四、实验过程与关键代码分析
五、实验小结
3+
第四篇: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嵌入式基础教程知识点总结
1、举出书本中未提到的嵌入式在每种异常模式下都有一个对统:嵌入式μCLinux、Windows 系统的例子:红绿灯控制,数字应的物理寄存器——程序状态CE、VxWorks、μC/OS-II 空调,机顶盒、键盘、鼠标、扫保存寄存器SPSR。当异常出现
18、ARM是什么样的公司?它是描仪 时,SPSR用于保存CPSR的状态,一家微处理器行业的知名企业,2、嵌入式系统:嵌入到对象体以便异常返回后恢复异常发生该企业设计了大量高性能、廉系中的专用专用计算机应用系时的工作状态。价、耗能低的RISC处理器。特统。特点:嵌入性、内含计算机、12、ARM7TDMI 产生异常的条点是只设计芯片,而不生产。它专用性。件?ARM的异常有哪几种,各进将技术授权给世界上许多著名
3、嵌入式处理器:为完成特殊入何种工作模式?他们退出各的半导体、软件和OEM厂商,并的应用而设计的特殊目的的处采用什么指令? 提供服务。理器。嵌入式处理器分为三类:答:当正常的程序被暂时中止,19、RISC是精简指令集计算机的1)注重尺寸,能耗,价格2)关处理器就进入异常模式。1)复缩写。CISC是复杂指令集计算机注性能3)关注全部四个需求。位异常(管理模式);2)未定的缩写。集体分为四类:嵌入式微处理义指令异常(未定义模式);3)20、ARM处理器核:ARM7系列、器、嵌入式微控制器、嵌入式DSP 软件中断异常(管理模式);4)ARM9系列、ARM10系列、ARM1130、寄存器CPSR,SPSR的功能
各是什么?
答:1)CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息。所有处理器模式下都可以访问当前的程序状态寄存器CPSR。2)在每种异常模式下都有一个对应的物理寄存器——程序状态保存寄存器SPSR。当异常出现时,SPSR用于保存 CPSR的状态,以便异常返回后恢复异常发生时的工作状态。
31、LPC2000系列ARM7微控制器具有哪两种低耗模式?如何降处理器、嵌入式片上系统
4、嵌入式操作系统:是操作系统的一种类型,是在传统操作系统的基础上加入符合嵌入式系统要求的发展而来的。首先,嵌入式实时操作系统提高了系统的可靠性。其次,提高了开发效率,缩短了开发周期。再次,嵌入式实时操作系统充分发挥了 32 位 CPU 的多任务潜力。
5、ARM7TDMI中的T高密度 16 位的Thumb指令集扩展、D支持片上调试、M64 位乘法指令、Embedded ICE 硬件仿真功能模块
6、ARM7TDMI采用三级流水线(取指 译码 执行)。存储器编址方式:使用了冯·诺依曼结构,指令和数据共用一条32 位总线。
7、处理器模式指的是处理器在执行程序时在不同时刻所处的不同状态,处理器状态指的是处理器当前所执行的指令集。
8、ARM的处理器模式:用户模式(usr)-正常程序执行的模式。快中断模式(fiq)-FIQ异常响应时进入此模式。中断模式(irq)-IRQ异常响应时进入此模式。、管理模式(svc)-系统复位和软件中断响应时进入此模式。中止模式(abt)-用于虚拟存储及存储保护。未定义模式(und)-未定义指令异常响应时进入此模式。系统模式(sys)-与用户类似,但有直接切换到其它模式等特权。状态:ARM状态,32 位,这种状态下执行的是字方式的ARM 指令。Thumb状态,16 位,这种状态下执行半字方式的 Thumb 指令。
9、堆栈指针R13(SP):用于保存堆栈的出入口地址,保存待使用寄存器的内容。链接寄存器R14(LR):当使用BL指令调用子程序时返回地址将自动存入R14中;当发生异常时,将R14对应的异常模式版本设置为异常返回地址,其他时候为通用寄存器。程序计数器R15(PC):R15总是指向正在“取值”的指令。
10、ARM状态和Thumb状态的寄存器之间的关系:1)R0-R7相同;2)CPSR相同,Thumb状态无SPSR。Thumb状态下不能更新CPSR中的ALU标志位。Thumb指令对R8-R15寄存器访问受限。
11、ARM7TDMI(-S)寻址方式: 1)寄存器寻址2)立即寻址3)寄存器移位寻址4)寄存器间接寻址5)基址寻址6)多寄存器寻址7)堆栈寻址8).相对寻址.寄存器CPSR,SPSR的功能各是什么?答:1)CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息。所有处理器模式下都可以访问当前的程序状态寄存器CPSR。2)指令预取中止异常(中止模式);系列、Intel的XScale系列和5)数据访问中止(中止模式);MPCore系列。6)快速中断请求(FIQ模式);
21、LPC2000系列器件有几种常7)外部中断请求(IRQ模式)。见的封装形式和其封装特点?异常返回指令:1)SWI,未定义常见的封装有64脚封装,144脚的返回:MOVS PC,R14;2)IRQ,FIQ,封装,功耗低,有多个32位定预取中止的返回:SUBS 时器,多达9个外部中断,16KPC,R14,#4;3)数据中止返回并字节静态RAM,1/128/256k字节重新存取:SUBS PC,R14,#8异常片Flash存储器,128为宽度接中断的优先级:复位(最高优先口加速器,4路10位ADC或8路级)--> 数据异常中止--->FIQ 10位ADC(64脚和144脚封装),---> IRQ--->预取指异常中止46或76~112个GPIO(64脚和--->SWI---->未定义指令(包括144脚封装)。缺协处理器)。
22、简要说明一下LPC2000系列
13、小端存储器组织是较高的有器件片内存储器的特点?片内效字节存放在较高的存储器地存储器分为片内Flash和片内静址,较低的有效字节存放在较低态RAM。片内Flash通过128位的存储器地址(同同小)。大端宽度的总线与ARM内核相连,具存储器组织是较高的有效字节有很高的速度,特有的存储器加存放在较低的存储器地址,较低速功能,可以将程序直接放在的有效字节存放在较高的存储Flash上运行。SRAM支持8位、器地址(正反大)。16位和32位的读写访问。
14、描述一下LPC2210的PO.14、23、存储器重映射是为了实现引P1.20、P1.26、BOOT1和BOOT0导块和异常向量表地址的固定。引脚在芯片复位时分别有什么重映射引导块,有利于用户调用作用?并简单说明LPC2000系列其中的某些程序,增加代码的可ARM7微控制器的复位处理流程。移植性;异常向量表重映射为了 P0.14的低电平强制片内引能让ARM内核通过访问0x0000~导装载程序复位后控制器件的0x003F地址访问到其他存储区操作,即进入ISP 状态。P1.20域的向量表。的低电平使 P1.25~P1.16复
24、LPC2000系列ARM7微控制器位后用作跟踪端口。P1.26的对向量表有什么要求(向量表中低电平使 P1.31~P1.26复位的保留字)? 后用作一个调试端口。当RESET 向量表中有一个空隙以确保软为低时,BOOT0 与BOOT1 一同控件能与不同的ARM结构兼容;表制引导和内部操作。引脚的内部中异常入口地址处放置的是跳上拉确保了引脚未连接时呈现转指令,已转向中断子程序。FIQ高电平。外部复位输入:当该引地址要放在向量表的最后。脚为低电平时,器件复位,I/O25、FLASH是128位宽度的接口,口和外围功能进入默认状态,处通过存储器加速模块提高其访理器从地址0 开始执行程序。复问速度。位信号是具有迟滞作用的TTL
26、FIQ、IRQ有什么不同?向量电平。IRQ和非向量IRQ有什么不同?
15、LDR/STR指令的偏移形式有FIQ是快速中断,具有最高优先哪4种?LDRB和LDRSB有何区级,中断处理转入FIQ模式;IRQ别? 是普通中断,优先级低于FIQ,1)零偏移;2)前索引偏移;3)中断处理转入IRQ模式。向量IRQ程序相对偏移;4)后索引偏移。支持16个向量IRQ中断,16个LDRB:读出指定地址的数据并存优先级,能为每个中断源设置服入指定寄存器,LDRSB:读出指务程序地址;非向量IRQ支持一定地址的数据,并高24位用符个非向量IRQ中断,所有中断都号位扩展,再存入指定寄存器。共用一个相同的服务程序入口
16、ARM7TDMI指令集包括1)ARM地址。指令集:指令32位,效率高,27、LPC2000系列芯片共有共有代码密度低,所有ARM指令都是4个外接中断输入,它们既可以可以有条件执行的。Thumb指令是IFQ也可以是IRQ。集:指令16位,代码密度高,28、LPC2000系列芯片常用的开Thumb指令仅有一条指令具备条发工具:ADS、IAR、JATG、ISP 件执行功能保持ARM的大多数性
29、嵌入式处理器的最小系统是能上的优势,是ARM指令集的子指提供嵌入式处理器运行所必集。须的条件的电路与嵌入式处理
17、广泛使用的三种类型的操作器共同构成的系统。嵌入式处理系统:多道批处理操作系统、分器的最小系统的基本电路包含:时操作系统以及实时操作系统。时钟系统、供电系统、复位及其常见的4种嵌入式实时操作系配置系统、存储器系统(可选)、调试测试系统(可选)。
低系统的功耗?空闲和掉电。目前大多数电路采用CMOS工艺,静态功耗很小,可以忽略,起主要作用的是动态功耗,因此降低功耗主要从降低动态功耗入手。低功耗设计技术:低功耗器件、低功耗电路形式、降低或动态改变处理器的时钟频率、降低持续工作电流、减少处理器工作时间、采用快速算法。
32、内部寄存器特点:ARM7TDMI处理器内部有37个用户可见的寄存器,31个通用32位寄存器,6个状态寄存器。这些寄存器不能在同一时间被访问,究竟何时才能访问上述寄存器完全取决于处理器状态和模式。
33、用户模式CPSR模式位的值:1000034、系统模式CPSR模式位的值:1111134、列举异常向量的向量地址。复位 0x00000000未定义 0x00000004软件中断 0x00000008
中止 0x0000000c中止(数据)0x00000010保留 0x00000014IRQ 0x00000018FIQ0x0000001c35、异常优先级顺序:复位数据中止FIQIRQ中止未定义 SWI36、最大中断延时27个周期,最小中断延时4个周期 N负标志位、运算结果的第31位值,记录标志设置的结果Z零标志位、如果标志设置操作的结果为0,则置位。C进位标志位、记录无符号加法溢出,减法无错位,循环移位。V溢出标志位、记录标志设置操作的有符号溢出。控制位:I、F、T、M【4:0】中断禁止位:I、F(I=1:禁止IRQ中断F=0:禁止FIQ中断)标志位:T反映处理器的运行状态。T=1时,程序运行Thumb状态,否则运行于ARM状态。模式控制位:M【4:0】决定了处理器的运行模式
总线就是各种信号线的集合,是计算机各部件之间传送数据、地址和控制信息的公共
路。总线的主要参数有:总线的带宽、总线的位宽、总线的工作时钟频率。
预分频功能:通过设置某个常量来控制pclk(定时器的时钟源)的分频。匹配功能:当定时器值等于预设的匹配值时,从引脚输出特定的信号。捕获功能:如果输入信号满足设定的要求,将触发捕获动作,将定时器的计数值保存到捕获寄存器中。
。除了用户模式外,其他模式均可视为特权模式。后五个为异常模式。