在线课堂:https://www.100ask.net/index(课程观看)
论  坛:http://bbs.100ask.net/(学术答疑)
开 发 板:https://100ask.taobao.com/ (淘宝)
     https://weidongshan.tmall.com/(天猫)
交流群一:QQ群:869222007(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
交流群二:QQ群:536785813(单片机-嵌入式)
公 众 号:百问科技


版本 日期 作者 说明
V1 2020 韦东山 适用于嵌入式Linux初学者

我在100ASK_IMX6ULL售后群里,发现很多初学者只有单片机基础,甚至没有单片机基础。在学习Linux时,对很多概念比较陌生,导致不知道学什么,也不知道学了之后有什么用。

从事嵌入式Linux培训12年来,我们写过很多《关于如何学习linux》的文章,这是最新的,本文将不断更新。

  • 新学习路线、视频介绍、资料下载(免费视频):
    https://www.100ask.net/detail/p_5f18007de4b0df48afbcd477/6

  • 嵌入式Linux应用开发基础知识(免费视频):
    https://www.100ask.net/detail/p_5f338ae3e4b075dc42ad44a1/8

  • 嵌入式Linux驱动开发基础知识(免费视频):
    https://www.100ask.net/detail/p_5f1aa2dde4b0df48afbd775f/8

  • 嵌入式Linxu实战项目(免费视频):
    https://www.100ask.net/detail/p_5f181e8fe4b0df48afbce201/8

第1章 单片机和Linux的区别

1.1 有哪些产品使用单片机或Linux

  • 所有的电子产品,所用技术都可以认为要么是单片机,要么是Linux;GUI方面主要是QT/Android,它们都是运行于Linux之上的。
  • 也许你不服!不是还有ucos、vxwork、wince、IOS吗?下面这个图是关于操作系统的占比,是2016年的,我没找到更新的图,但是很有参考意义:
  • 我们说的单片机不使用操作系统,在上图中没有体现出来。但是使用单片机设备肯定远远超过Linux。很多人也是先学习单片机,从单片机进入电子工程师行业
  • 日常生活中,有哪些产品使用单片机、Linux呢?下面举一些例子:
  • 我们设计一个产品时,是使用单片机还是Linux,取决于成本:硬件成本、软件成本、维护成本、升级成本。而不应该根据个人偏好来选择:我喜欢单片机,所以就排斥使用Linux;我喜欢Linux,就排斥使用单片机。为了有更多的选择,我们需要既懂单片机,又懂Linux。

1.2 在硬件操作上单片机和Linux是类似的

  • 以点灯为例,
    无论是单片机还是Linux,我们要做的事情都一样:
  1. 看原理图,确定引脚是哪一个,确定它输出什么电平才可以
  2. 看芯片手册,确定要怎么操作寄存器
  3. 写程序

但是,怎么编写程序,单片机和Linux有很大不同。

1.3 在单片机中点灯、使用LCD

  • 使用单片机开发程序时,我们一上来就写一个main函数,下面是一些简化的代码:
  • LED程序里面的init_led、led_on、led_off函数是你一个人写的,爱取什么名就取什么名,爱怎么写就怎么写。
  • LCD程序里的函数也是你写的,完全是自由发挥。
  • 很多单片机项目不是很复杂,2、3个人从上到下统统搞定,里面的函数大多时间是直接去读写寄存器。
  • 很多单片机项目严重依赖于硬件,换一个芯片后怎么办?重写一套代码呗。
  • 在单片机程序里,没有应用程序、驱动程序的概念,很可能一个人包揽了硬件设计、模块调试(或称之为驱动)、功能开发(或称之为应用)的全部活。

1.4 在Linux中点灯、使用LCD

  • 在Linux中,不允许应用开发人员直接去操作硬件,比如你想点个灯,不好意思,你无法直接访问寄存器;你需要通过驱动程序来访问寄存器。
  • 为什么?有几大原因:
  1. Linux系统中运行着众多程序,必须保证质量差的程序无法破坏系统
    假设你写的程序比较烂,那我不能让你去随便访问寄存器,把系统搞崩溃了怎么办?你本意是去点灯,但是你看错了寄存器,你把电源关了怎么办?

    所以这些操作硬件的活,还是交给信得过的人来做吧:交给驱动工程师,他既懂硬件又懂软件。

  2. 保证程序的可移植性
    编写应用程序时,大家都使用统一的函数,以后换一个芯片时,应用程序不用变;只需要根据这个接口提供驱动程序就可以了。

  3. 团队协作
    使用Linux系统的项目一般比较大,术业有专攻,一个人不太可能从上到下都全部掌握。比如做人脸识别项目,有擅长做图像处理的,他可不管你要用多少种摄像头,有图像给他就可以。而多种摄像头的硬件操作方法各有不同,这些交给驱动程序工程师。

  • 所以,在Linux中应用程序和驱动程序是分开的。

  • 以LED、LCD程序为例,简化的代码如下:

  • 也许你已经大概猜出来了,应用程序怎么调用驱动程序?通过标准的接口:

  1. open
    打开驱动程序。
  2. read/write
    读、写数据。
  3. ioctl
    传入各种参数,获得各种参数。
  4. mmap
    内存映射,比如映射之后,应用程序可以直接读写LCD的显存。
  • 你看!从这些接口里,我们根本看不到寄存器的操作。底层的程序驱动会根据这些调用,去设置寄存器、操作硬件。
  • 所以,我高大上的应用工程师,干嘛苦哈哈地去看原理图、看在片手册、读写寄存器,搞不好还要去调试硬件BUG。这些脏活、累活就交给驱动工程师吧。客户的需求千变万化,我996时间都不够用了。
  • 我上懂软件、下懂硬件的驱动工程师,肯定不能把这么重要的活交给你去做了,把我的系统搞崩溃了怎么办。
  • 开玩笑、开玩笑、开玩笑的,有应用工程师、驱动工程师的优劣之分,大家都是为了做出产品。现在有一个趋势,一个任务从上到下你都需要懂,这就是所谓的全栈工程师。
  • 还是以LED为例,应用程序和驱动程序的协作如下图所示:
  • 在Linux中,“一切皆文件”,要访问某个硬件,也是要打开文件、读写文件。应用程序要根据标准的文件接口:open/read/write/ioctl/mmap等来访问驱动程序。
  • 既然如此,怎么写驱动程序呢?最简单的方法就是:APP要调用open来打开驱动程序,那驱动‘程序里就提供一个xxx_open函数来初始化硬件;APP要调用write来写数据,驱动程序里就提供一个xxx_write函数来接收数据并操作硬件。
  • 用xxx_open、xxx_write来构成一个驱动程序,这就是驱动框架。
  • 怎么实现这些xxx_open、xxx_write函数?我们要做的事情跟单片机是类似的,一样要去看电路图、看芯片手册,然后在这些函数里读写寄存器:这称为硬件操作
  • 所以,Linux驱动程序= 驱动框架 + 硬件操作。
  • 有单片机基础的人,对硬件操作比较熟悉了,把重点放在驱动框架上就可以。
  • 高能预警:驱动框架可不简单,对于LED来说是简单,但是还有更复杂的驱动程序,它要考虑“通用”,这很要命。

第2章 嵌入式Linux快速入门

  • 这几天在群里跟学员聊天,有一位学员的学习方法很好:先观其广,再究其深。有时候要“不求甚解”,很多时候保持疑问先学下去,这些疑问就自然解决了。
  • 比如课程中涉及汇编知识,如果你要彻底弄清楚,你需要去学习《ARM架构与编程》;当你学完这本书,你的同学搞不好已经可以上手工作了。

2.1 短期的目标是什么

  • 我们先把学习目标定下来:快速了解嵌入式Linux开发的流程,知道要学什么,具备跟从业者交流的能力。

2.2 一个嵌入式Linux系统的组成


  • 下面我们用类比和逻辑推导出嵌入式Linux系统的组成,没错,“推导”。
    从上图可以知道:
  1. 组成
    嵌入式Linux系统
    = bootloader + linux内核 + 根文件系统(里面含有APP)。

  2. bootloader
    它的目的是启动内核,去哪等读内核?读到哪里?去Flash等外设读内核,存到内存里去。所以需要有Flash里外设的驱动能力,为了调试方便还会有网络功能。

    所以,可以认为 booloader = 裸机集合,它就是一个复杂的单片机程序。

  3. Linux内核
    Linux内核的最主要目的是去启动APP,APP保存在哪里?保存在“根文件系统”里。“根文件系统”又保存在哪里?在Flash、SD卡等设备里,甚至可能在网络上。所以Linux内核要有这些Flash、SD卡里设备的驱动能力。

  • 不仅如此,Linux内核还有进程调度能力、内存管理等功能。
  • 所以:Linux内核 = 驱动集合 + 进程调度 + 内存管理等。

2.3 要学习bootloader吗

  • Bootloader有很多种,常用的叫作u-boot。
  • 在实际工作中,对于u-boot基本上是修修改改,甚至不改。但是u-boot本身是很复杂的,比如为了便于调试,它支持网络功能;有些内核是保存在FAT32分区里,于是它要能解析FAT32分区,读FAT32分区的文件。
  • 花那么多精力去学习u-boot,但是工作中基本用不到,这对初学者很不友善。
  • 所以,对于初学者,我建议:理解u-boot的作用、会使用u-boot的命令,这就可以了
  • 如果你的工作就是修改、完善bootloader,那么再去研究它吧。

2.4 要学习Linux内核、要学习驱动程序吗

  • 之前我们说过Linux内核 = 驱动集合 + 进程调度 + 内存管理等,如果要学习Linux内核,从驱动程序入手是一个好办法。
  • 但是人人都要学习Linux内核、人人都要学习Linux驱动吗?显然不是。
  • 作为初学者,懂几个简单的驱动程序,有利于工作交流;理解中断、进程、线程的概念,无论是对驱动开发、应用程序开发,都是很有好处的。
  • 所以对于初学者,建议前期只学习这几个驱动:LED、按键、中断。
  1. LED驱动程序
    这是最简单的驱动程序。

  2. 按键驱动程序
    它也比较简单,从它引入“中断”

  3. 中断
    从“中断”它可以引入:休眠-唤醒、进程/线程、POLL机制、异步通知等概念。这些概念无论是对驱动开发,还是对应用开发,都很重要。

  • 所以,对于初学者,我建议必须学习这几个驱动:LED、按键、中断。
  • 入门之后,如果你想从事内核开发、驱动开发,那么可以去钻研几个驱动程序(输入系统、I2C总线、SPI总线等),掌握若干个大型驱动程序后,你对内核的套路就有所了解了,再去研究其他部分(比如进程管理、文件系统)时你会发现套路是如此通用。
  • 摄像头(VL42)、声卡ALSA驱动是Linux中比较复杂的2类驱动,它们是很难的,如果工作与此相关再去研究。

2.5,要学习Linux应用程序吗?先学一些基础技能

  • 要学,即使以后你只想研究内核,一些基本的应用开发编写能力也是需要的:
  1. 基本设备的访问,比如LCD、输入设备
  2. 进程、线程、进程通信、线程同步与互斥
  3. 休眠-唤醒、POLL机制、信号
  4. 网络编程
  • ①②③部分的知识,跟驱动有密切的关系,它们是相辅相承的。
  • 掌握了基本驱动开发能力、基本应用开发能力之后,在工作中你就可以跟别人友好沟通了,不至于一脸懵逼。

2.6,应用程序是怎么启动的?要了解一下根文件系统

  • 你辛辛苦苦写出了应用程序,怎么把它放到板子上,让它开机就自动启动?
  • 你写的程序,它依赖于哪些库,这些库放到板子上哪个目录?
  • 怎么做一个可升级的系统?即使升级中途断电了,也要保证程序至少还可以运行老的版本?
  • 这些都需要我们了解一下根文件系统。
  • 先了解一下init进程:它要读取配置文件,根据配置文件启动各个APP。
  • 了解了init进程,你就了解了根文件系统的组成,就可以随心所欲裁剪系统,为你的项目制作出最精简的系统。

第3章 学习方法

3.1,先不要打破砂锅问到底

  • 嵌入式涉及的东西太多太杂了,如果心里没有主线,碰到什么都要去研究个透彻,最终反而忘记自己要学什么了。
  • 嵌入式涉及硬件知识、软件知识,软件里涉及汇编、ARM架构、C语言、Makefile、Shell;又分为bootloader、内核、驱动、基本的APP、GUI。
  • 比如我们会用到Makefile,了解它的基本规则,会用我们提供的Makefile就可以。
  • 不需要深入研究那些make函数,因为在工作中都有现成的Makefile给你使用,不需要自己去编写一套Makefile。何必花上好几天去深入研究它呢?
  • 比如我们会用到bootloader,难道又要花上几个月来深入研究u-boot吗?工作中基本不需要改u-boot,会用那几个命令就可以。
  • 甚至有些学员先去买本shell的书来学习shell命令,何必?我们在视频中用到什么命令,你不懂时再去百度一下这些命令就可以了。
  • 不要脱离初学者的主线:应用基础、驱动基础。有了这2个基础后,你想深入研究某部分时,再去花时间吧。

3.2,思路要清晰,不怕抄代码

  • 视频里的代码,请你一定要自己去写一次、写多次。为什么我现在写驱动那么熟?我2009年在华清远见上课时,
  • 每次上课我都要给学生写一次那些驱动,十几次下来闭着眼睛都知道内核的套路了。
  • 记不住那些函数?我也记不住,我都是去参考同类的驱动程序,这又不是闭卷考试。
  • 但是要理清楚思路,你写这个程序要完成什么功能、怎么实现这些功能?这个要弄清楚。
  • 有了思路后再写代码,不知道怎么写?没关系,看看视频,看看示例,然后关闭视频看看能否自己写出来。

3.3,对自己的方向很了解,我只能带你到这里了

  • 我的专长是操作系统,是快速地带领大家掌握一些项目开发的基础知识。
  • 如果你决定深入研究某方面时,我并不能带你多久。你要去看源码,去看这方面的专业书籍。
  • 比如想深入钻研内核的内存管理时,它有页表映射(你需要阅读ARM架构的手册)、SLAB分配器、vmalloc/malloc实现、mmap实现、缺页中断、父进程子进程之间的页面管理等等,内容非常多。有时候连书籍都没有,你需要直接啃代码。
  • 当你想从事某个行业时,就需要深入研究行业相关的知识。
  • 比如CAN总线,它可以写成一本书:CAN协议、CAN报文、Socket CAN、车身网络拓扑结构,CAN应用报文,CAN网络管理报文,CAN诊断报文。
  • 想做物联网网关,需要深入研究MQTT,MQTT协议相对简单,但是MQTT英文原版协议有130多页,中文版有近100页,是一本小书了。
  • 每个行业都有自己的业务逻辑,在掌握基本的编程能力之一,你需要结合具体的业务去深入学习。

如何学习嵌入式Linux_韦东山相关推荐

  1. 牛人 就是这样锤炼出来的,中兴资深工程师,嵌入式专家韦东山是这样炼成的!

    导读 : 还在大学的你,不知道未来何去何从?都说迷茫是大事做不了,小事不想做.还在做程序袁的你,是不是也想创业?程序袁好创业吗? Linux好学吗? 学会了这个能找到咋样的工作?哎,老婆又生第2胎了, ...

  2. 【学习笔记】韦东山freertos直播学习笔记

    韦东山FreeRTOS学习 如果刚好有大佬看到发现笔记中有什么写错了的,欢迎大佬指点,我十分乐意受到大佬的指点哈哈哈,顺便我还想问一下csdn的编辑器有没有保存的快捷键啊,CTRL+S好像没有用啊. ...

  3. [光速QA][linux学习篇]基于韦东山I.MX6ULL pro开发板的学习笔记

    #前言: CSDN上已经有了太多的教程,我决定使用一种很新的方式记录自己的学习过程,如果对你有帮助就点个赞吧!一篇博文但是会长期更新(争取). 光速QA,希望面试官和面试者都可以给我这里找到灵感,如果 ...

  4. 用OpenJTAG烧写程序到Flash—— 韦东山嵌入式Linux视频学习笔记03

    说明:本文仅在Windows环境下实验. 韦东山的JZ2440(v2),可以选择从Nor Flash启动,也可以选择从Nand Flash启动,不管从哪里启动,都需要Flash上有程序,没有程序的话, ...

  5. 如何告别半途而废——韦东山嵌入式Linux视频学习笔记00

    今天终于从柜子里翻出了韦东山的板子--JZ2440(V2),又翻出了当时买板子赠送的光盘,是的,我又要重新学习了.其实说"重新"是不对的,我当初就没有学完,学到一半放弃了(惭愧啊) ...

  6. 作为一个新人,怎样学习嵌入式Linux ?(韦东山)

    作为一个新人,怎样学习嵌入式Linux ?(韦东山) 被问过太多次,特写这篇文章来回答一下.    在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看 ...

  7. 韦东山:嵌入式Linux学习路线图

    我是1999年上的大学,物理专业.在大一时,我们班里普遍弥漫着对未来的不安,不知道学习了物理后出去能做什么.你当下的经历.当下的学习,在未来的一天肯定会影响到你.毕业后我们也各自找到了自己的职业:出国 ...

  8. 开发板、Windows、Ubuntu三者互联——韦东山嵌入式Linux学习笔记08

    实验环境: 1. Windows7 2. VMware12.0+Ubuntu 3. JZ2440 按理说,在物理机上安装Ubuntu操作系统是比较推荐的方法.不过,因为windows上有很多好用的工具 ...

  9. win7下不能使用dnw烧写的解决办法——韦东山嵌入式Linux学习笔记05

    本文实验环境: 1. windows 7(64bit) 2. JZ2440 一. 问题的提出--没有驱动 假设板子的 Nor Flash 上已经烧好了 u-boot,那么如何通过 u-boot 的US ...

  10. 开发板的I/O在哪里——韦东山嵌入式Linux视频学习笔记01

    一般来说,串口就是开发板的I/O(输入输出)接口.我们可以通过串口向板子发送命令,也可以通过串口把板子的状态信息打印出来. 板载串口和PC的连接 如果板子上有串口,且电脑上也有串口,那直接用串口线相连 ...

最新文章

  1. type=InnoDB ENGINE=InnoDB
  2. 2020太湖杯 | Wp及复现
  3. php新闻列表页模块,PHP开发简单新闻发布系统之新闻列表页整体功能实现
  4. 数据库元数据数据字典查询_4_列出给定表的索引信息
  5. 我的第一份外包经历及所得
  6. 什么是OAuth 2.0
  7. c语言头文件 数学函数,头文件cmath中常用函数
  8. 基于 snowNLP的微博评论数据情感分析
  9. 【C语言】谭浩强C语言程序设计第五版135页例5.11译密码题的新解
  10. linux 命令行下载BT种子和磁力链接 ubuntu linux 命令行下载种子
  11. YAML文件格式详解
  12. 信息收集工具之hping安装和使用
  13. 离散数学 第一章 部分课后习题
  14. 计算机音乐谱大全告白气球,周杰伦《告白气球》钢琴曲谱
  15. 腾讯云:服务器资源池化技术发展趋势
  16. Blue Coat:打击移动领域的坏人
  17. 使用STM32进行Flash地址空间的数据读取
  18. stm32如何在官网下载标准函数库
  19. app测试——打印日志
  20. 7、LiveCharts--常用属性介绍(三)

热门文章

  1. 文件与Base64的互转
  2. 记账系统(java)
  3. 计算机在线应用不能安装,教您电脑为什么安装不了软件
  4. Dictionary 索引超出数组界限
  5. php 去除 css 格式,PHP清除html格式,去除html、css、js格式
  6. 2019支付版/聚合支付第三方支付/四方支付系统/提供技术咨询服务
  7. U盘刻录系统之后变小
  8. 在线教你图像分辨率怎么调整?
  9. cmder的下载和使用
  10. 现代操作系统 第三章 内存管理 习题