20天,入门嵌入式。难以想象的任务,以下是收集的一些资料,以作备份,供有兴趣的研究研究。
1.个人觉得, 主要还是要看个人的兴趣, 看你想向偏软方向还是偏硬方向发展了,向偏软方向的话建议首先看好C, 注意这个看好C,不是指语法层面的, 基本的C语言语法相信一般都没任何问题了. 更重要的是C的编译器是怎么工作地,一个程序编译好后,各项资源是怎么分配的,堆栈是怎么分配的,以及连接器是怎么工作的等等等等, 因为做嵌入式是直接和硬件打交道, 所以需要明白自己写的程序是放在内存的哪里的,运行时各种变量是放在哪的,堆栈是放在哪的,大约要使用多少堆栈.建议有时间看看编译原理, OS原理也是必看的,不过不要一上来就想弄LINUX,这个说实话是不大现实的,LINUX太大了
可以先看看原理的东西,比如说实时OS是什么,进程调度算法有哪些,文件系统是怎么回事等等,然后找个小的OS玩玩,比如UCOSII,然后再上LINUX吧
如果是偏硬的方向,那数电是必须学好的,当然最好能学学CPLD/FPGA,这个在嵌入式系统中也很有用,还有,要学会分析时序,学会看datasheet,不然对着各种器件的时序图和几百页E文datasheet你会很郁闷.
以上是我个人在学嵌入式系统时的体会, 希望可以解除部分网友的疑问.
2.看你打算给哪些设备做嵌入式开发。
比如手机和掌上电脑。智能手机和掌上电脑采用了Symabian、Linux、Palm和WindowsMobile系统。而且目前绝大多数手机都支持Java(国产不算,目前支持Java的太少,无法恭维)。
Symabian是手机上的,诺基亚的最多,使用C/C++来开发。
Linux嵌入现在用的也很多。手机上主要是摩托罗拉在用。Linux下的嵌入主要是C/C++。
Palm接触比较少,我记得也是使用C/C++开发的。
WIndowsMobile就不用说了,Microsoft的产品。现在可以使用Microsoft.NET平台开发。推荐C#语言。
Java可以使用在各种智能手机和非智能手机上,如果你想开发这个,多学学JavaME。
入门比较容易的是JavaME和WindowsMobile。
3.很多人问嵌入式Linux入门如何入,这个答案是很多了。
嵌入式Linux到底是干什么?
1.是编译编译几个GUI?
2.是写写几个应用?
3.是编译编译内核?
4.是做做rootfs?
5.是写写驱动?
6.是写写bootloader?
7.是画画原理图?
8.是搞搞芯片设计?
可以这么说,这些都是,但也可以说都不是。
你要想搞偏软的,至少要从7往上做起,当然这个原理图并不要求你来画,只要能看懂就行了。
你要高偏硬的只要从8做到5就可以了。但是入门的话,不要一开始就搞什么内核分析,呵呵。这样的话,保证你3年都入不了门。要偏软的选择,可以有这么几个起点:如果从7~5方面,至少你要熟悉CPU的体系结构,这样你才能知道为什么BOOTLOADER需要怎么写,驱动为什么要这样写,flash要怎么样才能正常操作。如果从4~1,几本上,你不能算做是一个嵌入式开发的。但是首先你也要了解内核的特性,这些就用不到内核里面到底是怎么工作的了。如果是从8~7,呵呵,你几本上算搞硬件的。这个,我可是不熟悉,就不唧唧歪歪了。大家看了,想想自己想干什么吧。呵呵。当然人人都想自己软硬通吃,但是比较困难,说不定你是个天才。
4.看书《Linux Device Driver,2rd Edition》《Linux Device Driver,3rd Edition》有电子版下载。
若对linux系统不是特别了解,最好还是先熟悉一下Linux环境,例如:背熟基本指令,了解权限观念,目录结构,基本技巧(TAB补全、历史记录等),常用软件(vi、tar等)。初学者可以利用VMware虚拟机安装Linux系统,学习从源码制作内核,安装交叉编译工具链,因为驱动程序经常要与内核和工具匹配。熟悉内核配置,makefile脚本,GCC扩展语法,(可选:AT&T汇编写法),gdb调试方法等。因为驱动要用到GCC扩展功能,有时还要编译到内核。基本熟悉以上内容后,就可以开始学习驱动开发了。Linux将一切看成“文件”,设备分成字符设备、块设备、网络设备三种。应主要了解文件和设备驱动是如何联系在一起的,文件操作如何对应驱动操作,重要的数据结构,三种设备之间的区别和实现机制,了解read、write、ioctl的用法等。更近一步,学习同步、异步、多数据源阻塞等高级内容。
课堂上最容易问到的问题是内存操作,物理/逻辑地址转换,如何分配大块内存?如何分配DMA内存?在中断里如何分配内存?如何关联内核态和用户态内存?...实际使用中,内存部分是个地雷阵,出错最多。其实,驱动开发的大部分内容是内存变来变去,理解了内存处理,驱动就不太难写了。驱动中的延迟和定时操作调用相应API,注意效率和精度即可。中断操作尽量短,少部分重要操作在中断里完成,大部分内容放在tasklet延迟队列中稍后处理。这是商业化驱动中可能用到的内容。USB驱动在Linux中支持得很完备,嵌入式相关部分参看OHCI、EHCI。加上读卡器,连SD卡也支持了。要不说学Linux值呢!Framebuffer是关于视频部分的内容,大多数使用硬件加速器,需要厂家支持。
综上,驱动开发不难,但是内容比较多,需要较长时间学习,而且实践操作非常重要。买个2410开发板(社区已有移植好的Linux源码),找人一起学是个捷径。

