姓名:黄楠琳 学号:19020100011 学院:电子工程学院
转自:https://blog.csdn.net/weixin_41213648/article/details/87895929
【嵌牛导读】本篇文章简单介绍了如何学习嵌入式Linux操作系统
【嵌牛鼻子】嵌入式Linux
【嵌牛提问】 怎么学习嵌入式Linux操作系统?
【嵌牛正文】
1 操作系统介绍
①操作系统具有进程管理、存储管理、文件管理和设备管理等功能,这些核心功能非常稳定可靠,基本上不需要我们修改代码。我们只需要针对自己的硬件完善驱动程序
②学习驱动时必定会涉及其他知识,比如存储管理、进程调度。当你深入理解了驱动程序后,也会加深对操作系统其他部分的理解
③Linux内核中大部分代码都是设备驱动程序,可以认为Linux内核由各类驱动构成。但是,要成为该领域的高手,一定要深入理解Linux操作系统本身,要去研读它的源代码。
2 学习驱动程序之前的基础知识
2.1 C语言
只要是理工科专业的,似乎都会教C语言。当你掌握基本语法后,就可以在电脑上练习一些C语言习题了;
当你写过几个C程序后,就可以进入下一阶段的裸机开发。
①不需要太深入,作为快速入门,只要你会编写“Hello, world!”,会写冒泡排序,会一些基础的语法操作,暂时就够了。
指针操作是重点
不需要去学习过多的数据结构知识,只需要掌握链表操作,其他不用学习,比如:队列、二叉树等等都不用学;
不需要去学习任何的函数使用,比如文件操作、多线程编程、网络编程等等;C语言是在写代码中精进的。
②可以在Visual Studio下学习,也可以在Linux下学习,后者需要掌握一些编译命令
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.3 硬件知识
我们学习硬件知识的目的在于能看懂原理图,看懂通信协议,看懂芯片手册;不求能设计原理图,更不求能设计电路板。
对于正统的方法,你应该这样学习:
①学习《微机原理》,理解一个计算机的组成及各个部件的交互原理。
②学习《数字电路》,理解各种门电路的原理及使用,还可以掌握一些逻辑运算(与、或等)。
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.5 为什么选择ARM9 S3C2440开发板,而不是其他性能更好的?
有一个错误的概念:S3C2440过时了、ARM9过时了。这是不对的,如果你是软件工程师,无论是ARM9、ARM11、A8还是A9,对我们来说是没有差别的。一款芯片,上面有CPU,还有众多的片上设备(比如UART、USB、LCD控制器)。我们写程序时,并不涉及CPU,只是去操作那些片上设备。所以:差别在于片上设备,不在于CPU核;差别在于寄存器操作不一样。因为我们写驱动并不涉及CPU的核心,只是操作CPU之外的设备,只是读写这些设备的寄存器。之所以推荐S3C2440,是因为它的Linux学习资料最丰富,并有配套的第1、2期视频。
2.6 怎么学习ARM+Linux的裸机开发
学习裸机开发的目的有两个:
①掌握裸机程序的结构,为后续的u-boot作准备
②练习硬件知识,即:怎么看原理图、芯片手册,怎么写代码来操作硬件
后面的u-boot可以认为是裸机程序的集合,我们在裸机开发中逐个掌握各个部件,再集合起来就可以得到一个u-boot了。后续的驱动开发,也涉及硬件操作,你可以在裸机开发中学习硬件知识。
注意:如果你并不关心裸机的程序结构,不关心bootloader的实现,这部分是可以先略过的。在后面的驱动视频中,我们也会重新讲解所涉及的硬件知识。
2.7 bootloader的学习
bootloader有很多种,vivi、u-boot等等,最常用的是u-boot。
u-boot功能强大、源码比较多,对于编程经验不丰富、阅读代码经验不丰富的人,一开始可能会觉得难以掌握。但是,u-boot的主要功能就是:启动内核。它涉及:读取内核到内存、设置启动参数、启动内核。按照这个主线,我们尝试自己从零编写一个bootloader,这个程序相对简单,可以让我们快速理解u-boot主要功能的实现。
2.8 Linux内核的学习
前面说过,内核本身不是我们学习的重点,但是了解一下内核的启动过程,还是很有必要的:工作中有可能要修改内核以适配硬件,掌握了启动过程才知道去修改哪些文件。
2.9 根文件系统
在驱动程序开发阶段,我们喜欢搭建一个最小根文件系统来调试驱动;在开发应用程序时,也需要搭建文件系统,把各种库、配置文件放进去;在发布产品时,你还需要修改配置文件,使得产品可以自动运行程序;甚至你想实现插上U盘后自动启动某个程序,这也要要修改配置文件;这一切,都需要你理解根文件系统的构成,理解内核启动后是根据什么配置文件来启动哪些应用程序。
3.1 经典字符设备驱动程序
视频中以LED、按键驱动为例,讲解并练习开发过程中碰到的机制:查询、休眠-唤醒、中断、异步通知、poll、同步、互斥等等。后续更复杂的驱动程序,就是在这些机制的基础上,根据硬件特性设计出精巧的软件框架。
3.2 工作中各类驱动程序
3.3 调试方法
4 Linux应用程序的学习
对于大多数人来说,第1个C程序是在Windows的Visual Studio C++(简称VC)上写的,所以你们关心的也许是:嵌入式Linux应用程序,跟VC应用程序之间的区别:
①编译方法不同:
在VC上点点鼠标即可编译,对于嵌入式Linux应用程序,我们需要“交叉编译”:程序要在PC Linux上编译,但是运行时要放到单板上。并且,它的编译环境需要你自己搭建:解压出工具链后设计PATH,还要自己构造一套Makefile系统。
②调试方法不同:
在VC上点点鼠标就可以调试,对于嵌入式Linux应用程序,你可以更喜欢用打印;或是在PC Linux上通过GDB观察应用程序在单板上的运行状况。
③可用的资源不同:
对于VC程序,你可以直接使用微软公司提供的各种类库;对于嵌入式Linux应用程序,很多时候需要去寻找、下载、编译、使用开源库。
④功能不同:
VC程序运行在PC上,一般是用来解决某些纯软件的问题,比如整理数据、修图、联网播放音乐之类。嵌入式Linux应用程序一般都要操作若干种硬件,比如监控设备中要操作摄像头、存储音视频,无人机中要操作GPS、螺旋桨,POS机中要操作银行卡等等。它跟单板上的硬件联系很大,很多时候需要你懂点硬件知识,至少是知道怎么通过驱动程序来操作这些硬件。
上述4点的不同,花很少的时间就可以掌握。
如果你有志于开发应用程序,那么一定要有算法、数据结构、网络编程等基础,然后再掌握一些设计模式,最后就是多参加一些实际项目的开发了。