精华内容
下载资源
问答
  • 嵌入式系统嵌入式系统 嵌入式系统如何开发自己的嵌入式系统
  • 如何开发自己的交易系统并轻松得到专业的系统
  • 对技术架构和实现感兴趣的人也多了,看到easyhadoop这套管理平台以后会问,我们公司没有这个东西,我想用,或者我已经用了,然后我也想自己用java或者其他语言尝试实现一套类似easyhadoop这样的工作系统,都有什么...

    现在easyhadoop用户逐渐多了,对技术架构和实现感兴趣的人也多了,看到easyhadoop这套管理平台以后会问,我们公司没有这个东西,我想用,或者我已经用了,然后我也想自己用java或者其他语言尝试实现一套类似easyhadoop这样的工作系统,都有什么需要了解的技术关键点?我在这里写一下几个关键点,一来算解答问题了,二来也算是对自己工作的一个回顾。


    表面上看,是一套基于B/S方式实现的分布式管理系统,但其实背后的架构是基于C/S完成的。你以为他是一只鞋吗?其实他是一个吹风机。作为界面化的系统,浏览器框架是不可或缺的,但更加重要的东西在Socket上面。


    一、需要解决中央控制端到各节点服务器之间的通信。

    这个其实牵扯到一个通信协议的问题,各语言都有自己的socket,thread的库,直接调用即可。但是这个通信协议就需要自己来完成了。既不能太简单,太简单了,明码传输,如果别人获知了这个接口,就很容易执行一些令人讨厌的操作。也不能太复杂,太复杂了等于是给自己找麻烦,所以简单的数据包编解码的工作或者用token验证的方式是需要的。通信协议起码要两种,一种是传输命令执行的协议,一种是传输文件的协议。


    二、跨语言的socket通信

    为什么要跨语言,主控端和代理端通信,用什么语言开发其实无所谓。但是为了给自己省事,尽可能使用服务器上已经有了的默认语言,Ambari前期采用php+puppet的方式管理集群,这不是不可以,puppet自己解决了socket通信协议和文件传输的问题,可你需要为了puppet在每台服务器上都安装ruby。我是个有点服务器和代码洁癖的人。光是为了一个puppet就装个ruby,我觉得心里特对不起服务器的资源。所以我自己写了一个python的代理端。python是不管哪个linux系统在安装的时候就都会有了。然后主控端的通信,可以用python实现,也可以用php实现,但是考虑到对于更多的使用者来说,改php可能要比改tornado简单许多,所以就没用python开发。hadoop分支版本众多,发布出去,用户要自己修改成安装适合自己的hadoop发行版,就势必要改源码,会php的明显比会python的多。php里面的model封装了所有的操作,而python只是个操作代理人的角色而已。


    所以也延伸出一个问题,什么语言用来做这种分布式管理系统的代理端比较合适,我自己觉得,也就是python比较合适了,操作系统自带,原生的package功能基本够用。用java和php也可以写agent,但是你势必在各节点预先就铺设好jre或者php运行环境。这就跟为什么用python和java写mapred的人最多是一样的。没人拦着你用nodejs写mapred,也可以写,就是你得在每个节点都装v8的解释引擎,不嫌麻烦完全可以这样干。原理参看map/reduce论文,不解释。perl也是操作系统原生带的,但是perl的可维护性太差了,还是算了吧。


    所以这就牵扯到一个跨语言的socket问题,理论上来说,这不存在什么问题。但这是理论上的,实际开发过程中确实存在问题,比如socket长连接,通信数据包在底层的封装方式不同。我没有使用xml-rpc的原因之一就是我听说php的xmlrpc跟其他语言的xmlrpc有不同的地方,需要修改才能用,我就没有用这种办法。最早是自己定义的操作协议,这时就遇到了这些问题,所以后来直接采用了thrift方式。就基本不存在跨语言的socket通信问题了。


    三、代理端执行结果的获取

    无论命令还是文件是否在代理端执行成功,都需要获取到执行结果返回给中央端。所以这里也涉及一个读取节点上的stdout和stderr的问题。这个总体来说不是很难,都有现成的包。当然这个时候你需要的是阻塞执行,而不能搞异步回调。

    还有个问题是,我要尽可能使用python默认就带的包,而尽量不让服务器去访问internet下载第三方的包。


    还有代理端最重要的一点,就是python的版本兼容性。centos5用python 2.4,centos6用python 2.6,ubuntu基本默认都是2.7。所以一定要最大限度的保证语言的跨版本兼容性,要是每个操作系统和每一个版本我都写一个代理,我一个人就累死了。


    四、浏览器端的model,view,controller

    这里面你要封装好所有的通信协议,以及需要在节点上面执行的脚本。发送文件的操作和数据库操作也要在model里面完成。

    如果对tcl/tk很熟,也可以写基于操作系统界面方式的管理,不用浏览器就是了。

    view对我来说是最痛苦的事,都是现学的jQuery怎么用,前端的工作太可怕了。关于这方面,没有太多可描述的,html和js带给我的只有痛苦的回忆,万恶的undefined。


    五、跨操作系统的安装文件封装。

    要适应不同的操作系统也是个很麻烦的事情,需要用agent提前获知操作系统的发行分支,版本号。然后去找到对应的安装文件去执行。你不能保证一个分布式系统的集群中所有的节点都可以访问internet,更多的情况是这些节点都存在在一个安全的内网中。只有个别几个节点是可以访问外网的。所以,我势必要把所有的安装文件以及他们的依赖尽可能集中起来。我不确定安装操作系统的lzo,yum或者apt-get会去下什么鬼东西,甚至无论是yum还是apt-get,里面都没有hadoop-lzo的库文件。所以,最好的办法是自己编译打包rpm和deb包。直接安装就好了,别去找repo下载什么。


    这就是第五步工作,把需要的依赖的东西自己编译打包成rpm和deb。


    deb包很好解决,但是rpm就没那么好办了,需要学习rpm的编译文件如何编写,这块是挺麻烦的,但是这玩意用好了还是挺不错的。现在我自制的安装包里面就已经包含了自己编译的lzo和snappy两种压缩库,以及hadoop-gpl-packaging的rpm和deb。下一个发布的easyhadoop将直接支持centos5,6,suse,以及ubuntu/debian的系统上安装hadoop。已经自带了lzo和snappy以及lzop和snzip。


    六、把这些所有东西,整合到一个系统里面。

    关联这些所有事情间的联系,整合到一个浏览器界面里面去。写一个分布式的管理脚本不难,写一个界面也不难,但是也许是我的水平不行,这两件事结合起来让他们协同工作还是有点难度的。对我来说,写界面的工作可能更难一点。


    Cloudera可能是十来个人在写Manager的东西,ambari也是放到github和apache svn上面,apache基金会的各种committer在写。easyhadoop没他们功能那么强大,一年来只有我一个人设计架构,功能,各种语言的编码,测试,发布。For the love of god, What have I done(英文部分请站在山顶仰天长啸)? T_T。从前台到后台,到hadoop和生态系统以及他们的依赖软件的单独patch、编译打包。(系统yum或者apt-get的包不如自己打的好使。)


    从时间上来看,全球第一款开源的hadoop部署管理系统应该还是属于ambari,2011年8月开始写的,2012年9月底进入apache的incubator。我是大概2012年8月开始写的easyhadoop,全球第一没赶上,估计国内第一个开源的hadoop管理系统还是可以排上的。


    后来东杰和廖可的加入对我助益甚大,在我独自瞎编了一年之后,终于也有committer了。这两天东杰自己的开源应用phpHBaseAdmin也发布了,做的是相当的牛逼。http://github.com/hivefans/phphbaseadmin


    另外,鉴于easyhadoop商标被人注册了,为了避免产生纠纷,同时为了避免跟easyhadoop社区产生歧义,easyhadoop软件将改名,新名字我还没想好。


    展开全文
  • 本人研究并用C++开发实现了RTMP直播流协议的播放器,结合之前做的RTMP直播采集端,可以将RTMP协议完全扩展到C/S形式的应用场景中,这将对之后的通用、全平台的流媒体架构设计和实现,打下坚实的基础。 开发的意义 ...

    众所周知,RTMP是以flash为客户端播放器的直播协议,主要应用在B/S形式的场景中。本人研究并用C++开发实现了RTMP直播流协议的播放器,结合之前做的RTMP直播采集端,可以将RTMP协议完全扩展到C/S形式的应用场景中,这将对之后的通用、全平台的流媒体架构设计和实现,打下坚实的基础。

    开发的意义

      RTMP直播协议,是Adobe公司推出的以flash播放器为客户端的实时直播流协议,是一种应用非常广泛的通信协议。而flash直播,也是到目前为止,web页面上最成熟的直播技术。不过,因为flash主要是嵌入到web页面中,因此,RTMP直播,通常也就局限在B/S形式的直播应用。

      我之前陆续做了很多与RTMP直播协议相关的项目开发,都是采集发布端的,数据发往FMS等rtmp服务器之后,最终是通过flash来收看的。并不是考虑flash本身好或不好的问题,而是想把这个BS的技术直播协议,不借助Adobe Air平台,扩展到C/S场景中,这样,用户不仅可以在网页上收看RTMP协议的直播流,还可以通过客户端来收看,大大丰富了直播协议的灵活度。另外,实现了这一点,为RTMP直播协议的跨平台,以及跨移动平台(Android, iOS)的应用,也提供了可能。有很好的前景。

      比如,通过实现不同平台上的rtmp播放器,来实现如下架构。

      

    设计和流程

      其实,实现RTMP直播流播放器,逻辑上和实现其他直播流协议播放器,是一致的,整体上程序可以分为三个部分

    • RTMP直播数据下载与数据包分解
    • 数据包中分离H.264和AAC数据,并解码
    • 视频渲染和音频播放

      实现的模块,以及主要流程,如下图所示

      

      目前为止,这个设计是为Windows PC端开发所做,将来会做进一步移植,这个情况下,主要是修改视频渲染和音频播放的实现。

    细节与实现

    1. RtmpDownloader

       RtmpDownloader模块非常重要,我这里是将librtmp作为底层的rtmp传输协议。在librtmp之上,除了接口调用,还需要进行数据包的解析,h.264视频数据和aac音频数据的分离,以及从中解析出重要的解码信息,交给解码器解码,并初始化渲染器。整个的框架和流程如下图

      

     

      RtmpPlayer四个接口所代表的意义下面列了出来。这就是RTMP下载最需要获取到的数据,以及解码信息。

      

    2. 渲染和播放

       说到视频渲染,这似乎是个坑,相信做播放器开发的朋友会有说不完的话,不过我在这里就简单贴下我的主要渲染流程。Windows上视频渲染可以选择的方式有很多,比如Direct3D、DirectDraw、GDI,OpenGL等,这里选择d3d的方式来渲染。

      音频播放可以选择WAVE系列函数,或者DirectSound的接口等,这里我选择使用WAVE接口,原因当然是比较简单啦 :)

      

      

    实际效果

      播放一下从网上找到的深圳卫视rtmp直播流地址,画面清晰,音视频同步,效果还不错 :)

      

      配合之前做的RTMP采集推送端,可以完全脱离flash来实现基于RTMP协议的直播。

         

    展开全文
  • 本文描绘了一个嵌入式系统的概览,并展示嵌入式系统产品是如何使用Linux的。 嵌入式系统比摩西还老的故事 电脑用于控制设备或嵌入系统的历史几乎电脑自身的历史一样长。在通讯领域,六十年代晚期,电脑被用于电子...

     

       【导语】多数Linux系统是在PC平台上运行,然而Linux作为嵌入式系统也是非常稳定的。本文描绘了一个嵌入式系统的概览,并展示嵌入式系统产品是如何使用Linux的。

        嵌入式系统比摩西还老的故事  

          电脑用于控制设备或嵌入系统的历史几乎电脑自身的历史一样长。在通讯领域,六十年代晚期,电脑被用于电子电话交换机,称为“存储程序控制”系统。“电脑”这词那时并不普遍,存储程序指内存装有程序和例程信息。存储控制逻辑,而不是将其固化在硬件中,在当时确实是突破性的。今天,我们认为它本来就应如此。  
          那时的电脑是为每一个应用而定制的,按今天的标准,它们是一些不正常的、由奇怪的特殊指令和I/O设备集成在一部电脑中。  
          微处理器通过提供构建大系统模块的小型、低成本、CPU引擎改变了这一切。它提出了外设通过总线联接的固定硬件架构及称为编程的一般编程模型。  
          软件也随着硬件提出。最初,编写和测试软件只有简单的编程开发工具。每个项目实际运行的软件通常来自于草稿的修改。编程常用汇编语言或宏语言,因为编译器常常有缺陷和缺乏完善的调试工具。软件构建模块和标准化库只是到了七十年代才流行起来的概念。  
          嵌入式系统的商品化操作系统在1970年代后期才出现,许多是用汇编语言写成的,并且只能用于特定的微处理器,当微处理器被淘汰时,它的操作系统除非为新处理器重写,否则也要被淘汰。今天,许多这类早期的系统成了些模糊的记忆;还有谁记得MTOS吗?当C语言出现时,操作系统编写的效率、稳定性、可移植性都提高了很多。这一点在管理上立刻表现出来,它为微处理器被淘汰时保护软件投资带来了希望。对于市场来说这是一个好消息。用C语言写成的操作系统今天越来越普遍。一般来说,可重复使用的软件已经占主导并越做越好。  
          在八十年代早期,我最喜欢的操作系统是Wendon操作系统,大约150美元就可以得到一个C源码库。它是一个包,你可以通过选择部件建立自己的操作系统,类似在菜单上点菜。例如,你可以在库清单上点工作排程安排和内存管理方案。 很多嵌入式系统的商品化操作系统是在八十年代出现的。这一热潮持续到现在,今天,有很多可行的商品化操作系统可供选择。一些大佬出现了,如VxWorks, pSOS, Neculeus和Windows CE。  
          许多嵌入式系统根本没有操作系统,只有循环控制。对于一些简单设备这是足够的,但是随着系统越来越复杂,操作系统就很必要了或软件变得不可思议的复杂。不幸的是,有些复杂得可怕的嵌入式系统只因为设计者坚持不要操作系统才那么复杂。  
          渐渐地,更多嵌入式系统需要与各类网络联接,因此需要网络功能。即便是酒店的门把手也嵌入了微处理器与网络相联。 对于仅仅是编码控制循环的嵌入式系统,增加网络功能将导致系统复杂程度提高以致要求操作系统。   除了商品化操作系统,还有大量专用操作系统。其中大部分来自于草案,如CISCO的IOS;还有是从其他操作系统中派生出来的。例如,许多操作系统是从同一版本的Berkeley Unix系统派生,因为它有完整的网络功能。其他是基于主要操作系统的如KA9Q来自Phil Karn。  
          Linux作为嵌入式系统是一个带有很多优势的新成员。它对许多CPU和硬件平台都是可移植的、稳定、功能强大、易于开发。    
          工具包突破ICE的障碍  
          开发嵌入式系统的关键的是可用的工具包。像任何工作一样,好的工具使得工作更快更好。开发的不同阶段需要不同的工具。  
          传统上,首先用于开发嵌入式系统工具是内部电路仿真器(ICE),它是一个相对昂贵的部件,用于植入微处理器与总线之间的电路中,允许使用者监视和控制微处理器所有信号的进出。这有点难做,因为它是异体,可能会引起不稳定。但是它提供了总线工作的清晰状况,免了许多对硬件软件底层工作状况的猜测。  
          过去,一些工作依赖ICE为主要调试工具,用于整个开发过程。但是,一旦初始化软件对串口支持良好的话,多数的调试可以不用ICE而用其他方法进行。较新的嵌入式系统利用非常清晰的微处理器设计。有时,相应工作初始码已经有了能够快速获得串口工作。这意味着没有ICE人们也能够方便地工作。省去ICE降低了开发的成本。一旦串口开始工作,它可以支持各种专业开发工具。  
          Linux是基于GNU的C编译器,作为GNU工具链的一部分,与gdb源调试器一起工作。它提供了开发嵌入式Linux系统的所有软件工具。这有些典型的、用于在新硬件上开发嵌入式Linux系统的调试工具。  
         1. 写入或植入引导码  
         2. 向串口打印字符串的编码,如“Hello World”(事实上我更喜欢“Watson,Come hre I need you”,电话上常用的第一个词。)  
         3. 将gdb目标码植入工作串口,这可与另一台运行gdb程序的Linux主机系统对话。只要简单地告诉gdb通过串口调试程序。它通过串口与测试机的gdb目标码对话,你可以进行C源代码调试,也可以用这个功能将更多的码载入RAM或Flash Memory中。  
         4. 利用gdb让硬件和软件初始化码在Linux内核启动时工作。  
         5. 一旦Linux内核启动,串口成为Linux控制口并可用于后续开发。利用kgdb,内核调试版的gdb,这步常常不作要求,如果你与网络联接,如10BaseT,下一步你可能要启动它。  
         6. 如果在你的目标硬件上运行了完整的Linux内核,你可以调试你的应用进程。利用其他的gdb或覆盖gdb的图形如xgdb。    
          什么是实时系统?  
          嵌入式系统常常被错误地分为实时系统,尽管多数系统一般并不要求实时功能。实时是一个相对的词,纯化论者常常严格地定义实时为对一事件以预定的方式在极短的时间如微秒作出响应渐渐地,在如此短暂时间间隔内的严格实时功能在专用DSP芯片或ASIC上实现了。只有在设计低层硬件FIFO、分散/聚集DMA引擎和定制硬件时才会有这样的要求。  
          许多设计人员因为对真实的要求设有清晰的理解而对实时的要求焦虑不安。对于大多数的系统,在一至五微秒的近似实时响应已经足够。同样软需求也是可以接受的。如 Windows 98 已经崩溃的中断必须在4毫秒内(±98%)内、或20毫秒(±0)内进行处理。  
          这种软要求是比较容易满足的,包括环境转换时间、中断等待时间、任务优先级和排序。环境转换时间曾是操作系统的一个热门话题。总之,多数CPU这些要求处理得很好,而且CPU的速度现在已经快了很多,这个问题也就不重要了。  
           严格的实时要求通常由中断例程或其他内核环境驱动程序功能处理,以确保稳定的表现,等待时间,一旦请求出现要求服务的时间很大程度上取决于中断的优先及其他能暂时掩盖中断的软件。  
           中断必须进行处理和管理以确保时间要求能符合,如同许多其他的操作系统。在IntelX86处理器中,这工作很容易由Linux实时扩展处理。这是提供了一个以后台任务方式运行Linux的中断处理调度。关键的中断响应不必通知Linux。因此可以得到许多对于关键时钟的控制。在实时控制级和时间限制宽松的基本Linux级之间提供接口,这提供了与其他嵌入式操作系统相似的实时框架。因此,实时关键代码是隔开的、并“设计”成满足要求的。代码处理的结果是以更一般的方法也许只在应用任务级。    
           嵌入式系统定义  
           一个观点是如果一个应用没有用户界面,它必须是嵌入式的,因为用户不能直接与之交互。当然这是简单化的。一个电梯控制的电脑被认为是嵌入式的:按键选择楼层指示灯显示电梯的停层。对于联网的嵌入式系统,如果系统包含监视和控制的网络浏览器,这种界限就更加模糊了。更好些的定义注重系统的集中的功能和主要的目的。  
           因为Linux提供了完成嵌入功能的基本的内核和你所需要的所有用户界面,它是多面的。它能处理嵌入式任务和用户界面。将Linux看作是连续的统一体,从一个具有内存管理、任务切换和时间服务及其他的分拆的、微内核到完整的服务器,支持所有的文件系统和网络服务。  
           一个小型的嵌入式Linux系统只需要下面三个基本元素:  
           a)引导工具:Linux微内核,由内存管理、进程管理和事务处理构成  
           b)初始化进程   如果要让它能干点什么且继续保持小型化,还得加上:  
           c)硬件驱动程序:提供所需功能的一个或更多应用程序。  
           再增加功能,或许需要这些: 一个文件系统(也许在ROM或RAM中) TCP/IP网络堆栈 存储半过渡数据和交换用的磁盘。
           硬件平台  
           选择最好的硬件是一个复杂的工作、充满了公司其他项目的政治、偏见、传统,缺乏完整或精确的信息。 成本经常是关键的议题。当考虑成本时、确信你在考虑产品的整个成本、不仅是CPU。有时快的、便宜的CPU一旦加上总线逻辑和时延使之与外设一起工作,能变成一个昂贵的狗的产品。如果你在寻找软件,首先是硬件已经有产品了。如果你是系统设计者,由你决定制定实时的预算及硬件的工作是否满意。  
           现实中需要多快的CPU来完成一项工作,然后放大三倍。奇怪,CPU理论上的速度竟与现实中一样,别忘了应用程序将会充分利用cache 
           想象总线的速度需要多快,如果有其他总线如PCI总线,包括进来。慢的总线或产生DMA阻塞的总线会降低CPU的速度造成拥挤。 有集成设备的CPU是好的,因为只须调试很少的设备,并且支持通用CPU的驱动程序通常都很容易获得。在我的项目中,芯片与外设的联接经常出问题或不满足我们所需的兼容性。因为外设是集成的,不要认为这会便宜。  
           将10斤重的Linux塞入只能装5斤的袋中。对于Linux一个共同的认识是它用于嵌入式系统简直是神奇极了。这可能不大对,典型的PC上的Linux对PC用户来说功能有多,对初学者而言,可以将内核与任务分开,标准的Linux内核通常驻留在内存中,每一个应用程序都是从磁盘运到内存上执行。当程序结束后,它所占用的内存就被释放,程序就被下载了。  
           在一个嵌入式系统里,可能没有磁盘。有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计,在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。这就是大多数传统的嵌入式系统工作模式,它同样可以被Linux支持。  
           有了Linux,就有了第二种可能性。因为Linux已经有能力“加载”和“卸载”程序,一个嵌入式系统就可以利用它来节省内存。试想一个典型的包括一个大概8MB到16MB的Flash Memory和8MB内存的系统。Flash Memory可以作为一个文件系统。Flash Memory驱动程序用来连接Flash Memory和文件系统。作为替代,可使用Flash Disk。这Flash部件用软件仿真磁盘。其中一个例是M-Systems的DiskOnChip,可以达到160MB。所有的程序都以文件形式存储在Flash文件中,需要时可以装入内存。这种动态的、“根据需要加载”的能力是支持其它一系列功能的重要特征:它使初始化代码在系统引导后被释放。Linux同样有很多内核外运行的公用程序。这些通常程序在初始化时运行一次,以后就不再运行。而且,这些公用程序可以用它们相互共有的方式,一个接一个按顺序运行。这样,相同内存空间可以被反复使用以“召入”每一个程序,就象系统引导一样。这的确可以节省内存,特别是那些配置一次以后就不再更改的网络堆栈 如果Linux可加载模块的功能包括在内核里,驱动程序和应用程序就都可以被加载。它可以检查硬件环境并且为硬件装上相应的软件。这就消除了用一个程序占用许多Flash Memory来处理多种硬件的复杂性。  
           软件的升级更模块化。你可以在系统运行的时候在Flash上升级应用程序和可加载驱动程序,配置信息和运行时间参数可以作为数据文件储存在Flash上。  
           非虚拟内存  
           标准Linux的另一个待征是虚拟内存的能力。正是这种神奇的特征使应用程序员可以狂热的编写代码而不计后果,不管程序有多大。程序溢出到了磁盘交换区。在没有磁盘的嵌入式系统里,通常不能这么做。  
           在嵌入式系统里不需要这种强大的功能。实际上,你可能不希望它在实时的关键系统里,因为它会带来无法控制的时间因素。这个软件必须设计得更加精悍,以适合市面上物理内存,就象其它嵌入式系统一样。  
           注意由于CPU的原因,通常在Linux中保存虚拟内存代码是明智的,因为将它清除很费事。而且还有另外一个原因是它支持共享文本,这样就可以使许多程序共享一个软件。没有这个,每一个程序都要有它自己的库,就象printf一样。  
           虚拟内存的调入功能可以被关掉,只要将交换空间的大小设置为零。然后,如果你写的程序比实际的内存大,系统就会当作你的运行用尽了交换空间来处理;这个程序将不会运行,或者malloc将会失灵。  
           在许多CPU上,虚拟内存提供的内存管理可以将不同程序分开,防止它们写到其它地址的空间上。这在嵌入式系统上通常不可能,因为它只支持一个简单、扁平的地址空间。Linux的这种功能有助于其发展。它减少了胡乱的编写程序造成系统崩溃的可能性。许多嵌入式系统基于效率方面的原因有意识使用程序间可以共享的“全局”数据。这也可以通过Linux共享内存功能来支持,共享的只是指定的内存部分。    
           文件系统  
           许多嵌入式系统没有磁盘或者文件系统。Linux不需要它们也能运行。如前所述,应用程序任务可以和内核一起编写,并且在引导时作为一个影像加载。对于简单的系统来说,这就够了。然而,它缺乏前面所说的灵活性。  
           实际上,许多商业性嵌入式系统,提供文件系统作为选项。许多或者是专用的文件系统或者是MS-DOS-Compatible文件系统。Linux提供MS-DOS-Compatible文件系统,同时还有其它多种选择。之所以提供其它选择是因为它们更加强大而且具有容错功能。Linux还具有检查和维护的功能,商业性供应商往往不提供这些。这对于Flash系统来说尤其重要,因为它是通过网络更新的。如果系统在升级过程中失去了能力,那它就没有用了。维护的功能通常可以解决这类问题。  
           文件系统可以被放在传统的磁盘驱动器、Flash Memory或其它这类的介质上。而且,用于暂时保存文件,一个小RAM盘就足够了。Flash Memories被分割成块。这些块中也许包括一个含有当CPU启动时运行的最初的软件的引导块。这可能包括Linux 引导代码。剩余的Flash可以用作文件系统。Linux的内核可以通过引导代码从Flash复制到RAM,或者还有一个选择,内核可以被存储在Flash的一个独立部分,并且直接从那里执行。  
           另外对于一些系统来说还有一个有趣的选择,那就是将一个便宜的CD-ROM包含在内。这比Flash Memory 便宜,而且通过交换CD-ROM支持简单的升级。有了这个,Linux 只要从 CD-ROM上引导,并且象从硬盘上一样从CD-ROM上获得所有的程序。  
           最后,对于联网的嵌入式系统来说,Linux 支持NFS(Network File System)。这为实现联网系统的许多增值功能打开了大门。第一,它允许通过网络上加载应用程序。这是控制软件修改的基础,因为每一个嵌入式系统的软件都可以在一个普通的服务器上加载。它在运行的时候也可以用来输入或输出大量的数据、配置和状态信息。这对用户监督和控制来说是一个非常强大的功能。举例来说,嵌入式系统可以建立一个小的RAM磁盘,包含的文件中有与当前状态信息同步的内容。其它系统可以简单的把这个RAM磁盘设置为基于网络的远程磁盘,并且空中存取状态文件。这就允许另一个机器上的Web服务器通过简单的CGI Script存取状态信息。在其它电脑上运行的其它应用程序包可以很容易的存取数据。对更复杂的监控,应用程序包如Matlab可以用来在操作员的PC或工作站的提供系统运行的图形展示。  
           引导LILO和BIOS在哪里  

           当一个微处理器第一次启动的时候,它开始在预先设置的地址上执行指令。通常在那里有一些只读内存,包括初始化或引导代码。在PC上,这是BIOS。它执行了一些低水平的CPU初始化和其它硬件的配置。BIOS继续辨认哪个磁盘里有操作系统,把操作系统复制到RAM并且转向它。实际上,这非常复杂,但对我们的目标来说也非常重要。在PC上运行的Linux依靠PC的BIOS来提供这些配置和OS加载功能。  

           在一个嵌入式系统里经常没有这种BIOS。这样你就要提供同等的启动代码。幸运的是,嵌入式系统并不需要PC BIOS引导程序那样的灵活性,因为它通常只需要处理一个硬件的配置。这个代码更简单也更枯燥。它只是一指令清单,将固定的数字塞到硬件寄存器中去。然而,这是关键的代码,因为这些数值要与你的硬件相符而且要按照特定的顺序进行。所以在大多数情况下,一个最小的通电自检模块,可以检查内存的正常运行、让LED闪烁,并且驱动其它必须的硬件以使主Linux OS启动和运行。这些启动代码完全根据硬件决定,不可随意移动。  

           幸运的是,许多系统都有为核心微处理器和内存所定制的菜单式硬件设计。典型的是,芯片制造商有一个样本主板,可以用来作为设计的参考或多或少与新设计相同。通常这些菜单式设计的启动代码是可以获得的,它可以根据你的需要轻易的修改。在少数情况下,启动代码需要重新编写。 为了测试这些代码,你可以使用一个包含‘模拟内存’的电路内置模拟器,它可以代替目标内存。你把代码装到模拟器上并通过模拟器调试。如果这样不行,你可以跳过这一步,但这样就要一个更长的调试周期。  

           这个代码最终要在较为稳定的内存上运行,通常是Flash或EPROM芯片。你需要使用一些方法将代码放在芯片上。怎么做,要根据“目标”硬件和工具来定。  

           一种流行的方法是把Flash或EPROM芯片插入EPROM或Flash烧制器。这将把你的程序“烧”(存)入芯片。然后,把芯片插入你的目标板的插座,打开电源。这个方法需要板上配有插座,但有些设备是不能配插座的。 另一个方法是通过一个JTAG界面。一些芯片有JTAG界面可以用来对芯片进行编程。这是最方便的方法。芯片可以永远被焊在主板上,一个小电缆从板上的JTAG连接器,通常是一个PC卡,联到JTAG界面。下面是PC运行JTAG界面所需的一些惯用程序。这个设备还可以用来小量生产。    

           健壮性比政治家的承诺更可靠  

           在PC硬件上运行时,Linux是非常可靠和稳定的,特别是和现在流行的一些操作系统相比。嵌入式内核本身有多稳定呢?对大多数微处理器来说,Linux非常好。移植到新微处理器家族的Linux内核运行起来与本微处理器一样稳定。它经常被移植到一个或多个特定的主板上。这些板包括特定的外围设备和CPU。  

           幸运的是,许多代码是与处理器的,所以移植集中在差异上。其中大多数是在内存管理和中断控制领域。一旦成功移植,它们就非常稳定。前面我们讨论过,引导策略广泛依赖于硬件要求,而且你必须有计划地做一些定制的工作。  

           设备驱动程序更加混乱:有些稳定有些不稳定。而且选择很有限;一旦你离开了通用的PC平台,你需要自己编写。幸运的是,周围有许多驱动程序,你可能可以找到一个与你的需求相近的修改一下。这种驱动程序界面已定义好。许多类的驱动程序都非常相近,所以把磁盘、网络或一系列的端口驱动程序从一个设备移植到另一个设备上通常并不难。我发现许多驱动程序都写得很好,很容易理解,但你还是要准备一本关于内核结构的书在手头。 依我的经验,Linux至少和我用过的著名的商业性操作系统一样稳定。总之,这些操作系统和Linux的问题在于对工作过程微秒之处的误解,而不在于代码的难度或基本的设计错误。任何操作系统都有很多争论不休的故事,这里不需要重复。Linux的优势在于源代码是公开、注释清晰和文档齐全的。这样,你就可以控制和处理所出现的任何问题。  

           伴随着基本内核和驱动程序,还有其它问题。如果系统有一个硬盘,那么文件系统的可靠性就成问题。我们有用磁盘进行Linux系统设计超过两年的经验。这些系统几乎从未正常关闭过。电源随时都可能被中断。感觉非常好,使用的是标准(EXT2)文件系统。标准Linux初始化脚本运行fsck程序,它在检查和清除不稳定的inodes方面非常有效。将默认的每隔30秒运行更新程序改为每隔5或10秒运行是比较明智的。这样缩短了数据在进入磁盘之前,待在高速缓冲存储器内的时间,降低了丢失数据的可能性。    

           如何发展  

           嵌入式Linux的确有它的缺陷。比如,虽然它并不比某些商业竞争对手差多少,但它的确是个贪婪的存储器。这可以通过减少一些不必要的功能来弥补,但这可能会花很长的时间,而且如果不仔细的话,还可能带来很大的困扰。  

           许多Linux的应用程序都要用到虚拟内存,在许多嵌入式系统中,是没有价值的,所以不要以为一个没有磁盘的嵌入式系统可以运行任何Linux应用程序。  

           内核调试工具都不怎么好,特别是在较底层的。kgdb可以使错误定位非常容易,你只要重新启动。不幸的是,打印语句更麻烦。  

           然而,对我来说最糟糕的是心理上的问题。Linux非常的灵活。嵌入式系统总的来说却不灵活;而且它们完全是为最有效实现预定功能而严格设计的。现在的趋势是保持灵活性、保持总体目标功能、尽量少做修改。这个目标是崇高的,但是,所付出的代价将是针对具体的工作做出巨大的调整。保持灵活性将导致额外的工作,带着额外的软件包,而且有时还要降低性能。一个反复出现的例子就是配置。考虑在一个网络界面配置IP地址,这通常是通过从启动script上运行ifconfig程序来完成的。这是一个28K的程序,从配置文件上调用数据,可以用几行代码代替,初始化合适的结构。然而,即使这非常合理,但它仍然有害,因为它用一种从未使用过的方法扭曲了软件。   Linux在嵌入式系统中的应用是可行的。它有用、可靠。它的发展成本和替代者一致。

    展开全文
  • 想赚钱吗? 需要自己系统。 怎么开发? 张轶老师教您 备注:由 张轶 书写
  • 定制开发一款好用的题库系统,我们可以把线下培训和手机移动学习...那么如果我们急需一款题库系统,要如何定制开发呢? 其实,如果是小公司,或者是刚刚起步的教育机构,没有研发团队的情况下,如果自己做题库系统...

    定制开发一款好用的题库系统,我们可以把线下培训和手机移动学习做有益的整合。传统的学习模式是以下线培训为主,题库系统使培训再也不是听课一种单一的模式了。同时,对于学员来说,题库系统具有很强的便利性,是可随身携带的智能题库,支持智能手机,有效利用碎片时间提高效率。那么如果我们急需一款题库系统,要如何定制开发呢?

     其实,如果是小公司,或者是刚刚起步的教育机构,没有研发团队的情况下,如果自己做题库系统,势必是没有优势的,但是我们可以借助软件公司,帮我们定制开发题库系统,比如,今天要推荐的,支持定制开发的优考试题库系统。

    使用优考试,我们无需自己开发,借助系统便可以实现在线导入试题、管理试题,智能组卷、自动阅卷出分,是增加教学质量附加值。为学员提供方便、高效的学习工具!

     1.大容量大负载:可导入上万试题,没有数量限制

     2. 收题简易快捷:支持word或Excel大批量导入试题

    试题支持大批量导入,试题的统计,可以采用手工输入的方式,或使用系统提供的模板编辑题目,快捷的使用word或Excel一键导入!

    强大的试题编辑功能,并与通常应用编辑工具有共通。这样就可以不分专业,不分学科快速方便的录入试题数据。

    进入手动添加试题界面时,先选择题型,再输入题目内容,如选择题题干和选项、问答题题干和参考答案等。

     选择题型.png

    灵活的试卷构造功能:用户可自定义试卷标题、试题数量、总分、试题难度系数、分数标注等。

     自定义分数.png

    生成试卷文档格式标准通用,能够合理使用,有效再编辑,保存,方便浏览和打印输出;可以导出题库到word文档,随时二次利用,打印给学生复习。

     3.细致化命题:支持按照知识点、难易程度、学科能力、区分度、教材大纲等指标属性命题 

    自定义试题管理目录,可以按专业、学科、章节等进行目录细分。

    该系统支持单选题、多选题、不定项选择题、填空题、判断题、问答题、理解题七种基本题型,可以导入数学公式题、图片题、音频题、视频题,在答题界面完美展示!

    4.智能组卷:我们可以在线组卷,非常的灵活,考试时间设置、权限设置、防作弊设置、结果页面设置等百项设置适用于多种考试场景。

    发布试卷有非常简单,只需要通过发布在线考试链接或二维码即可让考生进行在线答题。同时,在线考试系统支持大规模高并发,万人在线同时考试都不是问题。

    智能题库管理系统主要针对教研单位教学大纲命题、学校自主命题、等级考试命题等业务而研发的系统,能帮助教研单位和教师解决命题那呢、出卷难等问题、提高命题质量和工作效率。 

     5.科学决策:多维度统计分析,辅助决策更科学

    优考试有强大的统计分析功能。选择可以自动阅卷判分,生成答题结果分析,支持考生分数查询、排名查询、答卷和答案查询、知识点正确率统计等的考试系统

     

    针对每一份试卷能形成独立的数据分析、独立的考试报告;客观题系统自动判分,主观题可按关键字判分或管理员手动判分;管理员可以随时了解考试季度,查看统计分析;能同步进行对错题分析排名。

     

    对考试数据进行统计分析,诸如考试分数分布,考试用时分布,排行等,让你从整体上了解你的学员状态, 同时你也可以对学员一段时间的考试进行对比,并适当的进行指导。

    统计分析.png

     

     没有技术团队,也可以搭建属于自己的题库考试平台,优考试以精益求精的态度,可以帮我们定制开发我们需要的功能!

    展开全文
  • 除了共享单车以外,毫无疑问,短视频是内容创业2.0时代不折不扣的风口,那怎样搭建一个短频系统软件? 1、前期需求规划与信息——你需要制定出一个完整的需求文档,功能文档,流程图,时序图。 这里还需要你懂得px...
  • 对技术架构和实现感兴趣的人也多了,看到easyhadoop这套管理平台以后会问,我们公司没有这个东西,我想用,或者我已经用了,然后我也想自己用java或者其他语言尝试实现一套类似easyhadoop这样的工作系统,都有什么...
  • <小诗>SuperMap iDesktop是一款可编程、可扩展、可定制的,二三维一体化的桌面 GIS 产品,当项目需求是在想...但是如何系统看起来更像自己系统呢,更改启动图标?修改启动页面?修改软件左上角图标?修改程序名称?
  • 生产型企业,如果要自己开发一套管理系统,建议从以下几个方面考虑开发平台的选型问题:生产型企业,自己开发管理系统,该如何选型?1.生态兼容:这个名词可能很少看到,其实解释起来,就很容易明白了。所谓生态环境...
  • 各位大侠,我开发了一个系统,想要别人通过我的IP访问到这个系统,以前,我在windows下,很简单就实现了,只改了下路由的转发规则,弄个二级域名绑定一下就实现了。但在linux下我不知道怎么弄,求各位赐教!!小弟的...
  • 跑分系统如何开发搭建

    万次阅读 2021-01-28 12:48:16
    跑分系统如何开发搭建 最近支付宝微信越来越受欢迎,可以说是网上最好的赚钱方式。但是,给别人打工,挣钱总是不如老板。今天我们就带一个关于建立自己的分销渠道的教程,自己开渠道让别人给自己挣钱。下面我将...
  • 《Developing Your Own OS On IBM PC》,虽然并没有一个完整的OS实现,各内容部分也并不完整,但是包含了许多构建OS的基础知识,作为操作系统初学者的一份导读资料还是相当不错的。网址如下:...
  • 1、系统字体通过注册表设置。如下: [HKEY_LOCAL_MACHINE/System/GDI/SysFnt] ///系统字体 Wt=420 Ht=18 Nm=Arial [HKEY_LOCAL_MACHINE/System/GWE/Menu/BarFnt] ///菜单栏字体 [HKEY_LOCAL_MACHINE/System/...
  • 从上述图中,可知实际上Office Web Apps也是可以接入自己开发系统的。下面介绍一下整合Office Web Apps的一些理论知识。   要想让自己的系统与Office Web Apps整合就一定要清楚一些概念,首先要理解什么是”...
  • 如何想往zynq开发板里的文件系统里添加一些自己的驱动或可执行文件时,可以做如下操作:1.解压uramdisk.image.gz,去掉64字节的头部命令:dd if=./uramdisk.image.gz of=./ramdisk.image.gz bs=64 skip=1 count=...
  • 本文首发于微信公众号「刘望舒」 大家好,我是刘望舒,I’m back!最近分享了一些视频,都属于望舒杂谈,望舒杂谈会分享一些...这篇是BATcoder的第二个视频,来聊聊应用开发如何高效学习系统叠层源码,注意是给应用.
  • 今天小编给大家普及一下如何系统中创建一个虚拟的Python开发环境。 不知道大家有没有这样的烦恼,那就是当你的机器已经安装上了一个版本的Python开发环境了以后,如果您想利用另一个版本的Python开发环境那就会...
  • 那么在这个风口红利期,如何选择一家靠谱的开发商,进行电商直播系统开发呢? 1、看电商直播系统的功能是否符合需求 在选择开发商时,对于系统有无品质保证、完善的选品流程、销售的产品客户满意度如何?复购率有是...
  • 1java开发如何提升自己学习java是一件枯燥的事,如果你想要学java就应该静下心来学,也要付出一点努力,毕竟java是一门热门的编程语言,前景很好。那么下面小编给大家说说java开发如何提升自己,希望能对你有些帮助...
  • 当你打开计算机时发生了什么? 1.电源打开;2.BIOS开始执行;3.引导程序开始执行。...大小是512个字节;最后两个字节一定是0AA55h;它能被载入到内存地址0x7C00。 工具: NASM——是一个免费的汇编工具(有DOS/windows/...
  • 如何开发自己的操作系统的引导程序?当你打开计算机时发生了什么? 1.电源打开;2.BIOS开始执行;3.引导程序开始执行。 引导程序的规定:你要有一个普通的二进制文件(COM 格式);大小是512个字节;最后两个字节一定...
  • 今天湘北想来和大家聊一聊中小企业该如何低成本,高效,且快速的开发自己系统 首先我们要先了解先中小企业所面临的是什么 1、中小企业业务规范性差,信息化需求柔性大 首先要说到的就是小企业相较于大企业业务...
  • 如何搭建自己开发环境

    千次阅读 2009-05-22 08:35:00
    如何搭建自己开发环境 好了,到这里相信读者已经知道如何搭建自己开发环境了,说白了它跟开发一个普通的软件区别基本就在一个虚拟机上。它既是我们的“硬件”,又是我们的调试器,有了它我们安心多了。那是不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,061
精华内容 4,024
关键字:

如何自己开发系统