物联网嵌入式和物联网的关系平台为什么全是linux

面向物联网的几大开源操作系统_Linux新闻_Linux公社-Linux系统门户网站
你好,游客
面向物联网的几大开源操作系统
来源:51CTO&
作者:布加迪编译
本文介绍了面向物联网的许多新型开源操作系统。
在过去的十年间,大多数新型开源操作系统已从移动市场转向物联网市场。本文介绍了面向物联网的许多新型开源操作系统。我们之前的文章介绍了开源物联网框架,以及面向物联网和消费者智能家居设备的Linux和开源开发硬件。
除了介绍面向物联网的新型嵌入式Linux发行版外,我还介绍了OpenWrt等几款比较老的轻量级发行版,它们在这个领域迎来了新生。虽然Linux发行版主要针对网关和集线器,但是面向物联网的非Linux开源操作系统取得了同样迅猛的发展,它们可以在微控制器单元(MCU)上运行,通常面向物联网边缘设备。
请记住一点:如今几乎所有的操作系统都声称有一些物联网连接功能,所以本文这份名单有点随意。本文介绍的开源操作系统大多数符合下列属性:占用内存少、电源效率高、模块化可配置通信堆栈,对特定的无线和传感器技术提供强有力的支持。一些项目注重物联网安全,许多非Linux操作项目专注于实时确定性(real-time determinism),这有时是工业物联网的一个要求。
我通常远离这类Linux发行版:被列入&轻量级&这一类,但是仍然主要针对桌面使用或便携式U盘实施, 而不是针对无外设设备。不过,像LXLE或Linux Lite这些轻量级Linux发行版可能是适合物联网的选择。
非Linux开源平台方面的选择来得比较困难。毕竟,大多数轻量级实时操作系统可用于物联网。我侧重于主要平台,或者是似乎为物联网带来最大希望的平台。其他潜在的候选对象可以在这个开源实时操作系统网站()上找到。
本文未提到Windows 10 for IoT Core,它对创客来说是免费的,支持AllJoyn和IoTivity,但是并非完全开源。还有许多商用实时操作系统是物联网领域的大玩家,比如Micrium的&C/OS。
九大基于Linux的开源物联网发行版
1.Brillo ――在谷歌发布Brillo后的一年里,这款基于安卓的轻量级发行版日益受到嵌入式板卡的追捧,比如英特尔Edison和Dragonboard 410c,甚至得到一些模块上计算机的追捧。Brillo的未来与谷歌的Weave通信协议密切相关,它需要这种协议。Weave为Brillo带来了发现、配置和验证等功能,Brillo可以在只有32MB内存和128MB闪存的设备上运行。
相关链接:
2.华为LiteOS――别将华为的LiteOS与开源Unix变种混为一谈,据说它基于Linux,但确实是一种非常精简的实施方法。一年多前宣布的LiteOS声称可以作为只有10KB大小的内核来部署。LiteOS应用广泛,从基于MCU的设备,到与安卓兼容的应用程序处理系统,不一而足。这款可定制的操作系统拥有诸多功能,比如零配置、自动发现、自动联网、快速启动和实时操作,它提供广泛的无线支持,包括LTE和网状网络。LiteOS随华为的敏捷物联网解决方案交付,它驱动窄带物联网(NB-IoT)解决方案。
相关链接:
3.OpenWrt/LEDE/Linino/DD-Wrt――由于物联网热潮,久负盛名、专注网络的OpenWrt嵌入式Linux卷土重来。轻量级OpenWrt经常出现在路由器和基于MIPS的WiFi板卡上。早期的衍生版(比如DD-Wrt和面向Arduino的Linino)最近更是出现了分支版本。Linux嵌入式开发环境(LEDE)项目承诺治理会更透明、发布周期会更稳定。
相关链接:
4.Ostro Linux――今年8月,英特尔选择用于英特尔Joule模块(运行在最新的四核凌动T5700片上系统上)后,这款基于Yocto Project的发行版一举成名。Ostro Linux符合IoTivity,支持众多的无线技术,还提供一种传感器框架。它非常注重物联网安全,提供操作系统、设备、应用程序和数据等层面的保护,包括加密和MAC。该发行版包含在无外设版本和媒体(XT)版本中。
相关链接:
5.Raspbian――还有另外一些面向Raspberry Pi的发行版,它们更专门面向物联网,不过迅速成熟的Raspbian仍是佼佼者。由于它是面向在最广泛使用的物联网平台上的DIY项目的最流行的发行版,开发人员可以向众多项目和教程寻求帮助。由于Raspbian支持面向Node-JS的可视化设计工具Node-RED,我们觉得没有太充分的理由选择专门针对RPi、面向物联网的Thingbox。
相关链接:
Core――Ubuntu Core的这个嵌入式版本又叫带Snaps的Ubuntu Core,它利用了Snap软件包机制――Canonical将其作为一种通用Linux软件包格式分拆出来,让单一的二进制软件包能够在&任何Linux桌面、服务器、云或设备上&运行。Snaps让Snappy Ubuntu Core能够提供事务回滚、安全更新、云支持和应用程序商店平台。Snappy只需要600MHz处理器和128MB内存,但还需要4GB闪存。它可以在Pi及其他的嵌入式板卡上运行,出现在众多设备上,包括Erle-Copter无人机、戴尔Edge网关、Nextcloud Box和LimeSDR。
相关链接:
7.Tizen――Linux基金会托管的这个嵌入式Linux堆栈主要得到了三星的支持,它在移动市场很少引起注意。它广泛用于三星的电视和智能手表中,包括新的Gear S3,它也零星地实施在三星的相机和消费级设备中。Tizen 甚至可以在Raspberry Pi上运行。三星已开始将Tizen与其SmartThings智能家居系统集成起来,以便能够通过三星电视来控制SmartThings。我们还可以预计它会与三星的Artik模块和Artik Cloud加强集成。Artik随带,但是Tizen 3.0最近连同Ubuntu Core一并移植。
相关链接:
8.uClinux――久负盛名的精简版uClinux是唯一可以在MCU上运行的Linux,可以在特定的Cortex-M3、M4和M7等型号上运行。uClinux需要MCU内置存储器控制器,可以使用外部DRAM芯片来满足内存要求。现在uClinux已被并入到主线Linux内核中,得益于Linux中广泛的无线支持。然而,Mbed等更新颖的面向MCU的操作系统在迅速填补无线方面的空白,配置起来更容易。EmCraft是MCU上uClinux的最大支持者之一,提供众多基于Cortex-M的模块。
相关链接:
9.Yocto Project――Linux基金会的Yocto Project不是一款Linux发行版,而是一个开源协作项目,为开发人员提供构建自定义嵌入式堆栈的模块、工具和方法。由于你可以用极小的开销来定制堆栈,它常常用于物联网。Yocto Project构成了大多数商用嵌入式Linux发行版的基础,也是Ostro Linux和Qt for Device Creation等项目的一部分。Qt正在为Qt 5.8准备一种Qt Lite技术,将为更小巧的物联网目标设备优化Device Creation。
相关链接:
九大非Linux开源物联网操作系统
1.Apache Mynewt――开源、支持无线的Apache Mynewt面向32位MCU,由Runtime开发,由Apache软件基金会托管。模块化的Apache Mynewt拥有无线支持、并发连接的准确可配置性、调试功能和细粒度的电源控制。5月份,Runtime和Arduino Srl宣布,将提供Apache Mynewt,面向Arduino Srl的Primo和STAR Otoo SBC。这款操作系统还支持Arduino LLC板卡,比如Arduino Zero。(最近,Arduino Srl和Arduino LLC达成了诉讼调解,宣布计划在Arduino控股公司和Arduino基金会下重新联手)。
相关链接:
2.ARM Mbed――ARM面向物联网的操作系统针对小巧、电池供电的物联网端点,这些端点在Cortex-M MCU上运行,可能只有8KB内存,已出现在BBC Micro:bit SBC上。虽然最初是半专有、只有单线程,缺少确定性功能,但现在它是开源,采用Apache 2.0许可证,提供了多线程和实时操作系统支持。不像许多轻量级实时操作系统,Mbed在设计当初心系无线通信,最近它增添了线程支持。该操作系统支持可通过Mbed Device Connector来安全地提取数据的云服务。今年早些时候,该项目发布了可穿戴式设备参考设计。
相关链接:
3.Contiki――由于只需要10KB内存和30KB闪存,开源Contiki无法像Tiny OS或RIOT OS那么小巧,也无法像RIOT及其他一些操作系统提供实时确定性。然而,广泛使用的Contiki提供了广泛的无线网络支持,IPv6堆栈由思科贡献。该操作系统提供了一系列广泛的开发工具,包括可装入Cooja Network Simulator的动态模块,以便调试无线网络。Contiki声称可以高效地分配内存。
相关链接:
4.FreeRTOS――FreeRTOS很快就能在嵌入式开发平台中与Linux相匹敌,它特别适用于开发物联网终端设备。FreeRTOS缺少Linux功能,比如设备驱动程序、用户帐户以及高级的网络和内存管理。然而,它占用的资源比Linux少得多,更不用说与VxWorks这样的主流实时操作系统相比了,它还提供开源GPL许可证。FreeRTOS可以在内存不到0.5KB、ROM为5-10KB的设备上运行,不过与TCP/IP架构结合使用更为常见,它更像是24KB内存和60KB闪存。
相关链接:
5.Fuchsia――谷歌的这款最新开源操作系统在8月份部分透露,留下的问题多过答案。Fuchsia与Linux毫无关系,但是基于旨在与面向MCU的操作系统(比如FreeRTOS)兼容的LK发行版,这让许多人猜测它是一款物联网操作系统。不过,Fuchsia还支持移动设备和笔记本电脑,所以谷歌对这个处于早期阶段的项目方面抱有极大的野心。
相关链接:
6.NuttX――非限制性的、采用BSD许可证的NuttX主要以此出名:它是面向开源无人机的最常见的实时操作系统,在APM/ArduPilot和PX4 UAV平台上运行,它们都是Dronecode平台的一部分。NuttX还广泛用于其他资源受限制的嵌入式系统中。虽然它支持x86、 Cortex-A5及-A8平台,但这款基于POSIX和ANSI的操作系统主要针对Cortex-M MCU。 NuttX完全抢占式,有固定的优先级、轮询和偶发调度。该操作系统号称是&小巧的Linux通用型操作系统,但大大精简了功能特性。&
相关链接:
7.RIOT OS――已有8年历史的RIOT OS以高效的电源使用和广泛的无线支持而出名。RIOS的硬件要求是1.5KB内存和5KB闪存,要求几乎与Tiny OS一样低。不过,它也提供了诸多功能,比如多线程、动态内存管理、硬件抽象、部分的POSIX兼容和C++支持,这些是在Linux中而不是在轻量级实时操作系统中更常见的功能。其他功能包括低中断延迟(约40个时钟周期)和基于优先级的调度。你可以在Linux或OS X下进行开发,使用原生移植版,部署到嵌入式设备。
相关链接:
8.TinyOS――这款成熟的开源操作系统采用BSD许可证,非常小巧,支持低功耗,MCU目标设备可以&只有几KB内存和数十KB代码空间&。事件驱动的TinyOS由nesC这种C语言来编写,它经常被研究低功耗无线网络(包括多跳网络)的研究人员使用。据项目组自己承认,&计算密集型的应用程序可能很难编写。&项目致力于提供Cortex-M3支持,不过眼下它仍是为低端MCU和无线电芯片设计的。
相关链接:
9.Zephyr――Linux基金会这款轻量级、提供安全功能的Zephyr RTOS可在只有2-8KB内存的设备上运行。Zephyr可在x86、ARM和ARC系统上运行,主要专注于基于MCU,使用蓝牙/BLE和802.15.4无线电(比如6LoWPAN)的设备。Zephyr基于Wind River的Rocket OS,它基于Viper,而Viper是精简版的VxWorks。最初的目标设备包括Arduino Due和英特尔的Arduino 101及其他设备。Zephyr最近出现在了SeeedStudio的96Boards IoT Edition BLE Carbon SBC,它得到一个新的Linaro LITE工作组的支持。
相关链接:
原文标题: Open Source Operating Systems for IoT,作者: Eric Brown
本文永久更新链接地址:
相关资讯 & & &
& (06月12日)
& (05月10日)
& (07月01日)
& (06月06日)
& (04月20日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款为什么搞嵌入式的要转互联网,搞互联网的想转嵌入式?如何解释? - 知乎324被浏览18628分享邀请回答22426 条评论分享收藏感谢收起7添加评论分享收藏感谢收起更多想要玩转物联网,你需要先会用这些嵌入式操作系统-嵌入式系统-与非网
QNX是一种商用的类Unix实时操作系统,遵从POSIX规范,目标市场主要是嵌入式系统。QNX的应用范围极广,包含了控制保时捷跑车的音乐和媒体功能,核电站和美国陆军无人驾驶Crusher坦克的控制系统,还有RIM公司的BlackBelly PlayBook平板电脑。QNX是一个分布式、嵌入式、可规模扩展的实时操作系统。它遵循POSⅨ.1 (程序接口)和POSⅨ.2 (Shell和工具)、部分遵循POSⅨ.1b(实时扩展)。
QNX操作系统核心仅包含了CPU任务排程、进程间通讯、中断重导向以及定时器等部份,而除此之外包含驱动程序、档案系统堆叠协议以及使用者应用程序的所有程序都是属于在使用者阶段执行。QNX操作系统有个相当特殊的Proc阶段,专门负责程序process的建立,以及存储器管理等交集在系统微核心中的组件。基本上,QNX所有的组件都能透过消息传递这个函式来进行沟通,而具有良好定义的通讯机制,也能保障所有的组件都有完全独立且被保护的储存及执行空间。因此有问题的应用程序不会影响到其它组件的稳定性,发生问题的程序将会被自动终止并重新启动。
与传统的操作系统架构相较起来,微核心架构可以让嵌入式系统获得更为快速的平均回覆时间(MTTR),当硬件驱动程序失效,QNX可以在数毫秒之内,就对该驱动程序进行终止、回收资源并重新启动的步骤,让嵌入式设备可接近无停摆时间表现。
不过微核心RTOS的架构除了优点以外,由于其process间的讯息传递功能将会占用存储器频宽,影响到校能表现,因此在实际应用上,就必须采用特殊的最佳化手段,以避免掉讯息传递功能所带来的性能耗损。
6.Nucleus Plus
这款嵌入式操作系统主要特征就是轻薄短小,其架构上的延展性,可以让Nucleus RTOS所占的储存空间压缩到仅有13K左右,而且Nucleus Plus是一款不需授权费的操作系统,并且提供了原始码。
Nucleus Plus本身只是Acclerated Technology公司完整解决方案里面的其中一环,这个RTOS本身架构属于先占式多工设计,有超过95%的原始码是用标准的ANSI C语言所编写,因此可以非常有效率的移植到各种不同的平台。Nucleus Plus在CISC架构处理器中,核心部份大约占去20KB左右的储存空间,而在RISC处理器上则是40KB左右,核心资料结构仅占约1.5KB,由于其即时回应、先占式多工、以及多process并行,并且开放原始码等特性,在国防、工控、航天工业、铁路、网络、POS、自动化控制以及信息家电等领域广泛受到应用。
就如同QNX一般,Nucleus Plus也可以根据目标产品的需求,来自行剪裁所需要的系统功能,达到精简体积的目的。而配合相对应的编译器(Borland c/c++、Microsoft c/c++)以及动态连结程序库和各种底层驱动程序,在开发上拥有非常相当大的便利性。诸如飞思卡尔(Freescale)、罗技(Logitech)公司、美国NEC、SK Telecom等公司,都有采用Nucleus Plus嵌入式操作系统作为开发产品使用。
WinCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Win CE的图形用户界面相当出色。WinCE是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。它的模块化设计允许它对于从掌上电脑到专用的工业控制器的用户电子设备进行定制。操作系统的基本内核需要至少200K的ROM。
一般来说,一个WinCE系统包括四层结构:应用程序、WinCE内核映像、板级支持包(BSP)、硬件平台。而基本软件平台则主要由WinCE系统内核映像(OS Image)和板卡支持包(BSP)两部分组成。因为WinCE系统是一个软硬件紧密结合的系统,因此即使CPU处理器相同,但是如果开发板上的外围硬件不相同,这个时候还是需要修改BSP来完成一个新的BSP。因此换句话说,就是WinCE的移植过程主要是改写BSP的过程。
8.Android
Android是一个包括操作系统、中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。Android作为一个完全开源的操作系统,是由操作系统Linux、中间件以及核心应用程序组成的软件栈,通过Android SDK提供的API以及想用的开发工具,程序员可以很方便的开发Android平台上的应用程序。其整个系统由应用程序,应用程序框架,应用程序库,Android运行库,Linux内核(Linux Kernel)五个部分组成。Android操作系统内置了一部分应用程序, 包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所有的程序都是用java编写的。
移植的主要的工作是驱动,硬件抽象层的移植。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。
9.嵌入式实时操作系统
在工业控制、 军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。故对嵌入式实时操作系统的理解应该建立在对嵌入式系统的理解之上加入对响应时间的要求。
10.FreeRTOS
FreeRTOS是一个迷你操作系统内核的小型嵌入式系统。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS任务可选择是否共享堆栈,并且没有任务数限制,多个任务可以分配相同的优先权。相同优先级任务的轮转调度,同时可设成可剥夺内核或不可剥夺内核。
FreeRTOS 的移植主要需要改写如下三个文件。1.portmacro.h 2.port.c 3. port.asm
【嵌入式操作系统和通用计算机系统的区别】
嵌入式系统与通用计算机系统有着完全不同的技术要求和技术发展方向。通用计算机系统的技术要求是高速、海量的数值计算,其技术发展方向是总线速度的无限提升、存储容量的无限扩大;而嵌入式计算机系统的技术要求则是智能化控制,技术发展方向是与对象系统密切相关的潜入性能、控制能力与控制的可靠性不断提高。
嵌入式操作系统和通用计算机系统的主要区别包括以下几点:
1、形式与类型:
通用计算机系统:实实在在的计算机。按其体系结构、运算速度和规模可分为大型机、中型机、小型机和微机;嵌入式操作系统:&看不见&的计算机,形式多样,应用领域广泛,按应用进行分类。
通用计算机系统:通用处理器、标准总线和外设、软硬件相对独立;嵌入式操作系统:面向特定应用的微处理器,总线和外设一般集成在处理器内部,软硬件紧密结合。
3、系统资源:
通用计算机系统:系统资源充足,有丰富的编译器、集成开发环境、调试器等;嵌入式操作系统:系统资源紧缺,没有编译器等相关开发工具。
4、开发方式:
通用计算机系统:开发平台和运行平台都是通用计算机;嵌入式操作系统:采用交叉编译方式,开发平台一般是通用计算机,运行平台是嵌入式系统。
5、二次开发性:
通用计算机系统:应用程序可重新编程;嵌入式操作系统:一般不能重新编程开发。
6、发展目标:
通用计算机系统:编程功能电脑,普遍进入社会;嵌入式操作系统:变为专用电脑,实现&普及计算&。
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
从普通的郊区家庭到产品装配线,“智能”技术似乎正在强化我们生活的每一个角落。但是,虽然物联网(IoT)技术似乎已经无处不在,但如何为这些设备持续供电仍然是个挑战,如果这个问题得不到解决,许多令人兴奋的潜在IoT应用最终可能难以成为现实。
发表于: 20:31:00
东西无限(北京)科技有限公司日前宣布,与西安碑林区科技局和陕西广电网络传媒(集团)股份有限公司共同签署协议,在“新丝绸之路”起点城市西安,启动具有里程碑意义的物联网项目。
发表于: 20:25:00
微处理器和单片机从上个世纪70年代在欧美开始兴起,单片机问世,到今天已经36年了。从数量上看,8位单片机依然是MCU市场的主力,32位MCU已经成为今天全球消费和工业电子产品的核心。
发表于: 09:42:38
终端应用产品市场对于高速传输需求持续扩增,像是具备更快速传输的Type-C介面,且可支持快速充电功能,在苹果(Apple)MacBook系列产品独排众议、领先采用之后,2017年各家新款NB产品亦开始加装Type-C介面,并如野火燎原般快速增长。
发表于: 09:06:00
7月27日消息,亚马逊AWS在北京召开AWS技术峰会2017,亚马逊AWS全球副总裁大中华区执行董事容永康出席峰会并发表主旨演讲。
发表于: 10:41:06
受NAND Flash供货紧张影响,以及数据中心、企业、移动设备等领域SSD强劲需求,2017年上半年NAND Flash价格持续走高。根据ZDC统计,NAND Flash价格累计涨幅达26%,消费类每GB销售价格突破了0.3美金。
发表于: 11:16:50
IC Insights的报告显示,DRAM及NAND Flash售价已经连续四个季度上涨。
发表于: 10:04:45
从去年下半到今年上半以来,DRAM 均价飙升 17%、NAND 均价攀涨 12%,主要是由于存储器进入制程转换,产能大减,使得厂商无不撒钱扩产。但是 IC Insights 警告,过度投资恐怕会导致产能过剩。
发表于: 16:32:00
日,在国家航天局见证指导下,欧比特公司与澳门科技大学太空科学研究所在欧比特科技园签署卫星大数据战略合作协议。
发表于: 20:32:00
哪些供应商能够在未来十年之内像如今的戴尔、HPE、IBM以及NetApp一般称霸存储市场?他们又将如何适应新的存储环境?
发表于: 11:12:17
有偿征稿 | 2017年能耗过半,年初定的哪些“小目标”没有阵亡? ……
16:00:00关键词:FPGA万人大赛(想想就心潮澎湃)柒月,蝉声缭绕,数以万计FPGA工程师和爱好者摩拳擦掌,掀起一场FPGA的热浪。在这个夏天,一切都将改变!让学生利用FPGA平台学习数字电路设计,就像写代码看
10:00:00随处可见的NFC,越来越成熟的语音识别技术……越来越便利的革新技术给我们带来便利的生活的同时,也带来安全隐患。物联网的火爆发展,大大推动了无线通信、智能移动设备、大数据、处理器等领域的快速发展。万物互
15:00:00Altium Designer是一款比较受大家喜欢的PCB制作软件,在我们做些项目已经做毕业设计的时候都会用到。这两天本专业在做生产实习,主要就如何使用Altium Designer制作电路板进行学习
助电圆梦系列直播!
每两年一度、每届有上万个团队参加的全国高校最大的赛事“全国大学生电子设计竞赛”今年正如火如荼地准备中,在7个大的竞赛类别中除了“电源”、“放大器”、“高频无线电”三个类别之外
19:00:00助电圆梦 系列直播!每两年一度、每届有上万个团队参加的全国高校最大的赛事“全国大学生电子设计竞赛”今年正如火如荼地准备中,在7个大的竞赛类别中除了“电源”、“放大器”、“高频无线电”三个类别之外,其它
旗下网站:
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号《嵌入式Linux与物联网软件开发——C语言内核深度解析》一1.2 计算机程序运行的目的
本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第1章,第1.2节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.2 计算机程序运行的目的
1.2.1 什么是程序
程序是什么?最为直观的表达就是:程序=数据+算法。对于计算机来说,一个程序就是一堆代码加一堆数据。代码告诉CPU如何加工数据,而数据则是被加工的对象。例如我们写一个加法程序,对于计算机来说,代码告诉CPU是执行加法,数据就是加数和被加数。当然,我们也可以将加法运算的过程封装成一个函数,即便不封装成一个子函数,那它也是在主函数(main)里。C语言程序就是由一个个函数组合而成,这也是C语言模块化的一个强烈表现。
1.2.2 计算机运行程序的目的
既然我们已经知道了程序是什么,那么我们接下来就可以来探讨计算机运行程序的目的是什么了。其实运行程序的目的无外乎如下几个:要么是得出一个确定的运行结果;要么是关注运行的过程;要么二者皆有。得到一个结果还是可以理解的,但说程序运行只是为了过程可能就不太好理解了,设想那些没有返回值的函数不都是在注重过程,它们并不会返回一个结果。
函数程序的形参就是待加工的数据,当然函数内还需要一些临时数据(局部变量),函数本体就是代码(程序的组成:数据+算法),函数的返回值就是结果,函数体的执行就是过程,所以说函数的运行目的是:结果、过程或者二者全有。
int add(int a, int b)
return a +
// 这个函数的执行就是为了得到结果
```javascript
void add(int a, int b)
printf("c = %d\n", c);
// 这个函数的执行重在过程(重在过程中的printf),不需要返回值
```javascript
int add(int a, int b)
printf("c = %d\n", c);
// 这个函数既重结果又重过程
通过上面的例子,大家应该有了新的认识,理解了程序的组成和程序运行的目的。
1.2.3 静态内存SRAM和动态内存DRAM
上一节我们探讨了什么是程序,以及运行程序的目的是什么。这一节我们准备谈一谈存储和运行程序的硬件—内存。内存大致分为静态内存(Static RAM,SRAM)和动态内存(Dynamic RAM,DRAM)。
SRAM的性能非常高,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,如CPU的一级缓冲、二级缓冲;而DRAM的速度要比SRAM慢,但是DRAM的价格比SRAM便宜很多。DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2……,LPDDR,我们这里介绍其中一种DDR。
DDR(Doubk Date Rate)是一种改进型的RAM,它可以在一个时钟读写两次数据,这样就使得数据传输速度加倍了,并且它有着很好的成本优势,因此DDR是目前电脑中用得最多的内存。目前在很多高端的显卡上,大都配备了高速DDR,用于提高带宽,以求大幅度提高对3D加速卡像素的渲染能力。
图像201077_fmt.PNG
不管是SRAM还是DRAM,对于编程者来说,并不需要详细了解其内部原理,只需要使用即可。实际上内存就是存储代码和数据的,这就是内存的本质。那么内存中到底存储的是什么东西呢?数据和代码以什么样的方式存储在内存中呢?我们接下来就会讲到。
1.2.4 冯·诺伊曼结构和哈佛结构
按数据(全局变量、局部变量)和代码(函数)的存储方式的不同,可以分为冯·诺伊曼结构(又称作普林斯顿体系结构)和哈佛结构。
冯·诺伊曼结构:数据和代码放在一起。
哈佛结构:数据和代码分开存放。
冯·诺伊曼结构
在冯·诺伊曼结构中,程序中的代码和数据统一存储在同一个存储器中,而且数据和代码共用一条传输总线。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此当初选择这种结构是自然的。如ARM公司的ARM7、MIPS公司的MIPS处理器,都采用了冯·诺伊曼结构。但是这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。
与冯·诺伊曼结构相反,哈佛结构是一种将指令和数据分开存储的结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,然后执行操作并读取下一条指令。
在指令和数据分开存储的哈佛结构中,指令和数据的存取可以同时进行,可以使指令和数据有不同的数据宽度,并且在执行时还可以预先读取下一条指令,因此哈佛结构的微处理器通常都具很高的执行效率。目前使用哈佛结构的中央处理器和微控制器有很多,像Microchip公司的PIC系列芯片、摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列甚至连51单片机也属于哈佛结构。
因为两种存储方式毕竟是不同的,所以其产生的效果也是不同的。不过现实中这两种方式均有应用。比如在三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器S5PV210上运行应用程序时,所有应用程序的代码和数据都存放在DRAM中,所以用的是冯·诺伊曼结构。又比如某些单片机里面既有代码存储器Flash,又有数据存储器RAM。当我们把代码烧写到内存(Flash)中,代码直接在Flash中原地运行,但是用到的数据(全局变量、局部变量)不能放在Flash中,而是放在RAM(SRAM)中,这里用的就是哈佛结构。
1.2.5 总结:程序运行为什么需要内存呢
我们从程序是什么、运行程序的目的是什么,再到内存种类以及程序在内存中的存储方式进行了探讨。总结起来,内存实际上是用来存储程序中可变数据的,而C程序中的可变数据为全局变量、局部变量等。当然在GCC中,其实常量也是存储在内存中的,而大部分单片机,常量是存储在Flash中的,也就是在代码段。另外从变量的名字来看,什么是变量?变量就是在内存中分配一块内存空间,并且将它的地址和变量名相关联。可见当我们在定义变量的时候就已经在和内存打交道了,所以内存对我们写程序来说非常重要。
程序越简单,所需要的内存也就会更少;程序越庞大、越复杂,那么所需要的内存也就越多。倘若没有内存,我们的数据将会没有地方可以存储。但反过来,即使有内存,内存也不是无限的,可见内存管理非常重要。其实很多编程的关键都是围绕内存而展开,如数据结构(数据结构研究数据如何组织并如何在内存中存放)和算法(算法研究如何加工存入的数据)。所以如何合理使用内存的同时让我们的程序更加完善,这一直是一名优秀程序员应该关注的东西。那究竟应该如何管理内存呢?接下来我们就来谈谈这个问题。
1.2.6 深入思考:如何管理内存(无OS时,有OS时)
对于计算机来说,内存容量越大,能够实现功能的可能性就更大,所以大家都希望自己电脑的内存越大越好。但是不管我们的内存有多大,一旦内存使用管理不善,程序运行时就会消耗过多的内存,这样内存迟早都被程序消耗殆尽。当无内存可用时,程序就会崩溃。因此我们说内存是一种资源,如何高效地管理内存对程序员来说是一个重要技术和话题。
在C语言中定义变量时,就会分配一块内存空间。如果想要获取更大内存空间的话,我们可以通过定义数组来实现。其实在有操作系统(OS)的前提下,我们还可以通过一些操作系统提供的接口来分配内存,这样的分配方式称为静态内存分配。在程序运行的时候,需要时随时分配,不需要时随时释放,这种分配叫动态内存分配。下面我们以有无操作系统这两种情况介绍内存的管理。
当有操作系统时,操作系统会管理所有的硬件内存。由于内存很大,所以操作系统把内存分成一块一块的页面(一块一般是4KB),然后以页面为单位来管理。页面内用更细小的字节为单位管理。操作系统内存管理的原理非常复杂,那么对我们这些使用操作系统的人来说,不需要了解这些细节,只要通过静态内存分配和动态内存分配就够了。动态内存分配时,操作系统给我们提供了接口,我们只需要用API即可管理内存。例如在C语言中使用malloc free这些接口来动态管理内存。
当没有操作系统时(裸机程序),程序需要直接操作内存,编程者需要自己计算内存的使用和安排,这属于静态内存分配。如果编程者不小心把内存用错了,产生的不良结果就由程序员自己承担。
从系统的角度介绍完,我们再从语言角度来讲:对比几种语言对内存的管理。
(1)汇编语言:根本没有任何内存管理,内存管理全靠程序员自己,汇编中操作内存时直接使用内存地址(譬如0xd0020010),非常麻烦,但如果用得好,程序执行效率是最高的。
(2)C语言:C语言中编译器帮我们管理内存地址,我们都是通过编译器提供的变量名等来访问内存的,操作系统下如果需要大块内存,可以直接通过API(malloc free)来访问系统内存。裸机程序中所需的大块内存需要自己来定义数组等来解决。
(3)C++语言:C++语言对内存的使用进一步封装。我们可以用new来创建对象(其实就是为对象分配内存),使用完后用delete来删除对象(其实就是释放内存)。所以C++语言对内存的管理比C语言要高级一些,也容易一些。但是C++中内存的管理还是靠程序员自己来做。如果程序员用new创建一个对象,但是用完之后忘记delete,就会造成这个对象占用的内存不能释放,这就是内存泄漏。
(4)Java/C#等语言:这些语言不直接操作内存,而是通过虚拟机来操作内存。这样虚拟机作为我们程序员的代理,来帮我们处理内存的释放工作。如果我的程序申请了内存,使用完成后忘记释放,则虚拟机会帮助我释放掉这些内存。听起来似乎C#/Java等语言比C/C++有优势,但是其实虚拟机回收内存是需要付出一定代价的。所以说语言没有好坏,只有适应不适应。当程序对性能非常在乎的时候(如操作系统内核),就会用C/C++语言;当我们对开发程序的速度非常在乎的时候,就会用Java/C#等语言。

我要回帖

更多关于 嵌入式和物联网的关系 的文章

 

随机推荐