嵌入式入门学习笔记7:[转] 一位过来者的经验分享

嵌入式入门学习笔记7:[转] 一位过来者的经验分享

学嵌入式就像练一门武功一样,要想成为一个高手,首先要打好基础,磨刀不误砍柴工,说的就是这个道理。嵌入式系统涉及到硬件、底层驱动、操作系统以及应用程序各个方面,在系统学习之前,先把基础打好,后面的学习将事半功倍。如果前面的打不牢,今天学点这个,明天学点那个,看到别人学得有声有色,自己貌似折腾了半天,啥也没学会。很容易受到打击,半途而废。


举个简单的例子,同样是练乾坤大挪移,明教教主阳顶天撑死了也就练到第四层,最后走火入魔,惨死在光明顶的隧道中。而张无忌只练了几个时辰,就练到了最高层第六层(第七层该武功发明人也没有练成)。为什么呢?就是因为张无忌内功深厚,有九阳神功护底。有了好的基础和内功,再学习其它招式,那是信手拈来,不费吹灰之力。
对于有志于嵌入式系统开发的新手来说,同样需要深厚的基础和内功,那就是对计算机体系结构和原理的理解,C语言的掌握。对于嵌入式开发来讲,C语言绝对是必须要掌握的。
计算机运行的基本原理、存储的概念
程序的编译、连接、生成
内存的堆栈、代码分布
指针的高级使用、链表、动态内存的使用、内存泄露的概念
都是必须要掌握的,如果你对这些不熟悉,没搞明白,就直接兴冲冲地买个开发板,一遍喊着,我要努力,我要奋斗,然后开始了嵌入式之旅,折腾了一个月,按照教程走了一遍,你发现你仅仅是做了一遍,不懂的还是不懂,而不是真正掌握了嵌入式的精髓。
所以说,在学习嵌入式之前,一定把C语言搞精通,一定要把C语言搞精通,一定要把C语言搞精通,一定要把C语言搞精通,重要的话说三遍,我已经说了4遍,可见C语言的重要性。


学完了C语言,接着就可以练练ARM的裸机编程,买个开发板,将ARM的模块程序都跑跑,自己改改,增加一些功能。注意,不能所有的模块都跑一遍,这不是个好方法,时间精力有限,可以挑自己感兴趣的几个模块。关键是理解程序的运行原理,通过模块的程序理解ARM的编程方法、控制方法、中断的使用、寄存器的配置使用。这个才是你最终要学到的效果。


掌握了裸机编程,接着就可以玩玩操作系统了。操作系统也是一门比较难理解的课程,尤其对于非计算机类的,可以看看一些操作系统的经典书籍如塔利班母的操作系统设计与实现,挺好,知道任务调度、内核抢占、多任务等基本概念后,可以找个简单的操作系统学习:比如uc/os,代码也就5500多行,但是其完整实现了一个操作系统的基本要素。试着将该操作系统的最新版本源代码移植到你的arm开发板上,然后,试着编写一个多任务程序。等到了这一步,你基本上对操作系统的多任务编程以及进程间通信有个大致的了解了。接着你就可以玩重量级的Linux了。


不要一上来就看内核,看网上推荐的那些大砖头书,看得云里雾里,看来一个月不知道再讲些什么,陷入其中无法自拔,想要放弃,甚至开始怀疑人生,这时候估计你也开始对自己的智商产生了怀疑,觉得自己不是干这块的料。妈的,看了这么久,不知道在干什么。


任何一个复杂的东西都是由简单组成的。我们学习也是这样,一个东西,对它的理解也要遵循有简单到复杂,由表及里的一个认知过程,学习Linux也是这样。首先,我们要学会怎么用?学会Linux的基本命令,打包文件、系统管理等日常操作学习,这些可以看看鸟哥的Linux私房菜,针对初学者的教程,很好。掌握了Linux的使用,接着就可以学习Linux下的C语言应用编程。看到这里,估计很多有嵌入式驱动情怀的同学,肯定会说:NO!我想学驱动,我想搞驱动。其实,驱动开发只是嵌入式开发很小的部分,驱动开发的测试,我们也需要应用程序编写来测试,而且只有掌握了应用程序的编程,你开发驱动时才能更好地与应用成进行交互。所以这一步肯定不能省,这里可以参考Unix环境高级编程,经典的一本书。


