(一)嵌入式Linux系统入门概述

姓名:黄婷    学号:19020100410  学院:电子工程学院

转自:https://blog.csdn.net/subfate/article/details/72822708?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162848385116780255240111%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162848385116780255240111&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-72822708.first_rank_v2_pc_rank_v29&utm_term=%E5%B5%8C%E5%85%A5%E5%BC%8Flinux&spm=1018.2226.3001.4187

【嵌牛导读】嵌入式Linux系统入门概述

【嵌牛鼻子】嵌入式Linux 系统概述

【嵌牛提问】什么是嵌入式系统?

【嵌牛正文】

一、系统环境

1、环境搭建

开发嵌入式需要大量辅助软件,一般来说,我们是在电脑上开发好程序,然后通过某些方式将程序下载到开发板上运行。按这个顺序列出一些我认为必须的:

Linux系统:主要作为程序开发的系统,选择多人使用并资源丰富的版本,建议ubuntu或fedora,目前我使用ubuntu。可以使用在虚拟机或物理机上

虚拟机:有条件的推荐使用物理机安装,但一般经常使用vmware这类虚拟机软件,通过这个软件安装ubuntu系统,然后设置共享。然后在这个系统上交叉编译。

共享方式:有的人喜欢用vmware自带共享功能,有的人喜欢用samba共享。个人建议在ubuntu中设置samba共享,这样可以在windows上将ubuntu共享目录映射成为其中一个盘符,这样做,就可以在windows下操作linux系统的目录、文件了,不过前提是需要网络性能良好。另一种常见的共享方式是nfs,多用于主机和开发板之间的文件传输。

开发IDE:有的人建议在linux系统中用vim或emacs,但作为初学者入门,不要如此,使用vim、emacs学习成本高,而会打击积极性。在samba共享情况下,建议使用Notepad++、source insight进行代码编辑译。

交叉编译:交叉编译是嵌入式一个很重要的概念。由于我们编译的程序是在开发板(开发板又称目标板)上运行的,但开发板又没有环境进行编译,所以带出“交叉编译”概念。即在一台linux主机系统上使用交叉编译器对代码进行编译,但编译得到的二进制文件无法在该主机运行,只能在开发板上运行。不同的板子使用的交叉编译器不同。一般使用商家自带的交叉编译器。

下载手段:根据应用场合,可以用jtag烧录器下载程序(适用如u-boot开发)。可以使用tftp方式下载程序(适用kernel开发)。在开发板系统启动后且网络正常情况下,可以使用tftp下载、nfs拷贝等方式进行调试(适用于应用层程序开发)。

另外对于USB转串口线、网络这类的东西,就不一一详细说明了。

掌握程度:不同人使用的开发环境不尽相同。原则上只要是自己熟悉的环境就可以了,以提高开发效率为准则。

推荐软件:vmware、notepad++、source insight、tftpd32(均为windows系统软件)。

2、系统使用

工欲善其事,必先利其器。系统环境使用熟悉程度越高,越能提高开发速度。举个例了,曾经遇到过别人在设备上调试应用程序,步骤是:编码、编译、制作软件包、用工具升级软件包到设备上,设备上电看效果。这一系列步骤中,制作包、升级软件包耗时很长,对于调试十分不利。如果使用NFS,时间能省至少三分之二。所以说,环境的熟悉是十分重要和必要的。

本节主要针对Linux系统,对于入门者而言,Linux系统的使用是一个大坎。但要知道,嵌入式开发是离不开linux系统的,是必须学的。目前网络资料十分广泛,几乎遇到的问题都在找到答案,但质量往往良莠不齐,有些甚至会误导人。因此,建议一边学一边做笔记,把自己的疑问、心得、步骤都记录下来(比如,记录第1小节提到的nfs、samba服务安装的步骤)。

如果时间允许,最好找书本来学习,边看书边敲命令。因为书籍介绍比较系统,有利于了解全貌,再逐个知识点深入,做到胸有成竹。下面列一下需要学习的知识点。

