您的位置 首页 硬件

一篇看懂嵌入式Linux

嵌入式Linux跟桌面Linux一样,是一个操作系统。从单片机走过来的童鞋往往习惯于直接控制寄存器,事必躬亲,从零开始实现想要的功能。而在嵌入式Linux的

嵌入式Linux跟桌面Linux相同,是一个操作体系。从单片机走过来的童鞋往往习惯于直接控制寄存器,以身作则,从零开端完成想要的功用。而在嵌入式Linux的国际里,咱们首要要扔掉这个思维,应把它作为终究没办法的办法。

就像咱们想要在windows体系中编写一个程序,首要想到的不是操作CPU芯片的寄存器,而是学习Windows API相同。咱们在嵌入式linux编程时,首要想到的应该是运用现成的驱动或软件或Linux API。没有的话看看能不能修正一下现成的资源为己所用。仍是不可的话才考虑自己从头开端写。

嵌入式Linux大厦是由许多层组成的,当咱们想找一个人时,首要要清晰他在那一层楼。相同的,咱们遇到问题时,首要要知道是哪个方面的问题,然后才有或许知道到哪里寻觅答案。下面咱们把这座大厦进行一下拆解。

咱们平常运用Linux体系的话,最常用的东西便是Shell(或许用windows中常见的说法:指令行),初学者触摸Linux的第一个东西往往也是shell。或许你现已知道,把shell指令组合起来写成一个文件,亦即shell编程,也是一门大学识,它能做的事许多很强壮,但仅限于对Linux体系的操作。

咱们必定不会用shell指令去编写一个显示屏程序,或许一个GPS导航程序。并且作为嵌入式Linux开发来说,shell不或许作为终究产品作业的渠道,由于咱们不能要求用户在屏幕中输入代码来完成功用。因而我以为对嵌入式开发来说,shell指令无需深究,把握根本操作就够了。

shell根本操作首要包含:获取指令协助,抵达指定目录,检查目录内容,权限修正,文件的复制粘贴等根本操作,文件查找,文件内容检查和修改,体系关机重启……(这些只是最根本的,后边再渐渐学其他指令,比方学习进程编程时,再学习进程相关的指令;学习C言语编程时,再学各种编译和调试指令也不迟)

学习嵌入式Linux,咱们的终究意图是制造一套嵌入式体系来完成功用。往往需求用C/C++或Python等其他言语来编写程序,可是编程之前咱们要先清晰一些根本概念。

最根本的,当咱们编写程序时,首要要清晰嵌入式Linux分为用户空间和内核空间。用户空间是应用程序运转的空间,内核空间便是操作体系和驱动程序运转的空间。这是从软件的视点来说的,对应于ARM芯片来说,便是芯片的不同“作业形式”。这两个空间是经过“地舆阻隔”完成相互彻底独立的,它们各自的程序运用不同的内存地址区间,各自运用自己的头文件(有些头文件在两个空间内乃至是重名的,要注意区别)、各自调用归于自己空间的函数(哪怕完成的功用相同,比方printf()和printk()),并且不能相互直接拜访(用指针也不可)。(意味着学习这两部分的编程时要学习两套独立的常识体系)

内核空间相关的东西有:Linux内核源码、内核编译和装备、内核移植、文件体系、Busybox、设备驱动程序编写、中止编程……

用户空间相关的东西有:Shell、应用程序编译和调试、进程、线程、文件IO编程、网络通信相关、Qt图形界面编程……

假如你只是要开发应用程序,那你就能够远离内核空间那些东西了。对你来说,驱动程序、底层硬件、操作体系的作业方式等都是通明的,你写的程序在其他芯片上也能跑得很好。

但假如你想要开发驱动程序,或许定制自己的操作体系,或许你想向一片“全裸”芯片中写入操作体系,并使它正常运转起来,那就得学习内核空间的常识了。

