连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

2怎么学习嵌入式Linux操作系统

本文假设您是零基础,以实用为主,用最快的时间让你入门;后面也会附上想深入学习时可以参考的资料。在实际工作中,我们从事的是“操作系统”周边的开发,并不会太深入学习、修改操作系统本身。

① 操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序;

② 学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程序后,也会加深对操作系统其他部分的理解;

③ Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成。

但是,要成为该领域的高手,一定要深入理解Linux操作系统本身,要去研读它的源代码。

在忙完工作,闲暇之余,可以看看这些书:

① 赵炯的《linux内核完全注释》,这本比较薄,推荐这本。他后来又出了《Linux 内核完全剖析》,太厚了,搞不好看了后面就忘记前面了。

② 毛德操、胡希明的《LINUX核心源代码情景分析》,此书分上下册,巨厚无比。当作字典看即可:想深入理解某方面的知识,就去看某章节。

③ 其他好书还有很多,我没怎么看,没有更多建议

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

2.1、入门路线图

假设您是零基础,我们规划了如下入门路线图。前面的知识,是后面知识的基础,建议按顺序学习。每一部分,不一定需要学得很深入透彻,下面分章节描述。

2.2、学习驱动程序之前的基础知识

2.2.1、C语言

只要是理工科专业的,似乎都会教C语言。我见过很多C语言考试90、100分的一上机就傻了,我怀疑他们都没在电脑上写过程序。

理论再好,没有实践不能干活的话,公司招你去干嘛?

反过来,实践出真知,学习C语言,必须练练练、写写写!

当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;

当你写过几个C程序后,就可以进入下一阶段的裸机开发了。

① 不需要太深入

作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法操作,暂时就够了。指针操作是重点,多练习;

不需要去学习过多的数据结构知识,只需要掌握链表操作,其他不用学习,比如:队列、二叉树等等都不用学;不需要去学习任何的函数使用,比如文件操作、多线程编程、网络编程等等;这些知识,在编写Linux应用程序时会用,但是在操作系统特别是驱动学习时,用不着!永往直前吧,以后碰到不懂的C语言问题,我们再回过头来学习。

在后续的“裸机开发”中,会让你继续练习C语言,那会更实战化。

C语言是在写代码中精进的。

② 可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令

我们暂时没有提供C语言的教程,找一本C语言书,网上找找免费的C语言视频(主要看怎么搭建环境),就可以自学了。

2.2.2、PC Linux基本操作:

对于PC Linux,我们推荐使用Ubuntu,在它上面安装软件非常简便。

我们的工作模式通常是这样:在Windows下阅读、编写代码,然后把代码上传到PC Linux去编译。实际上,Ubuntu的桌面系统已经很好用了,我们拿到各种智能机可以很快上手,相信Ubuntu的桌面系统也可以让你很快上手。为了提高工作效率,我们通常使用命令行来操作Ubuntu。不用担心,你前期只需要掌握这几条命令就可以了,它们是如此简单,我干脆列出它们:

① cd : Change Directory(改变目录)

cd 目录名 // 进入某个目录

cd 。. // cd “两个点”:返回上一级目录

cd - // cd “短横”:返回上一次所在目录

② pwd : Print Work Directory(打印当前目录 显示出当前工作目录的绝对路径)

③ mkdir : Make Directory(创建目录)

mkdir abc // 创建文件夹abc

mkdir -p a/b/c // 创建文件夹a,再a下创建文件夹b,再在b下创建文件夹c

④ rm : Remove(删除目录或文件)

rm file // 删除名为file的文件

rm -rf dir // 删除名为dir的目录

⑤ ls : List(列出目录内容)

⑥ mount : 挂载

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt

mount -t yaffs /dev/mtdblock3 /mnt

⑦ chown : Change owner(改变文件的属主,即拥有者)

chown book:book /work -R // 对/work目录及其下所有内容,属主改为book用户,组改为book

⑧ chmod : Change mode(改变权限),下面的例子很简单粗暴

chmod 777 /work -R // 对/work目录及其下所有内容,权限改为可读、可写、可执行

⑨ vi : Linux下最常用的编辑命令,使用稍微复杂,请自己搜索用法。

要练习这些命令,你可以进入Ubuntu桌面系统后,打开终端输入那些命令;或是用SecureCRT、putty等工具远程登录Ubuntu后练习。

2.2.3、硬件知识

我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。对于正统的方法,你应该这样学习:

① 学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。

② 学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。

③ 《模拟电路》?好吧,这个不用学,至少我在工作中基本用不到它,现在全忘光了。

就我个人经验来说,这些课程是有用的,但是:

① 原理有用,实战性不强。

比如《微机原理》是基于x86系统,跟ARM板子有很大差别,当然原理相通。

我是在接触嵌入式编程后,才理解了这些课程。

