Embedded Linux 入门有感

前言

Embedded Linux 是自我学习过程中, 走的最不顺的一条路.
而学习android和python时, 基本自学一个月左右, 就能开始独立做项目了.
应该说, Embedded Linux的入门确实比较困难一点.

自己是从底层往上走的, 系统的学过硬件, 嵌入式, 操作系统,
但在没有具体项目要求的情况下, 学习Embedded Linux的过程充满了痛苦和不解, 始终没有坚持下来.

如今, 打算再次开始系统的学习Embedded Linux, 因而在此记录一下之前的学习感受, 分析一下困难之所在, 并制定好学习规则和方式.

为何困难

linux上手困难

对新手而言, linux的学习曲线很陡峭. 相信刚上手的话, 如何安装软件, 如何使用编辑器都是问题!

一个, 二个问题或者一层二层问题, 还能较为容易的解决. 但面对蜂拥而至的疑问和困惑, 能坚持下去就很不容易了, 何况途中还充满了陷阱和争论.

随便举几个例子:

  1. 用哪个版本的linux好? Ubuntu? Feroda? Redhat? CentOS? 服务器版? 桌面版? 然后图形界面居然还分 KDE/Gnome…
    为了弄清上面这个问题, 看看文章, 翻翻论坛, 结果就是更迷糊了… 甚至忘了初衷是要奔着 Embedded Linux 去的啊!

  2. 我的硬盘分区呢? 去哪里找文件呢? 文件权限的概念等等. (linux下一切皆文件!)

  3. 用哪个文本编辑器好? 大家都会说Vim, 然后和vim斗就能斗你一个月, 结果还是自己败下阵来, 回归熟悉的文本编辑器!

  4. bash shell 是精华啊, 不能不学! 得, 捧着鸟哥的私房菜, 随便翻翻也得几星期才知道个大概吧…
    (学习指令时, 需要有工作路径这么一个概念. 知道这个指令现在在哪里工作, 是非常重要的一个概念!)

  5. 唉呀妈呀, 好不容易装好了虚拟机, 装好了精挑细选的linux版本. 尝试装软件了! 一阵搜索, 还算顺利. 突然出了个依赖关系错误…
    耐着性子google, 百度, 似乎略微看懂了一二, 就是在装这个软件之前, 需要另外一个软件的特定版本么.
    尝试用安装指令装另外一个软件, 居然这个软件不存在了!!! 继续? 还是放弃?
    我继续过, 翻墙, 找到软件源码. 还要自己编译? 编译还要装编译软件… 彻底放弃…

缺乏合适的入门书籍

市面上大多数的Embedded Linux入门教程只讲应该如何做, 不说基础知识, 不讲前因后果.
读起来枯燥无味, 索然无趣. 学起来一头雾水, 不知其所以然.

譬如很多教程会详细的写出, 第一步, 第二步, 第三步… 但经常的, 只要系统环境稍微变化一点点(如linux版本不同, 软件版本不同), 上述的步骤就会失效.
喜欢刨根问底的我就开始纠结这些第一步, 第二步, 第三步到底再干吗? 为什么按照自己的理解在新的环境下就不工作了?
而遇到这些具体的困难时, 如何解决困难真的是一头雾水. 教程书籍类基本不会讲你可能遇到的问题! 基本只能到网络上去找解决办法…然后就是进一步的困惑…

而更专业的书籍根本不适合入门者去阅读, 那都是对特定领域进行深入分析学习的! 过早的接触自己完全不懂的东西, 只会打击学习的积极性.
譬如推崇度很高的鸟哥的私房菜, 实际是一本很好的运维方面的书籍, 用它来初学bash shell就太重了.
可以看一下鸟哥自己的经历, 就能明白了 Linux 的學習曲線,一個老人家的建議!
体验最深的就是这句了: 只要一出现问题, 自己完全无法解决时, 只好重新安装, 选择设定与书本教的内容完全一模一样, 不过即使如此, 很多时候仍然会遇到问题

