菜鸟分享嵌入式Linux驱动开发学习路线与心得(一)
发布时间:2022-09-27 15:10:45 所属栏目:Linux 来源:
导读: 大家好,这里是一只Linux驱动开发菜鸟,自学加网课零星加起来有将近一年的嵌入式Linux驱动学习经验,除了掌握一些Linux驱动编程基础知识和开发相关的理论知识外,也对嵌入式Linux驱动有了较为清晰的认识,所以把
|
大家好,这里是一只Linux驱动开发菜鸟,自学加网课零星加起来有将近一年的嵌入式Linux驱动学习经验,除了掌握一些Linux驱动编程基础知识和开发相关的理论知识外,也对嵌入式Linux驱动有了较为清晰的认识,所以把这半年来学到的知识点、我自己对嵌入式Linux驱动的认识、我自己学习Linux的路线、以及最重要的两点: 1.学嵌入式Linux驱动需要有什么知识储备? 2.学完嵌入式Linux驱动的工作方向是什么? 都在这个专栏中一 一总结出来,一是给自己一个复习整理知识脉络的机会,二是分享给想要入坑或者刚刚入坑的小白们,三是希望大神能指出我文章中错误或者不够准确的点。 今天分享的第一篇心得,主要通过Q&A的方式解答我能想到的,或者我也迷茫过的一些问题(如果仍然没能解答大家的疑惑,欢迎在评论区留言),具体的知识点会在专栏中后续更新的文章里分享出来。 1.什么是嵌入式? 看到这个问题你是不是有立马退出的冲动?毕竟多少专业课书籍开头都是用这种章节来水字数的 [狗头]。 别担心,这里只是对嵌入式相关进行一个简单的介绍linux 驱动,目的是让初学者搞清楚:我学这玩意能干啥? 嵌入式系统的概念就在它的名字里了,也就是嵌入在某个硬件里的系统。一般来说,它和我们使用的电脑系统、手机系统等功能庞杂的大型系统比较,最大的特点就是它针对性很强。 举个例子:在电脑或者手机上,我们可以浏览网页、使用QQ/微信、玩游戏(弱弱问一句:有玩死亡细胞的吗?——这里划掉),功能十分丰富。而在嵌入式,比如运动手表、车载媒体、车载GPS、数字电视等产品中,功能就十分有针对性了。 所谓嵌入式Linux,它用到的依然是Linux系统,只不过有时候会对拿到的Linux源码进行一定的处理(比如内核裁剪)之后,植入到嵌入式硬件中,这种就叫嵌入式Linux。 2.学习嵌入式是不是只能往驱动方向发展? 当然不是。 所谓嵌入式Linux,就是运行在嵌入式相关硬件中的Linux系统,所以同样地具有用户层、内核层。不同层都会有不同的开发需求。 在嵌入式Linux系统中,往上有应用程序功能开发和界面设计,往下有内核编程相关的驱动开发。(再往下就偏向硬件工程师方向了,当然,现在驱动开发和硬件工程的知识体系,二者交集好像越来越大了。) 3.学习嵌入式Linux需要的基础知识,以及要学的知识有哪些? 这个不用想都知道很重要,毕竟Linux驱动开发就是基于C语言的。这里主要是想稍微引出“编程规范”这个概念。Linux下规范了一定的编程风格,比如函数名和变量名的大小写、函数体和结构体大括号所在的位置,宏定义的正确使用(比如使用do{}while(0)保证宏定义不会因为在使用中缺少括号而出错) 但其实我看很多人写的Linux代码都不是很规范,但我感觉规范一点总是好的,严于律己嘛! 比如: 操作系统相关知识(可以去稍微看一点相关资料); Linux系统的基本使用(比如基本命令行、vim的使用) ——这里想说,我感觉vim对我这种菜鸟来说,就是提升逼格用的,毕竟大神用的都是vim,但我还是想说,比起vim那么多复杂的命令,gedit是真好用,因为它和Windows系统下文本的操作基本一样。(不过我也有练习vim的基础使用方法) 虚拟机的使用(我用的VMware) 这里是Linux驱动开发很重要的基础,涉及到的知识点如:各种锁、同步与异步操作、中断与时钟、内存操作等。 这里的知识点比较抽象、枯燥且繁杂,学习的时候稳住情绪,不要因为诸如“太难/太枯燥我学不下去了”、“怎么还没到正文”、“学这些有什么用”这样的心态而乱了阵脚。别慌,坚持下去。 这里涉及到的知识点有: Linux内核模块相关(因为驱动就是一种内核模块); Linux文件系统相关(在Linux下,一切皆文件,甚至连设备都是文件); 三种基本的驱动设备(字符设备、块设备、网络设备); Linux驱动的基本架构(这里是重中之重,搞明白了这里,才能对Linux驱动开发有明确的认识)——这里会学到一种虚拟总线platform; 常用的总线(USB、I2C、SPI等)在Linux内核中的抽象。(说白了就是用一堆结构体定义了总线的结构,用这些结构体来进行总线驱动开发); 对于想要尽快做出些什么产品功能的你,看到这儿是不是终于松了口气?——终于到开发了!(我当时就是这种感觉) 最终的开发其实就是基于如上我提到的那些知识储备的,同时不知道你注意到没,我上面写的是“Linux驱动正文”,而不是“嵌入式Linux驱动正文”,说明什么?说明这二者是互通的,不太负责任地讲,电脑上的Linux系统,和嵌入式里的Linux系统,写代码的方式基本是一样的,区别在于嵌入式Linux会与更多的硬件打交道。 所以说,在进行嵌入式Linux开发中,可能会经历如下工作内容: 移植系统(用开发板来举例):如果拿到的是一个没有烧录系统的开发板,那么就要通过一些步骤,完成Linux系统的烧录。 读原理图:那些硬件说白了就是通过电路连接在总线上的,那么总线自己的结构图、挂接在上面设备的原理图都是稍微要懂一些的。 设备树文件:上面提到的各种总线,以及总线上挂载的各种设备,被.dtb文件组织成了设备树的结构,目的是用比较明朗的结构、比较少的代码来告诉系统当前接入的设备都有哪些。(系统中有最基本的设备树文件,我们需要做的就只是把我们自己的设备用规定的语法添加在设备树文件中) Makefile文件的编写 驱动代码编写 驱动模块的加载、卸载和调试 总结: 我只是列举出了我暂时能想到的一些点,虽然看起来很零碎,但好在一些书籍、视频、开发手册都是以某些科学的顺序将知识点归纳起来的,所以别怕。另外关于书籍我想多说一点:这里不是推荐Linux驱动开发的书,毕竟这些书网上一大堆,我想说的是,学习不要只拘泥于一本书,不要期待只通过一本书就学完Linux驱动的所有知识点,可以多准备几本Linux驱动的书,然后学习时专注于其中的一本书,同时也别忘了在学习遇到障碍时多去参考其它的书——这真的会让你的学习过程事半功倍!我深有体会! 结尾:这篇文章只是梳理了一些问题和知识点脉络,接下来的文章我会开始分享我的笔记,包括:在学习中整理的知识点,以及我自己对这些知识点的理解。有兴趣的小伙伴可以持续关注一下,我们互相学习,共同进步! (编辑:百客网 - 域百科网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐


