嵌入式Linux——学习经历

简介:

        本文主要介绍我学习嵌入式的经历。并结合自身的经验希望可以对大家有所帮助。

视频及教材:

        郭天祥相关视频及教材,天狼星相关视频及教材,野火迷你相关视频及教材以及韦东山100ask官网所介绍的视频及教材

个人简介:

        我的本科学校是一个很普通的二本,研究生也是二本。我找的是一个规模中等的公司(我个人对这份工作还是比较满意的)。而我所面试的公司也是做嵌入式Linux相关的产品。好了我的基本情况就介绍到这里了。而详细的情况我会在下面说明。

我的大学——忙碌而充实:

        因为我所做的与单片机相关的项目都在大学时,而在研究生期间我主要研究的是量子相关的课题,所以这里我重点介绍我的大学。

        我的大学是一个很普通的二本。有时候大家可以会觉得他是一个专科,因为他是以学院命名的。而对于刚进大学的我嵌入式是一个我从来没有接触过的概念,更没有想到我的后半生都会与嵌入式相关。那时的我并没有明确的目标,只是想着要好好学习老师课上所讲的内容,而那时也是我最天真的时候。那时我所做的很多事都是因为其他人也在做,而没有真正去了解我真正想要的是什么,更没有认真的想过我的大学应该怎么过。

        这样的日子维持了一年,在这一年中我虽然也很忙碌但是回想自己走过的路,却发现并没有留下任何的痕迹。而真正出现转机是在我大二国庆节期间,那时候的我无所事事,但好的一点是我有几个要好的朋友。我们在一起聊天的时候他们聊到了自己所焊接的电路板,自己所搭建的电路,以及自己所设计的功能模块。这些都是我以前所没有接触过的。那一时刻,我突然意识到虽然我完全听不懂他们在说什么,但是感觉可以自己设计电路来实现某种特殊的功能对我来说似乎很有吸引力。所以那时候我决定要加入这个组织——第二课堂。

        不得不说第二课堂开启了我对这个世界新的认识,同时也感谢第二课堂为我提供了那么好的平台来学习各种嵌入式相关的知识。现在想想在第二课堂的两年我都觉得收获满满。我刚进第二课堂时还没有学习单片机,而是利用各种电子元器件和简单的芯片来实现一些简单的功能电路。而我们使用最多的就是NE555芯片了。虽然现在已经忘了这些芯片的功能,但是那段时间的练习却真正的让我学到了很多模电数电方面的知识,以及对各种芯片引脚和各种电子元器件的识别。这段时间一定要感谢我的好朋友礼标和吴老板。

        我接触的第一个单片机是stc89c51,也就是大家常说的51单片机。而这个单片机让我了解到,原来我们可以通过一种编程语言来控制一个机器的电平变化。而不是我在以前焊接电路板时,只能使用简单的逻辑电路搭建简单的功能。在这里,他的功能得到了足够的扩展。而51单片机的两个重点:中断和定时器,这两样功能让我十分幸喜,因为我意识到我可以使用这两个功能来完成很多的设计了。而那时的液晶屏更是让我意识到我可以将自己想表达的意思或者监控的数据显示到我的机器上了。这是多么愉快的事情(那时总是因为一些简单的功能而幸喜,而现在回想当初的行为确实有些幼稚)。依然记得当时自己用液晶在屏幕上显示内容时的高兴。

        这个之后我还用51做了很多好玩的东西,例如LED矩阵:

        学完51单片机,我就开始学习ATmage16(AVR)单片机。这个单片机还是对寄存器进行操作的,不过相对于51来说AVR的速度确实快了很多,而且功能也更加的强大。例如在引脚的模式选择方面就比51多了好几个。而其他的中断以及AD等更是51所不能及的。因此我在那段时间用AVR做了很多好玩的东西。而这期间我用这个单片机做过一个小冰箱:

        这个冰箱在当时炎热的夏季,给我们带来了不少欢乐。而我使用到的就是一个单总线的温度传感器,其将温度测出并实时的在数码管上显示,而关于温度的控制部分,我本来打算用pwm来控制电源的开关以实现控制温度的目的,但是并没有完成这部分功能,而这部分的功能我用到了后面做智能风扇中。

        而做完冰箱我做了一些更有趣的项目——智能小车,这个智能小车有三个功能:循迹,避障和蓝牙遥控。我将这三部分功能融合到一起,通过手机蓝牙选择使用哪个功能。而这里的循迹和避障功能我使用网上的红外发送和接收模块通过检测红外线是否接收到来确定是否遇到黑线或者碰到东西,从而做出反应。而对于蓝牙遥控功能,我直接使用蓝牙模块通过串口连接以实现蓝牙数据传输。这里有一个循迹的图:

        做完小车之后我感觉自己对ATmage16芯片有了一定的了解,这时候我画了一个ATmage16最小系统的板子:

        确实只有自己画了板子,才对这个芯片有一个更深入的理解。同时也可以对外围部件以及各个部件的尺寸类型有更好的了解:

        而学还习AVR有一个让我骄傲的地方就是我写了一些AVR模块的库,这个库对我十分重要,我在使用AVR后期进行编程时主要就是对这些库中的源文件和头文件进行调用。当你学会使用现有的库时,你会发现其实库调用是多么的方便。

        学完AVR之后我就开始学习stm32,对我来说32就像是一个新的大陆,之所以这么说不仅仅是因为32在性能方面远超51和AVR,而是因为32的编程方式是调用库进行编程的。在学习32之前我一直是针对寄存器进行编程(当然32也可以针对寄存器进行编程)。而寄存器编程的特定就是你要很好的了解你所编程的单片机,也就是说你要对单片机的各个引脚及接口功能都要十分的熟悉。而对于32单片机来说就相对简单,比较适合对硬件不是很熟悉的人。也就是说就算你对寄存器的操作方式不是很熟悉也可以对32单片机进行编程。因为32单片机是一个可以调用库进行编程的。由于32单片机的很多功能都已经被前辈写好,并将其封装成库。而我们只需要调用某种功能在库中的API接口就可以了。因此使用32单片机对我们来说是一个质的飞跃。同时也让我们了解了对库中API接口调用的重要性。这将帮助我以后学习嵌入式Linux打下基础。

        我用32做的是我的毕业设计,对于我所完成的功能,我使用自己当初毕业论文的简介:

        在没有家人在场的情况下,当老人不小心摔倒而且没有能力进行自救时或者老人遇到其他的突发危险而现场没有家人帮助时,如果没有及时得到救治或者帮助,这很可能会导致老人瘫痪甚至威胁老人的生命安全。在这种情况下,我们采用集三轴加速度和三轴陀螺仪于一体的MPU6050模块对老人是否跌倒进行监测。当老人跌倒时,以STM32为核心的中央控制系统将会向周围人发出发出声光警报。如果老人有能力自己站起来,可以自行解除警报。当老人没有能力自己站起来时,装置将在警报响起10 S后通过GSM模块将从GPS模块获得的经纬度信息以短信形式发送到指定联系人。该指定联系人可以通过智能手机搜索得出老人的地址。而且本装置还有一键SOS功能,当老人碰到其他危险且没有能力自救时,可以通过按下SOS按键直接将自己的地理信息通过短信形式发送给指定联系人。

        而作品的实物图为:

        好了,做完上面的设计,我的大学也就画上了完美的句号。在此我要感谢几个人,是他们在我做嵌入式的路上指导和帮助我,并为我提供各种便利。首先要感谢的是第二课堂的汪老师,可以说第二课堂的学生能有今天的成就在很大程度上要感谢汪老师,是汪老师为我们提供第二课堂的教室,并在学习的路上指导我们。而第二个要感谢的就是我的同学,吴老板和礼标,是他们在我当初学习嵌入式时不断指引我,并帮助我学习了很多的知识。而第三个要感谢的是我的师兄:林耕风。他对我以后在嵌入式方向上的提高给了很多好的建议。同时他也是一个热爱着技术,并对生活充满激情的人。他是我很敬佩也很向往的人。好了,接下来要开启的是我的研究生生涯了。