1、掌握常用命令。必须要学的命令不多,像查看文件、拷贝文件、创建文件、查找文件、显示日期、查看/修改IP,等等。这些常用命令只要使用次数多了,就能熟练掌握。具体的自行搜索。

2、掌握软件安装步骤。一般linux系统发行版自带有安装工具,如unbutu,在联网情况下直接输入命令apt-get

install tool-name,就能安装了。

3、编译源码方式安装软件。有些工具提供源码需要自己进行编译(比如要在开发板上运行的程序,则无法通过apt-get来安装,需要交叉编译)。linux编译一般有三个步骤:

配置:./configure

编译:make

安装:make

install。

这个知识点自行百度。

4、了解linux文件系统、目录结构、设备文件。如根目录名称是“/”,配置文件一般位于/etc目录,运行程序一般位于/bin、/sbin、/usr/bin、/usr/sbin,等等。因为嵌入式涉及到根文件系统概念,因而需要对linux目录结构有了解。如果感兴趣,可以去搜索一下LFS。

5、学习IO重定向、管道概念,学习并会写简单shell脚本。

6、学习编辑器vi的简单使用(因为有些情况下只有这个编辑器可用)、编译器gcc用法、Makefile知识、gdb调试。(此项针对开发而言)

推荐资源:

笔者的主页和博客有大量linux系统使用、软件编译、Makefile,等等文章,欢迎前来围观。

学习建议:

1、看书、网络搜索

2、学会man命令(这是linux内置的帮助命令,比如要了解cp命令的用法,则输入mancp)

3、记录笔记

二、应用层

1、C/C++语言

C/C++语言本身与具体平台相关不大,但必须结合具体环境平台才能展现其作用。比如,MFC使用C/C++,QT也使用C/C++,Linux内核中使用C,单片机使用C,等等。环境不同,其侧重点不同。在学校里学习C/C++语法,考完试,却没有结合实际项目编程,就有人纠结学了C/C++不懂能做什么。只有真正在某一领域使用了C语言,它才是一个可以看得见、摸得着的东西,而不再是抽象的。

这里结合Linux系统,列举出一些要掌握、学习的知识点。

1、linux系统编程基本概念:Makefile、gcc、gdb。

2、文件IO操作。

3、进程控制、进程间通信、多线程操作

4、信号处理

5、网络编程

6、串口编程

 另外也列举C/C++语言的学习点:

1、标准库

输入输出(fprintf、sscanf)、文件操作(fopen、fclose)、字符类操作(isalpha、islower)、字符串操作(strcpy、strcmp、memcpy)、信号处理(signal)、日期时间(mktime、ctime)

2、C++ STL

向量vector、队列queue、栈stack、列表list。

推荐网站:http://www.cplusplus.com/reference/

下面列出一些我认为较好的书籍。每种类型的书籍应用场合不同,按需求学习。——不仅嵌入式Linux领域,其它很多领域同时需要C,因而要提高C技能。

入门篇:

《Linux C 编程一站式学习》

《Linux C从入门到精通》

《Linux C编程从初学到精通 》

《Linux C编程实战》

《嵌入式linux应用开发完全手册》 (该书对嵌入式Linux开发整体都有讲述,一书以看窥全貌,入门适用)

linux网络编程篇:

《UNIX网络编程》

《UNIX环境高级编程》

C/C++提高篇:

《C陷阱与缺陷》

《C专家编程》

《C和指》

《C++沉思录》

《C/C++深层探索》

《Effective C++中文版》

《提高c++性能的编程技术》

《0 bug:C/C++商用工程之道》 (这本书网络有一定争论,笔者认为有部分的确有可取之处,请辩证看待)

学习路线:

环境:安装虚拟机linux,配置好samba,有windows下用notepad++编写代码,然后在命令行使用gcc编译并运行。像ubuntu安装必要开发工具sudo

apt-get install build-essential 这类的知识点本文就不涉及了。

实践:首先了解linux下gcc编译基本概念,然后逐个知识点学习。以上每点均是一个知识块,需要手动写代码。建议在github上建立仓库,形成自己的代码库,方便日后使用。

2、版本控制