驱动开始了!高能量
也许很多做嵌入式开发的都有一种情怀,那就是必须搞驱动,只有搞驱动,才算真正的嵌入式开发。其实在实际工作中,驱动开发的工作需求很低的,我说的是真正的驱动开发,大部分都是做维护和优化的工作。真正做驱动开发的也就是芯片原厂,他们在芯片研发成功后,会一直LinuxAndroid系统在上面,开发驱动,然后做成解决方案,卖给手机厂商。手机厂商基于这个软硬件平台方案做二次开发。而原厂这些驱动开发真正自己写驱动的也很少,大部分IP都是购买的,IP厂商提供了一些列解决方案。举个简单的例子:GPU驱动。一个芯片原厂在研发一个芯片前,一般会到IP厂商去买GPUip,集成到自己的芯片上,IP厂商在提供这个IP的同时,还会提供各个操作系统下的驱动源码,这样,其实真正开发驱动的很少,不是开发不出来,而是时间不允许。所以,驱动开发的实际需求很少。
这时候很多有驱动情怀地可能比较失落了,其实也没必要。现在芯片厂商越来越多,驱动职位也是很多的。外设、模组很多职位也是很大的需求。关键是:嵌入式真正产生价值的地方不一定是在驱动!
现在随着物联网、智能硬件的火热,无线通信、设备与设备之间的连接,才是真正产生价值的地方。整个系统的嵌入式开发,打造一款智能的点子产品,才是产生核心价值的地方。所以说,聪明的人将会往整个方向上开始去储备能量了。如果你能使用一款arm平台,连接到物联网上,比如QQ最近推出的QQ物联,给你的arm平台设备申请一个QQ,加你为好友,然后你跟你的设备聊天,整个流程走下来,你会发现你对嵌入式整个系统的理解远远比你单纯做一个模块的驱动、配配寄存器深刻得多。
当然还有很多方向,比如内核的虚拟化,云计算开发、嵌入式系统的低功耗、系统稳定、多核编程、系统优化都属于嵌入式系统开发的范畴,不一定非得做驱动。

 

做驱动开发,首先必须对内核机制有个大致的了解。因为驱动程序中经常会用到操作系统内核的一些机制:比如内核同步、中断、多任务、进程间通信等。这时候不要求看内核源码,至少知道内核提供的这些API接口,驱动如何使用。另外,驱动的调式方法也是必须掌握的,在实际工作中可以根据实际需要多到网上搜搜。

 

当你驱动做了几年,对内核的API使用熟悉之后,就可以对内核机制的实现原理进行深入探讨了。这时候看内核源码的实现,综合比较各种机制与策略的优劣,甚至提出优化的方法和构想,恭喜你,你已经向内核开发迈进了。

我的步子也是迈得太大,其实在工作中不可能等你所有的东西都掌握完才让你去做。很多时候都是用到什么学习什么,这时候弊端就出来了,如果前期没有一个基础知识,大致的理解,一下子去接触一个非常复杂的东西,会比较迷茫,可能看了一个月还是没有什么头绪,会非常打击人的自信心,会觉得自己不适合干这个。对于学生来说,有大把的时间去学习;对于工作的来说,根本没有太多的时间给你去充电。这个时候一般就是考验人的学习能力和个人价值的时候了。工作的时候,首先多向前辈指教,这里我说的不是技术上的实现细节,而是方向的问题。然后就是用到什么机制就恶补了:比如,一个驱动里面可能用到一个同步的机制和函数,这句代码可能很短,你可能一晃而过,没有注意。但是有可能就是这个函数起了很大的作用,这时候就得逮着这个函数不放,深入下去,研究其机制,一般半天应该就知道个大概。一次类推,坚持下去。等你把这个驱动里用到的所有机制等搞清楚了,再看其他的代码会发现越来越轻松。

 

关于开发板的选择
很多人学习嵌入式,一开始就开始纠结使用那块开发板,其实对于一个新手来说,我觉得先打好基础,然后再玩开发板。很多人都是一时豪情万丈,买来开发板,然后对嵌入式最小系统、系统启动原理、操作系统基本概念还不懂的情况下,直接开始折腾,通过论坛、QQ群让系统跑起来再说。其实在折腾的过程中,很多原理还是浮于表面。比如jtag工具,是什么原理?烧写过程?Linux启动的大致过程,如果通过打印信息判断系统运行到哪一步了?是u-boot阶段,还是kernel阶段?还是文件系统挂在阶段?是什么模块出问题了?有什么好的调试手段?
前期的学习我觉得,使用虚拟机就足够了。很多人没有明白学习嵌入式学习什么?开发板只是一个平台而已,我们要学习的就是Linux下的C编程,驱动编程,Linux的机制和编程方法在哪个平台都是适用的,为什么非要在嵌入式开发板上呢?而且环境搭建比较繁琐,交叉编译等,而虚拟机直接就可以编译,运行。有人可能会说,那就不是arm了啊,不是嵌入式了啊?其实嵌入式平台不仅仅包括arm,还有IntelX86结构的atom平台,即阿童木。还有MIPS平台,比如龙芯开发板,还有PowerPCArch等。所以,找个合适的平台,掌握嵌入式编程的精髓,然后跨平台。而不是一开始,纠结于一个开发板,受了很多打击,到最后发现玩不转,然后就扔在了一遍攒灰。我在博客上daydayblog会开始写一些关于嵌入式的教程,希望能与后来人多多交流,对大家有所帮助。

posted @ 2018-12-06 18:30 一直走向深渊的迷途羔羊 阅读( ...) 评论( ...) 编辑 收藏

你可能感兴趣的:(嵌入式入门学习笔记7:[转] 一位过来者的经验分享)