自己的ARM学习历程(入门版)

自己的ARM学习历程(入门版)
自己的ARM学习历程(入门版)

第一部分

罗嗦与废话(必看)

我写这个,再次申明:这不是教程,至少不是教科书式的教程。只是自己学习的一个过程,准确说是我个人学习的一个思维方式,学习顺序。可能我后面的写的有些乱,又有些天马行空,不过这真正是反映我学习的一个先后过程。

说实话,入门真的很痛苦,那种徘徊再门外而不得要领的感觉真的很痛苦,论坛上大多数教程啊例子什么的都是ADS的,刚看时那个郁闷啊,特别是对于学单片机用惯KEIL的人来说哦,还要再去学ADS,真是。。。所以我下面说的一些包括例子,都是基于keil的,为的是我们能够像学习51单片机一样学习ARM。

刚开始也是什么都不懂,在论坛上下了好多ARM的教程。也逐个浏览下了,就我个人认为,比较好的两本书,也是我自己整个浏览完(注意,是浏览)的两本。一本是“《ARM嵌入式基础教程》配套讲义”,这个是PPT文档,我没有找到完整的原书。这个教程我从头到尾看了一次,不过看完还是脑袋糊糊的。在这里,我也请大家对它不要钻研,糊糊的看完即可(要看完),大致知道ARM是什么意思,知道ARM是有一个内核的,ARM公司开发内核(什么ARM7,ARM9,AR1M1就是内核不同),然后交给其他公司添加其他外围设备,所以导致ARM 有衍生出很多种类;然后知道ARM都几种操作模式,什么用户模式,系统模式等等(我到现在也叫不全),至于具体什么时候用,干什么

用,不用管,用的时候再看;

还有就是知道ARM分为ARM指令集及Thumb指令,这个是汇编的,暂且搁搁吧,哎,本来我也是想向51一样先学汇编再学C的,不过看来看去,还是不知道汇编从何下手;然后看到PPT里一直有个什么启动代码的,什么意思?8懂,留着,到后面就知道了。。不过要写出来,,,有难度。。然后。。。自己看看,反正看完脑袋还是浆糊就对了,你都搞懂了,我想下面的你也不用看了,你是天才。。。。。。。

说说我当初用keil学ARM的开端。刚开始不知道keil C51原来和KEIL for arm是两个东西,从论坛上下了例子后,直接keil编译,失败ing。。后来下了个keil for arm的,想自己建个工程呢,楞是找不到LPCXX在哪里,找到Philips,下面只写着see NXP——就是这个就搞了好久,把keil C51,KIEL FOR ARM反复装来装去,然后又下了别的版本的keil for arm,还是搞不定,再网上找了几个keil arm 的教程,就是看不不到怎么教人找到LPCXX栏目的―――后来,光是这个就搞了两个多星期,没头绪。于是下了个ADS,看教程,发现。。。不会用。没法,又转会keil,一个偶然的以外,被我发现创建时左边有个NXP的栏目,于是点开,往下拉,天啊,上帝啊,终于看到LPC叉叉了。所以这就告诫我们,英文理解能力一定要好。。。(汗!!)然后问题又来了,看了ADS的例子(下了一个基于PROTEUS的ARM 虚拟开发技术,是ADS的),我晕,文件好多啊,什么main.c,target.c,starup.c,lpcxx.c,….然后又看keil的,我靠,又是一堆文件―――说实话,对初学者来说,看见这些文件就怕,干

嘛搞那么多啊,我××××无语。。。。。

哪些是可以放在一个文件里的?还是必须要分成几个文件的?还是分成的几个文件必须那样命名的?还是这些文件是必须的,哪些是不必要的?哪些是系统的,哪些自己写的,哪些是可以更改的?还是。。。真是彻底被这些乱七八糟的例子打败了。。。。想我当初学单片机,就建立一个工程,一个程序文件,写两句:SETB P1.0 ,END,OK。装上那个dpj.dll(平凡老师的,大家不陌生吧),效果就出来的,多么简单干脆,哪像这ARM这么繁琐啊,真的烦。。。。

为了研究这个问题,我反复实验,一个一个的改,删,得出结论:除了starup这个文件是必须要的(当然还要一个程序文件),其他都可以删,通通删(lpcxx。H是自动生成)。..

然后说说我看的另一本书,也是我现在还在看的一本书(电子档的)“深入浅出ARM7(上,下)”,这是本好书,建议大家开始写程序看这个。前面的就像看我说的第一本一样,浏览,纯粹的浏览,,有个印象即可;有不懂的地方,以后后面写程序时可以再回过头来研究,带着问题学习――――这是最好的;否则都不明白对后面的学习有什么帮助,看了也白看,没理解,转眼就忘了。。

我这里说的,像学C51一样学ARM,只是给大家一个入门的路,只能说入门,更高深的偶也8懂。至于到“会”的程度,我记得曾经学VC时有句话说的好“什么叫会VC,会建个工程,能弹出个‘Hello World’就叫会VC了?”所以这里也说“不是会点亮个LED就叫会ARM 的!!”至于“精通”,当今21世纪,呵呵,谁敢言“精通”二字?

那么“入门者”和“高手”有什么区别呢?借用当初学单片机时平凡老师的话,“入门者和高手的区别,看到FEH这个16进制数,入门者只有看到8个LED,7个灭,1个亮,然后才能回过头把FEH这个数和LED7灭1亮联想起来;而高手一看到FEH,脑海里自然就想到8个LED,7亮1灭(大致是这个意思,忘了,,!)”―――最后一句正文,我这个应当是大多数正常人的思维模式了,不敢说让大家成为高手,不过入个门应该不是什么难事。如果最后还没有入门的人,只能说我的思维方式不适合你。一种要么你是牛B的天才,另一种。。。不说了,自己明白。。。。。。

好了,废话就说到这里了,脑袋又糊了,打游戏去。。。。

王谷成

于 2008年12月8日星期一

农历戊子鼠年 冬月十一 晚