② 每本书都那么厚,内容都很多,学习时间过长,自学有难度。

针对这些校园教材的不足,并结合实际开发过程中要用到的知识点,我们推出了《学前班_怎么看原理图》的系列视频:

学前班第1课第1节_怎么看原理图之GPIO和门电路.wmv

学前班第1课第2.1节_怎么看原理图之协议类接口之UART.wmv

学前班第1课第2.2节_怎么看原理图之协议类接口之I2C.wmv

学前班第1课第2.3节_怎么看原理图之协议类接口之SPI.wmv

学前班第1课第2.4节_怎么看原理图之协议类接口之NAND Flash.wmv

学前班第1课第2.5节_怎么看原理图之协议类接口之LCD.wmv

学前班第1课第3节_怎么看原理图之内存类接口.wmv

学前班第1课第4.1节_怎么看原理图之分析S3C2410开发板.wmv

学前班第1课第4.2节_怎么看原理图之分析S3C2440开发板.wmv

学前班第1课第4.3节_怎么看原理图之分析S3C6410开发板.wmv

即使你只具备初中物理课的电路知识,我也希望能通过这些视频,让你可以看懂原理图,理解一些常见的通信协议;如果你想掌握更多的硬件知识,这些视频也可以起个索引作用,让你知道缺乏什么知识。这些视频所讲到的硬件知识,将在《裸板开发》系列视频中用到,到时可以相互对照着看,加深理解。

2.2.4、要不要专门学习Windows下的单片机开发

很多学校都开通了单片机的课程,很多人都是从51单片机、AVR单片机,现在比较新的STM32单片机开始接触嵌入式领域,并且使用Windows下的开发软件,比如keil、MDK等。

问题来了,要不要专门学习Windows下的单片机开发?

① 如果这是你们专业的必修课,那就学吧

② 如果你的专业跟单片机密切相关,比如机械控制等,那就学吧

③ 如果你只是想从单片机入门,然后学习更广阔的嵌入式Linux,那么放弃在Windows

学习单片机吧!理由如下:

① Windows下的单片机学习,深度不够

Windows下有很好的图形界面单片机开发软件,比如keil、MDK等。

它们封装了很多技术细节,比如:

你只会从main函数开始编写代码,却不知道上电后第1条代码是怎么执行的;

你可以编写中断处理函数,但是却不知道它是怎么被调用的;

你不知道程序怎么从Flash上被读入内存;

也不知道内存是怎么划分使用的,不知道栈在哪、堆在哪;

当你想裁剪程序降低对Flash、内存的使用时,你无从下手;

当你新建一个文件时,它被自动加入到工程里,但是其中的机理你完全不懂;

等等等。

② 基于ARM+Linux裸机学习,可以学得更深,并且更贴合后续的Linux学习。

实际上它就是Linux下的单片机学习,只是一切更加原始:所有的代码需要你自己来编写;哪些文件加入工程,需要你自己来管理。在工作中,我们当然倾向于使用Windows下更便利的工具,但是在学习阶段,我们更想学习到程序的本质。一切从零编写代码、管理代码,可以让我们学习到更多知识:

你需要了解芯片的上电启动过程,知道第1条代码如何运行;

你需要掌握怎么把程序从Flash上读入内存;

需要理解内存怎么规划使用,比如栈在哪,堆在哪;

需要理解代码重定位;

需要知道中断发生后,软硬件怎么保护现场、跳到中断入口、调用中断程序、恢复现场;

你会知道,main函数不是我们编写的第1个函数;

你会知道,芯片从上电开始,程序是怎么被搬运执行的;

你会知道,函数调用过程中,参数是如何传递的;

你会知道,中断发生时,每一个寄存器的值都要小心对待;

等等等。

你掌握了ARM+Linux的裸机开发,再回去看Windows下的单片机开发,会惊呼:怎么那么简单!并且你会完全明白这些工具没有向你展示的技术细节。

驱动程序=Linux驱动程序软件框架+ARM开发板硬件操作,我们可以从简单的裸机开发入手,先掌握硬件操作,并且还可以:

① 掌握如何在PC Linux下编译程序、把程序烧录到板子上并运行它

② 为学习bootloader打基础:掌握了各种硬件操作后,后面一组合就是一个bootloader

2.2.5、为什么选择ARM9 S3C2440开发板,而不是其他性能更好的?

有一个错误的概念:S3C2440过时了、ARM9过时了。

这是不对的,如果你是软件工程师,无论是ARM9、ARM11、A8还是A9,对我们来说是没有差别的。一款芯片,上面有CPU,还有众多的片上设备(比如UART、USB、LCD控制器)。我们写程序时,并不涉及CPU,只是去操作那些片上设备。

所以:差别在于片上设备,不在于CPU核;差别在于寄存器操作不一样。

