有些技术确实可以在两、三个月内学通,嵌入式开发经验总结 读大学时学过计算机组成原理、操作系统、计算机网络等等课程,但是大学生都知道,上完那些课只是懂一点皮毛而已,打打酱油就过去了。特别是对于软件工程师,一定要多实践、多思考才行。理论知识显得并没有搞硬件或者偏硬件开发的那么重要,因为软件的重点在于逻辑和算法。 个人认为,在中、高级阶段,偏硬莫非就是一种知识活儿,而偏软莫非就是一种体力活儿……只有到达专家阶段才能够有所突破。对比一下培训机构的软件开发和硬件开发的培训费用就知道了,一般的软件培训(Java/C++/PHP/C#),收费大概是一个月3000,强调是“一个月”,一般的培训都是2~6个月,所以总费用少则几千,多则上万。而嵌入式的培训费则是按天计算,1天大概500,强调是“1天”,一般的培训是一周,也有培训半年的,但是费用也相当高!由此可见,嵌入式的课程含金量很高。软件开发,特别是网站开发,比嵌入式辛苦多了。 如果硬件和软件两者皆不了解,那么推荐你选择偏硬件的方向,实惠很多。综合其他前辈的经验,嵌入式开发是个不错的工作,应该比公务员都还好,但要学好大学里面的课程,比如数字逻辑、电路分析、微机原理、单片机等等,理论很重要。理论面前,男女平等。 静下心来看书、做项目,你会发现有些东西确实可以在短短两、三个月内学通,即使说你今年做LinuxC/C++开发,明年做JavaEE、Android开发,后年去做硬件开发、驱动开发,那都是没问题的。问题是,你喜欢做什么?你想要达到哪种境界? 嵌入式开发知识总结 一、基础知识 目前流行的嵌入式操作系统有:linux、uC/OS、WindowsCE、VxWorks、PalmOS和QNX。其中VxWorks实时性很强,最稳定、可靠,但价格昂贵,而其他的都有各自的优点。 ARM公司(原名Advanced RISC Machine),主要是研发ARM系列微处理器(出售IP,即知识产权),目前全世界有几十家著名的半导体公司都使用ARM公司的授权,包括IBM、Intel、SONY、LG等。ARM微处理器已成为RISC标准。目前基于ARM核的处理器有以下几种: ARM7/9 Thumb家族 ARM9/10E家族 ARM 11家族 ARM Cortex家族 SecurCore家族 MPCore Multiprocessors家族 Intel公司的StrongARM(相当于ARM8)和Xscale。 ARM7处理器采用了ARMV4T(冯诺依曼)体系结构。目前主流的ARM7内核是ARM7TDMI(最常用)、ARM7TDMI-S、ARM720T和ARM7EJ-S。T代表支持Thumb指令集,D代表支持片上调试,M代表内嵌硬件乘法器,I代表支持片上断点和调试点。 ARM9处理器采用改进型哈佛体系结构。采用五级流水处理及分离的Cache结构。常见的系列有:ARM920T、ARM922T和ARM940T。 Xscale是基于ARMv5TE体系结构,是一款性能全、性价比高、功耗低的处理器。支持16位的Thumb指令和DSP指令集。 Cortex,按传统的命名方法,Cortex可以看做ARM12。ARM公司推出了Cortex-A/R/M三个系列。 还有ARM9E、ARM11、MPCore、StrongARM等,略。 比较经典的是基于三星ARM9的S3C2440的开发板,这个系列的资料很多。还有基于三星ARM11的S3C6410开发板,可以跑android。 ARM体系结构的变种 Thumb指令集(T变种)是将ARM指令集重新编码形成的一个子集。常见的ARMv5T使用v2版的Thumb指令集。 此外,还有长乘法指令(M变种),增强型DSP指令(E变种),Java加速器Jazelle(J变种)和ARM媒体功能扩展(SIMD变种)。 二、开发流程 不管系统多么复杂,一般都是以最小系统为基础,通过加入所需的功能模块构成的。最小系统大概包括电源电路、时钟电路、复位电路、外扩的存储系统和调试接口。 1、硬件设计 首先要进行实验板硬件资源规划,例如在最小系统的基础上扩充I2C存储器、串行接口、网络接口、USB接口、触摸屏接口,以及按键、蜂鸣器等。 然后设计硬件电路,包括电源电路、复位电路、时钟微处理器电路、外部存储器电路电路、网络接口电路等等,这一部分貌似比较有难度。许多公司也都是出售组装好的开发板。 PCB的设计,要考虑到抗高频干扰、信号完整性、差分布线等。焊接好元件之后还要调试电路。 2、软件的移植与开发 软件系统的移植主要包括Bootloader的移植、Linux操作系统的移植(包括内核和文件系统的移植)以及针对实验板的驱动程序的编写等。 1)准备交叉编译工具 2)引导加载程序的移植(例如vivi、U-Boot) 3)内核的移植 4)根文件系统的移植 5)驱动程序的编写 6)其他,例如JTAG测试。 三、移植Linux内核 基本步骤为: 1)获取某一版本的Linux内核源码,根据具体目标平台对内核源码进行必要的改写,主要是修改体系结构相关的部分。 PS:显然,对内核源码的修改很有难度,它既要求开发者对Linux内核结构非常熟悉,对目标平台的硬件结构也非常熟悉,而且要有良好的汇编基础。这一部分的工作一般都是目标平台提供商完成的,而且主要的东西是ARM公司的工程师来完成,由他们提供相关版本的Linux内核的补丁,然后把补丁打到我们所用的Linux内核上,经过必要的配置和交叉编译就行了。所以说,内核的定制和改写难度很大,一般的软件工程师和硬件工程师都很难胜任。 2)打补丁,然后配置内核,调出内核配置界面,选上某些选项或者去掉某些选项,配置选项非常多,而且某些选项之间有关联,所以说这一步比较有难度。下面列出一些配置项,每个配置项都可以选择Y(将该功能编译进内核)、N、M(编译成可以在需要时动态加载的模块)。 Code maturity level options(代码成熟度选项) General setup(通用设置) Networkong deveices(包括很多子选项dummy net driver support,PLIP support,SCSI device support等) 3)编译内核,用几个命令就可以编译内核了。#make clean,#make dep,#make zImage。 4)移植根文件系统,内核编译完之后,可以运行各种命令并支持各种功能的中央处理器,但是如果缺少了内存、硬盘等设备也不能正常运行。根文件系统中存放了Linux系统所需要得各种程序文件,没有这些文件内核无法正常工作。同样,要移植根文件系统需要清楚Linux的运行机制,比较麻烦。所以一般都使用Busybox这个工具。安装配置Busybox,向Busybox添加命令,构造根文件系统,制作根文件系统映像文件(形如initrd.gz)。 5)使用U-Boot制作、下载内核。U-Boot支持uImage格式的内核文件。启动内核,然后使用U-Boot加载根文件系统映像。 四、开发环境的建立 一般宿主机推荐用Red Hat9.0,需要宿主机在硬件上有标准串口、并口、网口;软件上具有目标板的Linux内核、ramdisk文件系统映像以及Bootloader。软件的更新通常使用串口或网口,最初的Bootloader烧写是通过JTAG进行的。 首先要在宿主机上建立交叉编译调试的开发环境,许多开发板配有光盘能实现自动安装。用minicom作为被开发目标板的终端,开发前要正确的配置minicom。然后配置TFTP(简单文件传输协议),用于在目标板和宿主机之间传输文件。配置NFS,以便终端机能共享宿主机的文件。 实验1 编译Bootloader 很简单。一种常见的Bootloader是PPCBoot,另一种是vivi。 实验2 编译Linux内核 用几个命令就可以编译内核文件,编译后就要配置,配置稍微繁琐一点。但是每个选项在网上都可以找到相应的配置方法。 实验3 制作文件系统及程序的烧写 实验4 烧写各部分到目标板 实验5 交叉编译并运行简单程序 打开minicom开启实验板电源,挂载实验板。编译C语言的命令形如: /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -oHelloWorld HelloWorld.c 实验6 简单驱动程序的编写 编写一个简单字符设备的驱动程序。该程序非常简单,但是涉及到很多系统硬件的知识。if,for,switch,static,define这些关键字用得很多,也涉及到结构体,涉及到直接对地址的操作、位运算。涉及到物理设备,中断等一些知识。 其实,显而易见,驱动开发更靠近硬件一些,程序方面主要是熟练c语言就可以了。驱动开发的最大喜悦就是把物理设备给驱动起来的,并尽量使驱动不出问题,物理设备能够正常运行。
|