第二部分

像学51一样学ARM

■一些说明:

本文所述的以及附带的keil-protues仿真例子,我都一一重新运行了的,能够protues仿真,然后基本上逐条逐句都有详尽的注释。例子以及注释主要参考了论坛下的“基于PROTEUS的ARM虚拟开发技术”(光盘)和“深入浅出ARM7(上,下)”,不过不是像“基于××”样完全照抄“深入××”,其中有我自己的理解,有些地方有疑问的我都标出了,哪位如果后来解决了可以发到论坛共享下。。。

我使用的keil for arm版本是mdk 3.22a,protues版本是protues 7.2 sp6(自己装第三方库).如果有人仿真不能的话,估计可能是软件版本的问题。大家可以网上搜搜自己下载。

1:开始-创建工程+点亮一个LED

还是从最简单的开始,点亮一个LED。

◆打开keilu3(mdk3.22a),进入时如下图:

◆然后选择project(工程)-New uVision Project(新工程),

起一个工程名,保存。

◆然后进入如下界面

◆下拉滚条,找到NXP(founded by Philips),展开,下拉滚条,

选择自己所用的ARM型号(我下面的都是LPC2131的)

◆确定后弹出一个对话框如下,问你是否要加载启动代码,选择是,

这里必须要加载启动代码(不像51,加启动代码A51反而出错)

◆然后就是和keil C51一样了,建立一个程序文件,加载到工程里。

然后写程序,编译,链接。要生成HEX代码的话,要在target里设置,如下图:

好了,开始点亮一个LED

使用的是LPC2131,点亮LED2.

程序如下(后续省略,建附带的例子文件):

#include

int main()

{ PINSEL0=0X00000000; //P0口配置为GPIO功能

IODIR0=0XFFFFFFFF; //P0口为输出状态

IOSET0=0XFFFFFFFF; //P0口置高电平,所有LED关闭

IOCLR0=0X00000002; //P0.1置低电平,点亮第二个LED

} //这里(19行)必须空出一行,否则KEIL编译会警告

具体的可以看keil-protues的例子。

在这里,#include表示是包含一个LPC213X.H的文件这个文件在...keil\ARM\INC\Philips目录下,里面有一些关于寄存器地址的定义,至于到底是如何定义的,先不管他,反正知道用C 语言写,都要包含这个文件就是了。

然后是PINSEL0=0X00000000这句,表示把P0口用作GPIO功能。在ARM里,每一个端口可能有很多功能,什么GPIO,串口,IIC,SPI 等等等等,而要让每个端口工作在什么功能下,就要靠PINSEL0或PINSEL1这两个寄存器来选择了,GPIO-General Purpose Input Output,通用输入输出,就是指那些可以通过软件把输入输出设置为高低电平1,0之类的端口,类似与C51中的P0,P1,P2等口。在ARM 里,各端口的默认功能是GPIO,所以这一句PINSEL0=0X00000000可以不要。

IOSET0=0XFFFFFFFF; IOCLR0=0X00000002;IOSET0,IOCLR0是P0

口设置高低电平的两个寄存器,只有当选择GPIO功能时才有效。IOSET0,IOCLR0为1时,相应的端口才输出高或低电平,注意,不是IOCLR0=0输出低电平,IOSET0,IOCLR0为0时,也就是说对IOSET0,IOSET1赋值(写)0是无效的。

最后一点,貌似是mdk的BUG?就是C程序写完后,要空一行,注意,这行必须是空的,不能有任何字,注释的也不行,否则keil 编译会有警告,可以看看附带的例子,删掉空行试试。

2:按键识别,点亮一个LED

具体程序见我的附带实例。

前面的都一样,设置GPIO功能,输入输出等。刚开始P0.0口置高电平,LED是灭的。然后while语句不停的循环,检查是否有按键按下。IOPIN0这个寄存器是一个读/写的状态寄存器,可以反映当前I/O口状态,将它与0X400(0100 0000 0000)相与,检查第【11】位(其他位“相与”后恒为0),即按键接的P0.10口。当按下键时,P0.10为低电平,执行if语句后面的一句,将P0.0变为低电平,LED 点亮。

这里有一个问题,用if语句查询按键时,如果将IOPIN0&0X400得出的值赋给另一个变量,例如我程序中的temp,然后检测temp是否为0,结果protues仿真时会出错:不会判断if语句,而是跳过if语句,直接点亮LED。这里不知道为什么,是程序的问题,还是protues仿真的问题呢?

3:按键控制LED闪烁

具体程序见我的附带实例。

基本上是在前一个实验的基础上增加闪烁效果,不停的使P0.0口高/低电平切换。

这里有两种方法:一是循环灯亮-延时-灯灭-延时;二是使用取反,检测P0.0口电平,为高-则变低,为低-则变高。

4:多按键控制LED闪烁

具体程序见我的附带

四个按键控制4个LED,按下相应按键时,LED闪烁。这个算法不是很好,我用的是一个一个检查,并且只能依次1-2-3-4,按键时才会被识别。加入LED1闪烁,按下K3时,则不会被识别。

5:流水灯

具体程序见我的附带

跟51单片机的原理一样的。这里有2中方法,一是我写的先定义一个数组,然后在程序中直接调用该数组即可;另一种是用指针的方式,使灯亮的顺序递增。

本例首先查询按键,有键按下时,灯开始从上到下流动。

6:串口通信_查询方式

具体程序见我的附带例子

关于串口的工作原理,这里就不赘述了,可以参考周立功的那本书或随便找个单片机的书,都一样。

这里说一下一个问题,周立功的书上说,在系统默认情况下,也就是上电复位时,系统频率Fcclk=外部晶振频率Fos c,VPB频率Fpclk=Fcclk/4,按照这样,如果在程序开头不进行分频设置,也就是采用系统默认的频率,计算出当串口波特率=9600时的除数锁存