我的研究生——迷茫中前行:

      我在研究生期间主要的课题是量子通信,而与嵌入式的关系并不是很大。而对于嵌入式的很多知识我是自学的,这里就要感谢韦东山老师的视频以及开发板,韦东山老大的开发板和视频很详细的为我们讲解了Linux在2440开发板上的运行、移植以及驱动的编写。这里还要感谢我表哥和我的同学吴老板,是他们在我当初迷茫的时候为我指引方向。

      如果用一个词来形容我的大学,我会用充实来形容,因为在大学期间我的目标明确,同时也会很有效的将自己的时间用到学习中。而对于我的研究生,我想跟多的是迷茫。初入研究生学校对很多新鲜的事物充满好奇,那时的我以为自己还可以像大学时一样有一个实验室,然后自己在其中做一些喜欢的项目。但是真实的研究生生活并不是我想象的那样,我的导师的研究课题是量子方向,因此我要学习量子的知识,而这方面知识的学习对我来说压力很大。因为在大学时我更多的时间是在实验室度过的。所以我的理论知识并不好,尤其是物理(但真正的学习下来,自己还是收获颇丰,同时也为自己在一个新的领域开启了一扇门,而相对于其他的来说,更重要的是我在这段时间证明了自己的学习能力,我发现如果你用心去学一门知识,其实也并不是那么的困难)。同时我发现我的实验室并不是我想象的实验室,我的实验室里没有示波器,没有可控电源。那时候的我十分失落,虽然比较失望但是我并没有就此放弃。在思考了一段时候之后我觉得学习Java,因为Java在那时比较火,同时也不需要任何的硬件,只要你有电脑就好了。因此我开启了Java的学习之路。现在想想那时候学的东西,似乎都已经忘记,但是那时候对于生活的态度还是很好的。我虽然不能改变我导师的方向,那么我就用课余时间去学一些东西来弥补这份失落。我记得我用GUI界面做了一个飞机大战的游戏。同时也学习了HTML,并在我女朋友生日的时候copy并修改别人的网页来为他庆生。

      我修改的网页已经找不到了,但是修改前的网页还在,这个网页是动态的,简洁但是漂亮。

      学了很多Java的知识但是总觉得心中空落落的,我知道我所学习的东西并不系统,同时也不是从底层开始做起,所以做起事来总觉的心中没有把握。同时我发现现在学习Java的人太多了,同时也发现Java似乎是每个人都可以学习的,是无门槛的,那么我的核心竞争力在哪里?这是我当时问自己的一句话,我也希望大家可以常问一下自己,你的核心竞争力是什么?

      而这时我与我哥以及吴老板的电话改变了我的学习路线。我在电话中问他们也是问自己:我应该学习什么?我的兴趣点又是什么?我要高于其他人的门槛是什么?我发现我还是对嵌入式有感情。我还是想学习有底层的东西,这样我觉得学的踏实。同时我发现学习嵌入式Linux是需要门槛的,并不是每个学过单片机的本科生就可以学习。所以我从研二的时候开始学习嵌入式Linux,而从此开始了我的嵌入式Linux之路。而也开始了我对系统的了解。我以前的博客所介绍的就是我在研究生期间学习嵌入式Linux的学习笔记和心得。