版本控制可以提高开发效率,目前很多公司使用svn或git进行代码管理,很多开源项目——包括kernel,都使用git来管理。对于不涉密的代码,推荐使用github托管,而不便公开的代码,可以在bitbucket或csdn上托管。养成保存代码的习惯很重要。笔者很多年前没有代码托管意识,一次电脑被偷,导致很多代码消失了,如今想找也想不回来了。

版本控制学习成本不大,无非创建仓库、提交代码这些过程,结合日常编码练习,慢慢熟悉掌握即可。

笔者录制了一个git教程,欢迎观看:

http://edu.csdn.net/course/detail/4562

3、脚本

Linux系统的脚本语言有很多,使用场合也不同,主要目的是提高开发效率。比如:在shell脚本中完成代码的编译并拷贝到nfs共享目录(或tftp服务目录)。这样只需要执行脚本就完成多项工作,节省很多时间。

4、界面开发

界面开发不是笔者强项,就写一写笔者的经历。笔者接触过的界面开发有QT、SDL、MFC。这些都是作为工具而存在的,不是专门研究,都是工作需要时再去学习,边学习边实践。

比如,做一个视频采集的软件,使用了SDL进行显示。

比如,为了显示YUV格式的文件,使用MFC编写一个播放器。

5、其它书籍推荐

内功修炼篇:

《程序员的自我修养——链接、装载与库》(偏底层的人建议看看)

《高效程序员的45个习惯 敏捷开发修炼之道》

《高质量程序设计指南》(建议看看,工作中编写代码一定要注意编码规范,否则维护难度太大)

《Linux开发工具箱:项目开发的最有效途径》(对应英文版本《The

Linux Programmer's Toolbox》,网络有资源)

(注:入门级别书籍不建议购买,通过网络资源或去图书馆借书等手段来学习就行了。当然经济条件允许的除外)

笔者这几年也积累一定的文章,欢迎阅读:http://blog.csdn.net/subfate/article/category/752115

三、底层

这里说的底层包括三大方面,这三大方面缺一不可。

bootloader:作为上电运行的第一个程序,负责最原始的初始化操作,初始化芯片、初始化内存、初始化IO复用,读取内核代码并将控制权移交到内核,从而完成使命。

kernel:提供基本的运行环境,提供外设操作控制接口。

rootfs:向用词(应用层)提供基本操作环境,包括命令行、程序库等。

1、bootloader(启动装载程序)

嵌入式Linux常见的bootloader是u-boot,而X86领域中一般称为BIOS。u-boot的学习没有捷径,最好是在有ARM开发板情况下进行研究,通过打印信息的方法跟踪其流程。但是,看懂u-boot代码需要电路基本知识、芯片手册知识等等。——这些知识,同样适用于内核驱动的开发。

首先要建立的是整体概念和认识。建议先把厂商提供的u-boot源码编译通过,并下载到开发板上看到正常结果后,再用串口打印信息搜索代码,以了解u-boot的代码流程。然后再慢慢研究。如果bootloader不是学习重点,在有一定概念前提下就可以跳过到内核驱动层了,不过就笔者经验来看,bootloader和内核关系十分密切且部分代码是相通的。

一般初始化的代码是汇编代码,对于入门者而言,初学阶段不用追究,等有一定基础后再回头研究也不晚。

笔者许多年前移植过u-boot,写了几篇文章,版本旧了一些,但对于学习而言还有有好处的:

http://blog.csdn.net/subfate/article/category/751064

笔者曾经研究过x86的开源bios,写了几篇文章,大家可以看看。虽然对于u-boot学习帮助不大,但可以了解笔者如何从零开始学习一个未知的知识。地址:http://blog.csdn.net/column/details/15826.html

2、kernel(内核)

内核是比较大的一块,涉及内容十分多。作为入门者,与u-boot类似,首先要建立的整体概念。先把厂商提供的内核源码编译通过,并下载到开发板上,串口会打印很多启动信息,这些启动信息能帮助我们学习内核,自己也可以在内核中打印语句,以了解其流程。

每一个平台芯片不同,外设不同,内核均不同,需要进行移植。所谓的“移植”,就是找到合适的驱动,修改适应到该平台的过程。比如,某平台使用2个LCD屏,一个是3.5寸的,另一个是4.3寸的,这需要对内核进行修改。比如,这个平台使用nand

flash是1GB的,另一个平台使用的是512MB的,也需要修改内核。其它如EEPROM、电源芯片、网卡,等等,均如此。

内核知识点分2部分,一是kernel本身的知识点,如内存管理机制(MMU)、时间管理、同步机制,等等。二是外设驱动,如LED灯、GPIO、按键。

初学者建议学习:

1、了解内核编译的过程:配置内核、编译uImage。

2、了解platform驱动模型(笔者文章有现成的模板,已经应用于很多个平台上)。

3、了解一般外设驱动模型。建议从简单的LED、GPIO入门。

高阶知识点:

1、学习各种子系统,如MTD、USB、IIC、SPI、RTC、WDT。

2、学习内核知识,如延时队列、时间管理,同步机制,等等。

以下是笔者笔记关于内核专题的目录:

推荐资源:

《Linux设备驱动程序》第三版

《Linux设备驱动开发详解》

笔者开了一个专栏讲内核的,欢迎阅读:http://blog.csdn.net/column/details/15829.htm

3、rootfs(根文件系统)

一般情况下,开发板厂商会提供根文件系统,如果没有,则可以自己编译制作。一般嵌入式Linux使用busybox制作文件系统必要的程序、库、配置文件。因为busybox编译出来的内容体积小,节省空间,所以很多ARM开发板上都是用busybox的。另外还涉及到文件系统格式,像Yaffs2、ramfs、ext4、UBI,等等。所有这些知识点,请自行搜索学习。

掌握程度:

1、知道系统启动过程涉及到哪些脚本。知道上电启动时如何添加自己程序启动。

2、了解各目录功能、存储哪些文件(如改IP在哪个配置文件,动态库在哪些目录)。

四、其他知识

1、电路原理图、datasheet

作为底层开发人员来说,能看懂硬件原理图和datasheet是必要的一项技能。

看懂硬件原理图,就可以知道这个系统上有什么器件,哪些器件有什么功能,如何连接(使用什么协议),提供什么接口。有了这些认知后,才会对系统有一个全局整体的认识掌握。对于开发人员来说绝对是有利的。

看懂datasheet,才能知道如何访问器件,如何操作器件,了解其时序。

另外,对于嵌入式经常接触到的如I2C协议,SPI协议等等的协议也要掌握。

掌握程度:不需要像硬件专业同学那样学习数电、模电课程。但起码掌握上升沿、下降沿的概念,知道高电平、低电平概念,懂得看I2C协议的时序图。懂得如何找到datasheet中关键信息(寄存器说明、时序图)。

学习路线:碎片时间多的人,建议在遇到不懂知识点时上网搜索学习。有条件的建议借书或买来学习。

2、英文

作为开发人员,英文是无涯逾越的坎,因为datasheet还有开发手册,几乎都是英文的。英文资料的特点是长句子多,而技术性术语多。初看英文的资料,可能进展很慢,但只要坚持下去,就会发现,英文手册也就那些术语而已。遇到不懂的术语,就记录下来。积累多了,阅读就慢慢顺畅了。除了术语外,语法难度,远低于高考、四级水平。

值得说的是,国外原版书籍或手册,用词往往通俗易懂,但翻译成中文后,有的术语不对,有的句子顺序不对。这加大了阅读难度,也是造成技术书籍难懂的原因之一。

个人经历:在某次旅途火车上,用手机看了一遍ONVIF协议手册,多年后再回看,基本已掌握。但目前ONVIF中文资料还是少。看懂英文资料,无疑有很大帮助。

某次工作遇到网络问题,中文搜索无果,去各大英文论坛看,无意发现pause

frame,继而看ieee802.3标准手册找权威说明,最后解决。这里英文资料帮了很大忙。

3、其它

其实很有许多其它知识,无法一一列举。

本文提及的众多知识点,但绝不是在炫耀水平——因为那是笔者工作被逼去了解掌握的。但总而言这,在认清自己专注核心技能外,多掌握一些技能,总归有好处的。

五、入门路线

这里以偏重嵌入式Linux(ARM)驱动开发为例,给出一条入门的路线。

1、买一款使用广泛、资料多的ARM开发板。因为使用的人多,你遇到的问题别人可能早就遇到并解决了,这样能省很多时间,并且提高自信心。可以到某宝上看看板子。因为是学习使用,最好便宜又适用的。

2、使用vmware安装一个ubuntu系统。在vmware软件中设置物理桥接方式上网。在ubuntu设置好samba服务、nfs服务、tftp服务。

3、首先自己动手亲自编译u-boot、kernel,烧写到板子上(注:有可能rootfs不提供源码,而是提供img镜像文件)。

4、自己修改kernel,并编译busybox,烧写到板子,在板子挂载NFS,在虚拟机交叉编译一个Helloworld程序,并在板子上运行。

5、根据兴趣,开始捣鼓:u-boot、kernel、应用层开发、QT开发。

6、选择自己重点关注方面,继续研究。

这个路线不一定要严格遵守时间轴。

六、补充

以上这些项,因不同人的基础而异。像硬件专业的同学,数电、模电和电路图已经掌握,就要加强C和Linux系统的学习。反之,计算机软件专业的同学,就要去学习硬件知识。等等。

对于书籍,有的可能一下子无法理解,那是因为功力不到。有的可能觉得没有用处,那是因为还没有涉及此方面。比如,非计算专业的人看《编译原理》,《操作系统原理》,《计算机体系结构》,肯定是看不懂的,而且初学者也不必要看。又比如,嵌入式有的领域使用到H264编码、MPEG编码,802.11、CDMA,如果不是进入有关行业的,也不必学习。另外网上很多人写的嵌入式入门文章提到0.11内核版本、2.4内核版本的书,还有离散数字、算法导论的书,并不是都适用所有人。 所以大家一定要量体裁衣,有多大胃口吃多少饭,有多大头戴多大帽,根据自己已有的知识和所处的阶段进行选择。

另外要说明的是,很多知识点是密不可分的,且界线是很模糊的。比如应用层和底层。因为有时出现问题,并不知道具体哪里的问题,这就需要站在比较高的层面(系统视野)看问题,才会快速定位并解决问题。建议以某一方面为核心点,另一方面做了解掌握。如果有能力,最好都学。

本文所列举的项目条款,根据个人实际情况学习。建议逐步学习,各个击破。理论上知识点学得越多,越有利于看问题深度、广度的提高。

一般情况下,嵌入式Linux没有速成。但可以达到入门速成,根据个人能力,我认为大约半个月~2个月即可,不过入门后就要不断学习和积累了,——这个积累,需要精力、时间的投入。

在后续的系列文章中,笔者将介绍嵌入式Linux入门的一些方法和步骤,当然,不会详细到每个命令,每个驱动,只是根据笔者经验来描述,因此,更多的是经验的分享。

PS:

本文提到的服务设置这类操作,自行搜索了解。

本文提到硬件、协议这类知识,自行搜索了解。

文中提到书籍的机构与笔者无利益关系,不构成购买理由,请自行把控。

版权声明:本文为CSDN博主「李迟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/subfate/article/details/72822708

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 姓名:薛绍宏 学号:19020100016 学院:电子工程学院 转自:https://blog.csdn.ne...
    Jetho阅读 354评论 0 0
  • 姓名:吴兆阳 学号:14020199009 转自韦东山 嵌牛导读:对嵌入式初学者,没有足够的视野选择一个合适投入方...
    吴兆阳阅读 2,368评论 0 4
  • 学习stm32gpio 学习linux 程序员的三大方向 程序员的方向,一般可以分为3类:专业领域、业务领域、操作...
    王公民阅读 708评论 0 3
  • 转发https://www.jianshu.com/p/439ce15436c1 Android 简介 Andro...
    wholesky阅读 1,282评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,014评论 0 4