寄存器U0DLM/U0DLL的值,由公式得出(外部晶振11.0592MHz): U0DLM,U0DLL=(11059200÷4)/(16×9600)=18=0X0012 则: U0DLM=0X00,U0DLL=0X12

按照这个值写入程序里,并在protues里设置通信波特率为9600(如下图),结果仿真时无任何反映。说明,程序的波特率和protues设置的波特率不一致。

然而,当按照默认系统频率Fcclk=5×Fosc计算U0DLM和U0DLL时(波特率为9600),protues仿真却能够正常通信。不知道是我那个环节弄错了,还是周立功的书上搞错了。。。

这里有个问题?怎么接收字符串呢?

软件破解入门教程

先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! ---------------------------------------------------------------------------------------------------------------- 语句:cmp a,b //cmp是比较的意思!在这里假如a=1,b=2 那么就是a与b比较大小. mov a,b //mov是赋值语句,把b的值赋给a. je/jz //就是相等就到指定位置(也叫跳转). jne/jnz //不相等就到指定位置. jmp //无条件跳转. jl/jb //若小于就跳. ja/jg //若大于就跳. jge //若大于等于就跳. 这里以一款LRC傻瓜编辑器为例,讲解一下软件的初步破解过程。大家只要认真看我的操作一定会!假如还是不明白的话提出难点帮你解决,还不行的话直接找我!有时间给你补节课!呵呵! 目标:LRC傻瓜编辑器杀杀杀~~~~~~~~~ 简介:本软件可以让你听完一首MP3歌曲,便可编辑完成一首LRC歌词。并且本软件自身还带有MP3音乐播放和LRC歌词播放功能,没注册的软件只能使用15天。 工具/原料 我们破解或给软件脱壳最常用的软件就是OD全名叫Ollydbg,界面如图: 它是一个功能很强大的工具,左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值. 右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色突出显示. cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态. 左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息. 右下角的是当前堆栈情况,还有注释啊. 步骤/方法 1. 我们要想破解一个软件就是修改它的代码,我们要想在这代码的海洋里找到我们破解关键的代码确实很棘 手,所以我们必须找到一定的线索,一便我们顺藤摸瓜的找到我们想要的东东,现在的关键问题就是什么

Unity3D经典入门教程(精)

一、Unity基础 本部分是你开始Unity的关键。、这里将解释Unity的界面,菜单项,使用资源,创建场景,和发布。当你完全阅读了该部分后,你将能够理解Unity是如何工作的,以及如何使其更加有效的工作,和如何将简单的游戏放置在一起。 1. 界面学习 现在我们开始学习Unity,如果你还没有打开 Unity,你可以通过双击位于Application->Unity文件夹中的 Unity图标来运行它,当它第一次运行时你将看到如下的场景: Unity运行时的缺省场景,如果你打开过任何实例,你的屏幕会与上图不同 有很多需要学习的东西,让我们花费点时间来观察理解上述界面。我们将介绍每一个接口 元素。 概要主窗口的每一个部分都被称为视图(View)。在 Unity中有多种类型的视图,但是,你

不需要同时看见所有的视图。不同的布局模式(Layout modes)包含的视图是不同的。通过单击布局下拉控件来选择不同的布局,该控件位于窗口的右上角。 布局模式选择下拉列表 现在,单击布局选择,并单击Animation,切换到动画布局 (Animation layout)。还可以从菜单中选择Window->Layouts->Animation来切换。动画布局包含所有的视图,这是昀好的用来介绍它们的方法。

通过视图左上角的名称你可以迅速的分辨这些视图。这些视图是:场景视图(Scene View)-用于放置物体游戏视图(Game View)-表示游戏在运行时的外观层次视图(Hierarchy)-当前场景中的游戏物体的列表工程视图(Project)-显示当前打开工程中所有可用的物体和资源检视视图(Instpector)-显示当前选中物体的细节和属性时间线(Timeline)-用于为当前选中物体创建基本的时间线动画 场景视图(Scene View) 场景视图 场景视图(Scene View)是一个可交互的沙盘。你将使用它来选择并在场景中定位所有的游戏物体(GameObjects),包括玩家,摄像机,敌人等。在场景视图中操纵并修改物体是Unity非常重要的功能。这是昀好的通过设计者而不是玩家的角度来查看场景的方法。在场景视图中你可以随意移动并操纵物体,但是你应该知道一些基本的命令以便有效的使用场景视图。 第一个你应该知道命令是FrameSelected命令。这个命令将居中显示你当前选中的物体。你可以在层次视图(Hierarchy)单击任何物体,然后移动你的鼠标到场景视图上并按F键。场景视图将移动以居中显示当前选择的物体。这个命令是非常有用的,你将在场景编辑的

6、汇编学习从入门到精通(荐书)