假如你想让“全裸”芯片运转起来,还会遇到一块比内核更底层的东西,Bootloader。它是在内核发动前运转的一段程序,用来初始化硬件、树立内存空间映射等,与芯片的品牌、类型极端相关。咱们一般对一些现成的Bootloader进行修正来满意需求,常见的Bootloader有U-Boot、Vivi等。

再多说一句,假如想从零开端做一个嵌入式设备,还有更底层的问题需求处理和学习:电路设计、PCB布线等。

因而,咱们看到的嵌入式Linux书本就能够大略分红两个方向:一类讲嵌入式Linux应用程序编程,另一类讲怎样树立一个完好的嵌入式Linux渠道。别离对应的便是用户空间和内核空间的工作。

尽管用户空间和内核空间是独立的,但就像Windows供给了API,答应咱们对体系进行操作相同,用户空间的程序也能够经过体系调用来拜访内核(便是一些的C言语函数)。但由于体系调用十分根底,所以有时运用起来很费事。比方说一个简略的给变量分配内存空间的操作,就需求动用多个体系调用。Linux界说一些库函数(API)来将体系调用组合成某些常用的功用,以便利咱们编程(相同是C言语函数)。因而,咱们在读他人的程序时,就要区别其间的函数是体系调用,仍是库函数,仍是C/C++规范库中的函数,仍是用户自己界说的函数。假如是前三者,就能够到各个地方查找相应的材料,这样学习起来就快许多。

那么shell程序和咱们用C/C++编写的程序有什么区别呢?事实上,咱们在shell中写的每一个指令,都对应了一个程序,在程序内部便是经过调用各种API来完成相应功用的。因而用shell能完成的功用,理论上都能用C言语完成。

作为嵌入式Linux开发初学者,简略了解了shell今后,就能够开端进行一些C言语编程的尝试了。

咱们最早触摸编程一般都是在大学的编程课上,并且往往用的是Visual C++ 6.0。窃以为这是让我对编程原理长时间困惑不解的元凶巨恶!啥是环境变量?为啥要设置include途径,lib途径?为啥一点编译按钮就会出来那么多后缀名不同的文件?这些很根底很重要的问题都被VC6.0这个外壳掩盖了。但哪怕你在Linux中运用gcc编译一个最简略程序,必定就会像我相同立刻了解把一个.c的源文件变成一个可执行文件,中心终究发生了什么工作。假如你再用gdb调试一个程序,就会了解得更多一点。

关于C/C++编程的根本东西,咱们需求学习的有:vim等代码修改器、diff等文件比较的shell指令、gcc等编译器、gdb等调试东西、穿插编译等。这儿需求特别说到一个重要东西(网站):github,依据百度的解说,它是一个“分布式的版别控制体系”,初学者还用不到版别控制,那就能够单纯把它当成一个敞开的源代码库。这个网站里有很多优异的源代码供学习和运用。

学习了根本的编程办法,咱们就该触摸Linux的API等内容了。究竟,咱们的嵌入式体系要与设备进行交互,只用C/C++规范库是不行的。在此之前,需求树立一个Linux的重要概念:全部皆文件。乃至硬件设备对Linux体系来说,也是文件。这样对设备的操作就等同于对文件进行读、写,或读写以外的操作。这部分内容在各种书本材猜中一般以“文件IO编程”命名,作为一个章节来写。我觉得这是应当第一个来学的东西,由于看到自己能随意控制文件和外设是一件让人很振作的工作!成就感是持续学习的一大动力!

别的一个重要内容是,了解进程和线程。经过学习这个部分,能井蛙之见地大致领略到Linux体系怎样进行调度,你的程序是怎样在Linux中运转的。这是操作体系原理的内容,但作为非软件专业身世的人,没办法,只能自学了。

其他应用程序编程如网络编程、Qt图形编程等就不逐个说明晰。

驱动程序或许是咱们将来触摸内核空间遇到的第一个内容。不过暂时还没什么特别想说的。内核空间间隔初学者仍是有点远的……今后再来学这部分内容。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/152599.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部