嵌入式开发总结
2012年01月11日


序:

    读大学时学过计算机组成原理、操作系统、计算机网络等等课程,但是大学生都知道,上完那些课只是懂一点皮毛而已,打打酱油就过去了。特别是对于软件工程师,一定要多实践、多思考才行。理论知识显得并没有搞硬件或者偏硬件开发的那么重要,因为软件的重点在于逻辑和算法。

    我认为,在中、高级阶段,偏硬莫非就是一种知识活儿,而偏软莫非就是一种体力活儿……只有到达专家阶段才能够有所突破。对比一下培训机构的软件开发和硬件开发的培训费用就知道了,一般的软件培训(JAVA/C++/PHP/C#),收费大概是一个月3000,强调是“一个月”,一般的培训都是2~6个月,所以总费用少则几千,多则上万。而嵌入式的培训费则是按天计算,1天大概500,强调是“1天”,一般的培训是一周,也有培训半年的,但是费用也相当高!由此可见,嵌入式的课程含金量很高。软件开发,特别是网站开发,比嵌入式辛苦多了。

    如果你两者皆不了解,那么我推荐你选择偏硬件的方向,实惠很多。综合其他前辈的经验,嵌入式开发是个不错的工作,应该比公务员都还好,而且比较适合女生,因为涉及很多知识,女生在这方面比较在行(善于学习)。但要学好大学里面的课程,比如数字逻辑、电路分析、微机原理、单片机等等,理论很重要。理论面前,男女平等。

    而软件工程师就业也很容易,这些天很火爆的消息就是“CSDN等网站被黑”,接踵而至的就是“传智播客创始人、中关村黑马程序员总负责人张孝祥老师急病突发意外逝世,终年38岁”,张孝祥何许人也?你可能不知道,但是对我来说却是如雷贯耳。就我知道的情况,目前黑马程序员训练营3个多月培训出来的学生,平均薪资大概8000,这里面有高中生,有大学生,也有研究生,但多数是大专或大学本科学生,具体薪酬在4500~15000之间,而且千真万确,我没有一点吹嘘。类似的培训机构还很多,尚观、达内、软通、安博、国信蓝点…………这个省略号还很长。软件开发的培训周期都在1~4个月之间,就业薪资至少都承诺3000以上,一般都在4000左右

    他们就业很容易,我理解。但是他们起薪就六、七千的,我就有些不淡定了。校园招聘,自己这么多个Offer,普遍开价都在3000~4500,上5K的公司就很少了,华为和腾讯校园招聘时开的工资才6000。同学的5K就已经让很多人羡慕……但是要淡定,一定要淡定,不要把工资看得那么重要。据我所知,传智播客的老师月薪2.5W以上,国信蓝点的老师也有1.2W,是否说明工资越多人就越幸福健康?作为传智播客的老板,张孝祥有钱吧,但是他却非常朴素、非常忙,曾经还跑去发传单……志向不同,追求不同。

    境界。我静下心来看书、做项目,我发现有些东西确实可以在短短两、三个月内学通,而且是无师自通。即使说今年做Linux C/C++开发,明年做JavaEE、Android开发,后年去做硬件开发、驱动开发,那都是没问题的。问题是,你喜欢做什么?你想要达到哪种境界?

 

嵌入式开发知识总结

一、基础知识

 

目前流行的嵌入式操作系统有:Linux、uC/OS、WindowsCE、VxWorks、PalmOS和QNX。其中VxWorks实时性很强,最稳定、可靠,但价格昂贵,而其他的都有各自的优点。

 

ARM公司(原名Advanced RISC Machine),主要是研发ARM系列微处理器(出售IP,即知识产权),目前全世界有几十家著名的半导体公司都使用ARM公司的授权,包括Motorola、IBM、Intel、SONY、LG等。ARM微处理器已成为RISC标准。目前基于ARM核的处理器有以下几种:

ARM7/9 Thumb家族

ARM9/10E家族

ARM 11家族

ARM Cortex家族

SecurCore家族

OptimoDE Data Engine家族

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 -o HelloWorld HelloWorld.c

 

实验6 简单驱动程序的编写

    编写一个简单字符设备的驱动程序。该程序非常简单,但是涉及到很多系统硬件的知识。if,for,switch,static,define这些关键字用得很多,也涉及到结构体,涉及到直接对地址的操作、位运算。涉及到物理设备,中断等一些知识。

 

其实,显而易见,驱动开发更靠近硬件一些,程序方面主要是熟练C语言就可以了。驱动开发的最大喜悦就是把物理设备给驱动起来的,并尽量使驱动不出问题,物理设备能够正常运行。