汇编学习从入门到精通Step By Step 2007年12月15日星期六00:34 信息来源:https://www.360docs.net/doc/f214008374.html,/hkbyest/archive/2007/07/22/1702065.aspx Cracker,一个充满诱惑的词。别误会,我这里说的是软件破解,想做骇客的一边去,这年头没人说骇客,都是“黑客”了,嘎嘎~ 公元1999年的炎热夏季,我捧起我哥留在家的清华黄皮本《IBM-PC汇编语言程序设计》,苦读。一个星期后我那脆弱的小心灵如玻璃般碎裂了,为了弥补伤痛我哭爹求妈弄了8k大洋配了台当时算是主流的PC,要知道那是64M内存!8.4G硬盘啊!还有传说中的Celeon 300A CPU。不过很可惜的是在当时那32k小猫当道的时代,没有宽带网络,没有软件,没有资料,没有论坛,理所当然我对伟大的计算机科学体系的第一步探索就此夭折,此时陪伴我的是那些盗版光盘中的游戏,把CRACK_XXX文件从光盘复制到硬盘成了时常的工作,偶尔看到光盘中的nfo 文件,心里也闪过一丝对破解的憧憬。 上了大学后有网可用了,慢慢地接触到了一些黑客入侵的知识,想当黑客是每一个充满好奇的小青年的神圣愿望,整天看这看那,偷偷改了下别人的网页就欢喜得好像第一次偷到鸡的黄鼠狼。 大一开设的汇编教材就是那不知版了多少次的《IBM-PC汇编语言程序设计》,凭着之前的那星期苦读,考试混了个80分。可惜当时头脑发热,大学60分万岁思想无疑更为主流,现在想想真是可惜了宝贵的学习时间。 不知不觉快毕业了,这时手头上的《黑客防线》,《黑客X档案》积了一大摞,整天注来注去的也厌烦了,校园网上的肉鸡一打一打更不知道拿来干什么。这时兴趣自然转向了crack,看着杂志上天书般的汇编代码,望望手头还算崭新的汇编课本,叹了口气,重新学那已经忘光了的汇编语言吧。咬牙再咬牙,看完寻址方式那章后我还是认输,不认不行啊,头快裂了,第三次努力终告失败。虽然此时也可以爆破一些简单的软件,虽然也知道搞破解不需要很多的汇编知识,但我还是固执地希望能学好这门基础中的基础课程。 毕业了,进入社会了,找工作,上班,换工作成了主流旋律,每天精疲力尽的哪有时间呢?在最初的中国移动到考公务员再到深圳再到家里希望的金融机构,一系列的曲折失败等待耗光了我的热情,我失业了,赋闲在家无所事事,唯一陪伴我的是那些杂志,课本,以及过时的第二台电脑。我不想工作,我对找工作有一种恐惧,我靠酒精麻醉自己,颓废一段日子后也觉得生活太过无聊了,努力看书考了个CCNA想出去,结果还是被现实的就业环境所打败。三年时间,一无所获。 再之后来到女朋友处陪伴她度过刚毕业踏入社会工作的适应时期,这段时间随便找了个电脑技术工作,每月赚那么个几百块做生活费。不过这半年让我收获比较大的就是时间充裕,接触到了不少新东西,我下定决心要把汇编学好,这时我在网上看到了别人推荐的王爽《汇编语言》,没抱什么希望在当当网购了人生中的第一次物,19块6毛,我记得很清楚,呵呵。 废话终于完了,感谢各位能看到这里,下面进入正题吧。

嵌入式学习心得体会5篇

嵌入式学习心得体会5篇 嵌入式学习心得体会(一) 首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。 对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的modem 射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在15k以上。 另一类就是数字部分了,在大方向上又可分为51/arm的单片机类,dsp类,fpga 类,国内fpga的工程师大多是在ic设计公司从事ip核的前端验证,这部分不搞到门级,前途不太明朗,即使做个ic前端验证工程师,也要搞上几年才能胜任。dsp 硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。 而arm单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互pk,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,比如pxa255处理器i2c要求速度在100kbps,如果把一个i2c外围器件,最高还达不到100kbps的与它相接,必然要导致设计的失败。这样的情况有很多,比如51单片机可以在总线接lcd,但为什么这种lcd就不能挂在arm的总线上,还有arm7总线上可以外接个winband的sd卡控制器,但为什么这种控制器接不到arm9或是xscale处理器上,这些都是问题。 因此接口并不是一种简单的连接,要看时序,要看参数。一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师

Linux基本反汇编结构与GDB入门

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、基本操作指令 简单的操作数类型说明,一般有三种, (1)立即数操作数,也就是常数值。立即数的书写方式是“$”后面跟一个整数,比如$0x1F,这个会在后面的具体分析中见到很多。 (2)寄存器操作数,它表示某个寄存器的内容,用符号Ea来表示任意寄存器a,用引用R[Ea]来表示它的值,这是将寄存器集合看成一个数组R,用寄存器表示符作为索引。 (3)操作数是存储器引用,它会根据计算出来的地址(通常称为有效地址)访问某个存储器位置。用符号Mb[Addr]表示对存储在存储器中从地址Addr开始的b字节值的引用。通常可以省略下标b。 图1表示有多种不同的寻址模式,一个立即数偏移Imm,一个基址寄存器Eb,一个变址或索引寄存器Ei和一个伸缩因子s。有效地址被计算为Imm+R[Eb]+R[Ei]*s,对于这中寻址方式,我们可以在数组或者结构体中进行对元

注:操作数可以是立即数值、寄存器值或是来自存储器的值,伸缩因子必须是1、2、4、或者是8。从上面的图我们就可以大致了解操作数的类型了。 在操作指令中,最频繁使用的指令是执行数据传送的指令。对于传送指令的两个操作数不能都指向存储器位置(我的理解是一般存储器存储的都是地址,不能够对地址和地址进行操作)。将一个值从一个存储器位置拷到另一个存储器位置需要两条指令——第一条指令将源值加载到寄存器中,第二条将该寄存器值写入到目的位置。下面给出源操作数和目的操作数的五种可能组合。 1、movl $0x4050, %eax 立即数——寄存器 2、movl %ebp, %esp 寄存器——寄存器 3、movl (%edi, %ecx), %eax 存储器——寄存器 4、movl $-17, (%esp) 立即数——存储器 5、movl %eax, -12(%ebp) 寄存器——存储器 注意这里的指令mov可能有不同的形式,不同平台的汇编一般是有些不一样的, 结合例子来进行讲解一下指令的具体操作,在这里将会正式接触到Linux下的GCC开发环境和GDB调试器,不过都是比较简单的应用。我的Linux操作系统是Ubuntu9.10,其它版本的差别应该不大, 如果我们要编写一个程序,我们可以用Linux下自带的vi或vim编辑器,studyrush@studyrush-desktop:~/C$ vi exchange.c vi 后面加我们要创建的程序文件的名字,在这里是exchange.c studyrush@studyrush-desktop:~/C$ gcc -o exchange exchange.c gcc -o exchange exchange.c 或gcc exchange –o exchange这两者都可以对源文件进行编译,-o exchange 表示对我们要输出的文件名称,可能表达的不够准确,大家可以先熟悉一下gcc编译器,应该就会明白的了。 studyrush@studyrush-desktop:~/C$ ./exchange 点加斜线再加输出文件名就表示运行程序,下面是运行的结果。 a = 3, b = 4

