嵌入式 订阅
嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。嵌入式系统作为装置或设备的一部分,它是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。 展开全文
嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义是用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;国内普遍认同的嵌入式系统定义是以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。嵌入式系统作为装置或设备的一部分,它是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。
信息
应用于
工业、国防
标准制订
IEEE
中文名
嵌入式系统
外文名
Embedded System
嵌入式嵌入式系统组成
一个嵌入式系统装置一般都由嵌入式计算机系统和执行装置组成, 嵌入式计算机系统是整个嵌入式系统的核心,由硬件层、中间层、系统软件层和应用软件层组成。执行装置也称为被控对象,它可以接受嵌入式计算机系统发出的控制命令,执行所规定的操作或任务。执行装置可以很简单,如手机上的一个微小型的电机,当手机处于震动接收状态时打开;也可以很复杂,如SONY 智能机器狗,上面集成了多个微小型控制电机和多种传感器,从而可以执行各种复杂的动作和感受各种状态信息。硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等)。在一片嵌入式处理器基础上添加电源电路、时钟电路和存储器电路,就构成了一个嵌入式核心控制模块。其中操作系统和应用程序都可以固化在ROM中。(1)嵌入式微处理器 嵌入式系统硬件层的核心是嵌入式微处理器,嵌入式微处理器与通用CPU最大的不同在于嵌入式微处理器大多工作在为特定用户群所专用设计的系统中,它将通用CPU许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统在设计时趋于小型化,同时还具有很高的效率和可靠性。嵌入式微处理器的体系结构可以采用冯·诺依曼体系或哈佛体系结构;指令系统可以选用精简指令系统(Reduced Instruction Set Computer,RISC)和复杂指令系统CISC(Complex Instruction Set Computer,CISC)。RISC计算机在通道中只包含最有用的指令,确保数据通道快速执行每一条指令,从而提高了执行效率并使CPU硬件结构设计变得更为简单。嵌入式微处理器有各种不同的体系,即使在同一体系中也可能具有不同的时钟频率和数据总线宽度,或集成了不同的外设和接口。据不完全统计,全世界嵌入式微处理器已经超过1000多种,体系结构有30多个系列,其中主流的体系有ARM、MIPS、PowerPC、X86和SH等。但与全球PC市场不同的是,没有一种嵌入式微处理器可以主导市场,仅以32位的产品而言,就有100种以上的嵌入式微处理器。嵌入式微处理器的选择是根据具体的应用而决定的。(2)存储器嵌入式系统需要存储器来存放和执行代码。嵌入式系统的存储器包含Cache、主存和辅助存储器。1、CacheCache是一种容量小、速度快的存储器阵列它位于主存和嵌入式微处理器内核之间,存放的是一段时间微处理器使用最多的程序代码和数据。在需要进行数据读取操作时,微处理器尽可能的从Cache中读取数据,而不是从主存中读取,这样就大大改善了系统的性能,提高了微处理器和主存之间的数据传输速率。Cache的主要目标就是:减小存储器(如主存和辅助存储器)给微处理器内核造成的存储器访问瓶颈,使处理速度更快,实时性更强。在嵌入式系统中Cache全部集成在嵌入式微处理器内,可分为数据Cache、指令Cache或混合Cache,Cache的大小依不同处理器而定。一般中高档的嵌入式微处理器才会把Cache集成进去。2、主存主存是嵌入式微处理器能直接访问的寄存器,用来存放系统和用户的程序及数据。它可以位于微处理器的内部或外部,其容量为256KB~1GB,根据具体的应用而定,一般片内存储器容量小,速度快,片外存储器容量大。常用作主存的存储器有:ROM类:NOR Flash、EPROM和PROM等。RAM类:SRAM、DRAM和SDRAM等。其中NOR Flash 凭借其可擦写次数多、存储速度快、存储容量大、价格便宜等优点,在嵌入式领域内得到了广泛应用。3、辅助存储器辅助存储器用来存放大数据量的程序代码或信息,它的容量大、但读取速度与主存相比就慢的很多,用来长期保存用户的信息。嵌入式系统中常用的外存有:硬盘、NAND Flash、CF卡、MMC和SD卡等。(3)通用设备接口和I/O接口嵌入式系统和外界交互需要一定形式的通用设备接口,如A/D、D/A、I/O等,外设通过和片外其他设备的或传感器的连接来实现微处理器的输入/输出功能。每个外设通常都只有单一的功能,它可以在芯片外也可以内置芯片中。外设的种类很多,可从一个简单的串行通信设备到非常复杂的802.11无线设备。嵌入式系统中常用的通用设备接口有A/D(模/数转换接口)、D/A(数/模转换接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太网接口)、USB(通用串行总线接口)、音频接口、VGA视频输出接口、I2C(现场总线)、SPI(串行外围设备接口)和IrDA(红外线接口)等。硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board Support Package,BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP 层提供的接口即可进行开发。该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。BSP具有以下两个特点。硬件相关性:因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软 件与硬件平台之间的接口,BSP需要为操作系统提供操作和控制具体硬件的方法。操作系统相关性:不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。设计一个完整的BSP需要完成两部分工作:嵌入式系统的硬件初始化以及BSP功能,设计硬件相关的设备驱动。 [1]  [2] 
收起全文
精华内容
下载资源
问答
  • 一线工程师告诉你嵌入式真实现状与发展前景

    万次阅读 多人点赞 2018-10-02 18:49:59
    个人说明:本人并不是年薪百万的技术大牛,但总算是一名合格的嵌入式工程师,现在某企业担任嵌入式软件工程师开发一职,以下观点可能会带有片面或者分析不全,但却是一名一线企业嵌入式软件开发者真实感受和所得,...

    个人说明:本人并不是年薪百万的技术大牛,但总算是一名合格的嵌入式工程师,现在某企业担任嵌入式软件工程师开发一职,以下观点可能会带有片面或者分析不全,但却是一名一线企业嵌入式软件开发者真实感受和所得,希望能帮助那些有需要的人,我明白年轻人出来打拼都不容易。

    为何要写这片文章?小生也是过来人,踩过你们踩过的坑

    百度搜索“嵌入式”、“嵌入式开发”、“嵌入式发展前景”等字眼,出来的都是一大堆培训机构,出来的都是一大片他们所谓的对嵌入式行业的“见解”,不否定其内容有一定的专业性,但其中“水份”我想大家比我更清楚,“卖瓜赞瓜”的道理谁都懂;或者出来的是几年前的“嵌入式状况”,与当今嵌入式环境相比,企业无论是在开发、用人、内容、市场上都发生了很大的改变。因此,作为一名一线企业嵌入式软件工程师的我,想通过自己的实际经历理性地评论当今嵌入式行业的真实状况。本文章写于2018年10月1日,小生不才,自认为可以反映当今嵌入式行业的一个真实状况,以及它的科学性和前沿性可以是2018-2020年期间嵌入式的定义。

    一.嵌入式的定义和举例分析

    官方定义:

    根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监控或者辅助设备、机器和车间运行的装置”。这主要是从应用上加以定义的,从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。

    目前国内一个普片被认同的定义是:以应用为中心、以计算机技术为基础,软件硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

    说白了就是先设计硬件,然后根据需求编写能在该硬件上运行的软件,就成了所谓的“智能硬件”。

    或者说得还不够明白,那行,我们说一说具体的嵌入式产品有哪些,嵌入式是做什么的:

    传统嵌入式产品:空调主控模块、冰箱主控模块、家用遥控器、智能手机、教学投影仪、音响系统、雷达系统、路由器等等

    前沿嵌入式产品:无人机、智能音响、机器人控制、城市天眼系统、智能家具、自动驾驶汽车、扫地机器人、小米手环等等

    一起看一些前沿的嵌入式产品:

    下面是大疆无人机,可应用在高空拍摄、军事侦查、高空作业、自动巡逻、农业工作、矿业勘测、地形测绘等方面

    下面是天猫精灵智能音响,可进行语音识别、对话交互,应用与娱乐、生活、购物、智能家具控制等方面,属于新一代音箱

    下面是百度机器人,通过深度学习、神经网络等算法,实现“百度大脑”,具有自学习、自训练能力,如最强大脑的小度机器人

     下面是自动驾驶汽车,自动驾驶是一个前沿的科技,在我国还没本真正实施,不仅是技术方面,它还得得到政府支持和认同

    下面是海尔扫地机器人,能够自动巡逻,自动绘制室内地图,自动避障,自动清洁地面,还你一个干净的环境

    下面是小米手环3,可显示微信、来电等消息内容,振动闹钟,心率计算,步数统计,实时运动数据查询,睡眠质量监测等

    看完这些前沿科技产品后可发现,这些形形色色的“高端产品”都离不开嵌入式技术,离不开传感器技术,离不开软件程序。那么我现在可以告诉你,嵌入式开发的工作就是去开发以上等一系列产品 ,这就是嵌入式,相信此刻你对嵌入式行业已有“形而上学”的了解。

    二.嵌入式工程师在企业工作的真实内容

    嵌入式软件开发具体可以分三类:

    嵌入式驱动工程师:编写和移植各种芯片驱动(如音频芯片),优化硬件设备驱动(如温湿度传感器),得精通各种硬件接口协议(如I2C协议)、系统调度、信号量、锁机制等等,开发难度最大。该类开发者一般是软硬件综合型人才,一般的嵌入式驱动工程师指Linux上的驱动开发工程师,需要精通Linux驱动框架(platform框架、input子系统框架等),结合芯片本身去编写驱动,驱动的好坏很大程度上决定一个产品的好坏。业界对驱动人才的定义是三年才算入门,可见此门槛之高。

    嵌入式系统工程师:主要是编写固件,根据不同平台移植操作系统,根据应用场景来优化系统,需要熟悉整个操作系统组成与调度,对固件的稳定性高求很高,如果系统不稳定,驱动和应用也是白做的。

    嵌入式应用工程师:编写业务逻辑程序,调用驱动工程师提供的接口控制设备,软件开发过程所涉内容范围非常广,主要使用C语言开发,但经常会涉及C++、Java、python、JavaScript、PHP等各类语言以及各种脚本语言、数据库、前端后台、各种通讯协议、甚至一些从来没听过的协议或概念,需要很强的学习能力,该职位也是各大公司需量最大的,一般10人的开发小组,驱动开发与系统开发与应用开发的比例是1:2:7。

    根据我的经验,世界上可以分成两种嵌入式工程师,一种是大公司的嵌入式工程师,另一种是小公司的嵌入式工程师,我知道这样分类很不妥,但并非毫无道理,请听我一一下概述:

    大公司:大公司的特色是什么?答案:人多!

    人多导致的后果是什么?答案:项目分工非常细,都遵循“术业有专攻”这一哲学道理;

    例如职位是嵌入式驱动开发,那么大公司可能还会细分嵌入式显示屏驱动工程师、嵌入式音频驱动工程师、嵌入式电源驱动工程师等;这就是大公司一贯的作风,它希望去培养某一方面的人才;说白了就是如果你分配到的是一个显示屏驱动项目,那么有可能你这一年内都是在开发显示屏驱动,一年后你将是显示屏驱动方面的一个小专家;在大公司记住一点,你做的东西都是很“精”的;同时,大公司的薪资水平和福利也是相当可观的,有完善的晋升路线,离职率一般不高。

    小公司:小公司的特色是什么?答案:人少!

    人少导致的后果是什么?答案:项目分工不明确,什么都得干,它给你灌溉的思想是“小陈,我们培养的是综合性人才,在这里你就是全栈工程师”;

    估计很多人都没听明白,意思是说这里人少活多,你什么都得干。小公司才不会管你是嵌入式驱动工程师还是嵌入式应用工程师(有的公司还是区分的,的确不能以片盖全),反正是活你就得干,分分钟前端后台服务器你都得给我干,不要跟我说什么没学过,没学过就去学呗。小公司还有一个特色就是:“节奏快”,大公司里面可能开展一个项目会花上几个月的时间或者更长,在小公司是不存在的,领导都是指望着你几天或者两三周完成,那你也只能说呵呵了。的确,在小公司你可以得到飞速的进步,很强的综合性技能,前提是比人家花出更多的时间,把每一个项目理解清楚,而不是应付心态。坚持下来,两年后必能独当一面。小公司提供给应届生的薪资水平相对与到大公司来说要低,其福利不完善和晋升路线也一般比较模糊,所以小公司的离职率会比较高,经常出现两年三跳的情况。

    还有一个经验分享给年轻人:无论哪种语言,程序代码只是一个简单的工具,最后真正留下的只有原理、协议、框架、思维。

    三.嵌入式发展前景与当今状况

    目前的嵌入式开发更倾向于智能化,也就是我们所说的智能硬件(硬件+软件),从现在各种前沿的嵌入式产品来看的确如此,嵌入式产品的一个发展趋势是更倾向与自动化控制和人机交互,而不是强调“算法”这一块,要区分你仅仅是一名嵌入式工程师而不是算法工程师,什么一大堆“人工智能”、“阿尔法狗”、“深度学习”、“神经网络”都不需要深入理解,那是研究生、博士生做的,小生并不是说你的能力不足,而是“术业有专攻”,这并不是一名嵌入式工程师的工作量,你需要做的仅仅是与他们的“云端大脑”进行对接,调用他们API就完事了。

    由于人工智能、深度学习、神经网络、区块链、大数据等先进学科的崛起,很多人都产生质疑:“嵌入式还有发展前景吗”?这个问题我在这里可以很肯定地告诉你:“嵌入式有很好的发展前景,前沿嵌入式技术即将崛起,或者说已经崛起”。的确,人工智能、大数据这些学科会给嵌入式带来冲击,就目前来看,大学生更倾向与python编程语言、机器学习这一块,而嵌入式学者的确比往年有所下降,但学者少了并不代表他的需求就少了,并不代表他的薪资水平下降了,目前的一个嵌入式技术更倾向于与智能学科相结合的趋势,以百度机器人为例,机器人的核心是大脑,即是“数据和算法”,但机器人大脑想机器人身躯能够像人类一样活动,能说会道,行走自如,那么就必须得依靠嵌入式技术,这就是我所说的嵌入式+智能学科应用,从长久来看,嵌入式只会越来越火,智能学科的崛起必定带动新型的嵌入式技术发展。

    对于发展前景,有一项更重要的参数,那就是当今嵌入式软件工程师的薪资水平,我下面给出一些理性的数据,是从各大招聘平台调研而来:(数据只能作为参考,具体薪资还是得看个人修为,有的达不到该薪资水平,有的早已超过该薪资水平)

    非211、985院校应届毕业生平均月薪:8k

    是211、985院校应届毕业生平均月薪:12k

    一年工作经验者月薪:10k-15k

    二年工作经验者月薪:12k-18k

    三至五年工作经验者月薪:20k-30k

    上述数据只针对那些“真正努力”的嵌入式工程师,不适合应“应付式工作”的嵌入式工程师,同时声明不对该薪酬水平负任何责任。

    四.展望人工智能带动前沿嵌入式技术

    人工智能给嵌入式带来的冲击,是福也是祸,人工智能实现智能化无处不依赖嵌入式技术,人工智能学科在不知不觉中带动嵌入式技术革新,从一系列智能产品,包括无人机、智能音响、机器人控制、城市天眼系统、智能家具、自动驾驶汽车、扫地机器人、小米手环等等,有哪个不依靠嵌入式技术来实现,并没有,人工智能越是想向人类表达他的智能水平,越是要依靠嵌入式技术,所以前沿嵌入式技术更倾向于嵌入式+智能学科的发展,当智能学科真正崛起,嵌入式必定又是一次浪潮与技术革新。

    展开全文
  • 何为嵌入式? 1、单片机相关 1.1 基于单片机的智能小车、智能机器人制作 1.2 基于Arduino的3D打印机制作 2、嵌入式Linux相关 2.1 智能扫地机器人 2.2 智能可穿戴类设备:智能安全头盔 2.3 智能可穿戴类设备:...

    目录:

    0、引言

    何为嵌入式?

    1、单片机相关

    1.1 基于单片机的智能小车、智能机器人制作

    1.2 基于Arduino的3D打印机制作

    2、嵌入式Linux相关

    2.1 智能扫地机器人

    2.2 智能可穿戴类设备:智能安全头盔

    2.3 智能可穿戴类设备:面向空巢老人/病人的智能手环

    2.4 物联网智能控制系统:家居、农业、医疗

    2.5 基于Linux的嵌入式网络视频监控系统

    2.6 移动图像监控系统

    2.7 基于TCP/IP的安全文件传输系统(TLS/SSL)

    2.8 嵌入式MP3播放器

    2.9 基于Qt的新能源汽车电池管理系统

    2.10 嵌入式车载导航定位系统 Qt+GPS+Baidu Map

    2.11 无人机

    2.12 嵌入式VR、AR

    2.13嵌入式结合AI、Machine Learning

    3、嵌入式Android相关

    3.1 物联网智能控制系统:家居、农业、医疗

    3.2 嵌入式家庭保健系统

    3.3 智能电视TV、AR/VR眼镜

    3.4 自己定制的平板电脑、手机等

    4、裸机开发

    4.1 裸机实现串口通信

    4.2 裸机实现DMA方式SD卡读写

    4.3 裸机是实现NANDFlash、EEPROM的操作(擦除、读写)

    5、相关资料分享

    博主热门文章推荐:


    0、引言

    何为嵌入式?

            IEEE官方定义:Devices Used to Control,Monitor Assist the Operation of Equipment,Machinery or Plants。

    翻译过来就是:用于“控制、监视或者辅助操作机器和设备的装置”。

              其实按我理解,嵌入式系统就是“高大上+土豪”版的单片机,因为嵌入式不只带操作系统(OS),并且都是上架构(如ARM)的。其实咱们所用PC机也是一个嵌入式系统,只不过处理器、Bootloader、操作系统OS都是通用化的Intel系列、BIOS、Windows等;而面向具体应用,就需要根据需求,实现硬件资源和软件操作系统的“私人订制”,无非就是先根据需求硬件选型,然后根据硬件资源去裁剪操作系统,把软件不需要的都去掉,只留有用的,这样保证我们用的系统在达到需求目标的同时,还保证了实时性稳定性(没有无关因素干扰)并且小型化具有专用性

           再啰嗦几句,假设大家对单片机已经很熟了,举个栗子:对单片机引脚控制LED,用C编程通过IDE编译个Hex文件,烧写就可以运行实现;那么对嵌入式来说呢,因为处理器引脚太多(如Cortex-A9架构的Exynos4412芯片 有400多引脚),那么自己一个个配(裸机编程)实在麻烦,而且编的程序都与硬件密切相关,没有通用性且很难移植;因此就使用上了操作系统;那么操作系统干了什么呢?其实就是和单片机操作引脚一样,只不过OS将这些操作封装成各种驱动(如GPIO驱动),那么你只要在应用程序上调用这个驱动内的函数,借助OS内核实现机制,就能向单片机一样操作这些引脚,所有嵌入式设计,底层都是这么实现的。

          So, 怎么判断该用嵌入式还是单片机呢:其实就是看需求,单片机处理能力、可扩展性及其有限,涉及到图像监控处理、网络协议就捉襟见肘了;因此这个逻辑很简单:单片机不能实现的,上嵌入式;并且现在是个嵌入式功能都有成型的solution,特别是Linux的开源,资料成堆成堆的。这也是近年嵌入式(包括物联网智能硬件火这么快的原因之一吧。

    以上都是愚见,切入正题:本人不才整理了几个嵌入式比较好的练手项目和小课题,有的是我之前做的项目,有的是网络搜罗,反正都是我个人认为比较综合而且interesting的,这些网上一大堆相关资料,我这里只是提个题目和其中关键点,具体内容不赘述,感兴趣直接百度google,希望给大家一个参照,大家有idea都可以相互交流,有机会共同学习,感谢。

    骚扰方式: Howiexue@gmail.com


    1、单片机相关

          这里主要是推荐嵌入式相关,所以单片机就只简单提几句

    1.1 基于单片机的智能小车、智能机器人制作

         对于大学经常参加一些智能车比赛的童鞋,相信已经做吐了。。。小车目前可以算是相关资料最多的练手项目之一,各种脑洞大开的智能车车,你值得拥有~

    1.2 基于Arduino的3D打印机制作

    需求:使用单片机,通过限位开关和温度等传感器控制步进电机移动、加热头,将打印材料加热挤出后凝固成型。

    硬件:Arduino mega2560开发板,3D打印机套件,打印材料,安装工具等

    软件:Marlini开源程序,上位机软件Print3D,切片软件(推荐Cura),三维制图软件(推荐犀牛)等。

    参考链接:Kossel - RepRap

                Prusa i3 3D printer - Prusa Printers(推荐一开始做Kossel和i3型的)

    800元组装一台3d打印机全教程流程【图片】【项目发起】800元组装一台3d打印机全教程流程【arduino吧】_百度贴吧

    注:这个项目实现很费事,可谓处处是坑,不只是单片机软硬件知识,还要学三维制图、机械原理等等,期间会遇到一系列问题,但是最终调试完,第一次打出自己想要的东西时,感觉真是此生难忘,所以当时一做就做了三台(下图,其中左面上角是 Prusa I3 型,其余那俩都是Kossel 三角洲)。推荐创客们玩玩,比四轴飞行器好玩多了(也省软妹币)。

        3D打印现在是所谓工业4.0的主打,特别是牛炸天的细胞打印(对你没有看错)、器官打印、粉末金属打印等。不过我们做的也就打印些塑料小玩具,现在的SLA光敏树脂打印倒挺不错,能比FDM的快几十倍,只是成本太贵(貌似10w+)。又扯远了。。。咳咳,下面开始划重点:


    2、嵌入式Linux相关

          嵌入式Linux就是在嵌入式硬件平台上使用Linux操作系统。其实嵌入式开发过程就是硬件+软件设计过程,本节推荐的都是在一个目标硬件平台上设计基于linux系统的应用,主要工作一般都是:Bootloader设计与移植、Linux内核裁剪移植、Linux驱动程序开发移植、文件系统制作移植和最后的应用程序开发移植。说了这么多移植它是什么东东?我理解为:拿着别人写好的东西,稍微自己改改放到自己的平台上,其中的“改”和“放”的过程就是移植的过程。这也是嵌入式工程师必须具备的能力,一定要借鉴甚至使用别人做好的,自己闷头写代码只能闭门造车(大神除外)。

             推荐硬件平台树莓派(首推),友善之臂、飞凌等开发板(这些开发板自带很多练手项目课题,网上也很多资料,本文就不再提那些case),架构最好选主流的ARM,像流行的s3c6410(ARM11)、s5pv210(A8)、exynos4412(A9)等。或者自己画板子(使用现有开源出来的修改下,不过成本高,难度大),有兴趣不妨一试,刚开始学习还是老实用开发板吧。

            推荐软件平台Linux2.6以上内核(2.6以下很多系统机制会不同)嵌入式系统,Github、开源中国和ChinaUnix上一堆开源的Linux驱动和小应用,宿主(PC)机最好使用Fedora、Ubuntu系统(如果使用虚拟机VMware版本最好在9.0以上),Bootloader推荐使用U-Boot;文件系统根据使用的Flash支持,用Busybox制作;人机界面用Qt。

    如图:

    嵌入式系统层次结构

    2.1 智能扫地机器人

           深藏不露的“扫地僧”,类似壁障设轨智能小车,只不过有更多人性化功能,网上资料+自由发挥吧

    2.2 智能可穿戴类设备:智能安全头盔

    背景:在工厂或危化品存储等场所,经常发生危害气体泄漏,而由于环境、风力等因素,人们无法直接在固定位置检测,而且有的气体是无色无味,如何解决?其实最终目的还是保证工人的人身安全,这时候就体现出来智能可穿戴设备的价值。

    需求:设计智能安全头盔,当检测到有害气体后震动报警,并将该危险地点通过GPS上传到上位机显示,生成一个有害气体地图(借助Baidu API)以红色标出危险地段。

    2.3 智能可穿戴类设备:面向空巢老人/病人的智能手环

    需求:背景不用说,设计一个智能手环(或其他设备),检测人身体的各项生命特征,并且实时GPS传输老人位置,还具有跌倒报警、遇水报警等突发状况向子女手机、服务器端推送报警信息。自由发挥,有些身体特征检测实现确实困难,但总有方法解决,市面已有这类产品。

    2.4 物联网智能控制系统:家居、农业、医疗

    这就是近年炒的最火的智能家居、智慧农业等物联网项目,其实都是属于嵌入式智能控制系统,无非就是底层传感器网络(如Zigbee)采集环境参数数据,传给嵌入式网关,网关再传给上位机服务器,再加上远程控制、视频监控等。像这样的题目很多很多,例如智能温室大棚控制系统、智能家居系统、智慧医院系统、智能仓储管理系统等等,其实都能归结为一套系统,只不过根据应用领域有些不同细节。

     

    盗图留种:智能农业系统综合项目实训|项目作品演示_华清远见高端IT培训

    注:这类课题难度适中,建议多人合作,分别负责感知层(传感器网络),网关层(嵌入式平台),上位机应用层(Web服务器、安卓App);至于云端架构可以使用乐联网、Yeelink等已实现好的物联网平台。总之多借鉴别人好的案例。

    友情提示:可以先做底层采集温度,传给网关显示并转发到服务器,这一路通了后面程序就好开发了。或者灵活变通,用嵌入式网关采集传感器(需移植传感器驱动到Linux内核),就不需要使用Zigbee等WSN了(如下图)这也可以算是一个题目,都很open的,怎么做你来定,只要脑中有idea,生活处处皆课题(简直是自虐)。

    2.5 基于Linux的嵌入式网络视频监控系统

    面向安防等应用中,具多个摄像头同时视频传输,为减少带宽、提高视频分辨率和帧率,就需要使用编码标准对视频编码后再传输,so做一个软编码器,我做过基于H.265的编码(有兴趣百度Lib265),这里可以使用H.264(资料较多)其实原理很简单,涉及到摄像头驱动和编码库。还有上位机解码软件。

    Linux网络服务器可以使用开源的mjpg-streamer。(可以参照国嵌高级项目班视频)

    2.6 移动图像监控系统

          类似2.4, 例如国嵌高级项目班中就有介绍,多了一个入侵检测。使用摄像头抓取图像,通过Motion库动态监控比对,一旦出现和前一个图像较大变化(如家中进来一个人),则立即拍照将照片传到上位机,并报警等联动。

        后面还包括安全文件传输系统,嵌入式MP3两个都是国嵌教程里的项目,后面都有链接,我也是以前学习时候在网上找的,如有侵权等问题请告知

           另外:视频图像做好了,就可以做很多应用,如现在比较牛的机器视觉,无损检测、缺陷检测等等。

    2.7 基于TCP/IP的安全文件传输系统(TLS/SSL)

        其实就是把Socket包通过OpenSSL的工具加密一下(TLS/SSL),再发送,然后接受端再解密。里面用到了线程池,在企业项目会经常用到。

    2.8 嵌入式MP3播放器

    2.9 基于Qt的新能源汽车电池管理系统

        如题,使用Qt作为GUI显示,实现对电池容量显示和管理操作。较简单,不过可扩展性强,大到汽车管理,再大一点还可以上升到车联网。

    2.10 嵌入式车载导航定位系统 Qt+GPS+Baidu Map

        GPS采集经纬度数据通过GPRS、WiFi无线传输到服务器上,并借助Baidu、Google提供的API进行精确定位。(还是那句话,借鉴网上现有的,自己开发难度Huge)

    2.11 无人机

    好吧,不得不又谈四轴了,现在无人机导航送快递、监控交通可谓前景广大,有兴趣创客可以做一个,网上各类资料,实现不难,但主要是烧钱….烧钱….钱…

    Ps:买就要买好的模块,特别是图传和电调!,要么一摔就….别问我怎么知道的!

    2.12 嵌入式VR、AR

    VR/AR实际没接触过,不过很高大上的样子,最近好多大牛公司在搞虚拟现实。感觉还是嵌入式图像处理+全景映象的应用吧,有兴趣可以看看Google的产品。

    2.13嵌入式结合AI、Machine Learning

    此类课题必火!本质其实就是将机器学习、人工智能等算法,应用在嵌入式领域。AI领域将是嵌入式工程师的又一择业选择!未来必将处处AI,且处处嵌入式AI(如现在市面各类AI电器)。

    因为AI涉及到N多机器学习类算法,学习过程也能极大提高嵌入式er的算法能力(算法一般是广大嵌入式er的一块短板),网上也有各种大神编译好的算法模型可以借鉴并直接使用,不过在学习阶段建议自己从无到有搭建算法模型、找数据集训练、交叉验证最终移植发布,有可能自己搭的模型效果不咋地,但这个过程我觉着还是能学到不少AI的思想。。。

    本人这方面还是纯种小白,目前正在努力学习,找到好的嵌入式AI资料再第一时间奉上。(前期可以看看吴恩达的视频)

    附机器学习算法地图:


    3、嵌入式Android相关

    嵌入式Android开发,就相当于自己定制各种功能的手机一样,因为Android系统发布就是面向移动端设备的,Android系统移植后也保留大量移动设备应用。因为Android系统基于Linux内核,所以底层还是Linux的东西,但应用层就完全不一样了,要在之前的基础上开始学Java、JNI、Android编程,相关嵌入式资料也没有Linux多,所以想开发还是有一些门槛的。

    要说明的是:上述嵌入式Linux的项目,用嵌入式Android一样开发,只不过平台不一样,用的Linux内核不太一样而已,这时候如果真心想学,可以在上面项目做完后的基础上,将你的项目移植到Android平台。这里要注意使用的Linux内核版本,缺少什么就补什么,如驱动、库文件等等,然后重新编译移植内核

    Android系统架构

     推荐硬件平台树莓派、友善之臂、飞凌等开发板,这里一般的处理器就不行了,ARM11以下可能连安卓2.0系统都带不动,So推荐使用Cortex-A9四核处理器或以上,否则系统卡顿…顿….

     推荐软件平台嵌入式Android2.3以上系统,宿主(PC)机最好不要用虚拟机,我用真实Ubuntu,i5+8G内存的主机编译Android5.0.2系统都编译了8个多小时,推荐使用开发板厂家提供的已经编译好的版本,不要重新一点点编译;Bootloader和上章一样,Linux内核3.0以上;人机界面直接用Android自带的(嵌入式Android优势)。

    3.1 物联网智能控制系统:家居、农业、医疗

    同上文一样,只不过网关那一层换成Android平台,个人感觉这个还是很有搞头的,毕竟Android用户群这么大,大家跟熟悉,操作使用更方便。

    这里说到了 ,类似上章的题目,都可以把Linux平台转到Android平台,所以这里关于上面提到的题目就不再赘述。

    3.2 嵌入式家庭保健系统

    借助Android良好的人际交互,开发集成智能心率计、血压计等检查项目的嵌入式系统。

    3.3 智能电视TV、AR/VR眼镜

    就是家里用的互联网电视机顶盒,例如小米、乐视盒子,结合AR技术

    需要支持HDMI音视频输出、VGA输出、AV音视频输出、支持网口与WIFi、支持USB设备(鼠标键盘)、支持红外设备(遥控器)等。

    3.4 自己定制的平板电脑、手机等

    从底层或者上层应用定制自己的移动设备,比如说更改开机界面为你的果照。。


    4、裸机开发

    “裸奔”挺难的,因为不使用操作系统,不光要整天和芯片datasheet打交道,还要深入处理器架构以及各类存储机制。其实严格意义来讲,我们之前搞单片机也是属于裸机开发。

    如果是大神中的大神,上述的一些题目完全也可以用裸机开发出来,我没有奔过,不敢妄自评测,所以只提供几个小题目。

    4.1 裸机实现串口通信

    4.2 裸机实现DMA方式SD卡读写

    4.3 裸机是实现NANDFlash、EEPROM的操作(擦除、读写)


    5、相关资料分享

    福利来也

    注:这些都是我学习嵌入式时候精心整理的资料,其中也有购买或在网上找的资源,如有侵权等问题请告知删除

    链接:http://pan.baidu.com/s/1b0QLOy 密码: 

    链接:http://pan.baidu.com/s/1cDsqp4 密码: (本文提到的很多项目源码和视频)

    链接:http://pan.baidu.com/s/1dFmNHxZ 密码: 

    链接:http://pan.baidu.com/s/1gfFPTIV 密码: 

    PS:一直审核不过,考虑或许有不少涉及版权,就把链接密码去了,所以需要资料的留言邮箱吧~ 别忘了+关注收藏一键三连哦~

    博主热门文章推荐:

    一篇读懂系列:

    LoRa系列:

    网络安全系列:

    嵌入式开发系列:


    友情赞助:

    如果你觉得博主的文章对你那么一点小帮助,恰巧你又有想打赏博主的小冲动,那么事不宜迟,赶紧扫一扫,小额地赞助下,攒个奶粉钱,也是让博主有动力继续努力,写出更好的文章^-^,求赞助哦~~。

        1. 支付宝                2. 微信

                                     

    展开全文
  • 嵌入式开发(一):嵌入式开发新手入门

    万次阅读 多人点赞 2019-07-26 15:54:18
    本篇文章整理下嵌入式开发中一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。 嵌入式开发流程一般如下,一般是在PC机的Windows系统下安装Ubuntu虚拟机,搭建嵌入式开发环境及...

    系列文章:

    嵌入式开发(一):嵌入式开发新手入门
    嵌入式开发(二):开发板配置(自用)
    嵌入式开发(三):海思Hi3559a交叉编译live555

    嵌入式开发(四):海思Hi3559AV100交叉编译ffmpeg
    嵌入式开发(五):海思Hi3559AV100交叉编译boost
    嵌入式开发(六):websocketpp服务端海思交叉编译及使用
    嵌入式开发(七):thrift库ubuntu端编译
    嵌入式开发(八):makefie文件


    本篇文章整理下嵌入式开发中一些入门的基础技能,都是根据以往的工程经验整理,适用于之前没做过嵌入式开发的新手。

    嵌入式开发流程一般如下,一般是在PC机的Windows系统下安装Ubuntu虚拟机,搭建嵌入式开发环境及交叉编译环境,开发完成后,编译得到bin文件,然后在Windows下将bin文件通过串口或网络下发到嵌入式板卡,程序在嵌入式板卡上运行。

     

    1. RS232串口接孔图解

    串口,一般也指COM接口,传输速度较慢,适合远距离传输。这里用于主机与嵌入式版之间的数据通信,一般用于指令下发等。按照协议标准还分为RS-232-C、RS-422、RS485等。其中RS-232也是最常用的串口,称为标准串口。下面仅介绍RS-232的的接线图。RS232串口为9针接口,分为公头与母头,PC机上的串口一般为公头,如下图。

     各个针孔功能如下:

    最简单的串行接口需要的信号线是2数据发送(TxD)3数据接收(RxD)和5信号地(GnD) ,只需要接通这3根线即可实现上位机PC与嵌入式板的通信,如下图:

     2. 上位机与嵌入式板串口通信工具

    一般使用SecureCRT工具进行上位机与板卡通信。

    (1)串口连接

    打开快速连接

    协议选择Serial,端口与波特率根据实际情况而设置,

    点击连接,弹出新窗口,敲回车键,出现以下界面表示上位机与板卡连接成功。

    (2)使用Telnet连接

    Telnet连接就是使用网络(即网线)实现PC机与板卡通信,而不需要串口。

    Tlenet新建连接,选择Telnet协议,主机名是板卡的ip。

     点击连接,弹出新窗口,输入用户名和密码:

     

    3. 上位机与嵌入式板卡实现文件传输

    在SecureCRT中使用命令ifconfig查看板卡的ip地址:

    将上位机PC与嵌入式板卡用网线直接连接,将PC机的本地连接ip地址改成与嵌入式板卡同一个网段,例如:

    在上位机中打开tftpd32工具,在Server interface中选择上位机与嵌入式板卡相同网段的ip,如下:

    注意之类PC机是作为TFTP协议的服务端,板卡作为客户端。

    将文件从上位机下载到板卡,在SecureCRT中输入以下命令:

    tftp -g -r 1080P.jpg 192.168.1.100

     这里-g表示从PC下载文件到板卡,-r表示远程服务器(即PC)的文件, 1080P.jpg表示要传输的文件,后面的ip地址就是PC机的IP地址,例如:

    输入以上命令后,板卡在当前目录下即收到该文件。如果需要在某个目录下接收文件,需要切换到该目录下,再输入以上命令。

    将文件从板卡传输到上位机,在SecureCRT中输入以下命令:

    tftp -p -l 10801P.jpg 192.168.1.100

    这里-p即推送的意思,-l表示本地(板卡)的文件。

     

    4. 常用Linux命令

    • 回到根目录:cd /
    • 解压文件:tar -xvf data.tar
    • 删除文件: rm -f 1.txt
    • 改变目录的读写权限:sudo chmod 777 /usr/share/themes

                 说明:这里777表示每个用户都可以读写,后面设的是路径

    • 重命名:mv aaa.h264 bbb.h264

                 说明:将aaa.h264重命名为bbb.264

    • 查看ip地址:ifconfig
    • 查看文件属性:stat sample_nnie_main
    • 查看当前路径:pwd
    • 创建文件夹:mkdir
    • 更改ip地址:ifconfig eth0 192.168.6.111  (重启后会丢失)

    (持续更新)

    5. MP4、AVI等转换为*.h264格式

    在嵌入式系统中,程序往往无法直接解码mp4,avi等格式视频文件,需将其转换为裸流.h264格式,方法如下:

    PC上下载ffmpeg工具,切换到ffmpeg.exe的目录,用cmd打开命令行窗口:

    .mp4转.h264:

    ffmpeg -i 1920x1080.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 1920x1080.h264

    .avi转.h264:

    ffmpeg -i 160x120.avi -vcodec h264 -s 160*120 -an -f m4v test.h264

    mov转h264

    ffmpeg -i test.mov -vbsf h264_mp4toannexb -vcodec copy -an 2.h264 

    即在ffmpeg目录下生成所需格式的文件。

    展开全文
  • 韦东山嵌入式Linux第一期视频

    万人学习 2014-11-29 12:20:18
    掌握写汇编代码的能力,可以分析任意裸板包括U-boot、内核里的相关汇编代码; 掌握常用的硬件部件的操作,比如GPIO,UART,I2C,LCD,触摸屏; 深入理解ARM体系统架构,可以写出具备中断功能的裸板程序,对程序现场...
  • 嵌入式 课程设计
  • 嵌入式linux嵌入式linux嵌入式linux嵌入式linux嵌入式linux
  • 行业分类-嵌入式设备-嵌入式装置以及嵌入式系统.zip
  • 嵌入式linux与嵌入式系统设计
  • c嵌入式c嵌入式c嵌入式c嵌入式c嵌入式c嵌入式
  • 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件 嵌入式课件
  • 嵌入式系统芯片工艺制备嵌入式系统芯片嵌入式微芯片实现嵌入式 本溪市溪湖区金博信息传播中心 73?一种嵌入式系统软件中命令解析的偏移量方法 [摘要]?本发明涉及一种嵌入式系统软件中命令解析的偏移量方法用于各类...
  • 大学时期嵌入式系统应用课程设计,包括设计报告,欢迎下载。
  • 行业分类-嵌入式设备-嵌入式微波炉装饰框和嵌入式微波炉.zip
  • 行业分类-嵌入式设备-嵌入式灯具连接装置以及嵌入式灯具.zip
  • 行业分类-嵌入式设备-嵌入式灯具的接线结构及其嵌入式灯具.zip
  • 行业分类-嵌入式设备-嵌入式冰箱的散热系统以及嵌入式冰箱.zip
  • 嵌入式】基于ARM的嵌入式Linux开发总结

    万次阅读 多人点赞 2019-06-14 20:04:39
    前言嵌入式知识点复习一嵌入式知识点复习二 --体系结构嵌入式知识点复习三 --ARM-LINUX嵌入式开发环境嵌入式知识点复习四 --arm-linux文件编程嵌入式知识点复习五 --arm-linux进程编程嵌入式知识点复习六 --arm-...

    嵌入式知识点复习一

    1、 嵌入式系统的一般组成结构

    在这里插入图片描述

    2、嵌入式硬件系统的结构
    (1)嵌入式处理器+外围硬件
    (2)常见的外围硬件:电源、时钟、内存、I/O、通信、调试;
    3、嵌入式处理器
    (1)ARM、S3C6410、STM32单片机、华为海思、高通骁龙等
    (2)Intel /AMD 都不是嵌入式处理器
    4、嵌入式操作系统
    功能:
    种类:嵌入式linux;WinCE;Vxworks;μC/OS-II;Android;IOS。注意:linux不是嵌入式操作系统;MAC OS WINDOWS XP/7/8/10都不是

    嵌入式知识点复习二 --体系结构

    1、ARM:ADVANCED RISC MACHINES,是一款嵌入式微控制器,也是一家嵌入式处理器设计厂商。设计高性能、低功耗的嵌入式处理器。
    2、ARM微处理器工作状态:两种指令对应两种状态(通常情况)
    (1)Thumb状态、ARM状态;
    (2)32位定长ARM指令,16位定长Thumb指令。
    (3)ARM1176支持ARM指令、Thumb指令、Jazelle指令,故有三种状态:ARM状态、Thumb状态、Jazelle状态。
    3、异常:
    (1)处理器执行某些区别于用户指令的任务,如中断处理、复位、调试等;为了区分用户指令,因此称为异常;
    (2)异常的种类与类型(1176为例):7种,中断(IRQ)、快中断(FIQ)、未定义(Undef)、数据中止(DABT)、预取指中止(PABT)、软中断、复位(reset)
    4、工作模式:根据系统执行正常或异常指令不同,分为8种工作模式:用户模式、系统模式、中断模式、快中断模式、未定义模式、中止模式(对应数据中止异常、预取指中止)、SVC管理模式(软中断、复位)、SM安全监视器模式。
    5、寄存器:
    (1)ARM处理器均为32位寄存器;
    (2)ARM1176寄存器数量:40个
    (3)ARM1176寄存器包括:未分组寄存器、分组寄存器、CPSR、SPSR;
    (4)未分组寄存器(所有模式通用):9个,R0~R7;R15(PC)
    (5)分组寄存器(不同工作模式下专用,不同模式稍有不同):
    ① R8~R14;
    ② 6个不同模式下的SPSR寄存器:SPSR_irq,SPSR_fiq,SPSR_abt,
    SPSR_und,SPSR_svc,SPSR_mon
    (6)可复用寄存器:
    ① SP堆栈指针寄存器-R13,用于保存子程序调用或异常处理的临时数据;
    ② LR连接寄存器-R14,用于保存子程序调用或异常处理时,主程序调用指令/中断跳转指令的下一条指令的入口地址,以便于恢复主程序;
    ③ PC程序计数器-P15,用于保存要执行的指令的地址。
    (7)PSR程序状态寄存器:
    ① 包括CPSR当前程序状态寄存器和SPSR备份的程序状态寄存器;
    ② CPSP用于保存当前模式下处理器模式、状态、中断使能、大小端模式及条件位等信息;
    ③ SPSR用于备份异常发生前的CPSR寄存器的值,以便异常处理结束时能返回用户程序状态。
    6、ARM支持两种中断:IRQ和FIQ
    7、ARM数据存储格式:大端(big endian)和小端(little endian)
    8、采用RISC架构的ARM微处理器一般具有如下特点:
     
    ① 体积小、低功耗、低成本、高性能;
    ② 支持Thumb(16位)/ARM(32位)双指令集,能很好地兼容8位/16位器件;
    ③ 大量使用寄存器,指令执行速度更快;
    ④ 大多数数据操作都在寄存器中完成;
    ⑤ 寻址方式灵活简单,执行效率高;
    ⑥ 指令长度固定;
    ⑦ 指令支持按 条件执行;
    ⑧ 内存访问采用load/store实现。

    嵌入式知识点复习三 --ARM-LINUX嵌入式开发环境

    一、交叉开发模式
    1、组成结构
    (1)宿主机:开发主机,一般由PC、发行版linux系统、开发工具(本地及交叉编译)(代码编辑器Vi,编译器GCC、调试器GDB、工程管理器MAKE、NFS等)组成;
    (2)目标机:嵌入式系统,一般由ARM硬件、BOOTLOADER、内核、根文件系统构成;
    (3)连接工具:串口线、网线、USB线等。
    2、理解编译工具链与交叉编译工具链的异同
    (1)相同点:
    ① 用于支持的语言的编译、链接与调试,编译器用法相同;
    ② 通常都有编译器、链接器、调试器、库及其他二进制工具构成。
    (2)不同点:
    ① 编译工具链一般用于本机编译、本机执行的开发模式;
    ② 交叉编译工具链用于宿主机编译,目标机运行的交叉开发模式;
    ③ 编译器一般Linux发行版都配备,直接调用gcc命令即可;
    ④ 交叉编译器一般需根据宿主机软硬件环境,进行gcc、相关库、工具进行有针对性的定制。
    ⑤ 实验室使用的OK6410开发板定制的编译器为32位的,其交叉编译工具链主要arm-linux-gcc,arm-linux-g++arm-linux-gdb等构成。
    二、开发工具的用法
    1、Vi的工作模式及其切换-掌握使用Vi完成源代码编辑、保存及退出的常见按键操作;
    2、GCC:GNU Compiler Collection,GUN编译器套件,特点:
    ① 支持绝大多数高级语言的编译,既支持传统的C/C++,Fortan,Objective-C ,也支持java,python,go等语言;
    ② 支持汇编语言;
    ③ 支持绝大多数的主流处理器平台;
    ④ 便于构建交叉编译工具链。
    3、gcc/arm-linux-gcc用法:
    ① 基本用法:gcc hello.c;arm-linux-gcc hello.c;输出a.out
    ② 推荐用法:gcc hello.c -o hello/arm-linux-gcc hello.c -o hello ,可以指定输出文件名称;
    ③ 主要的编译参数
    -Wall 打印全部警告信息;
    -O{0-3,s} 支持代码优化,0无优化;
    -g 支持gdb调试;
    -lpthread 支持多线程。

    4、make及Makefile
    (1)make:工程管理器,利用执行Makefile文件实现工程管理(编译、链接、生成工程镜像、安装、清理、卸载等);
    (2)make用法:编写Makefile,在终端下执行make命令即可。
    (3)Makefile文件编写示例:
    一个工程,2个源文件testa.c ,testb.c,一个头文件testb.h,编译器为arm-linux-gcc,生成的可执行文件为test,需支持代码优化、打印警告信息,支持gdb调试等编译选项,其Makefile文件如下:
    SRC=testa.testb b.c testb.h
    EXEC=test
    CC=arm-linux-gcc
    CFLAGS=-Wall -O2 -g
    ( E X E C ) : (EXEC): (EXEC):(SRC)
    $(CC) $(SRC) -o $(EXEC) $(CFLAGS)

    嵌入式知识点复习四 --arm-linux文件编程

    1、linux文件编程概述
    (1)文件描述符:Linux中文件分为4种:普通文件、目录文件、链接文件、设备文件要区分这些文件就要了解“文件描述符”;
    文件描述符是一个非负的整数,他是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符,当需要读/写文件时,也需要把文件描述符作为参数传递给相应的函数。
    (2)基本I/O操作
    Linux的输入/输出(I/O)操作,通常为5个方面:打开,读取,写入,和关闭
    对应的有5个系统调用:
    open,read,write,close,lseek
    所需要的头文件:
    #include <sys/types.h>
    #include <unistd.h>
    1.open函数
    open函数的原型如下:
    int open(const char *pathname, int flags, mode_t mode)
    函数传入参数含义如下:
    pathname:为字符串,表示被打开的文件名称,可以包含路径。
    flags :为一个或多个标志,表示文件的打开方式,常用标志如表所示:
    O_RDONLY 只读方式打开
    O_WRONLY 只写方式打开
    O_RDWR  读/写方式打开
    O_CREAT 如果文件不存在,就创建新的文件
    O_EXCL 如果使用O_CREAT时文件存在,则可返回错误消息
    O_TRUNC  如果文件已存在,且以只读或只写成功打开,则先全部删除文件中原有的数据
    O_APPEND  以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾、
    注意:在open函数中,flags参数可以用过“|”组合而成,O_RDONLY,O_WRONLY,O_RDWR这三种方式是互斥的,不可同时使用,因此这3个参数只能出现一个。

    mode 被打开文件的存取权限模式,可以使用八进制数来表示新文件的权限,也可以采用<sys/stat.h>中定义的符号常量,当打开已有文件时,将忽略这个参数,函数返回值:成功则返回文件描述符,出错返回-1。

    文件模式符号常量:
    S_IRWXU   00700    所属用户读。写和执行权限
    S_IRUSR   00400   所属用户读权限
    S_IWUSR   00200   所属用户写权限
    S_IXUSR   00100   所属用户执行权限

    S_IRWXG  00070   组用户读,写和执行权限
    S_IRGRP   00040   组用户读权限 
    S_IWGRP   00020  组用户写权限
    S_IXGRP   00010  组用户执行权限

    S_IRWXO  00007  其他用户读,写和执行权限
    S_IROTH  00004  其他用户读权限
    S_IWOTH  00002  其他用户写权限
    S_IXOTH  00001  其他用户执行权限
    2.read和write函数
    函数原型如下:
    ssize_t read(int fd, void *buf,size_t count)
    ssize_t write(int fd,const void *buf, size_t count)
    函数传入参数含义如下:
    fd 文件描述符
    buf 指定存储器独处数据的缓冲区
    count 指定读出或写入的字节数
    3.close函数
    当使用完文件时可以使用close关闭文件,close会让缓冲区中的数据写回磁盘,并释放文件所占的资源,close的原型如下:
    int close(int fd)
    函数传入参数:fd文件描述符
    函数返回值:若文件顺利关闭则返回0,发生错误则返回-1,并置errno,通常文件在关闭时出错是不常见的,但也不是不可能的情况,他别是在关闭通过网络访问的文件时就会出现这种情况。
    4.lseek函数
    主要用于移动文件读写指针,主要用于获取文件大小和拓展文件(先分配空间、然后再填充内容),函数原型如下:
    off_t lseek(int fd, off_t offset, int whence)
    参数 fd:文件描述符。
    offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)
    whence
    (当前位置基点): SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。
    SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
    SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。
    返回值 成功:文件的当前位移
    -1:出错

    实例:(1)参考实验2:linux文件编程;
    (2)网盘:/linux编程源代码/IO(readwrite、fcntl)下相关代码

    嵌入式知识点复习五 --arm-linux进程编程

    一、Linux进程编程
    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。
    1 进程控制
    子进程创建:fork()函数
    在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,因为fork()函数看起来执行一次却返回两个值。
    1)fork()函数说明
    fork()函数用于从已存在的进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。
    使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间,包括进程的上下文、代码段、进程堆栈、内存信息、打开的文件描述符、符号控制设定、进程优先级、进程组号、当前工作目录、根目录、资源限制和控制终端等,而子进程所独有的只有它的进程号、资源使用和计时器等。
    因为子进程几乎是父进程的完全复制,所以父子两进程会运行同一个程序。这就需要用一种方式来区分它们,并使它们照此运行,否则,这两个进程不可能做不同的事。
    实际上是在父进程中执行fork()函数时,父进程会复制一个子进程,而且父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行,从而使两个进程分别获得所属fork()函数的返回值,其中在父进程中的返回值是子进程的进程号,而在子进程中返回0。因此,可以通过返回值来判断该进程的父进程还是子进程。
    2)fork()函数语法
    在这里插入图片描述
    进程等待函数
    1)wait()函数,无条件等待,父进程阻塞直到子进程结束
    在这里插入图片描述
    2)waitpid()函数,指定等待某个子进程结束以及等待的方式(阻塞或非阻塞)
    所需头文件 #include <sys/types.h>
    #include <sys/wait.h>
    函数原型 pid_t waitpid(pid_t pid, int *status, int options)
    函数参数 pid pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
    pid=-1:等待任何一个子进程退出,此时和wait作用一样。
    pid=0:等待其组ID等于调用进程的组ID的任一子进程。
    pid<-1:等待其组ID等于pid的绝对值的任一子进程。
    status 同wait
    options WNOHANG:若由pid指定的子进程并不立即可用,则waitpid不阻塞,此时返回值为0
    WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态。
    0:同wait,阻塞父进程,等待子进程退出。
    函数返回值 正常:结束的子进程的进程号
    使用选项WNOHANG且没有子进程结束时:0
    调用出错:-1
    所需头文件 #include <sys/types.h>
    #include <sys/wait.h>

    函数原型 pid_t waitpid(pid_t pid, int *status, int options)
    函数参数 pid pid>0:只等待进程ID等于pid的子进程,不管已经有其他子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
    pid=-1:等待任何一个子进程退出,此时和wait作用一样。
    pid=0:等待其组ID等于调用进程的组ID的任一子进程。
    pid<-1:等待其组ID等于pid的绝对值的任一子进程。
    status 同wait
    options WNOHANG:若由pid指定的子进程并不立即可用,则waitpid不阻塞,此时返回值为0
    WUNTRACED:若某实现支持作业控制,则由pid指定的任一子进程状态已暂停,且其状态自暂停以来还未报告过,则返回其状态。
    0:同wait,阻塞父进程,等待子进程退出。
    函数返回值 正常:结束的子进程的进程号
    使用选项WNOHANG且没有子进程结束时:0
    调用出错:-1

    进程结束:exit()和_exit()

    所需头文件 exit:#include <stdlib.h>
    _exit:#include <unistd.h>
    函数原型 exit:void exit(int status);
    _exit:void _exit(int status);
    函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
    通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
    在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的
    处理。

    所需头文件 exit:#include <stdlib.h>
    _exit:#include <unistd.h>
    函数原型 exit:void exit(int status);
    _exit:void _exit(int status);
    函数传入值 status是一个整型的参数,可以利用这个参数传递进程结束时的状态。
    通常0表示正常结束;其他的数值表示出现了错误,进程非正常结束。
    在实际编程时,可以用wait系统调用接收子进程的返回值,进行相应的
    处理。

    两者的区别:
    (1)_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;
    (2)exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。
    (3)exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是"清理I/O缓冲"。
    Linux下的进程间通信
    进程间通信用于实现参数传递及通信功能;Linux支持的常用的进程间通信方法:管道、消息队列、共享内存、信号量、套接口等等。
    实例:(1)实验三:Linux进程编程;
    (2)网盘linux编程源代码目录下fork文件下相关实例(FIFO、msgque、shm)。

    嵌入式知识点复习六 --arm-linux网络编程

    1、程序流程
    (1)网络通信程序架构-客户端/服务器架构
    (2)流程如下图:
    在这里插入图片描述
    TCP通信

    2、函数说明
    socket()
    Sockfd=socket(AF_INET,SOCK_STREAM,0);

    Bind()
    s_add.sin_family=AF_INET;IPV4协议
    s_add.sin_addr.s_addr=inet_addr(“192.168.1.123”);IP地址192.168.1.123
    s_add.sin_port=htons(0x8888);端口号是8888

    if(-1 == bind(Sockfd,(struct sockaddr *)(&s_add), sizeof(struct sockaddr)))

    listen()服务器端侦听函数
    listen(Sockfd,5)服务器侦听来自客户端的请求
    accept()服务器端接受客户端连接请求
    nfp = accept(Sockfd, (struct sockaddr *)(&c_add), sizeof(struct sockaddr);

    send()数据发送函数
    send(nfp,“hello,welcome to my server”,32,0)
    recv()数据接收函数
    recv(nfp,buffer,1024,0)
    关闭连接
    Close(nfp)
    关闭服务器
    Close(Sockfd)
    实例:(1)实验四:网络聊天室设计
    (2)网盘/linux编程源代码/socket下相关代码

    嵌入式知识点复习七 --linux字符型设备驱动初步

    一、Linux字符设备驱动初步
    1、Linux设备类型
    (1)字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。
    (2)块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。
    (3)网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备驱动程序。在/dev目录下也没有文件来表示网络设备。

    2、开发流程

    3、关键函数讲解(以2.6以下版本内核为例)
    (1)驱动模块注册register_chrdev()函数
    原型:register_chrdev(unsigned int major, const char *name,const struct file_operations *fops);
    major:主设备号,该值为 0 时,自动运行分配。而实际值不是 0 ;
    name:设备名称;
    fops:操作函数,实现驱动定义的open、read、write、close等内核函数与应用程序调用的open、read、write、close间的映射;
    返回值:
    major 值为 0 ,正常注册后,返回分配的主设备号。如果分配失败,返回 EBUSY 的负值 ( -EBUSY ) 。major 值若大于 linux/major.h (2.4内核)中声明的最大值 (#define MAX_CHRDEV 255) ,则返回EINVAL 的负值 (-EINVAL) 。指定 major 值后,若有注册的设备,返回 EBUSY 的负值 (-EBUSY)。若正常注册,则返回 0 值
    (2)驱动注销unregister_chrdev()函数
    原型:
    #include <linux.fs.h>
    int unregister_chrdev (unsigned int major, const char *name)
    变量:
    major 主设备号
    name 设备文件
    返回值:
    major 值若大于 linux/major.h (2.4 内核)中声明的最大值 (#define MAX_CHRDEV 255),返回 EINVAL的负值 (-EINVAL)。指定了 major的值后,若将要注销的 major 值并不是注册的设备驱动程序,返回 EINVAL的负值 ( -EINVAL )。正常注销则返回 0值。
    (3)File_operation结构体
    file_operations结构是建立驱动程序和设备编号的连接,内部是一组函数指针,每个打开的文件,也就是file结构,和一组函数关联,这些操作主要用来实现系统调用的
    struct file_operations {
      struct module *owner;//拥有该结构的模块的指针,一般为THIS_MODULES
    loff_t (*llseek) (struct file *, loff_t, int);//用来修改文件当前的读写位置
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//从设备中同步读取数据
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向设备发送数据
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的读取操作
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);//初始化一个异步的写入操作
      int (*readdir) (struct file *, void *, filldir_t);//仅用于读取目录,对于设备文件,该字段为NULL
    unsigned int (*poll) (struct file *, struct poll_table_struct *); //轮询函数,判断目前是否可以进行非阻塞的读写或写入
      int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); //执行设备I/O控制命令
      long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); //不使用BLK文件系统,将使用此种函数指针代替ioctl
      long (*compat_ioctl) (struct file *, unsigned int, unsigned long); //在64位系统上,32位的ioctl调用将使用此函数指针代替
      int (*mmap) (struct file *, struct vm_area_struct *); //用于请求将设备内存映射到进程地址空间
      int (*open) (struct inode *, struct file *); //打开
      int (*flush) (struct file *, fl_owner_t id);
      int (*release) (struct inode *, struct file *); //关闭
      int (*fsync) (struct file *, struct dentry *, int datasync); //刷新待处理的数据
      int (*aio_fsync) (struct kiocb *, int datasync); //异步刷新待处理的数据
      int (*fasync) (int, struct file *, int); //通知设备FASYNC标志发生变化
      int (*lock) (struct file *, int, struct file_lock *);
      ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
      unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
      int (*check_flags)(int);
      int (*flock) (struct file *, int, struct file_lock *);
      ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
      ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
      int (*setlease)(struct file *, long, struct file_lock **);
    };
    实例:见网盘/linux编程源代码/ok6410ledrv

    展开全文
  • 行业分类-嵌入式设备-嵌入式装置、嵌入式装置的存储器硬盘以及存取嵌入式装置的存储器硬盘的方法.zip
  • rapidIO嵌入式系统互连
  • 在我们初学嵌入式开发的时候,总会出现一个问题。那就是C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的...
  • 嵌入式系统是以嵌入式计算机为技术,面向用户、面向产品、面向应用,软硬件可裁减的;适用于对功能、可靠性、成本、体积、功耗等综合性能有严格要求的专用计算机系统。  嵌入式系统应具有的特点是:高可靠性;在恶劣...
  • 嵌入式系统编程,满足你嵌入式编程的需求和学习
  • 嵌入式系统 嵌入式系统 嵌入式系统 嵌入式系统 嵌入式系统 嵌入式系统
  • 嵌入式相关嵌入式相关嵌入式相关嵌入式相关嵌入式相关
  • 行业分类-嵌入式设备-一种嵌入式冰箱门铰链及嵌入式冰箱.zip
  • 行业分类-嵌入式设备-嵌入式设备及用于嵌入式设备的诊断卡.zip
  • 行业分类-嵌入式设备-嵌入式LED灯散热器及嵌入式LED灯.zip
  • 行业分类-嵌入式设备-控制嵌入式设备的方法及WEB嵌入式系统.zip
  • 在我们初学嵌入式开发的时候,总会出现一个问题。那就是C语言和嵌入式C编程有什么区别?而嵌入式工程师一般都会告诉你,其区别在于嵌入式的C语言是跑在嵌入式的开发板上的,CPU和电脑不一样,所以编译器也是不一样的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 568,186
精华内容 227,274
关键字:

嵌入式