第一篇:25年嵌入式经验
我的25年嵌入式生涯
作者:周立功,出处:程序员杂志
对于今天很多的年轻人来说,一味注重技术至上的观念刻骨铭心,其实很多时候努力并非一定有回报。
在这篇文章里,我不打算将创业的艰辛与喜悦重新回忆一遍,我确实不想去误导大家,因为我所处的年代是一个物质缺乏的年代,成功相对来说要容易得多。每个人的成长经历都有其个性化的东西,每个人的成功创业经验虽然有一些可以遵循的普遍规律,但一般来说都很难复制,成功需要不断地创新。
对于今天很多的年轻人来说,一味注重技术至上的观念刻骨铭心,其实很多时候努力并非一定有回报。事实上,有不少出类拔萃的人才往往做出来的产品就是卖不掉,因为设计者压根儿就不了解用户的需求和心理以及产品功能的恰当定义,而总想在同事及其老板面前卖弄自己的技术和产品功能。其实有很多思维性的东西恰恰是很多人所忽视的,因为从一开始的出发点就错了,怎么可能取得辉煌的成绩呢?所以有时拥有卓越的技术并不一定代表人生的成功,很多企业就是死在一些自命不凡的“卓越人才”手中。
它山之石可以攻玉,减少“阶段0”的开发
有所“创造”确实是人人期待的,令人瞩目的发明虽然激动人心却谈何容易,人们时常将盖茨没有任何爆炸性的发明作为茶余饭后的笑料,我们不妨从另外一个角度去探索微软的成功奥妙从而为我们所用。
确实不假,盖茨的DOS源代码是从帕特森手上“买”来的。这些年来,我收集了世界各地中英文版有关微软的专著来比较研究,大家仅仅注意到盖茨为建立整个行业架构标准的远见,并叹服盖茨深得市场运作经验的精髓,我认为这些研究成果都是后来者研究微软成功经验,是“牵强附会”不可复制的理论总结。
当初微软公司还仅仅是一家很稚嫩的公司,可以说生存下去是盖茨作为老板唯一的使命。事实上,正当盖茨决定动手来写IBM所要的OS时,原计划在一年左右完成,但IBM公司只给了他几个月的时间。尽管帕特森的QDOS并不完善错误百出,但为了履行对IBM的承诺,盖茨购买了QDOS改贴标签后卖给了IBM公司。盖茨对此心知肚明,因为他知道如果用一年的时间来做OS的开发,他将失去与巨人IBM的合作机会,那是一种浪费。付一小部分的技术费用没有关系,只要能获得Know-how,获得更高的利润就好了。通过支付权利金引入技术,然后以模仿的方式学习他人的技术,再改造成符合IBM需要即可。“买”――只要有现成的就不需要自己开发,这就是盖茨的过人之处,而且恰恰是很多人忽视的地方,值得我们所有人学习和仿效。盖茨就是由于没有“阶段0”,从而大幅度地降低开发风险。
当年,我是一个人单枪匹马借了2.15万元出来创业的,可以说是负资产,后来才开始有伙伴注资6万元。没有经验怎么办?我有一个非常好习惯,读书从不拘泥于他人的观点,也满足于人云亦云,否则那就是听别人讲故事,那不是您的东西,有入宝山空手而归。我认为,要想成功就必须“研究”成功者的轨迹,向成功者学习。
下面我会把我“第一桶金”的故事告诉你,这也是尽量减少“阶段0”开发一个非常典型的例子。
当年,《羊城晚报》几乎每天都有半版广告刊登信息台(听歌、悄悄话等)广告,一打听广告费每天几十万。当时相信不少人在利用公费电话在拨打这些信息台。后来我送货到客户那里发现电话机都外加了一个铁壳并上了一把锁,从看到那一幕开始,我决定做电话加密码锁,锁长途电话0字头,手机、BB机、信息台的9字头。通过朋友介绍,福州某公司有这个技术,于是我打了一个试探性的电话,使用5000元购买方案和源代码,对方非常爽快地同意了。我生怕有变立即坐飞机到福州去,很快就见到了郑新建工程师,他原来在福州某公司工作,我见到他的时候已经离开了福州某公司,但仍然自己写一些产品解决方案,通过福州某公司销售。买到方案与源代码之后,我立即带样机到各地去做测试,发现这台样机兼容性太差,而且市场已经开始在卖的产品也存在同样的问题,我想只要解决好兼容性的问题,如果在任何地区交换机局域网都能够使用,那就是最好的产品不愁没有市场。
我当时既没有资金也没有生产和销售经验,到底怎么将技术变成市场上所需要的产品呢?那是因为我找到了生产电话分线器的广州市白云区百新电器厂的老板陈国亮,由他生产和销售,每销售一台产品给我提成。以这个项目为起点,我们使用PIC单片机的数量很快就达到了每月100K以上,一年以后Microchip香港公司经理Andi主动找上门来将当时的广州强力电子研究所发展成为了授权分销商。
毫不否认盖茨的远见和判断力是微软至关重要的核心竞争力,但盖茨也绝非天才,否则盖茨就不会在浏览器上输给网景了,尽管微软使用的很多技术都不是微软所发明的,但毫不妨碍微软独步天下。
注重核心技术,其余的外包
通过创业以来第一个项目的成功,我深深地体会到商业模式比技术本身更重要。通过十多年的努力,我们设计的“铁将军(Steel Mate)”品牌汽车防盗器、汽车倒车雷达不仅成为了全世界范围的“隐性冠军”,而且为GE等世界著名汽车厂商售前市场提供配套产品,与此同时我们为智能卡酒店门锁厂商设计与制造的各种智能卡门锁控制模块在国内也一直处于第一名的地位。
他们为何能够取得与众不同的成功呢?其最大的长处就是产品创意与制造、简约时尚风格的工业设计、模具制造技术以及精心打造的销售渠道,这些厂商深刻明白“注重核心技术做自己擅长的,其余的外包分段取利”的基本道理,而对于我来说就是“智慧出租”,通过与强者合作获得双赢。
通过这些成功经验的积累,我们开始全力以赴注重发展核心技术,将自己不擅长的技术全部外包。比如,我们长期投资清华大学计算机系,并建立以陈渝博士后为主Linux内核开发团队,为公司底层的技术提供良好支撑,而我们自己则将精力集中于Linux驱动开发。这种分工合作、协同开发的模式赢得市场上宝贵的时间,并快速取得了应用成果。
也许有程序员会关心JTAG开发工具问题,那也是一个“外包”的项目。当时,我们在网上发现了一个由计算机爱好者业余时间设计的H-JTAG,这是一个比较稳定的调试器软件,正好适合我们使用。于是我就同设计者联系,并决定由周立功单片机资助他继续开发,同时,其开发成果还免费提供给网上的用户下载,保证它作为一个自由软件。其实,无论是Linux还是H-JTAG都是开源软件,如果担心其它的同行因此受益而超越自己的话,难免需要在公司负担很多开发人员,面面俱到地做许多事实上是重复的开发工作。其实,我们的合作伙伴都是所在领域的专家,如果自己从头到尾去学习和开发,不仅抢了合作伙伴的饭碗,而且结果未必理想。这种情况下不但会延误宝贵的商机,而且还会影响与合作伙伴之间的关系。其实只要引入我们企业长期积累和制定的嵌入式系统工程管理思想和规范,即可得到自己想要的结果:“做你最擅长的,其余的外包”,类似这样的案例在周立功单片机将会越来越多。
专注与差异化生存
1999年1月23日我离开了原公司,先后分别创立了广州周立功单片机发展有限公司与广州致远电子有限公司,分别从事贸易业务与产品制造。
作为代理商通过为客户提供解决方案从而达到大批量销售芯片是代理行业惯常使用的手段,而实际上通过设计能够真正达到增值获得丰厚回报的代理商却少之又少。要知道过去公司的人才数量和资源是非常宝贵的,如果没有正确的战略,机会可能稍纵即逝。事实上创业开始的前几年,我们一共为用户设计了超过100个品类的产品,产品型号超过500种,可以说几乎涉及到了各行各业,但能够带来稳定而丰厚回报的案例几乎没有。我经过一段时间的思考和报表分析发现,目前公司的业务做得太多、太杂,没有将任何一个行业做精。于是我下定决心减少用户数量集中精力在1-2个行业做强、做大,直至成为顶尖的行业专家,坚持十年如一日重点做好汽车配套产品与智能卡门锁控制模块的开发。通过多年的精耕细作,我们通过为直接用户设计产品增值年销售单片机的数量已经超过了1000万片,无论是对用户还是对半导体公司来说,我们无疑是一家非常有价值的代理商。
1999年5月,PHILIPS半导体公司邀请我去上海洽谈是否有意向代理LPC700单片机,当我拿到用户手册时离去上海的时间只有5天。当时公司不像现在有250位大学生,总共只有8个人,怎么办?我一边写商业计划书,一边与大家翻译用户手册、打字和贴图,面对机会就像抓住救命稻草一样加班加点,每天只休息3-5个小时。第5天我赶到上海东亚富豪酒店时,我将整整齐齐的材料放在了来自美国PHILIPS半导体公司2位经理的面前,包括吃饭在内仅仅只洽谈了2个小时,代理权就正式谈下来了。事后他们告诉我,就是因为我与众不同,专注且非常有个性。
风雨变换诱惑莫测,人怕出名猪怕壮,这是常理!随后找上门来要求我们代理芯片的著名半导体公司不下10家。这时候,对于很多人来说不做什么就是一个艰难的选择。此时,我认为不管对方开出的条件多好,有冲突的就是不做,性能不突出的也不做,如果能够形成价值链互补,就一定要通过自己的努力和业绩表现主动去“求”半导体公司授权给我们,我就是这样取得了Keil、Catalyst、Sipex的代理权和信用额度。2004年SHARP半导体公司北京、日本、美国一共五位经理来到我的办公室要求我代理SHARP的ARM,帮助SHARP在中国推广以及制造用于全球销售的开发套件,我根本没有思考就一口回绝了,可以说SHARP给我的条件非常之好,特别是美国人觉得是非常不可思议的事情,作为商人这么好的赚钱机会都不要。为什么?我们之所以暂时“强大”,就是因为我们长期以来专注于发展PHILIPS半导体,集中精力对准焦点成为了小河里的大鱼,进而才引起了众人的关注。如果我们分散了精力,最后的结果一定会什么都不是!当决定专注的目标之后,接下来的就是想办法如何做得与众不同,这是一件不容易的事情。最重要的就是穷举用户最大的需求和竞争者最容易忽略之处,然后将其做到最好。为了推广好PHILIPS的单片机和ARM,我们定位于帮助初学者快速入门,至今一共编写出版了20多本专著,并将大部分版权全部捐献给了出版社用于降低成本,同时我也还会继续坚持将这项工作做下去、争取做得更好。邓小平有一句名言:“计算机要从娃娃抓起!”我认为,任何一个有远见的厂商,要想成功地推广嵌入式系统,一定要从在校大学生抓起,这必定是一件一举多得的好事。既能够提高企业的美誉度,又能获得市场占有率,还能为学生提供实践的理论基础。为何很少有厂商或者代理商心甘情愿去做?这不仅可帮助企业建立差异化,而且还能够给企业带来长远的利益,何乐而不为? 比如说,至今在国内任何一家代理商的网站上几乎都找不到完整的芯片中文数据手册、用户手册与应用手册,不是我们的同行不知道其中的重要性。首先大家普遍认为这是半导体公司的份内之事,其次大家或许感到自己做好之后放到网站任由用户免费下载,会给其它代理商占了便宜。但很多人却始终不明白,这是满足用户需求制造公司服务差异化的最佳机会。
于是我们决心从网站入手坚持长期投资,做中国最好的嵌入式系统专业技术网站,建立专业的技术支持与开发团队。特别是对于优质用户的服务,网站还专门开通了“快速绿色通道”,如果这样的用户遇到问题,都是由我、分公司经理及其相关服务部门的经理牵头负责实施“保姆式”的服务,我们实施的服务战略就是:“用有限的资源为有效的用户提供高质量的服务”。
“你若亲近神,神就亲近你!” 2001年8月一篇来自PHILIPS内部刊物的报道《风险意味着机会》,我是被推上了“本地英雄”封底人物栏目的第一位亚洲代理商;2004年PHILIPS半导体公司又给我授予了“优秀卓越贡献奖”,来自全国各地的用户连续多年通过《亚洲资源》媒体将我们公司评选为“本地十大最受客户欢迎的分销商”。没有用户崇高的忠诚度和长期的大力支持,我们不可能从1999年以来连续多年销售单片机取得PHILIPS亚太区第一名的业绩。
一个“人弃我取”的机会成就了我,尽管个人与团队的努力至关重要,但可以毫不掩饰地说,如果没有PHILIPS半导体经理的慧眼相马,一定是巧妇难为无米之炊,业界不会再有我的一席之地。
在嵌入式系统应用技术方面与我们不相伯仲或者说比我们聪明能干的人才何止万千,为何只有少数人能够脱颖而出呢?就是因为想法太多、不专注,不能坚持在一个行业里面十年如一日地下苦功夫。但面对众多的竞争者和后来者,我每天都如履薄冰,不敢有丝毫的懈怠,每天坚持学习到深夜,因为唯有不断地学习和更新思维才有可能具备远见并及时规避可能出现的失误。
第二篇:师兄的嵌入式入门学习经验
我是08届惠州学院电子系的毕业生,现在从事于linux嵌入式研发工作。本人写这一篇所谓的“嵌入式入门学习法”,是因为自己一开始学习嵌入式的时候,电子系里几乎没有人可以带自己入门或者教授相关学习方法,基本上都是自己摸索着学习,可想而知,这过程蛋疼的程度让人想死。所以希望通过这一年来自己的学习,整理出一条学习路线给以后电子系的师弟们作参考。
废话不多说,进入正题。首先大家应该理解两个概念,什么是处理器,什么是控制器。相信很多电子系的学生,一开始是从玩51单片机开始进入电子研发领域的,再者就是AVR单片机,参加过飞思卡尔智能车比赛的同学,应该也玩过16位的飞思卡尔单片机芯片。那么,我们所使用的单片机,它就是一个控制器,我们在其芯片上进行编程,也就是计算机领域所谓的编写出应用程序。而像计算机系的同学,他们所写的软件都是在处理器上面跑的,就像我们的PC机一样。但是当你一开始接触嵌入式的时候,我们一般是从ARM芯片入门的,ARM具备了控制器和处理器的特性,它具有我们平时玩的单片机一样的IO功能口,也具有处理器一样可以搭载庞大的操作系统的特性。从这点上看,其实电子系的学生只要具备了操作系统的知识,入手嵌入式其实并不是件难事。
然而当你选择了嵌入式学习并把它当做职业发展方向一样对待的时候,请记住,一当坚持下去了,你将选择了一条和玩单片机完全不同的道路。可以说,玩单片机的人,以后可以从事自动控制领域的相关工作,可以从事FPGA/CPLD这种芯片编程制作工作,也可以从事小家电领域的工作。但是玩嵌入式的电子系的学生,一开始便成为转行计算机工作的学生了,你每天都是对着电脑编写程序,没错,你就是个软件工程师,计算机软件工程师。当然,别怀疑自己选错方向,电子系的学生学习驱动开发自然有他的优势,但是,请别只让自己成为一个驱动程序开发者(虽然工作已经挺高的了),电子系的学生完全有能力成为一个系统级别的嵌入式专家。请记得,你玩硬件出身的,你只要软硬都会,整个产品你都可以了如指掌。
那么,我们如何来开展嵌入式学习呢。
*****************************************************************************************************************************
嵌入式五大板块介绍
*****************************************************************************************************************************
首先,你应该了解嵌入式分为几大板块。
我一一讲解你跟它们,在你毕业从事嵌入式工作时所接触的程度,以及你在学校至少要学习到什么样的程序才可以。
应用程序,分为有用户界面的应用程序和没有用户界面的应用程序,前者可以简单说是我们平时所看到的软件。当然一般的嵌入式的软件是用QT语言编写出来的,计算机系的同学一般都从事这方面的工作,而没有用户界面的应用程序,电子系的同学是必须得会的。因为应用程序的编写是用linux系统所提供的接口所编写出来的,对于以后我们开发linux内核和驱动程序都是帮助非常大的(很简单,你要调试驱动或者内核,你肯定要写应用程序)。当然,一开始找工作,企业很希望你精通应用程序,因为这是最基本的要求,也是毕业生进入企业后唯一最能帮上忙的能力。
文件系统,在学校的时候要了解其特性和相关使用,至少必须知道你所用到和见到的文件系统的特性是什么。每一个文件系统的诞生都有它的需求所在,而了解它对以后每一个阶段学习都会有帮助。但是为什么说了解就好,因为开发文件系统这活,至少要有五六年的工作经验才可能涉及到的。所以,了解好文件系统,也学下移植文件系统吧。
Linux内核,是一个几千万代码组成的程序,汗,入门时想懂它,基本不可能,不过基本相关知识点还是要懂的,怎么懂,稍后介绍。
驱动程序,简单地说,就是把硬件的功能通过一定的封装技术打包起来,供应给linux内核调用。那么也就是说,看datasheet就必不可少啦。Datasheet,你懂的,哥不多说。
Bootloader,是一个引导芯片初始化工作和引导内核启动的程序包,基本上现在所用到的bootloader是U-BOOT。就U-BOOT目前来说,大部分工作都是在修改ARM初始化部分,也就是说,首先汇编语言你要懂,其次是ARM体系结构你要懂,还有就是相关ARM的datasheet你要会看。
说到这里,其实可以说,电子系的学生学习嵌入式,优势就在于你看了很多datasheet和对硬件比较了解,开发驱动程序和bootloader会比较顺手。但是,入门学习嵌入式,先从开发驱动程序和bootloader入手?当然不是。
*****************************************************************************************************************************
嵌入式入门学习规划
*****************************************************************************************************************************
第一阶段
先按着国嵌的视频教程开始,把虚拟机安装好,在虚拟机里面安装好linux发行版,也就是红帽子、fedora这些系统,最好装国嵌用的发行版。然后把相关命令学习一下,比如怎么查看内核版本,怎么解压安装包,怎么进入root权限,怎么打开文件,还有怎么编写程序,什么是交叉编译工具。其实就是把国嵌的第一阶段学习下,对整个linux环境和历史有个大概的了解。
第二阶段
首先去计算机系那边找本《计算机操作系统》的书,花半个月的时间,把计算机系统了解一遍,什么是文件系统,什么是进程,什么是文件,什么是上下文等等。但是不要深入去了解,要通读,就是说要把里面的概念理解清楚就好,但是有关于算法的,就不用去深入理解了,知道有这东西就行。为什么说要先了解操作系统呢,其实电子系的学生学习嵌入式,最头疼的地方就是一点都不了解操作系统是什么。就打个比方,输入命令这东西以前基本没怎么接触,可在嵌入式开发的过程中,输入命令是最基本的事情。
第三阶段
买一本叫做《Linux C程序设计大全》回来,一是对C语言进行复习以及指针这块知识进行学习;二是对Linux C语言学习,比如Linux C的编程风格和规范性;三是这本书的内容结构非常好,基于linux内核编程,由浅到深,算是涵盖了所有的linux编程内容。所以你搞完它,基本是对嵌入式应用程序编程应该入门了;四是这本书错误满多的,你要按着它所写的程序一个个试着自己去编写运行,当你发现错误的时候试着去寻找解决办法,这样你会很深刻地记住很多知识点。那,这本书大概要花一个半月的时间去学习吧。
第四阶段
搞一本有关linux内核的书籍,像《linux内核设计与实现》,把整个linux内核进行大致的了解,比如了解驱动程序在里面算什么。但是你肯定会疑惑,就只是为了了解驱动程序在内核中充当什么角色?NONONO,其实写驱动程序,就是在写内核。所以内核的很多机制很多接口你要懂。所以你先要去了解它。
第五阶段
从《嵌入式Linux应用开发完全手册》里对驱动开发进行学习吧,先了解驱动开发是什么,驱动开发具体的开发流程是什么。然后先自己对字符型的设备进行学习,开发出相应的驱动程序。
第六阶段
好了,如果学习到这里,不知道你要找工作了没。如果你想继续,那么就开始U-BOOT的相关学习吧,这方面的学习也就一本书《ARM 体系结构》,然后按着网上流传的教程进行学习,当然最好有开发板,推荐MINI2440,这货还是挺权威的。
第七阶段
到了这里,相信你对嵌入式开发已经算是入门了吧,嵌入式开发有哪些工作你也应该了如指掌,呵呵,五个东东:应用程序开发、文件系统移植、linux内核移植、驱动程序开发与移植、U-BOOT移植。当然最好配合开发板进行学习喔。然后在毕业前,请把应用程序开发学精,把C语言学透点,这样子去找工作是没问题的。当然,能够抽空学习C++也是很不错的,linux内核的编程思想很多都是参考C++面向对象思想的。为什么会用到,是因为面向对象的编程语言好管理和容易扩展开发,至于精粹嘛,自己去了解哈。
喔,对了,还有一本书很好,《Unix高级编程》!最好学习下哦,我说整本都要喔!
*****************************************************************************************************************************
结尾
*******************************************************************************
**********************************************
就写到这里吧,这是我自己一路苦B过来,最后总结出来的。至于效果怎么样,我也不
敢肯定什么。只能说一句:学习嵌入式,如果你爱上它,那么就坚持下去,它会给你带来很多意想不到的收获与升值。
最后还想给大家说下平时如果没有老师帮忙或者同学帮忙,怎么办。网络资源很重要哦。论坛,Q群。论坛最好自己专注一个,多问多看,但是论坛的回复没有Q群那么及时。但是在这里有件个事情要告诉大家的,就是向别人问问题的时候一定要有逻辑,不然像一些人一样:“怎么学嵌入式?”这么一句话,汗,哥,请问谁有去鸟你呢。
所以,大致可以这样子去问
1.你目前在做什么内容,要达到什么效果
2.你目前所遇到的问题是什么
3.错误或者问题所产生的提示是什么,比如把“超级终端的错误信息提示”截图给大家看一下
行吧,我也不是牛人,只是希望未来电子系的师弟们能越走得越来越顺,为自己的父母多争点气。加油!
(文中涉及到“电子系”和“计算机系”等分类字眼,作者并无议论谁好谁坏之意,只是想借“电子系”和“计算机系”两个词来分别说明各个专业所学习科目不同而带来,对学习嵌入式的一些障碍而已。如文中所写内容有对“电子系”和“计算机系”学生有不敬之意,在此说声“对不起”!)
第三篇:嵌入式实验报告
实验一 ARM汇编语言程序设计
一、实验目的
1.了解IAR Embedded Workbench 集成开发环境 2.掌握ARM汇编指令程序的设计及调试
二、实验设备
1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序
三、实验内容
1.熟悉IAR Embedded Workbench 集成开发环境
2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能
分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F 程序代码:
AREA Examl, CODE,READONLY;定义一个代码段 ENTRY
;程序入口
MOV R0,#0;设置R0寄存器的值为0 MOV R8,#0;设置R8寄存器的值为0 ADR R2,N;将R2寄存器的值设为数据域N的地址 LDR R1,[R2];将以R2的值为地址的数据读入R1 MOV R2,#0;设置R2的值为0 ADR R3,C;将R3寄存器的值设为数据域C的地址 ADR R5,X;将R5寄存器的值设为数据域X的地址 LOOP LDR R4,[R3,R8];将R3+R8的数据读入R4 LDR R6,[R5,R8];将R5+R8的数据读入R6 MUL R9,R4,R6;R9 = R4*R6 ADD R2,R2,R9;R2 = R2+R9 ADD R8,R8,#4;R8 = R8+4 ADD R0,R0,#1;R0 = R0+1 CMP R0,R1;比较R0和R1的值 BLT LOOP;R0 执行结果如下: 3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面 程序代码: MOV R0,#100;设置R0寄存器的值为100 LDR R2,=0X90018;设置R2寄存器指向地址0x90018 MOV R1,#0;设置R1的值为0 MOV R3,#0;设置R3的值为0 LOOP ADD R3,R3,R0;R3 = R3+R0 SUB R0,R0,#1;R0 = R0-1 CMP R0,R1;将R0和R1的值比较 BNE LOOP;不相等的话继续执行循环 STR R3,[R2];将R3的值装入到R2指向的地址块中。END 程序执行结果:程序执行完在0x90018内存入的数据是0x13ba即5050 实验二 ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程; 2.掌握ARM汇编指令中的堆栈指令的操作,以及存储器的装载指令操作。 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2.集成开发环境,仿真器驱动程序。 三、实验内容 1.理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: x EQU 15;定义常量x=15 y EQU 61;定义常量y=61 stack_top EQU 0X1000;定义堆栈栈顶地址为0x1000 ENTRY;程序入口处 MOV sp,#stack_top;将堆栈指针指向栈顶 MOV r0,#x;将x的值放入r0 STR r0,[sp];将r0的值压入堆栈 MOV r0,#y;将y的值放入r0 LDR r1,[sp];将x的值放入r1 ADD r0,r0,r1;r0 = r0+r1 STR r0,[sp];将r0的值装入堆栈 Stop;B stop;程序结果为:r1 = x+y = 0x6D 2.编写程序循环R4~R11进行累加8次赋值,R4~R11初始值是1~8,每次操作后把R4~R11的内容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD指令清空为0 程序代码如下: X EQU 1;定义常量x = 1 stack_top EQU 0X800;定义栈顶地址 ENTRY;MOV SP,#stack_top;将栈顶地址指向0x800 MOV R4,#1;设置R4 = 1 MOV R5,#2;设置R5 = 2 MOV R6,#3;设置R6 = 3 MOV R7,#4;设置R7 = 4 MOV R8,#5;设置R8 = 5 MOV R9,#6;设置R9 = 6 MOV R10,#7;设置R10 = 7 MOV R11,#8;设置R11 = 8 LOOP ADD R4,R4,#x;R4累加1 ADD R5,R5,#x;R5累加1 ADD R6,R6,#x;R6累加1 ADD R7,R7,#x;R7累加1 ADD R8,R8,#x;R8累加1 ADD R9,R9,#x;R9累加1 ADD R10,R10,#x;R10累加1 ADD R11,R11,#x;R11累加1 STMIA SP!,{R4-R11};将R4-R11的值压入堆栈 CMP R4,#9;比较R4和9的大小 BLT LOOP;R4 < 9继续执行循环 LDMFD SP!,{R4-R11};将R4-R11清零 END;实验结果:主要实现将数据2-9,3-10,4-11……9-16压入堆栈(初始地址是0x800处开始),最后将R4-R11全部清零。 3.更改实验中1中的X,Y的值,观察期结果 程序代码: x EQU 20 y EQU 120 stack_top EQU 0X1000 ENTRY MOV sp,#stack_top MOV r0,#x STR r0,[sp] MOV r0,#y LDR r1,[sp] ADD r0,r0,r1 STR r0,[sp] Stop B Stop END 程序结果为:r0 = x+y = 140 = 0X8C 实验三 ARM汇编语言程序设计 一、实验目的 1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程 2.掌握ARM汇编的存储器加载/存储指令,及if条件、循环、循环及循环的汇编实现 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真器驱动程序 三、实验内容 1.理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: Num EQU 20;定义常量Num = 20 START;LDR r0,=src;将src数据块的开始地址存入r0中 LDR r1,=dst;将dst数据块的开始地址存入r1中 MOV r2,#Num;设置r2的值为20 MOV sp,#0x400;堆栈指针sp指向0x400 blockcopy;MOVS r3,r2,LSR #3;将r2左移3位移入r3并且影响标志位 BEQ copywords;结果为0的话跳转到copywords STMFD SP!,{r4-r11};将r4-r11的值入栈 octcopy;LDMIA r0!,{r4-r11};将src的前8个字数据存入让r4-r11 STMIA r1!,{r4-r11};将r4-r11中的数据放入dst数据块中 SUBS r3,r3,#1;r3 = r3-1 BNE octcopy;结果不为0跳转到octcopy LDMFD SP!,{R4-R11};恢复原来的r4-r11 copywords;ANDS r2,r2,#7;r2 = r2&7 BEQ stop;结果为0跳转到stop wordcopy;LDR r3,[r0],#4;将r0指向的字数据放入r3中,r0 = r0+4 STR r3,[r1],#4;将r3中的数据存入到dst数据块中,r1 = r1+4 SUBS r2,r2,#1;r2 = r2-1 BNE wordcopy;不为0跳转到wordcopy处 stop;B stop;src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4;dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;END;程序结果:将src的数据全部存入到dst中 2.新建工程,并自行编写程序,分别使用LDR,STR,LDMIA,STMIA操作,实现对某段连续存储单元写入数据,并观察结果 程序代码: MOV R4,#1;设置r4 = 1; MOV R5,#2;设置r5 = 1; MOV R6,#3;设置r4 = 1; LDR R0,=dst;R0保存dst的首地址 STR R4,[R0];将r4的值装入r0执行的内存中 STR R5,[R0,#4];将r5的值装入r0+4执行的内存中 STR R6,[R0,#8];将r6的值装入r0+8执行的内存中 LDR R7,=src;R0保存src的首地址 LDMIA R7,{R8-R10};将r7执行的地址的数据读入r8=r10 LDR R3,=N;r3保存N的首地址 STMIA R3!,{R8-R10};将r8-r10装入r3指向的内存 N DCD 0,0,0 src DCD 1,2,3 dst DCD 0,0,0 END 程序结果:熟悉使用LDMIA,STMIA和LDR,STR指令 3.使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行,使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。程序代码: 实现if条件: MOV R0,#1 MOV R1,#2 CMP R0,R1 BGT LOOP1 BLT LOOP2 LOOP1 MOV R3,R0 LOOP2 MOV R3,R1 END 程序结果: 实现for和while条件: MOV R1,#1 MOV R3,#0 MOV R2,#101;LOOP ADD R3,R1,R3 ADD R1,R1,#1 CMP R1,R2 BLT LOOP END 程序结果: 实现do…while条件: MOV R0,#1 MOV R1,#100 MOV R3,#0 LOOP CMP R0,R1 BGT STOP ADD R3,R0,R3 ADD R0,R0,#1 B LOOP STOP END 程序结果: 实验四 基于ARM的C语言程序设计 一、实验目的 1.了解ARM C语言的基本框架,学会使用ARM的C语言编程。2.掌握C语言和汇编语言编程的相互调用。 二、实验设备 1.EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。 三、ARM C语言简介与使用规则 1.ARM使用C语言编程是大势所趋 在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C语言的在ARM编程中具有重要地位。 2.ARM C语言程序的基本规则 在ARM程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。 C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。 在使用C语言时,要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通过ATPCS的规定与C程序相互调用与访问。 ATPCS,就是ARM、Thumb的过程调用标准(ARM/Thumb Procedure Call Standard),它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。 在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。具体来说,汇编语言的子程序应满足下面3个条件: ● 在子程序编写时,必须遵守相应的ATPCS规则; ● 堆栈的使用要遵守相应的ATPCS规则; ● 在汇编编译器中使用-atpcs选项。基本的ATPCS规定,请详见相关技术文档。 汇编程序调用C程序 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。在调用C程序时,要正确设置入口参数,然后使用BL调用。 C程序调用汇编程序 汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。 在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup44b0/INC目录下都有一个44b.h的头文件,那里面定义了所有关于44B0的硬件寄存器的宏,对宏的读写,就能操作44B0的硬件。 具体的编程规则同标准C语言。 四、实验内容 1、理解下列程序,新建工程,加入下面的程序,并观察实验结果。程序代码: /*实现5个数的相加*/ int sum5(int a,int b,int c,int d,int e){ return(a+b+c+d+e);};汇编语言 IMPORT sum5;声明调用c函数 CALLSUMS STMFD SP!,{LR};将LR寄存器入栈 MOV R0,#1;r0 = 1 ADD R1,R0,R0;r1 = 2 ADD R2,R1,R0;r2 = 3 ADD R3,R1,R2;r3 = 5 STR R3,[SP,#-4]!;将r3的值入栈当做第五个参数 ADD R3,R1,R1;R3 = R3+R1=4 BL sum5;调用sum5 ADD SP,SP,#4;sp = sp+4 LDMFD SP,{PC} 程序结果:实现了i+2i+3i+4i+5i的汇编语言调用c语言 2、用汇编语言实现1到100累加的函数,用C言语编写主程序,在主程序中调用所编写的汇编函数 程序代码: NAME asmfile PUBLIC sum5 SECTION.intvec : CODE(2)CODE32 sum5 ENTRY MOV R1,#1 MOV R2,#0 sum6 ADD R2,R1,R2 ADD R1,R1,#1 CMP R1,R0 BLE sum6 MOV PC,LR END #include 总结 本次实验主要是通过对ARM的各种指令进行操作,通过对这些指令的应用,让我们学会了如何使用汇编来进行编程,掌握汇编编程和C语言编程的技巧,并且能够熟练的使用汇编语言,深刻理解ARM的工作。并且培养了我们写代码的能力以及对代码的阅读能力和修改能力。为我们在以后的学习和生活中更实用ARM,利用汇编进行编程奠定了一定的基础! 计算机专业类课程 实验报告 课程名称:嵌入式微处理器系统及应用 学 院:计算机科学与工程 专 业:计算机科学与技术 学生姓名:廖雪平学 号:2011060120003 指导教师:陈丽蓉 日 期:2014年5月15日 电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 实验一 实验名称:熟悉嵌入式系统软件开发工具与环境 一、实验学时:4 二、实验内容和目的: AR熟悉嵌入式系统软件开发工具与环境 M处理器指令编程基础实验 ARM处理器工作模式实验 ARM处理器异常处理实验 编写2段汇编程序,一段实现数据区的拷贝,另一段实现对第一个程序的调用,完成参数传递和返回值的传递。数据拷贝程序需要判断传递参数的正确性:源数据区和目的数据区不能重叠,如果重叠则不进行拷贝操作,并返回错误码(1),否则进行数据拷贝并返回成功码(0)。 三、实验原理: M处理器指令编程基础。 ARM处理器工作模式 ARM处理器异常处理 四、实验器材(设备、元器件) Pc机、开发板 五、实验步骤 1、了解并连接开发板。 2、运行程序熟悉环境并对开发板进行测试。 3、编写程序并调试运行 4、完成实验内容。 5、调试并撰写实验报告。 六、实验数据及结果分析: 实验代码: 实验截图: 电子科技大学计算机学院实验中心 七、实验结论、心得体会和改进建议: 实验本身不会很难,但初次开发还是不太熟练,不过本实验让我更加熟练了ARM汇编的开发,以及熟悉了ARM的开发流程以及开发环境 电子科技大学计算机学院实验中心 电 子 科 技 大 学 实 验 报 告 实验二 一、实验名称:UART串口通讯实验 二、实验学时:4 三、实验内容和目的: 1) 在已有串口驱动软件及测试程序的基础上,修改测试程序,尝试对串口的各项通讯参数进行修改,并调整相应的与主机的连接配置,以便修改参数后的串口仍然能够正常通讯; 2)通过查阅芯片手册,尝试自行实现串口的初始化函数,替代已有驱动软件库中的串口初始化函数,并通过测试程序验证自行编写的函数的正确性。 四、实验原理:UART串口通讯原理 五、实验器材(设备、元器件) pc、开发板、相关环境 六、实验步骤: 1、了解实验内容 2、修改测试程序调整连接配置以便修改参数后的串口仍然能够正常通讯 2、编写实验代码 3、测试验证自行编写的函数的正确性。 七、实验数据及结果分析: 实验代码: 电子科技大学计算机学院实验中心 实验截图: 电子科技大学计算机学院实验中心 八、实验结论、心得体会和改进建议: 通过本实验让我对串口程序的编写有初步的了解,已经对软硬件间的衔接更加深刻的理解 北京科技大学 黄强 41050176 嵌入式实验报告 实验一 建立并编译WinCE平台 【实验目的】 掌握PB下WinCE平台的定制 【实验内容】 开始利用Platform Builder定制平台并编译 【实验流程】 1. 将OURS-PXA270-EP实验箱的电源线、串口、网线、同步线、鼠标等全部连接。 2. 由于已经安装好了BSP,我们可以直接打开Platform Builder5.0。3. 新建Platform Builder工程,在建立向导中进行名称、路径、BSP选择、设计模板、可选项目等的设置,完成WinCE平台的建立。 北京科技大学 黄强 41050176 4. 设置编译平台的参数。 5. 构建新建里的WinCE平台的运行时映像。整个过程大约持续20分钟,构建成功后得到操作系统运行时的映像。【实验结果】 见nk.bin 【小结】 通过这个实验,我们初步接触了PXA270EP实验箱,并通过Platform的建立,对Platform Builder有了一个初步了解,同时也对嵌入式开发的过程有了一个初步认识,掌握了PB下WinCE平台的定制。 实验二 定制增强型内核 【实验目的】 1.熟悉Platform Builder集成开发环境以及相关配置 ·使用模板创建新平台 ·添加和删除组件 ·配置和运行平台 2.利用Platform Builder定制一个增强型内核,并下载到内存中。【实验内容】 参照本实验指导书的步骤,定制一个包括Word(支持中文输入法)、图片浏览器、MediaPlayer、支持USB鼠标、键盘,并能通过USB从设备接口进行宿主机与目标版通信的内核。 北京科技大学 黄强 41050176 【实验流程】 1.打开已创建好的PB,在PB右边的Catalog中添加其他组件。这里我们所做的与实验指导书上的不同,为了更好的配合我们的实验,我们所添加的内容有: ·Third Party-BSPs-OURS PXA270-Device Drivers-OEM Devices下所有内容。·Platform Manager ·Third Party-BSPs-OURS PXA270-Device Drivers-USB Host-USB Host Controllers-PXA270x USB Host{OHC} ·Core OS-Windows CE devices-Core OS Services-USB Host Support-USB HID-USB HID Keyboard and Mouse ·Third Party-BSPs-OURS PXA270-Device Drivers-Input Devices-Keyboard/Mouse-OURS270 KEYPAD Driver ·Third Party-BSPs-OURS PXA270-Device Drivers-Networking-LAN devices-OURS270 LAN91C111 Driver 2.选择Build OS|Sysgn开始构建,编译的结果生成了Eboot和NK.bin映像文件。 3.在终端进行配置。打开“超级终端”进行连接端口、波特率、数据流控制等的设置,此时会弹出名为11520的超级终端的窗口。 4.打开实验箱电源,此时窗口里会出现字符,快速按空格键。 5.当完成Eboot配置后,按下D,准备下载内核的映像文件NK.bin到实验箱上。6.再进行PB里面的目标设备的配置。7.对映像文件进行下载。 映像文件传输完成后,Eboot会根据设置,自动烧写到内存中,完成烧写以后,WinCE会自动启动。至此,一个功能较强的内核定制成功了。【实验结果】 略 【小结】 经过这个实验,我熟悉了Platform Builder集成开发环境以及相关配置,虽然刚开始不知道这些配置有什么用,后来在老师的讲解下才渐渐明白,这些配置是为了后续的编程做准备的。 北京科技大学 黄强 41050176 实验三 定制SDK并建立EVC下的开发环境 【实验目的】 熟悉SDK的概念,配置EVC下的开发环境 【实验内容】 生成SDK并安装,配置Embedded Visual C++的开发环境 【实验流程】 1. 在已经建立好的PB中,新建一个SDK文件。2. 按步骤完成SDK的配置 3. 点击Build SDK 这个过程大概要3分钟,在指定目录下生成SDK文件。4. 安装刚生成的SDK,之后即可在此模拟器上运行开发好的应用程序。【实验结果】 北京科技大学 黄强 41050176 见SDK文件 【小结】 SDK的概念其实对我们来说还是相对陌生的,在实验的过程中由于概念不了解我们并不太清晰的知道我们在做什么,直到我们查阅并了SDK的相关概念后才有所收获。SDK实际上是一个开发工具包,我们根据自己的开发需要,针对于自己的PB定制了一个专用开发工具包来便于我们的模拟开发。经过这个实验,我们了解了更多关于软件开发的知识,接触到了许多课堂上所学不到的内容,受益匪浅。 实验五 建立宿主机与实验箱的连接 【实验目的】 学习并掌握利用SMSC91C111网口建立宿主机与实验箱的连接 【实验内容】 利用SMSC91C111网口建立宿主机与实验箱的连接 【实验设备】 1.OURS-PXA270-EP实验仪,烧录有WINCE的Flash,交叉网线,USB数据线。2.PC操作系统,Platform Builder5.0集成开发环境。【实验步骤】 1.在PB的菜单下,点Remote File Viewer击。 北京科技大学 黄强 41050176 2.在弹出的“Windows CE Remote File Viewer”界面中,选择“Configure Connection”按钮,进入下一个画面。 3.选好目标设备,并单击右边的“Properties”按钮。 4.在弹出的对话框“Device Properties”中如下图所示设置,单击“Transport”下拉框右边的“Configure...”按钮。 5.在弹出的对话框“Transport Configuration”中可以设置超时值、端口号、主机IP等。 6.设置完毕后,打开实验箱电源,启动WinCE平台,将宿主机与实验箱网口用交叉线连接号,点击“Text”按钮。 7.点击Text按钮后,出现所示窗口,它的意思是说,在试验箱的命令行中键入“CEMGRC.EXE/S /T:TCPIPC.DLL /Q /D:192.168.0.21:5000”(其中IP地址是自己宿主机的IP地址),完成此项操作后,点击OK。 8.在实验箱的CE系统中,设置IP地址与宿主机地址在同一网段内。具体操作为:在实验箱的CE系统“开始”菜单中点击运行命令,键入命:CEMGRC.EXE/S /T:TCPIPC.DLL /Q /D:192.168.0.21:5000,然后点击OK。如果PC机上再出现运行CEMGRC.EXE/S /T:TCPIPC.DLL /Q /D:192.168.0.21:5000的提示,重复上述步骤,便会出现如下界面,点击Export按钮(黄色按钮),可上传文件。9.如下图所示,可浏览远程文件,并指定上传文件,选中文件后,点击“打开”按钮。 10.成功上传文件,可以在实验设备上看到上传的文件。11.至此,利用SMSC91C111网口建立连接完毕。【实验结果】 实验失败 【小结】 通过这次试验,我们掌握了利用SMSC91C111网口建立宿主机与实验箱的连接的方法,实验中要求IP地址与宿主机地址在同一网段,实验中解决了这个问题,让我们对网络相关的概念也加深了理解。经过多次试验,我们还是无法连通宿主机与实验箱,我认为我们的步骤没有问题,可能是设备有故障。 北京科技大学 黄强 41050176 实验六 USB Device建立宿主机与实验箱的连接 【实验目的】 学习并掌握利用USB Device建立宿主机与实验箱的连接 【实验内容】 利用USB Device建立宿主机与实验箱的连接 【实验设备】 1.OURS-PXA270-EP实验仪,烧录有WINCE的Flash,交叉网线,USB数据线。2.PC操作系统,Platform Builder5.0集成开发环境。【实验步骤】 北京科技大学 黄强 41050176 1.ActiveSync安装 Microsoft ActiveSync允许您使用电缆、底座或红外线在移动设备和桌面计算机之间建立合作关系。建立合作关系后,如果您的设备支持调制解调器或(以太网)卡,就可以使它们同步数据。通过ActiveSync还可以使用现有计算机连接其他资源,也可以使用ActiveSync保持两台计算机上拥有最新信息。 首先在主机端安装ActiveSync程序。该程序安装在D:科大目录下的ActiveSyncsetup.smi。双击该文件开始安装。 2.用USB延长线连接试验箱和PC,当PC发现新设备时安装附带的驱动,安装完成后,打开Microsoft ActiveSync窗口进行连接。 选择“否”然后点击行“下一步”按钮。 3.在“我的电脑”中添加“我的设备”,它对应于目标系统的WINCE文件系统。注意: 如果WINCE运行以前USB线已经连接到PC机的USB插座,可能导致连接不上,此时,请将USB线拔下然后重新插入即可。4.通讯 在上图我的电脑中双击“我的设备”将打开WINCE同步目录,可以和操作WINDOWS其他目录一样操作该目录,包括拷贝文件到该目录或见文件从该目录拷贝到PC机。 文件拷贝成功,可以成功将应用程序下载到试验箱运行,这样我们就完成了宿主机与实验箱的通讯连接。【实验结果】 北京科技大学 黄强 41050176 【小结】 通过实验,我们掌握了利用USB Device建立宿主机与实验箱的连接的具体方法,并且连接成功,与上一个方法比较,该方法简单实用,成功率高,适合我们选用。 实验七 在实验箱的WinCE平台上的Hello World实验 【实验目的】 北京科技大学 黄强 41050176 1.熟悉EVC集成开发环境以及相关配置。2.利用EVC编写WinCE的应用程序。【实验内容】 参照本实验指导书的步骤,一步一步完成实验,编写、编译并运行HelloWorld程序 【实验设备】 1.OURS-PXA270—EP实验仪,交叉网线。 2.PC操作系统,Platform Builder4.2集成开发环境,eMbedded Visual C++集成开发环境。【实验结果】 【小结】 这是我首次接触EVC集成开发环境,感觉有点陌生,但按照实验指导书一步一步做下去之后,我终于对EVC集成开发环境有了初步的了解,收获很大。 实验八 LED数码管驱动 【实验目的】 北京科技大学 黄强 41050176 1.熟悉EVC集成开发环境以及相关配置 2.利用EVC编写一个针对实际硬件的驱动程序 【实验内容】 编写一个针对硬件的驱动程序,硬件是LED 【实验设备】 PC机操作系统,Platform Builder集成开发环境,OURS—PXA270-EP实验箱。 【实验步骤】 1.使用前面实验所制作的内核 2.按照实验指导书上添加窗口及代码 3.测试与调试 【实验结果】 北京科技大学 黄强 41050176 【小结】 经过本次实验,我熟悉了EVC集成开发环境以及相关配置,在EVC中编写了一个程序,通过实验,对开发环境有了更深入地了解,为日后的课程设计打下了坚实的基础。第四篇:嵌入式实验报告
第五篇:嵌入式实验报告