嵌入式经典书籍100册

嵌入式工程师必读100本专业书籍 ——从小白到大牛你只差这100本书《大话数据结构》 《鸟哥的linux私房菜》 《疯狂android讲义》 《第一行代码》 《linux内核设计与实现》 《驱动设计开发》 《linux内核解密》 《unix环境高级编程》 《linux内核设计与实现》 《essential C++》 《嵌入式linux》 《linux设备驱动》 《c语言深度解剖》 《linux下的c编程》 《C Primer Plus(第五版)》 《ARM体系结构与编程(第二版)》 《lINUX设备驱动开发详解(第三版)》 《android开发艺术探讨》 《c++plus》 《Unix环境高级编程》 《与大数据同行——学习和教育的未来》 《用户体验的要素》 《编程与艺术》 《ARM嵌入式体系结构与接口技术》 《cortex-m0接口编程》 《C语言程序设计:现代方法》 《C++ Primer》

《数据结构》(严蔚敏) 《算法导论》 《Linux设备驱动开发》 《代码大全》 《深入理解计算机系统》 《UNIX环境高级编程》 《计算机安全原理》 《UNIX网络编程》 《HeadFirst设计模式》 《linux驱动》(宋保华) 《C++ primer4》 《qt5精彩实例》 《ldd3》 《C++高级编程》 《c语言教程》 《实战linux编程精髓》 《ARM教程》 《JAVA编程思想》 《HTML+CSS网页设计与布局从入门到精通》《C语言深度解剖》 《深度实践嵌入式Linux系统移植》 《unix高级编程》 《c嵌入式一站式教学》 《编译原理》 《深度实践嵌入式Linux系统移植》《UNIX环境高级编程》 《linux网络编程》 《C语言程序设计》 《unix环境高级编程》 《嵌入式linuxc语言程序设计基础教程》

菜鸟学arm之方法入门篇(基于arm7内核)

by:爱雪胡 想必有很多同学都有这样的经历,学过了51单片机之后,想要学习ARM,但又无从下手,关于ARM的学习视频或资料又没有51的那样好理解,结果花了好长时间也不得其法。我也曾是一个初学者,也是从这个过程走过来的,对其中的困难深有感触,闲来无事,把自己的学习过程及心得体会记录成文,希望能对处在纠结中的孩纸有点帮助。ps:我不是大神,本人菜鸟一个,如有疏漏,还望不吝赐教qq:1906723068 首先说一下我用的芯片,是LPC2103,ARM7内核的,相信很多人也用过,ARM9比较高端,目前还没有学完。个人感觉ARM7还是作为单片机使用比较好,不适合用它来跑系统,因为它主频不够高(能提到60多M貌似),我就是把它单纯作为一个32位的单片机来使用的。 ARM7与51的最大区别首先是CPU位数不一样,这个应该好理解一个是32位单片机,一个是8位单片机,性能上当然前者更好点了,速度更快、功耗更小、外设更多,价格差距也越来越小。一般用的51单片机多为STC89C52或其同类产品如图所示:

51的外设一般比较少,以上图为例只有UART,定时器资源,其他功能基本需要另加元件,比如AD芯片、DA芯片、有些功能还只能靠软件模拟,如SPI接口,IIC接口,PWM等,在简单的控制系统中51是非常厉害的,但是在一些复杂控制并且对体积功耗等要求严格的系统中,51就力不从心了,这时ARM7就非常好用了,它速度快,体积小(LPC2103的面积还不到1平方厘米),外设多(集成有2个UART,1个SPI,2个IIC,1个SSP,2个定时器,PWM,AD,RTC等)这样就非常方便好用。 最开始学习ARM我们最希望弄明白的就是怎么去操作它,具体来说就是我买一个学习板,怎么把程序下载到芯片里边并让程序跑起来,这和我们学51时点亮第一盏等的想法是一样的。这就要求知道3点: 1.编程,即使用什么软件去编程序; 2.烧程序,即使用什么烧录程序软件; 3.怎么烧,是用串口ISP下载还是使用JLINK烧录 对这3个问题我一一解答。1.编程序,一般使用IAR或ADS或Keil,如果想很快上手建议使用IAR,不过我用了一段时间之后感觉并不好

汇编语言入门教程

汇编语言入门教程 2007-04-29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK 出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……)。但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程。大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解) 因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提) CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 有8个8位数据寄存器,这些8位寄存器可分别组成16位寄存器:AH&AL=AX:累加寄存器,常用于运算;BH&BL=BX:基址寄存器,常用于地址索引;CH&CL=CX:计数寄存器,常用于计数;DH&DL=DX:数据寄存器,常用于数据传递。为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器CS,DS,SS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是COM文件不得大于64K的原因。8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IP(Intruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SI(Source Index):源变址寄存器可用来存放相对于DS 段之源变址指针;DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。还有一个标志寄存器FR(Flag Register),有九个有意义的标志,将在下文用到时详细说明。

ARM学习心得etc

ARM 学习心得 一、通用I/O口设置: 1、使用PINSELx定义端口作为通用I/O功能, 每个引脚可能有4 个功能, 因此需要用2位来确定其功能 2、设置SCS寄存器第0位为1, 使其作为快速I/O端口 3、使用PINMODEx定义端口的模式, 分为上拉, 下拉, 浮空, 因 此需要用2位来确定其模式 4、使用FIOxDIR来确定端口方向 5、使用FIOxMASK与FIOxCLR, FIOxSET, FIOxPIN联合来设置端 口的值 6、由于通用I/O一般情况下方向是确定的, 通常或者为输入, 或者为输出, 要模拟数据总线, 必须在需要的时候, 随时 改变端口的方向, 可使用FIOxDIR寄存器完成此项工作 7、除EXTINT0-EXTINT3外,端口0和端口2均可以作为外部 中断源,它们共用EXTINT3这个外部中断。 8、根据实际情况合理选用。主要对上电时的初始值。上拉或 下拉都是弱的,有时也用外部分电阻上/下拉。对于输入, 上拉表示通用端口所连接的外部信号不存在时, 端口值 为1, 下拉为0。对于输出,如果没有更改时,上拉输出 为高(1), 下拉输出为低(0)。FIOxPIN总是可以读出端口的 状态。FIOxPIN对非通用I/O端口也可读出其状态。 9、对于内置(片上)外设, 如UART, CAN, SPI等:使用PINSELx定

义端口作为特定外设。通常情况作为外设的引脚的方向是 确定的,如果可能,还会自动改变方向。大多情况下,无 须设置上拉或下拉模。设置外设的参数,如果需要的话, 安装中断服务程序外设上电(有些外设默认是上电的,有些 不是)启动外设 二、以太网模块心得 实例1: 以微处理器LPC2368为核心、DP83848C为以太网物理层 接口芯片,介绍嵌入式以太网接口的实现方法。 以太网接口电路主要由MAC控制器和物理层接口 (Physical Layer,PHY)两大部分构成。LPC2368内嵌一个 以太网控制器,支持精简的媒体独立接口(Reduced Media Independent Interface,RMII)和带缓冲DMA接口(Buffered DMA Interface,BDI),可在半双工和全双工模式下提供 10M/100Mbps的以太网接入。因此,LPC2368内部实际上 己经包含了以太网MAC控制,但并未提供物理层接口,所 以,需要外接一片物理层芯片以提供以太网的接入通道。 在这里选用National Semiconductor公司的DP83848C作为 以太网物理层接口芯片,它提供了包括MII/RMII/SNI接口, 可以很方便地与LPC2368连接。 DP83848C是一个10/100Mb/s单端低功耗物理层器件,有 几种智能降功耗模式,包括有25MHz时钟输出,很容易通过

OllyDBG完美教程

关键词:OD、OllyDBG、破解入门、调试专用工具、反汇编 一、OllyDBG 的安装与配置 OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可: OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助: 反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。 信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。 数据窗口:显示内存或文件的内容。右键菜单可用于切换显示方式。 堆栈窗口:显示当前线程的堆栈。 要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。 启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签: 因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。上图中其它的选项可以保留为默认,若有需要也可以自己修改。修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。有人可能知道插件的作用,但对那个 UDD 目录

嵌入式软件工程师学习指南

嵌入式软件工程师学习 1. 嵌入式软件课程体系 自学嵌入式确实不大现实(当然也不是说没有这个可能),毕竟嵌入式难度也是比较大的。嵌入式的应用主要是几个方向: 一是系统开发:侧重开发环境搭建、内核原理、交叉编译等; 二是嵌入式Linux应用开发:侧重Linux应用编程、内核编译、系统调用; 三是底层驱动开发:侧重嵌入式Linux系统下的驱动开发、内核的深入分析。 不过初进门者主要往系统开发和应用开发发展,有了相关工作经验再进一步向底层驱动靠。 嵌入式课程的目标,想自学完课程,要掌握以下知识点: ◆Linux命令、工具和C编程基础 ◆嵌入式Linux C语言强化 ◆嵌入式Linux上的C编程训练 ◆Linux高级编程及编程训练 ◆嵌入式ARM处理器体系结构及编程训练 ◆嵌入式Linux内核环境搭建和编程训练 ◆嵌入式Linux驱动理论及驱动程序开发训练 ◆Android应用研究和系统开发 ◆Android体系结构和系统移植 ◆嵌入式ARM Linux项目实践和训练 嵌入式软件方面最重要的课程包括: (1)嵌入式微处理器结构与应用 这是一门嵌入式硬件基础课程,我院用这门课取代了传统的“微机原理与接口”课程(目前国内已有少部分高校IT专业这样做了,因为讲x86微机原理与接口很难找到实际用处,只为教学而已)。我们说过,嵌入式是软硬件结合的技术,搞嵌入式软件的人应对ARM 处理器工作原理和接口技术有充分了解,包括ARM的汇编指令系统。若不了解处理器原理,怎么能控制硬件工作,怎么能写出节省内存又运行高速的最优代码(嵌入式软件设计特别讲究时空效率),怎么能写出驱动程序(驱动程序都是与硬件打交道的)?很多公司招聘嵌入式软件人员时都要求熟悉ARM处理器,将来若同学到公司中从事嵌入式软件开发,公司都会给你一本该设备的硬件规格说明书 (xxx Specification),您必须能看懂其中的内存分布和端口使用等最基本的说明(就像x86汇编一样),否则怎么设计软件。有些同学觉得嵌入式处理器课程较枯燥,这主要是硬件课程都较抽象的原因,等我们的嵌入式实验室10月份建好后,您做了一些实验后就会觉得看得见摸得着。还有同学对ARM汇编不感兴趣,以为嵌入式开发用C语言就足够了。其实不应仅是将汇编语言当成一个程序设计语言,学汇编主要是为了掌握处理器工作原理的。一个不熟悉汇编语言的人,怎么能在该处理器写出最优的C 语言代码。在嵌入式开发的一些关键部分,有时还必须写汇编,如Bootloader等(可能还包括BSP)。特别是在对速度有极高要求的场合(如DSP处理器的高速图像采集和图像解压缩),目前主要还要靠汇编写程序(我看到过很多公司是这样做的)。当您在一个嵌入式公司工作时,在查看描述原理的手册时,可能很多都是用汇编描述的(我就遇到过),这是因为很多硬件设计人员只会写或者喜欢用汇编描述,此时您就必须看懂汇编程序,否则软硬件人

arm嵌入式linux安装课程设计心得

arm嵌入式linux安装课程设计心得 篇一:116709047陈俊松嵌入式Linux课程设计 福建农林大学金山学院电子信息类课程设计 课程名称:设计题目:姓名: 系: 专业:年级:学号:指导教师:职称: 嵌入式linux应用开发课程设计嵌入式linux Web服务器的设计 陈俊松信息与机电工程系电子信息工程2011级116709047 朱仕浪讲师 2014年11 月24 日 福建农林大学金山学院电子信息类 课程设计结果评定 目录 设计的目的

-------------------------------------------------------- 1 设计要求---------------------------------------------------------- 1 主要仪器设备(软硬件环境)---------------------------------------- 1 设计内容---------------------------------------------------------- 1 设计原理---------------------------------------------------- 1 总体方案设计------------------------------------------------- 3 程序设计---------------------------------------------------- 3 程序的调试和运行结果---------------------------------------- 7 总结-------------------------------------------------------------- 8 参考文献---------------------------------------------------------- 9 嵌入式linux Web服务器的设计 1. 设计的目的

关于ARMloader的一些心得.

关于ARM loader的一些心得 最近的项目里需要用KS8695这块MPU,它是ARM922T内核的,有cache,也有MMU,RAM和ROM需要外扩,最大都支持到64M,足以跑起一个完整功能的linux核.虽然这MPU主频最高只有166Mhz,相比三星的S3C2410等性能不是很强,但有内置的硬件WAN口和LAN口,构建网络路由器非常方便. 考虑到各种原因,最主要是实时性响应和速度响应的原因,决定不上linux操作系统,当作普通单片机以单一任务不断循环的方式实现,这就涉及到了loader的问题.由于专用于网络,普及率不大,这块MPU的网上资料不多,随开发板赠送的loader是uboot,uboot 是引导linux内核的,功能多,但要在linux环境下编译和调试,比较麻烦.我习惯用的工具是ADS,因此决定用ADS的汇编实现一个简单功能的loader(以下提到的代码语法全部是针对ADS环境的,而且仅是KS8695这块芯片,对于Keil for ARM或GCC环境或其他ARM芯片需要做别的考虑,但可以参考下面的作法和思路). 玩ARM的朋友,少不免要接触loader,但因为loader涉及到很多跟硬件有关的很抽象的东西,看起来比较复杂和难理解。希望下面说的这些能帮助有兴趣的朋友更好理解。 下面由简单到复杂来说说这个loader。 先想想,这个loader该有哪些功能呢?很明显,最重要的是,它必须最后能调用C语言里的Main函数,因为我不想整个项目都用汇编写,毕竟我不是自虐狂.而很明显,如果你要调用函数,必须进行入栈,出栈这些保护现场的工作,否则程序就会乱套.那保护现场工作需要什么?当然就是需要RAM来保存现场.对于KS8695,它没有内置可随意使用的RAM(实际上,它有特殊的小容量的RAM,但那是给网卡这些做硬件数据缓冲,用户是不能随意调用的,顺便提一下,ARM芯片很多,不同的厂家有不同的硬件配置,譬如很多低端应用的ARM芯片其实有内置的SRAM,譬如菲利浦的LPC系列),因此,就得使用外扩的RAM了.开发板上用的是 SDRAM,SDRAM的本身的特性决定,需要定时刷新的支持,KS8695有内置的SDRAM控制器,只要往某个专用的寄存器写入一些与硬件参数有关的数值,该SDRAM控制器就能自动产生各种读写SDRAM的时序信号来驱动SDRAM。然后用户程序只需用str和ldr指令就能读写SDRAM的内容. OK,现在有点头绪了,loader至少要完成这两个功能: 只要这两部做完,其实就可以调用C里的main函数,然后由main函数再调用各种功能的子函数,以后就爱咋滴就咋滴了. 咋一看,似乎这两步做完,就天下太平了,真的就这么简单吗? 未必,别忘了,几乎所有的CPU都带有中断触发机制.一个稍能完成点实用功能的项目,你想完全避开中断处理这一部分是完全不可能的,也不现实,你必须按你的需要来编写各种各样的中断服务程序,处理各种各样的中断触发(至于中断触发对CPU来说是必需的吗?中断有什么好处?中断时CPU的硬件会做什么动作?...这些就不想罗嗦,有兴趣的可以参考51系列的中断原理作为入门理解).编写中断服务程序,可以在C语言里实现,不要在loader里实现,loader里要实现的,是要建立中断向量表.中断向量表是一个有点专业的名词,请自行查入门资料. 这里说说为什么要建立中断向量表.在51单片机里,是不用自己建立中断向量表的,这是因为标准51核的中断,本身就是一个向量中断(自行查资料),自身硬件里就已经有内置的中断向量表,没必要自己去建立.就是说,当某个中断触发时,51核的硬件会自动把PC置成相应的固定的地址入口来执行相应的中断处理程序,不同的中断触发时,会有不同的地址入口,一一对应,俗称向量中断.但

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解[转] 2009-02-11 08:09 OllyICE反汇编教程及汇编命令详解 内容目录 计算机寄存器分类简介 计算机寄存器常用指令 一、常用指令 二、算术运算指令 三、逻辑运算指令 四、串指令 五、程序跳转指令 ------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 对低16位数据的存取,不会影响高16位的数据。 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、除、输入/输出等操作,使用频率很高; 寄存器EBX称为基地址寄存器(Base Register)。它可作为存储器指针来使用; 寄存器ECX称为计数寄存器(Count Register)。 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数; 寄存器EDX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果, 而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 2、变址寄存器 32位CPU有2个32位通用寄存器ESI和EDI。 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。 寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,

嵌入式系统开发基础1

青岛理工大学琴岛学院计算机系实验教材 Linux嵌入式系统 实验指导书

青岛理工大学琴岛学院计算机科学系 二0一0年四月

前言 随着后PC时代的到来,嵌入式系统技术已经成为了一个万众瞩目的焦点。目前已广泛应用于信息家电、数据网络、工业控制、医疗卫生、航空航天等众多领域。巨大的市场潜力,无穷的商机,吸引了各路英豪纷踵沓来。 硬件方面,各大电子厂商相继推出了自己的专用嵌入式芯片,漫天而至的是mp3,PDA,无线上网装置,让人们充分感受到了这股强劲之势;软件方面,在Vxworks、pSOS、Neculeus 和Windows CE等嵌入式操作系统引领下,也出现了空前繁荣的局面,但这些专用操作系统都是商业化产品,其高昂的价格使许多面向低端产品的小公司望而却步,并且其源代码的封闭性也大大限制了开发者的积极性。 近两年在我国登陆并蓬勃发展的Linux,也已广泛应用于各类计算应用,不仅包括IBM 的微型Linux腕表、手持设备(PDA和蜂窝电话)、因特网装置、客户机、防火墙、工业机器人和电话基础设施设备,甚至还包括了基于集群的超级计算机。Linux在高端服务器的优越表现及其天生具有的突出特点,就注定它必将在低端嵌入式系统中再次给人们以惊喜,而基于嵌入式Linux操作系统的应用,必定给我们未来的工作和生活带来翻天覆地的变化。 Linux价格低廉、功能强大,可以运行在X86,Alpha,Sparc,MIPS,PPC,MOTOROLA,NEC,ARM等硬件平台上,而且开放源代码,可以定制。我们所介绍的硬件平台是基于ARM体系结构,由北京博创兴业科技有限公司开发的UP-CUP 3000 平台、UP-CUP 2410-S 平台系列以及UP-CUP P270A 平台系列实验仪器。UP-CUP 3000 平台的CPU为ARM7TDMI内核的三星 S3C44B0X01芯片,由于没有MMU(内存管理单元)只能运行uClinux,UP-CUP 2410-S 平台系列的CPU为ARM920T内核的三星S3C2410芯片,由于有MMU可以运行标准的ARM-LINUX 内核。UP-CUP P270 平台系列实验仪器为Intel XSCALE ARM10系列CPU。通过这些硬件平台,我们可以学习嵌入式LINUX中的针对有MMU和无MMU的不同开发过程。UP-CUP 3000 平台和UP-CUP P270 平台系列产品及其相关资料可以访问博创公司的网站获得。本书以 S3C2410系列中的UP-CUP S2410 经典平台为例,详细介绍嵌入式 Linux的开发过程。 指导书参考与引用了许多相关资料,在此一并致谢。本指导书仅供内部学生学习使用。由于时间仓促,编者水平有限,书中疏漏之处在所难免,欢迎读者批评指正,并提出宝贵意见和建议,以便不断改进。 编者江艳飞 二0一一年四月 目录

嵌入式系统学习心得

嵌入式系统学习心得 首先我声明,我是基于嵌入式系统平台级设计的,硬件这个方向我相对来讲比较有发言权,如果是其它方面所要具备的基本技能还要和我们培训中心其它专业级讲师沟通。他们的方面上我只能说是知道些,但不是太多,初级的问题也可以问我。 对于硬件来讲有几个方向,就单纯信号来分为数字和模拟,模拟比较难搞,一般需要很长的经验积累,单单一个阻值或容值的精度不够就可能使信号偏差很大。因此年轻人搞的较少,随着技术的发展,出现了模拟电路数字化,比如手机的modem射频模块,都采用成熟的套片,而当年国际上只有两家公司有此技术,自我感觉模拟功能不太强的人,不太适合搞这个,如果真能搞定到手机的射频模块,只要达到一般程度可能月薪都在15k以上。 另一类就是数字部分了,在大方向上又可分为51/arm的单片机类,dsp类,fpga类,国内fpga的工程师大多是在ic设计公司从事ip核的前端验证,这部分不搞到门级,前途不太明朗,即使做个ic前端验证工程师,也要搞上几年才能胜任。dsp硬件接口比较定型,如果不向驱动或是算法上靠拢,前途也不会太大。而arm 单片机类的内容就较多,业界产品占用量大,应用人群广,因此就业空间极大,而硬件设计最体现水平和水准的就是接口设计这块,这是各个高级硬件工程师相互pk,判定水平高低的依据。而接口设计这块最关键的是看时序,而不是简单的连接,比如pxa255处理器

i2c要求速度在100kbps,如果把一个i2c外围器件,最高还达不到100kbps的与它相接,必然要导致设计的失败。这样的情况有很多,比如51单片机可以在总线接lcd,但为什么这种lcd就不能挂在arm的总线上,还有arm7总线上可以外接个winband的sd卡控制器,但为什么这种控制器接不到arm9或是xscale处理器上,这些都是问题。因此接口并不是一种简单的连接,要看时序,要看参数。一个优秀的硬件工程师应该能够在没有参考方案的前提下设计出一个在成本和性能上更加优秀的产品,靠现有的方案,也要进行适当的可行性裁剪,但不是胡乱的来,我遇到一个工程师把方案中的5v变1.8v的dc芯片,直接更换成ldo,有时就会把cpu烧上几个。前几天还有人希望我帮忙把他们以前基于pxa255平台的手持gps设备做下程序优化,我问了一下情况,地图是存在sd卡中的,而sd卡与pxa255的mmc控制器间采用的spi接口,因此导致地图读取速度十分的慢,这种情况是设计中严重的缺陷,而不是程序的问题,因此我提了几条建议,让他们更新试下再说。因此想成为一个优秀的工程师,需要对系统整体性的把握和对已有电路的理解,换句话说,给你一套电路图你终究能看明白多少,看不明白80%以上的话,说明你离优秀的工程师还差得远哪。其次是电路的调试能力和审图能力,但最最基本的能力还是原理图设计pcb绘制,逻辑设计这块。这是指的硬件设计工程师,从上面的硬件设计工程师中还可以分出ecad工程师,就是专业的画pcb板的工程师,和emc设计工程师,帮人家解决emc的问题。硬件工程师再往上就是板级测试工程师,就是c语功底很好的硬件工程师,在电路板调试过程中

相关文档
最新文档