嵌入式开发入门—Linux

点此进入原文链接,有视频课程哦

第一部分 嵌入式Linux简介:

首先,不知道大家知不知道嵌入式linux设备运行的话一般需要哪几个组成模块?

一、嵌入式Linux设备如何在运作——Uboot

第一部分是BootLoader,它是作为一个刚刚开机的引导程序。Uboot也是BootLoader的一种,主要有以下几个作用:

Uboot本质上是一个裸机程序(没有操作系统的程序,开机只能单一运行)
Uboot主要是用来启动操作系统的内核
Uboot负责部署整个计算机系统,例如传参、分配OS内存
Uboot负责硬件初始化。例如串口打印、擦除、烧写flash等
Uboot提高一个命令行界面供人来操作

总之,Uboot的作用就是启动内核,内核运行起来后,它的任务也就完成了。二、嵌入式Linux设备如何在运作——KernelUboot加载成功后就到了Kernel这一步,kernel的作用就是将软硬件联系起来。大家都知道光光靠一个CPU硬件是没有什么用的,必须要靠内核去支配。

二、嵌入式Linux设备如何在运作——KernelUboot

加载成功后就到了Kernel这一步,kernel的作用就是将软硬件联系起来。大家都知道光光靠一个CPU硬件是没有什么用的,必须要靠内核去支配。
在这里插入图片描述
Kernel(内核)的5个子系统:

进程调度:多线程操作以为是并行的,实际上是串行的,根据优先级进行调度,约10ms调度一次
内存管理:CPU提供内存管理,操作系统将这块的物理地址和虚拟地址之间做一个映射,我们平时开发的程序操作都是虚拟地址,只有到驱动层开发的时候才是物理地址。
虚拟文件系统:嵌入式设备中有很多的文件系统,不过对我们开发者来说,这些文件系统不需要关心怎么去操作,一般都是通过虚拟文件系统来统一操作。
网络接口:主要包括网络通信协议和网络设备驱动。
进程通信:方式很多,如文件和记录锁定、管道、FIFO、消息队列、信号灯,共享内存。

总之,Kernel(内核)是软件和硬件之间连接的“桥梁”,有了内核才能做应用程序的开发。

三、嵌入式Linux设备如何在运作—— rootfs(文件系统)

平时打包一个设备,发布一个固件、文件系统等一般都是自己独立去做的。比如bin文件,就是做一些二进制文件,像最简单的ios等等就是放在bin文件里面的。再比如dev,他就是动态生成的,像串口和其他的设备会生成在dev里面。还要重点说一下proc,内核以及进程信息的虚拟文件系统都是存在这个里面的。其他的介绍大家可以参考下图:

在这里插入图片描述

四、嵌入式Linux软件开发环境

在这里插入图片描述
从上图可以看出:嵌入式Linux软件开发环境基本是从PC端开始写软件,编译过后,通过U盘或者网络文件系统放到嵌入式设备中运行。

五、代码编译的流程

预处理:展开头文件、宏替换、去掉注释(test.i main .i)
编译:检查语法,生成汇编 (test.s main .s)
汇编:汇编代码转换机器码 (test.o main.o)
链接:接到一起生成可执行程序 (a.out)

六、嵌入式开发的方向

(1)底层驱动的开发(大方向):开发出硬件设备然后调试
(2)中间件的开发:可划分为应用程序里面的一种。海思这块,就是属于中间件的开发。
(3)应用程序的开发

  1. 界面类 Qt、minigui等
  2. 流媒体协议RTSP、RTMP、GB28181等
  3. 行业协议 104/376规约、JT1078/808等
  4. 算法类 opencv等

第二部分 海思平台简介:

一、海思平台概述

海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI(MPP Programe Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入视频捕获、H.264/MJPEG/JPEG/MPEG4 编码、H264/H.265/VC1/MPEG4/MPEG2/AVS 解码、视频输出显示、视频图像前处理(包括去噪、增强、锐化)、编码码流叠加 OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。
在这里插入图片描述

二、海思媒体处理平台架构

在这里插入图片描述

三、海思mpp调试信息

做海思应用开发的时候,这块会用的比较多。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

心得与建议:

一个优秀程序的表现:

  • 代码可读性要好
  • 程序稳定性高、容错机制强
  • CPU使用率
  • 内存占用率,一定要控制在合理范围内,下面两个图就是看CPU使用率的,一般是10%~20%。
    在这里插入图片描述
    在这里插入图片描述
如何提高自己的个人能力:

解决问题从原理性的角度出发去解决问题,而不是去“试”
多去学习别人的代码、多学习开源项目
保证项目进度的前提下,多思考好的设计方式

开发过程中遇到问题怎么办?

多思考、多琢磨
遇到问题先要自己思考下,每次解决问题的时候要有个积累,需要记笔记
用搜索引擎,很多问题网上能找到相似的答案,思路类似

学习书籍或资料推荐:

C/C++ 经典书籍(必读)
鸟哥的Linux私房菜(不熟悉linux的必读)
Unix环境高级编程(必读)C++ GUI Qt4 编程(选读)
韦东山的嵌入式linux 学习教程(选看)

下期学习预告:git使用入门,想要学习的同学可以在评论区留言,告诉我们想听的课程!

易百纳技术社区内容涵盖半导体、图像处理、人工智能、物联网、工业板卡以及通用硬件等多个领域,已成为一个多系列(如:海思芯片等)的第一热门技术网站,致力于为更多工程师答疑解惑,创造机遇!