找工作——一点优势就是很大的距离:

      由于我还是学生,所以我参加的是校招,而相对于社招,校招就简单了很多。而这时你相对于其他人一点的优势,其实你就跟他拉开了很大的距离。就像我在前面所说的门槛。

      做技术的校招大多数分为下面几个步骤:

            宣讲会——》笔试——》技术面试——》HR面——》发offer

      在各位参加宣讲会之前我想大家就对自己要应聘的岗位十分熟悉了吧。如果不熟悉你可以在宣讲会时了解也不晚,但是大致的方向应该是清楚的,例如你是要做嵌入式还是要做算法,或者是做图像你应该清楚吧。而在选择岗位时你就会发现,其实平时多学一些东西还是十分重要的,因为平时多学一些东西,那么你的选择范围就相对广一些。而宣讲会时的提问就很重要了。因为回答你问题的很可能是你的部门主管,同时也可能是你面试时的面试官,所以你要在提问时让他对你有一个好的印象十分重要。所以你在提问时要有针对性,要在你的问题中体现了你在这个方向上有了一些了解,并且很想继续学下去,而他应聘的置位正好适合你,例如你要应聘嵌入式驱动工程师岗位,你可以这样提问:您好,我是学习嵌入式Linux驱动的,目前我学习了一些驱动的框架,例如输入系统和usb驱动。我想问咱们公司在驱动上主要做那个方向?上面的问题体现出了两点,第一你确实学习了嵌入式驱动的一些知识,同时你也表示你对这个职位感兴趣。

      宣讲会之后就要笔试了,而笔试其实更多的时候是在考大家的基础,或者说是一个细节。这就要看你平时编程时是不是细心了。而对于做嵌入式驱动的岗位有时候还会考你一些简单的汇编,所以希望你在平时用汇编编程时注意一些。这里我要强调的一点就是你要在这个试卷上体现出你确实学过一些知识,也就是通过你的答案让阅卷的人知道你是他要找的(阅卷的人很可能就是要面试你的人)。例如你会碰到对寄存器中位操作的试题,对于很多人可能就是简单的使用指针对寄存器中位进行操作,而这个时候你在指针声明前加一个voliate关键字就很不一样了,阅卷的人以看就知道你不仅会这道题,同时也知道你确实写过驱动相关的代码。而在笔试中另一个要注意的地方就是当你碰到不会写的程序时,写下你的思路,这个很重要。有时候阅卷人就是要看到你的思路。而对于写出程序的题,你同样要写出思路,这样可以让阅卷人更好的了解你的思路,同时这也体现了一个好的程序员的素养。

      笔试完就要通过你的笔试内容来决定是否通知你参加面试了。而技术面就要检验大家平时的学习成果了,技术面其实更多还是喜欢问你做过什么样的项目。如果你有一些项目经验,那么你就有加分项了。因为面试官很喜欢有项目经验的人,如果你没有项目经验那么你就要向面试官证明你的学习能力很强了。而这个时候面试官的问题有时候会很难(因为他会问很多学习中的细节,以及知识点的细节)。还是那句老话,在技术面时不要不懂装懂,因为对你面试的人都是这方面的牛人,他们对这方面的知识十分熟悉,所以你会什么答什么。不会的不要乱说 。要保持谦虚。

      如果你通过了技术面试,那么可以很荣幸的通知你,你被录取的几率就很大了,因为到HR面试时,主要就是来谈工资了。

 

  • 25
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
学习嵌入式Linux开发时,可以按照以下脉络进行学习: 1. 了解嵌入式系统基础知识:首先,了解嵌入式系统的基本概念和特点,了解硬件平台、操作系统和应用程序之间的关系,以及嵌入式Linux系统的组成部分。 2. 学习Linux基础知识:掌握Linux的基本命令行操作和文件系统管理,了解Linux的目录结构、文件权限和用户管理等。这是嵌入式Linux开发的基础。 3. 学习交叉编译和工具链:了解交叉编译的概念和原理,学习如何配置和使用交叉编译工具链,以便在主机上开发和编译嵌入式Linux应用程序。 4. 掌握Linux内核原理和驱动开发:深入学习Linux内核的原理和结构,了解设备驱动的开发流程和机制。学习如何编写和调试设备驱动程序,以及如何将驱动程序集成到Linux内核中。 5. 理解嵌入式Linux系统启动过程:学习嵌入式Linux系统的启动过程,包括引导加载程序(Bootloader)、内核启动、根文件系统挂载等。了解嵌入式Linux系统的启动流程对于系统的调试和优化非常重要。 6. 学习嵌入式Linux应用程序开发:掌握使用嵌入式Linux平台上的开发工具和库函数开发应用程序。学习如何编写多线程程序、网络编程、文件I/O等常用的嵌入式Linux应用程序。 7. 了解嵌入式系统的性能优化和调试技巧:学习如何对嵌入式Linux系统进行性能优化,包括内存管理、CPU占用、IO等方面。掌握常用的调试工具和技巧,如GDB调试器、性能分析工具等。 8. 实践和项目开发:通过实践和参与项目开发,巩固所学知识。可以尝试构建一些嵌入式Linux应用程序或者参与开源项目,锻炼编程能力和解决问题的能力。 记住,学习嵌入式Linux开发需要不断地实践和深入理解系统原理,同时也需要不断地学习和跟进新的技术和发展趋势。祝您在嵌入式Linux开发的旅程中取得成功!如果您有具体的问题,随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值