因此, 建议自己通过网络和书籍总结归纳一下最基本的指令和用法, 加之自己的理解, 做成笔记. 一来帮助记忆, 二来便于日后查阅.
但不用刻意的去背这些东西, 要用的时候知道去哪里查阅就可以了, 用多了既然就记住了.
在真正深入学习后, 觉得有需要自然会更有针对性的选择专业书籍来看!

这样, 才能避免淹死在知识的海洋里!

缺乏硬性目标:

之前都是跟着教程的自学, 属于漫无目的的囫囵吞枣, 学到哪忘到哪.
然后, 缺乏硬性目标最大的问题就是: 容易放弃!
因为遇到的困难太多了, 在没有硬性目标的情况下, 不断的打击最终导致的就是放弃!

如果能定一个最终目标, 譬如基于开发板做一款视频识别系统, 那在学习过程中就会有侧重点.
这样对问题的处理就能起到抓大放小, 不纠结于所有的细节. 在解决实际问题的过程中, 逐步深入学习linux.

解决之道

个人认为, 学习linux, embedded linux的终极解决之道就是定下一个硬性目标, 有这么一个压力在的话, 在学习过程中不断试错, 一知半解都不是问题!

正所谓有压力才有动力! 回到鸟哥的个人经历, 见Linux 的學習曲線,一個老人家的建議!.
正是有项目压力的情况下, 才能忍受无数次的重装系统, 才能忍无可忍痛下决心系统的学习linux(此时已经不是初学者了, 知道了很多基础, 也知道自己想解决什么问题!)
在此压力下, 搭建环境的过程就不会过于纠结我到底在干吗? 为什么要这么做?的困惑; 使用编辑器时, 也会直接挑个最顺手的用着再说; shell的使用也会因为时间压力只学最基本的.

初期, 在一定要完成这个硬性目标, 在不求甚解, 能用就好的心态下, 至少能帮助自己摸一遍linux, 知道一个大概的流程和遇到的问题.
这样也能很大程度上避免自己陷入到底用哪个linux版本好, 用哪个桌面系统好, 用哪种编辑好的争论中! 在不知道具体需求的情况下, 这些都是无意义之事!
这个时期, 坚持学下来, 用下来, 就是胜利! 工具的选择上, 顺手的, 上手快的就是好的!

然后, 在完成一二个项目后, 虽然心中的疑惑越积越多, 但潜移默化中, 已经对linux有了相当程度的理解, 常用指令也都会用了!
此时, 再根据自己的具体疑惑去查阅更专业的书籍, 更系统的学习, 其效果会远好于上来就拿着本专业书籍看!

自我要求

我目前的情况也不能算linux初学者, 但也确实没有在embedded linux下开发的经验.
自己的感觉是, 虽然对某些方面还一知半解, 但背景知识的储备已经够了, 是时候定个小目标, 完成系统的学习了!
毕业已10年, 我学习linux的初学期和倦怠期也着实太长了一点… 好在, 任何时候开始都不晚么.

陆续了解过的背景知识有: linux基础概念, ubuntu的基础使用, bash shell, 硬件原理图, 嵌入式C开发, 操作系统原理, 阅读linux0.11源码.
总的来说, 感觉自己就差临门一脚… 能坚持做一二个项目后, 自己就有能力做嵌入式linux开发了.

  • 定个小目标: 跟着教程, 在2440开发板上, 完成音视频对讲功能. 细分为实现摄像头功能, 搭建服务器, 实现可视对讲功能.
  • 开发环境搭建: 最困难的就是环境搭建, 走了很多弯路, 不过目前已经走通了.
  • 不求甚解: 学习过程中, 注意连续性, 有些专业知识先不求甚解, 有个基础概念, 简单做下笔记即可. 如makefile的书写, 编译器原理等等.
  • 勤做笔记: 好记性不如烂笔头. 我相信即便linux高度使用者, 能记住的也就几条常用指令. 自己做好笔记就便于日后查阅, 做笔记的同时也加深了印象!

原创于 DRA&PHO