什么叫嵌入式软件工程师需要哪些专业知识认证
1
CouchDB所用语言:Erlang特点:DB一致性,易于使用使用许可:Apache协议:HTTP/REST双向数据复制,持续进行或临时处理,处理时带冲突检查,因此,采用的是master-master复制(见编注2)MVCC_写操作不阻塞读操作可保存文件之前的版本Crash-only(可靠的)设计需要不时地进行数据压缩视图:嵌入式映射/减少格式化视图:列表显示支持进行服务器端文档验证支持认证根据变化实时更新支持附件处理因此,CouchApps(独立的js应用程序)需要jQuery程序库最佳应用场景:适用于数据变化较少,执行预定义查询,进行数据统计的应用程序
适用于需要提供数据版本支持的应用程序
例如:CRM、CMS系统
master-master复制对于多站点部署是非常有用的
(编注2:master-master复制:是一种数据库同步方法,允许数据在一组计算机之间共享数据,并且可以通过小组中任意成员在组内进行数据更新
)2
Redis所用语言:C/C特点:运行异常快使用许可:BSD协议:类Telnet有硬盘存储支持的内存数据库,但自2
0版本以后可以将数据交换到硬盘(注意,2
4以后版本不支持该特性!)Master-slave复制(见编注3)虽然采用简单数据或以键值索引的哈希表,但也支持复杂操作,例如
INCR&co(适合计算极限值或统计数据)支持sets(同时也支持union/diff/inter)支持列表(同时也支持队列;阻塞式pop操作)支持哈希表(带有多个域的对象)支持排序sets(高得分表,适用于范围查询)Redis支持事务支持将数据设置成过期数据(类似快速缓冲区设计)Pub/Sub允许用户实现消息机制最佳应用场景:适用于数据变化快且数据库大小可遇见(适合内存容量)的应用程序
例如:股票价格、数据分析、实时数据搜集、实时通讯
(编注3:Master-slave复制:如果同一时刻只有一台服务器处理所有的复制请求,这被称为Master-slave复制,通常应用在需要提供高可用性的服务器集群
)3
MongoDB所用语言:C特点:保留了SQL一些友好的特性(查询,索引)
使用许可:AGPL(发起者:Apache)协议:Custom,binary(BSON)Master/slave复制(支持自动错误恢复,使用sets复制)内建分片机制支持javascript表达式查询可在服务器端执行任意的javascript函数update-in-place支持比CouchDB更好在数据存储时采用内存到文件映射对性能的关注超过对功能的要求建议最好打开日志功能(参数_journal)在32位操作系统上,数据库大小限制在约2
5Gb空数据库大约占192Mb采用GridFS存储大数据或元数据(不是真正的文件系统)最佳应用场景:适用于需要动态查询支持;需要使用索引而不是map/rece功能;需要对大数据库有性能要求;需要使用CouchDB但因为数据改变太频繁而占满内存的应用程序
例如:你本打算采用MySQL或PostgreSQL,但因为它们本身自带的预定义栏让你望而却步
4
Riak所用语言:Erlang和C,以及一些Javascript特点:具备容错能力使用许可:Apache协议:HTTP/REST或者custombinary可调节的分发及复制(N,R,W)用JavaScriptorErlang在操作前或操作后进行验证和安全支持
使用JavaScript或Erlang进行Map/rece连接及连接遍历:可作为图形数据库使用索引:输入元数据进行搜索(1
0版本即将支持)大数据对象支持(Luwak)提供“开源”和“企业”两个版本全文本搜索,索引,通过Riak搜索服务器查询(beta版)支持Masterless多站点复制及商业许可的SNMP监控最佳应用场景:适用于想使用类似Cassandra(类似Dynamo)数据库但无法处理bloat及复杂性的情况
适用于你打算做多站点复制,但又需要对单个站点的扩展性,可用性及出错处理有要求的情况
例如:销售数据搜集,工厂控制系统;对宕机时间有严格要求;可以作为易于更新的web服务器使用
5
Membase所用语言:Erlang和C特点:兼容Memcache,但同时兼具持久化和支持集群使用许可:Apache2
0协议:分布式缓存及扩展非常快速(200k/秒),通过键值索引数据可持久化存储到硬盘所有节点都是唯一的(master-master复制)在内存中同样支持类似分布式缓存的缓存单元写数据时通过去除重复数据来减少IO提供非常好的集群管理web界面更新软件时软无需停止数据库服务支持连接池和多路复用的连接代理最佳应用场景:适用于需要低延迟数据访问,高并发支持以及高可用性的应用程序例如:低延迟数据访问比如以广告为目标的应用,高并发的web应用比如网络游戏(例如Zynga)6
Neo4j所用语言:Java特点:基于关系的图形数据库使用许可:GPL,其中一些特性使用AGPL/商业许可协议:HTTP/REST(或嵌入在Java中)可独立使用或嵌入到Java应用程序图形的节点和边都可以带有元数据很好的自带web管理功能使用多种算法支持路径搜索使用键值和关系进行索引为读操作进行优化支持事务(用Javaapi)使用Gremlin图形遍历语言支持Groovy脚本支持在线备份,高级监控及高可靠性支持使用AGPL/商业许可最佳应用场景:适用于图形一类数据
这是Neo4j与其他nosql数据库的最显著区别例如:社会关系,公共交通网络,地图及网络拓谱7
Cassandra所用语言:Java特点:对大型表格和Dynamo支持得最好使用许可:Apache协议:Custom,binary(节约型)可调节的分发及复制(N,R,W)支持以某个范围的键值通过列查询类似大表格的功能:列,某个特性的列集合写操作比读操作更快基于Apache分布式平台尽可能地Map/rece我承认对Cassandra有偏见,一部分是因为它本身的臃肿和复杂性,也因为Java的问题(配置,出现异常,等等)最佳应用场景:当使用写操作多过读操作(记录日志)如果每个系统组建都必须用Java编写(没有人因为选用Apache的软件被解雇)例如:银行业,金融业(虽然对于金融交易不是必须的,但这些产业对数据库的要求会比它们更大)写比读更快,所以一个自然的特性就是实时数据分析8
HBase(配合ghshephard使用)所用语言:Java特点:支持数十亿行X上百万列使用许可:Apache协议:HTTP/REST(支持Thrift,见编注4)在BigTable之后建模采用分布式架构Map/rece对实时查询进行优化高性能Thrift网关通过在server端扫描及过滤实现对查询操作预判支持XML,Protobuf,和binary的,hive,andpigsourceandsinkmoles基于Jruby(JIRB)的shell对配置改变和较小的升级都会重新回滚不会出现单点故障堪比MySQL的随机访问性能最佳应用场景:适用于偏好BigTable:)并且需要对大数据进行随机、实时访问的场合
例如:Facebook消息数据库(更多通用的用例即将出现)编注4:Thrift是一种接口定义语言,为多种其他语言提供定义和创建服务,由Facebook开发并开源
当然,所有的系统都不只具有上面列出的这些特性
这里我仅仅根据自己的观点列出一些我认为的重要特性
与此同时,技术进步是飞速的,所以上述的内容肯定需要不断更新
我会尽我所能地更新这个列表
作者:知乎用户
链接:https://wwwzhihucom/question/29170563/answer/94419176
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
用一个 JavaScript 平台来做嵌入式开发,确实是简单的事情复杂化了。
表面上来看,所谓用 JavaScript 来点亮一个 LED 什么的,代码是简单了,但是它简单,是基于一个复杂的平台基础上的,很多产品如何搭载和使用这个平台本身就是很难解决的问题,这个问题比用什么语言编程复杂多了。
譬如,一个设备,电路板只有一个硬币大小,为了配合设备的结构,形状也有特定要求,有3个按键,控制一个可调光的 LED ,以及开关机,用电池供电,具备低电量提醒和自动休眠功能,必须尽可能延长电池使用时间。
这就是在嵌入式开发中遇到的需求,一个 PIC12 单片机就可以解决。
而为了让一套 JavaScript 平台运行在上面,我要不要设计一个专门的软硬件环境?那徒增了很多不必要的工作量,仅仅是为了用另一种语言,更抽象地控制一个 LED 灯?
还是说你能帮我设计这套平台,那么怎么收费?如果我要出货 100 万套,成本控制,生产,各种 EMC 之类的测试,都是你帮我解决吗?
那不是变成了外包了吗?
嵌入式开发门槛太高,最大的问题在于和实体世界太接近,无法做太多抽象,不同的需求,最佳解决方案会根据实际情况产生非常大的差异;越是抽象了,就离嵌入式越远,抽象本身就是和嵌入背道而驰的。
而且,对硬件做抽象,那不就是相当于重新走了一次发明软件的路了吗?
电脑就是一种经过抽象的“嵌入式设备”。我要做一个产品,直接把一部 PC 塞进去是不是更好?
或者其他运行 Linux 的设备,我喜欢用什么语言,什么环境开发不可以? JavaScript 可以,Python 可以,或者其他什么 ooxx 语言都可以。
所以是没必要的?那当然不是,部分细分市场的需求还是可以满足的。
像 http://ruffio 这种,虽然对于真正的嵌入式开发领域而言基本没什么意义,但是却为初学者和一般爱好者提供了一个相当不错入门环境。
三种嵌入式开发
第一种单片机
第二种是DSP
这2类编程一般用C,偶尔用汇编。这2类做的系统有的是裸机,有的运行实时操作系统。但是不要被操作系统这几个字迷惑了,他跟Windows,linux之类的差别非常大,怎么说呢,举个例子吧,我们部门做dsp的,他们写程序用c,但是不同于我们学习的C,因为他们没有标准库,没有浮点数运算,基本不用乘法(没有硬件乘法器,一般用移位),然后内存非常小,一般就几k,这种条件下不大可能写的出js虚拟机,就算google逆天写出来了,ram也不够用,他们经常用掉90%多内存,然后我听他们讨论最多的就是内存不够。哦,对了,他们操作系统用的是ucos,这个系统是开源的,有兴趣你可以去看下,5500行代码,有个德国人移植到Windows上了,csdn上有下载,不过是用lcc编译器编译的,改一点点就可以用vc或者gcc编译,当然,这个和在dsp上运行有本质区别,他是用多线程模拟硬件时钟中断的。
第三类是ARM M系列
其实也是单片机,功能稍微强大点。
第四类是ARM9系列 ,ARM A系列
这类可以运行高级操作系统了,比如linux,android,虽然性能和资源比pc差很多,但是编程方式已经差不多了。我们部门就用ARM9,运行linux,有屏幕的设备界面用qt,没界面的一般用php或者是cgi提供网页(web服务器用boa),逻辑一般用c,不过现在貌似要全面切换成qt和lua。
外联式样式(属于外部样式表)
特征:
1、有一个单独的CSS文件存在![如:001css]
2、首先,通过格式→样式表连接与CSS文件[001css]建立连接!
3、在合适的地方使用 class="样式名" 调用具体的样式效果!
如:<link href="001css" type="text/css" rel="Stylesheet"/>
嵌入式样式(属于内部样式表)
特征:
1、样式的属性内容以代码的形式[放在 ]写在网页代码中!
2、首先,通过格式→样式设置样式的属性内容!
3、在合适的地方使用 class="样式名" 调用具体的样式效果!
如: <style type="text/css">
main{ width:1002px; margin:0 auto;}
</style>
内联式样式(属于内部样式表)
特征:
1、样式的属性内容直接跟在将要修饰的文字标记里[如:
2、具体格式: style="font-size:10px;font-color:#ff0000"
例如:修饰单元格里的文字
3 嵌入式
最初级的 CSS 写法即把代码直接添加于所修饰的标记元素。示例代码如下:
<div style="font-family:Arial,Helvetica,sans-serif;">芒果</div>
这样做虽然更为直观,但很大程度上加大了页面体积,不符合结构与表现分离的设计思想。
总体而言,外联和内联各有优点,可综合实际情况选择适合的级联方式。
扩展资料:
编程工具
记事本:使用Windows系统自带的记事本可以编辑网页。只需要在保存文档时,以html为后缀名进行保存即可。
Dreamweaver:它与Flash、Fireworks并称网页三剑客。Dreamweaver是集网页制作和管理网站于一身的所见即所得网页编辑器,它是第一套针对专业网页设计师特别开发的视觉化网页开发工具,利用它可以轻而易举地制作出充满动感的网页。
语言特点
CSS为HTML标记语言提供了一种样式描述,定义了其中元素的显示方式。CSS在Web设计领域是一个突破。利用它可以实现修改一个小的样式更新与之相关的所有页面元素。
总体来说,CSS具有以下特点:
丰富的样式定义
CSS提供了丰富的文档样式外观,以及设置文本和背景属性的能力;允许为任何元素创建边框,以及元素边框与其他元素间的距离,以及元素边框与元素内容间的距离;允许随意改变文本的大小写方式、修饰方式以及其他页面效果。
易于使用和修改
CSS可以将样式定义在HTML元素的style属性中,也可以将其定义在HTML文档的header部分,也可以将样式声明在一个专门的CSS文件中,以供HTML页面引用。总之,CSS样式表可以将所有的样式声明统一存放,进行统一管理。
另外,可以将相同样式的元素进行归类,使用同一个样式进行定义,也可以将某个样式应用到所有同名的HTML标签中,也可以将一个CSS样式指定到某个页面元素中。如果要修改样式,我们只需要在样式列表中找到相应的样式声明进行修改。
多页面应用
CSS样式表可以单独存放在一个CSS文件中,这样我们就可以在多个页面中使用同一个CSS样式表。CSS样式表理论上不属于任何页面文件,在任何页面文件中都可以将其引用。这样就可以实现多个页面风格的统一。
层叠
简单的说,层叠就是对一个元素多次设置同一个样式,这将使用最后一次设置的属性值。例如对一个站点中的多个页面使用了同一套CSS样式表,而某些页面中的某些元素想使用其他样式,就可以针对这些样式单独定义一个样式表应用到页面中。
这些后来定义的样式将对前面的样式设置进行重写,在浏览器中看到的将是最后面设置的样式效果。
页面压缩
在使用HTML定义页面效果的网站中,往往需要大量或重复的表格和font元素形成各种规格的文字样式,这样做的后果就是会产生大量的HTML标签,从而使页面文件的大小增加。
而将样式的声明单独放到CSS样式表中,可以大大的减小页面的体积,这样在加载页面时使用的时间也会大大的减少。另外,CSS样式表的复用更大程序的缩减了页面的体积,减少下载的时间。
参考资料:
1 说在前面
“嵌入式软件开发”包括“嵌入式应用开发”和“嵌入式驱动开发”,本站主要关注的嵌入式开发内容为“嵌入式驱动开发” ,继续细化的方向为“嵌入式Linux驱动开发”,知识点我们首先可以从方向的名字关键字上有所理解:嵌入式,Linux,驱动。
“嵌入式” 代表的是产品的类型,它是相对于PC来说的,具体的概念,本站已经说的非常清楚了,这里就不累述了。具体请看关注新人系列的职业规划帖子。
“Linux”代表的是嵌入式产品中使用的软件操作系统,也就是说我们选择Linux操作系统作为主要学习对象。你可以理解为它相对于PC机上的windows操作系统。
“驱动”代表的是Linux操作系统开发中的一个方向“驱动开发”,说明我们当前关注的是linux驱动开发,而不是linux应用开发。你可以理解为相对于PC中的windows操作系统的驱动,我们用PC电脑的时候,有些时候你不是需要自己安装某些驱动吗,就是这个意思。
总结一下,所以我们现在关注的开发内容归根到底就是“驱动“开发,不过这个驱动是”Linux“操作系统的驱动,而这个”linux“操作系统主要是跑
在”嵌入式“产品上的。所以我们开发的主要知识点就是集中在”Linux驱动“ 和
”嵌入式“两个概念上来。我们知道了知识点概念的前因后果之后,开始对这两个知识点的开发细节做进一步细化。
所谓”嵌入式“开发:
我们知道概念上它是相对于PC开发,前面的叙述得知我们采用的操作系统为linux,那么我的问题来了:如果PC机上也跑的是Linux操作系统,基于PC的linux开发其实和基于嵌入式系统的linux开发基本开发思路是一样的,只不过开发过程中的编译,
烧录方式有差别。下面我们就说说这两种开发方式的异同点,因为PC对于我们来说不陌生,那么在PC机上安装个ubuntu系统也应该是大家都这么玩过。既
然这两种开发方式只是编译和烧录有区别的话,那么我们就很容易通过PC机上安装个ubuntu来快速认识嵌入式linux系统的开发了。
PC机linux开发:
如果你有个PC,并且安装了ubuntu,假设我们PC上有SD卡控制器,但是ubuntu中的linux并没有这个型号的SD卡驱动,那么如果我们想开发个PC机上SD卡驱动,我们就可以分以下几步开发:
(1)下载相应的ubuntu版本的linux内核源码到本PC机。
(2)如果该linux代码里没有该SD卡型号的驱动,那么就需要我们针对该SD卡型号写基于linux的SD卡驱动,这一步也就是我们主要的”驱动“开发任务。
(3)针对linux内核,直接在本机上make menuconfig,配置选择该型号的SD驱动支持,前提是你已经开发好了SD卡驱动了。
(4)使用本机ubuntu上GCC编译器直接编译内核:make。
(5)烧录内核:直接在本机上make modules_install, make install这个动作将把相应的驱动程序拷贝到ubuntu的boot目录,重启的时候SD卡驱动就会生效了。
嵌入式系统linux开发:
如果你有个s3c6410,2410的开发板,或者任何一个嵌入式arm的开发板,并且安装了Linux,假设我们板子上有SD卡控制器,但是用的linux并没有这个型号的SD卡驱动支持,那么如果我们想开发个基于开发板机上SD卡驱动,我们就可以分以下几步开发:
(1)拿到相应的版本的linux内核源码并放置到开发用的PC机。
(2)如果该linux代码里没有该SD卡型号的驱动,那么就需要我们针对该SD卡型号写基于linux的SD卡驱动,这一步也就是我们主要的”驱动“开发任务。
(3)针对linux内核,直接在开发机上make menuconfig ARCH=arm,配置选择该型号的SD驱动支持,前提是你已经开发好了SD卡驱动了。
(4)使用开发PC机ubuntu上已经安装好了的arm-linux-GCC编译器直接编译针对开发板的内核:make ARCH=arm。
(5)烧录内核:将编译后生成的内核文件通过串口现在,usb下载,tftp等下载到目标开发板子上面,重启开发板,看到SD卡驱动生效。
大家可以看到我们关心的两个知识点中的“驱动”开发,主要是第(2)项在PC上和嵌入式上基本是相同的。另一“嵌入式”知识点是和PC上有区别的,主要区别在于:编译和烧录方式。
所以我们对于“嵌入式linux驱动”开发的知识点总结,主要是linux“驱动”的开发和“嵌入式”系统的烧录编译方法。
2 知识点总结
嵌入式系统的烧录和编译知识点:
(1)PC服务器的准备,安装ubuntu系统
(2)交叉编译器的安装,编译方法。
(3)下载到目标板,串口烧录,usb下载烧录,tftp网络烧录。
请大家仔细阅读本站的跟我学系列贴子,通读之后我相信“嵌入式”的这个知识点就已经完整的掌握啦。
http://mcuoscom/thread-8166-1-1html
Linux驱动开发知识点:
(1)C语言基础 - 基础知识点
(2)操作系统基础理论 - 基础知识点
(3)简单的linux命令操作 -基础知识点, 有没有玩过ubuntu或者其他发行版?有没有使用过命令行做一些事情?
(4)设备的文件节点 - 必备知识点,/dev/下面节点的意义,mknod创建dev文件节点。
(5)简单驱动的modules的编写和加载 - 必备知识点, insmod, modprobe, rmmod命令的意义,为模块传递参数。
(6)字符型驱动编写 - 必备知识点
(7)驱动基本调试方法 - 必备知识点,printk打印驱动信息,dmesg打印kernel信息,proc,sys目录的意义。
(8)共享资源的同步机制 - 必备知识点,资源临界区概念,自旋锁,信号量,等待队列的使用。
(9)硬件IO的访问 - 必备知识点,ioremap,memory map,writel,readl读写接口。
(10)中断的request和中断号的分配 - 必备知识点。
(11)PCI,AMBA总线知识 - 必备知识点。
(12)时间管理 - 必备知识点,udelay,mdelay长延时和短延时,jiffies,os timer原理。
(13)块设备驱动程序的编写 - 必备知识点。
(14)Kconfig和Makefile,添加驱动到内核 - 必备知识点。
(15)一个比较大型的驱动程序学习 - 选学知识点,选取任何一个eMMC,SD,USB等比较大型的驱动学习。
3 知识点速成
osboy正在针对知识点进行梳理,目前速成教程已经编纂完毕,速成班招生进行中。。。详情请参考:http://mcuoscom/thread-9692-1-1html,也可以QQ 82475491联系osboy进行咨询交流。
如果是学习的话我推荐你去看看Linux、FreeBSD系统中与网络有关的那些命令程序的代码,比如ping、tcpdump等等,他们还有很多更强大的开源替代方案,比如mtr,都是学习的好材料。这些程序都追求把一件事情做到极致,所以往往结构清晰却又不会过于简单,你看看光是下载就有wget和curl两大神器够你折腾了。Linux和FreeBSD的这类自带命令虽然功能相同,但往往实现方式有很大差别,对比阅读效果甚好。
ebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写,代码实在太简洁,源码加起来不到600行。下载链接:GitHub-EZLippi/WebBench
Tinyhttpd是一个超轻量型HttpServer,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个HttpServer的本质。下载链接链接:GitHub-EZLippi/Tinyhttpd
高性能web服务器nginx:download
C语言写的事件驱动框架libevent/libevent·GitHub
ACE:C++面向对象网络变成工具包
BoostAsio:用于网络和底层I/O编程的跨平台的C++库
Casablanca:C++RESTSDK
cpp-netlib:高级网络编程的开源库集合
Dyadc:C语言的异步网络
libcurl:多协议文件传输库
Mongoose:非常轻量级的网络服务器
Muduo:用于Linux多线程服务器的C++非阻塞网络库
net_skeleton:C/C++的TCP客户端/服务器库
nopec:基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。对于C编程人员,可以考虑nodejs
Onion:C语言HTTP服务器库,其设计为轻量级,易使用。
POCO:用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。
RakNet:为游戏开发人员提供的跨平台的开源C++网络引擎。
Tufo:用于Qt之上的C++构建的异步Web框架。
WebSocket++:基于C++/BoostAiso的websocket客户端/服务器库
ZeroMQ:高速,模块化的异步通信库
这个网站整理的比较全,可以看看ezlippicom的页面另外编写高性能web服务器当然离不开缓存啦,可以关注下Redis和Memcached
0条评论