嵌入式开发总结
序:
读大学时学过计算机组成原理、操作系统、计算机网络等等课程,但是大学生都知道,上完那些课只是懂一点皮毛而已,打打酱油就过去了。特别是对于软件工程师,一定要多实践、多思考才行。理论知识显得并没有搞硬件或者偏硬件开发的那么重要,因为软件的重点在于逻辑和算法。
我认为,在中、高级阶段,偏硬莫非就是一种知识活儿,而偏软莫非就是一种体力活儿……只有到达专家阶段才能够有所突破。对比一下培训机构的软件开发和硬件开发的培训费用就知道了,一般的软件培训(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语言就可以了。驱动开发的最大喜悦就是把物理设备给驱动起来的,并尽量使驱动不出问题,物理设备能够正常运行。
![](http://files.cnblogs.com/files/zollty/zollty-git.gif)
- 作者:zollty(接收技术咨询和工作机会)
- 出处:http://www.cnblogs.com/zollty/
- 本文版权归作者和博客园共有,欢迎转载,但请在文章页面明显位置给出原文连接,否则视为侵权。
- 关于博主,85后程序员,擅长复杂分布式系统架构,中间件设计开发,关注效率/性能/稳定性。
- 对于自己,博文只是总结。在总结的过程发现问题,解决问题。
- 对于他人,在此过程如果还能附带帮助他人,那就再好不过了。
- 感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。