因为我们写驱动并不涉及CPU的核心,只是操作CPU之外的设备,只是读写这些设备的寄存器。之所以推荐S3C2440,是因为它的Linux学习资料最丰富,并有配套的第1、2期视频。

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

2.2.6、怎么学习ARM+Linux的裸机开发

学习裸机开发的目的有两个:

① 掌握裸机程序的结构,为后续的u-boot作准备

② 练习硬件知识,即:怎么看原理图、芯片手册,怎么写代码来操作硬件

后面的u-boot可以认为是裸机程序的集合,我们在裸机开发中逐个掌握各个部件,再集合起来就可以得到一个u-boot了。后续的驱动开发,也涉及硬件操作,你可以在裸机开发中学习硬件知识。

注意:如果你并不关心裸机的程序结构,不关心bootloader的实现,这部分是可以先略过的。在后面的驱动视频中,我们也会重新讲解所涉及的硬件知识。

推荐两本书:杜春蕾的《ARM体系结构与编程》,韦东山的《嵌入式Linux应用开发完全手册》。后者也许是国内第1本涉及在PC Linux环境下开发的ARM裸机程序的书,如果我说错了,请原谅我书读得少。

对于裸机开发,我们提供有2部分视频:

① 环境搭建

第0课第1节_刚接触开发板之接口接线.wmv

第0课第2节_刚接触开发板之烧写裸板程序.wmv

第0课第3节_刚接触开发板之重烧整个系统.wmv

第0课第4节_刚接触开发板之使用vmware和预先做好的ubuntu.wmv

第0课第5节_刚接触开发板之u-boot打补丁编译使用及建sourceinsight工程.wmv

第0课第6节_刚接触开发板之内核u-boot打补丁编译使用及建sourceinsight工程.wmv

第0课第7节_刚接触开发板之制作根文件系统及初试驱动.wmv

第0课第8节_在TQ2440,MINI2440上搭建视频所用系统.wmv

第0课第9节_win7下不能使用dnw烧写的替代方法.wmv

② 裸机程序开发

第1课 环境搭建及工具、概念介绍.wmv

第2课 GPIO实验.wmv

第3课 存储管理器实验.wmv

第4课 MMU实验.wmv

第5课 NAND FLASH控制器.wmv

第6课 中断控制器.wmv

第7课 系统时钟和UART实验.wmv

第8课 LCD实验.wmv

要声明的是:

录制上述《裸机程序开发》视频时,本意是结合《嵌入式Linux应用开发完全手册》的《第2篇 ARM9嵌入式系统基础实例篇》来讲解,所以视频里没有完全从零编写代码,需要结合书本来学习。

① 书和视频并不是完全配套的,不要照搬,其中的差异并不难解决。

《嵌入式Linux应用开发完全手册》发表于2008年,使用了很多款开发板,并且那时的开发板配置较低(Nand Flash是64M);《裸机程序开发》视频使用JZ2440开发板录制。

② 书和视频,适用于所有S3C2440开发板,包括mini2440、tq2440等

天下S3C2440配置都是相似的,基本也就是LED、按键所用引脚不同,LCD型号不同;你学习了书、视频,如果连这些差异都搞不定的话,那就是你我的失败了。

学习方法是这样的:

① 先看《环境搭建》视频来搭建开发环境

② 书(第2篇)和视频(裸机程序开发)结合,看完一章,练习一章,一定要编写代码,即使是照抄也要写。

③ 如果对于ARM架构相关的知识,觉得模糊或是想了解得更深入,参考《ARM体系结构与编程》。

学习程度:

① 理解一个裸机程序的必要结构:异常向量、硬件初始化、代码重定位、栈

② 知道如何操作GPIO、Flash、LCD、触摸屏等硬件

③ 很多人觉得MMU难以理解,可以放过它

(未完待续。..)

还在为学习单片机入门吗,想知道您现在学习单片机,在未来对从事的工作有用吗?

您是否还在埋头苦学windows系统下单片机开发?

首先了解是否去学习,然后就是如何去系统、科学地学习单片机、嵌入式?

与韦东山一起学习ARM+Linux裸机,带您学习更深入、更广阔的嵌入式Linux!

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

本课程配套专享服务:

* 清晰详细的学习计划,可按需选择性学习,提高效率。

* 课程qq群全程在线辅导,快速响应式答疑。

* 每周设置挑战任务,检测学习效果。

* 与好学的同频人一起成长

点击“阅读全文”立即报名ARM裸机1期视频实战!

如果您正在学习单片机,或者刚刚接触嵌入式linux,对代码编程知识不了解,可以先预习一下C语言、Java课程。

· 嵌入式linux C语言快速入门

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

· 嵌入式linux java语言快速入门

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开

连载 | 系统学习Linux+Android:如何高效学习ARM+Linux的裸机开