Wekey's profilewekey 的个人空间PhotosBlogListsMore ![]() | Help |
wekey 的个人空间个人点滴、心得 技术、娱乐、生活一Blog打尽 June 23 IPTV端到端业务质量监测技术研究本文关键字: IPTV99, 监测45, 运营商6, 网络23, 监测系统5, 融合2, 电信5, 有线电视1, 宽带2, Qos8, ITU15, 测试30, VOD4, 流媒体3, 信令1, IP6, 服务器1, DSL5, 国际标准化组织1, 机顶盒6, 广域网1, H.2641, 中国电信2, 电信网1
摘要 在IPTV业务的实际运营中,如何保证和监测端到端的业务质量是运营商关注的主要问题。本文首先介绍了IPTV业务质量的定义和业务质量模型,并从运营商角度提出了业务质量监测的需求。之后介绍了目前IPTV质量监测领域的技术、标准和产业发展状况,最后提出了在IPTV业务网络中部署端到端监测系统的技术方案。
1、引言 随着近几年在业务融合、技术、标准以及商业模式等方面的摸索,IPTV业务在中国开始逐步成熟并进入到规模商用阶段。IPTV作为一种电信级业务,要达到大规模应用需要有效的业务质量保障。由于IPTV是电视类的媒体业务,用户希望得到如同有线电视的服务水平,包括频道切换速度、节目的图像质量、播放的流畅性等。而传统的宽带业务质量监测侧重于数据链路层和网络层的监测,无法直接反映用户对IPTV业务的主观感受,因此不能满足IPTV质量监测的需求。 本文针对现有监测方案的不足,提出了一种采用分布式部署与集中管理相结合的监测方案,该方案具有监测功能丰富、可扩展性强等优点,可满足现阶段IPTV业务质量监测的需要。 2、业务质量定义及模型 业务质量(quality of service,QoS)术语并不是针对IPTV的,在很多电信业务中都提出QoS要求及相关的QoS保障技术。在ITU-T E.800[1]标准中,QoS被定义为“反映用户对业务使用满意程度的服务性能的综合效果”。对传统电信业务而言,QoS通常指网络性能,尤其是网络传输性能。而由于IPTV是一种上层应用的业务,传统的QoS无法满足对最终用户感受的评估,因此目前业界往往采用体验质量(quality of experience,QoE)一词来描述面向最终用户应用的业务质量。QoE在ITU-T P.10/G.100[2]中被定义为“最终用户对使用的应用或业务的总体主观可接受程度”,可见QoE相比QoS更强调最终用户的业务使用感受。 目前尚无国际规范对IPTV业务质量进行完整定义,国际标准组织ITU正在进行IPTV GSI(global standard initial,全球主动标准)工作,以推动全球IPTV标准化进程。其中暂时还没有对IPTV业务质量进行定义,仍沿用了ITU-T P.10/G.100中对QoE的定义。IPTV GSI也指出,IPTV QoE应该同时包含主观评估质量和客观评估质量两部分内容,前者主要根据人眼视觉系统来评估视频质量,通过主观感受来评估体验质量;后者则可以定义各种客观指标,并采用相应的测试工具进行测量,具体如图1所示。
图1 目前ITU IPTV GSI规定的QoE定义范围 作者比较赞同ITU IPTV GSI目前对IPTV业务质量的定义,在本文中也采用IPTV QoE来表示IPTV业务质量。当然,从运营商的角度来说不仅仅关心IPTV业务质量定义,更具实际意义的是如何量化IPTV业务质量,如何建立IPTV 业务质量的指标体系以指导现网的质量运维。因此,需要根据IPTV所涉及的技术环节,建立IPTV业务质量的评估模型。 图2参考OSI的7层模型,给出了一种可供参考的IPTV业务质量的参数模型,并展示了与IPTV协议栈之间的对应关系。
图2 IPTV业务质量模型与OSI 7层模型和IPTV协议栈的关系 如图2所示,IPTV QoE的参数模型覆盖了OSI 7层模型的所有层次。其中,客观QoE相关的分层质量对应于IPTV的协议栈中各个协议,各层次的质量参数可以通过采集对应的协议及其字段获得。 具体的,客观QoE包含以下几方面的内容。 ●内容质量和业务控制质量:主要指直播频道、时移节目、VOD节目、图片、文字等内容的品质和业务控制的性能指标。例如对于直播频道质量,需要采集和分析媒体编码参数、分辨率参数等;对于业务控制质量,需要采集HTTP和RTSP请求的响应速度、页面数据呈现完整度、组播加入/退出的时延等。 ●流媒体质量:主要指流媒体传输层的性能指标,以采用MPEG2 TS协议传输IPTV节目为例,DVB系统测试标准TR 101-290根据各参数对质量影响的程度不同,定义了3个级别,每个级别分别对应一组质量参数,这些参数同样可供采用MPEG2 TS协议的IPTV系统参考,例如需要采集第一级别中的同步错误字段(sync loss)、包识别丢失(PID missing),第二级别中的数据传输错误(transport error)、节目参考时钟抖动错误(PCR,jitter error)等参数。如果采用RTSP作为VOD节目的流控制协议,则要采集RTSP信令参数。 ●网络传输层质量:主要指网络传输层相关协议的性能指标,包括TCP/UDP的重传次数,在采用了RTP的情况下,需要监测RTP丢包率、RTP抖动等。 ●网络层质量:主要指传统IP网络层的性能指标,根据ITU-T Y.1540[3]建议,主要为IP丢包率、IP包时延、IP包抖动及其相关参数。 ●链路层质量:根据不同的链路层类型,需要采集不同的性能指标。由于这个层次的质量保障是面向全业务而不仅仅是IPTV业务,本文不做详述。 主观QoE主要是用户对IPTV业务使用中的主观感受,这些感受是对服务接入速度、内容质量、使用操作便利性等多方面的综合,至少可以包含以下参数: ●开机进入IPTV主界面的速度; ●用户鉴权频道浏览(加入/离开时延); ●视频内容的清晰度和流畅程度; ●直播频道的切换速度; ●VOD节目进行快进、快退和暂停操作的响应速度; ●业务请求的响应速度、业务内容的完整性等。 3、业务质量监测需求 IPTV业务质量监测应包含两部分,即监控和测试,二者相互关联但又相对独立。其中监控技术主要是面向IPTV运维部门使用,协助IPTV平台及网络运维部门监控网络运行中的质量状态,帮助定位故障和解决问题,因此要求监控技术能够覆盖整个IPTV业务质量领域。测试主要面向IPTV产品研发、性能评估和故障排查等应用,因此测试技术往往针对与IPTV业务质量相关的某一个领域或层面,重点解决某一类问题。 如前所述,IPTV业务质量监控应该覆盖整个IPTV业务领域,是面向IPTV业务的端到端全网监测,具体应满足以下需求。 ●满足IPTV业务的7×24 h不间断监测,同时不对正在运营的IPTV系统产生影响。 ●监测范围能够覆盖整个IPTV网络的各个环节,并能根据各环节采集的参数进行对比分析。这些环节至少包括:内容头端系统、系统核心平台出口、边缘节点出口、关键网络节点等。 ●当IPTV质量发生劣化时,系统能够自动采集质量劣化的技术参数,并作详细记录;能够通过对比分析各节点参数,进行故障点分析和快速定位。 ●能够根据采集参数进行平台及服务器的性能分析等。 ●能够完成图2中质量模型各层次的分析。 而IPTV业务质量测试主要针对与IPTV业务质量相关的某一个领域或层面,如在实验室进行质量验证或问题和故障发生后进行定位和排障,或针对IPTV某个网元设备进行测试。因此IPTV业务质量测试往往可以借助原来各层面的相关测试工具进行,下面举几个例子。 ●内容质量的测试:主要在实验室或内容上线前,采用专门的质量检测工具进行图像质量、伴音质量、字幕质量、元数据质量等的测试,主要针对直播频道、时移节目、VOD节目、图片、文字等内容的品质和业务控制的性能指标。 ●流媒体层的测试:主要在系统上线前对流协议的规范性进行测试和验证。 ●网络传输层、网络层和链路层质量测试:主要采用与应用无关的专用测试软件或仪表测试目前IPTV承载网络的质量状况。 4、标准及产业链现状 如前所述,IPTV作为一个新兴的融合性业务,目前还没有非常完备的国际规范。虽然包括ITU IPTV GSI、ATIS(alliance for telecommunication industry solution,电信行业解决方案联盟)、IPTV论坛、DSL论坛、DVB(digital video broadcasting,数字视频广播)等多家国际标准化组织已开始相关的标准化推进工作,但目前尚未正式发布。尽管如此,在IPTV业务质量监测的系统架构、参数建议等方面已取得了较大进展。 ●ITU IPTV GSI:已经初步完成了IPTV业务质量相关的需求草案和IPTV业务性能监测的草案,目前ITU的相关工作组正在进行后续的工作,计划在2008年底能够成为国际规范。 ●ATIS:起步较早,在2006年就开始了IPTV QoS指标体系、IPTV QoE模型等相关的制定工作,计划在2008年完成。 ●DSL论坛:主要关注机顶盒侧与业务质量相关的参数定义,目前已经完成了机顶盒数据模型技术报告(DSL Forum TR135)、可应用于机顶盒的终端广域网管理协议技术报告(DSL Forum TR069)等。 在产业链支持方面,尽管还没有完整的IPTV业务质量监测技术标准可供参考,但由于IPTV业务的快速部署和运营商对质量监测需求的迫切,市场上已经有多家测试仪表厂商能够提供IPTV质量监测仪表。如前所述,IPTV业务质量监测包含测试和监控两部分,因此这些仪表也可对应地分为测试和监控两大类。 在测试仪表方面,主要是针对某个层面的专用测试工具,例如美国IneoQuest公司提供的Singulus G1-T系列测试仪表,其主要特征是支持RFC4445定义的MDI指标值,可应用于IPTV数据的模拟、捕捉、数据流监控以及视频质量的分析;思博伦公司提供的IPTV测试解决方案包括宽带网络测试、频道切换测试、频道内容验证等;泰克公司则提供了较为完备的视频质量测试和分析工具,如能够分析H.264编解码参数的MTS4EA,能够测试视频主观质量的PQA仪表等。 在监控系统方面,目前还没有很完备的、能完全满足运营商需求的解决方案。美国JDSU公司提供的QT系列仪表可应用于IPTV直播频道的7×24 h质量监控,监控的内容包括了网络质量、传输层质量等。因此,目前国内的IPTV运营商开始根据运维需求自主或与合作伙伴联合开发IPTV业务质量监测系统。例如中国电信上海研究院就和国内的中创信测合作开发了IPTV业务质量监测系统,该系统已能够支持现网应用的主流IPTV系统,支持从业务层到网络层的端到端业务质量监测。 5、IPTV端到端业务质量监测方案 以下以中国电信上海研究院与中创信测合作开发的IPTV业务质量监测系统为例,介绍IPTV端到端的质量解决方案。该系统是一个独立的分布式系统,叠加在现有IPTV业务网络中,通过部署监测代理或测试探针的方式来获得IPTV业务运行时各个网络节点的相关质量参数数据,并由监测平台进行集中采集、分析和统计,以获得IPTV业务总体质量情况。 值得一提的是,该方案的系统架构与目前ITU IPTV GSI正在制定的IPTV性能监测标准一致,均采用了“分布部署、集中采集”的系统架构,如图3所示,其中PT指监测点。
图3 目前ITU IPTV GSI定义的业务质量系统架构 如图3所示,整个系统主要包括监测管理平台、监测代理。 监测管理平台:负责管理监测代理和采集所有代理上传的监测数据,并执行统计和分析,是整个系统的核心组件。 监测代理:主要完成业务质量参数的采集和上传,根据部署的监测点不同,又可以分为3种工作模式。 ●仿真模式:即主动模式,仿真用户的IPTV业务登录、认证及基本业务流程,能够通过预定义的脚本文件,自动进行相关的测试,记录并形成业务质量参数记录文件,上传给监测管理平台所有的性能参数。在图3中,该模式可以部署在PT4和PT5的位置。 ●监测模式:即被动模式,通过数据镜像或备份的方式获得用户业务数据,分析质量参数,并记录和上传给监测管理平台所有参数。在图3中,该模式可以部署在PT1、PT2和PT3的位置。 ●机顶盒内嵌模式(STB embedded test agent,STB-TA):在机顶盒内部嵌入测试客户端软件,能够将机顶盒运行中的业务质量参数记录并上传到监测管理平台。在图3中,该模式可以部署在PT1、PT2和PT3的位置。 当然,从系统角度来看,IPTV监测系统在不同的节点所关注的质量是不同的,因此当监测代理工作在不同的模式下或部署在不同的节点时,所采集的质量参数也不尽相同,这里就不详述了。 从整个系统的架构可以看出,上述系统基本覆盖了IPTV端到端各个环节,所采集的参数能够帮助完成图2中质量模型客观QoE各个层面的分析,能够协助IPTV平台及网络运维部门监控网络运行中的质量状态,从而帮助定位故障和解决问题。 6、结束语 IPTV是一个跨广电网、IP网、电信网的复杂应用,其业务质量监测需要综合考虑视音频内容质量、网络质量、用户最终感受等多重因素。本文对IPTV业务质量监测相关技术进行了研究,并提出了IPTV业务质量模型及性能监测的系统框架。 但是对于IPTV运维部门来说,需要一整套IPTV业务质量指标体系,希望能够通过类似主观评测分的等级划分来衡量整个IPTV系统质量,并提供可操作的监测手段。因此,后续还需要研究IPTV业务质量指标体系,量化和评估每个指标对最终用户感受的影响,并研究各业务质量指标的采集方法,从而构建完整的IPTV业务质量监测体系,保证IPTV业务的顺利运营。 参考文献 1 ITU-T E.800.Terms and definitions related to quality of service and network performance including dependability,August 1994 2 ITU-T P.10/G.100.Vocabulary for performance and quality of service,July 2006 3 ITU-T Y.1540.Internet protocol data communication service-IP packet transfer and availability performance parameters,Nov、2007 4 DSL Forum.www.dslforum.org 作者:罗斯青 段保通 来源:电信科学 June 02 GCC笔记转载自: zzzppp.cublog.cn
The History of GCC 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版的GCC横空出世,成为第一款可移植、可优化、支持ANSI C的开源C编译器。 警告信息 -Wall : 显示所有常用的编译警告信息。 C语言标准 你可以在gcc的命令行中通过指定选项来选择相应的C语言标准: 从传统c到最新的GNU扩展C. 默认情况下, gcc使用最新的GNU C扩展. 生成特定格式的文件 以hello.c为例子,可以设置选项生成hello.i, hello.s, hello.o以及最终的hello文件: 如果你不通过-o指定生成可执行文件名,那么会默认生成a.out. 不指定生成文件名肯能覆盖你上次生成的a.out. e.g. -c生成.o文件时,默认生成与源代码的主干同名的.o文件。比如对应hello.c生成hello.o. 但也可在生成目标文件时指定目标文件名(注意同时要给出.o后缀): $ gcc -c -o demo.o demo.c $ gcc -Wall -c hello.c : 生成hello.o 多文件编译、连接 如果原文件分布于多个文件中:file1.c, file2,c 若对其中一个文件作了修改,则可只重新编译该文件,再连接所有文件: 注意:若编译器在命令行中从左向右顺序读取.o文件,则它们的出现顺序有限制:含有某函数定义的文件必须出现在含有调用该函数的文件之后。好在GCC无此限制。 编译预处理 以上述的hello.c为例, 要对它进行编译预备处理, 有两种方法: 在gcc中指定-E选项, 或直接调用cpp.gcc的编译预处理命令程序为cpp,比较新版本的gcc已经将cpp集成了,但仍提供了cpp命令. 可以直接调用cpp命令, 也可以在gcc中指定-E选项指定它只进行编译预处理. $ gcc -E hello.c == $ cpp hello.c 上述命令马上将预处理结果显示出来. 不利于观看. 可采用-c将预处理结果保存: $ gcc -E -c hello.i hello.c == $ cpp -o hello.i hello.c 注意, -c指定名称要给出".i"后缀. 另外, gcc针对编译预处理提供了一些选项: (1) 除了直接在源代码中用 #define NAME来定义宏外,gcc可在命令行中定义宏:-DNAME(其中NAME为宏名), 也可对宏赋值: -DNAME=value 注意等号两边不能有空格! 由于宏扩展只是一个替换过程,也可以将value换成表达式,但要在两边加上双括号: -DNAME="statement" e.g. $ gcc -Wall -DVALUE="2+2" tmp.c -o tmp 如果不显示地赋值,如上例子,只给出:-DVALUE,gcc将使用默认值:1. (2) 除了用户定义的宏外, 有一些宏是编译器自动定义的,它们以__开头,运行: $ cpp -dM /dev/null, 可以看到这些宏. 注意, 其中含有不以__开头的非ANSI宏,它们可以通过-ansi选项被禁止。 查看宏扩展 1, 运行 $ gcc -E test.c ,gcc对test.c进行编译预处理,并立马显示结果. (不执行编译) 2, 运行 $ gcc -c -save-temps test.c ,不光产生test.o,还产生test.i, test.s,前者是编译预处理结果, 后者是汇编结果. 利用Emacs查看编译预处理结果 针对含有编译预处理命令的代码,可以利用emacs方便地查看预处理结果,而不需执行编译,更为方便的是,可以只选取一段代码,而非整个文件: 1,选择想要查看的代码 2,C-c C-e (M-x c-macro-expand) 这样,就自动在一个名为"Macroexpansion"的buffer中显示pre-processed结果. 生成汇编代码 使用"-S"选项指定gcc生成以".s"为后缀的汇编代码: $ gcc -S hello.c $ gcc -S -o hello.s hello.c 生成汇编语言的格式取决于目标平台. 另外, 如果是多个.c文件, 那么针对每一个.c文件生成一个.s文件. 包含头文件 在程序中包含与连接库对应的头文件是很重要的方面,要使用库,就一定要能正确地引用头文件。一般在代码中通过#include引入头文件, 如果头文件位于系统默认的包含路径(/usr/includes), 则只需在#include中给出头文件的名字, 不需指定完整路径. 但若要包含的头文件位于系统默认包含路径之外, 则有其它的工作要做: 可以(在源文件中)同时指定头文件的全路径. 但考虑到可移植性,最好通过-I在调用gcc的编译命令中指定。 下面看这个求立方的小程序(阴影语句表示刚开始不存在): #include <stdio.h> 使用gcc-2.95来编译它(-lm选项在后面的连接选项中有介绍, 这里只讨论头文件的包含问题): 程序编译成功,但gcc给出警告: pow函数隐式声明。 明显执行结果是错误的,在源程序中引入头文件(#include <math.h>),消除了错误。 不要忽略Warning信息!它可能预示着,程序虽然编译成功,但运行结果可能有错。故,起码加上"-Wall"编译选项!并尽量修正Warning警告。 搜索路径 首先要理解 #include<file.h>和#include"file.h"的区别: UNIX类系统默认的系统路径为: 头文件,包含路径: /usr/local/include/ or /usr/include/ 对于标准c库(glibc或其它c库)的头文件, 我们可以直接在源文件中使用#include <file.h>来引入头文件. 如果要在源文件中引入自己的头文件, 就需要考虑下面的问题: 1, 如果使用非系统头文件, 头文件和源文件位于同一个目录, 如何引用头文件呢? 2, 对于比较大型的工程, 会有许多用户自定义的头文件, 并且头文件和.c文件会位于不同的目录. 又该如何在.c文件中引用头文件呢? 针对头文件比较多的情况, 最好把它们统一放在一个目录中, 比如~/project/include. 这样就不需为不同的头文件指定不同的路径. 如果你嫌每次输入这么多选项太麻烦, 你可以通过设置环境变量来添加路径: 3, 还有一个比较猥琐的办法: 系统默认的包含路径不是/usr/include或/usr/local/include么? 我把自己的头文件拷贝到其中的一个目录, 不就可以了么? 的确可以这样, 如果你只想在你自己的机器上编译运行这个程序的话 前面介绍了三种添加搜索路径的方法,如果这三种方法一起使用,优先级如何呢? 与外部库连接 前面介绍了如何包含头文件. 而头文件和库是息息相关的, 使用库时, 要在源代码中包含适当的头文件,这样才能声明库中函数的原型(发布库时, 就需要给出相应的头文件). 和包含路径一样, 系统也有默认的连接路径: 头文件,包含路径: /usr/local/include/ or /usr/include/ 库文件,连接路径: /usr/local/lib/ or /usr/lib/ 同样地, 我们想要使用某个库里的函数, 必须将这个库连接到使用那些函数的程序中. 有一个例外: libc.a或libc.so (C标准库,它包含了ANSI C所定义的C函数)是不需要你显式连接的, 所有的C程序在运行时都会自动加载c标准库. 除了C标准库之外的库称之为"外部库", 它可能是别人提供给你的, 也可能是你自己创建的(后面有介绍如何创建库的内容). 两者的共同点: 两者的区别: 共享库.so : 与共享库连接的可执行文件只包含它需要的函数的引用表,而不是所有的函数代码,只有在程序执行时, 那些需要的函数代码才被拷贝到内存中, 这样就使可执行文件比较小, 节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用).共享库还有个优点: 若库本身被更新, 不需要重新编译与它连接的源程序。 静态库 下面我们来看一个简单的例子,计算2.0的平方根(假设文件名为sqrt.c): #include <math.h> 用gcc将它编译为可执行文件: 现在我用2.95版的gcc把sqrt.c再编译一次: 使用下列的命令可以成功编译: C库文件默认位于/usr/lib, /usr/local/lib系统目录中; gcc默认地从/usr/local/lib, /usr/lib中搜索库文件。(在我的Ubuntu系统中,C库文件位于/urs/lib中。 这里还要注意连接顺序的问题,比如上述命令,如果我改成: 正如读取目标文件的顺序,gcc也在命令行中从左向右读取库文件——任何包含某函数定义的库文件必须位于调用该函数的目标文件之后! 指定库文件的绝对路径比较繁琐,有一种简化方法,相对于上述命令,可以用下面的命令来替代: 上面所提到的"libm.a"就是静态库文件,所有静态库文件的扩展名都是.a! 正如前面所说,默认的库文件位于/usr/lib/或/usr/local/lib/目录中。其中,libm.a是静态库文件,libm.so是后面会介绍的动态共享库文件。 如果调用的函数都包含在libc.a中(C标准库被包含在/usr/lib/libc.a中,它包含了ANSI C所定义的C函数)。那么没有必要显式指定libc.a:所有的C程序运行时都自动包含了C标准库!(试试 $ gcc-2.95 -Wall hello.c -o hello)。 共享库 正因为共享库的优点,如果系统中存在.so库,gcc默认使用共享库(在/usr/lib/目录中,库文件以共享和静态两种版本存在)。 运行:$ gcc -Wall -L. hello.c -lNAME -o hello 正如前面所说,共享库以.so为扩展名(so == shared object)。 那么,如果不想用共享库,而只用静态库呢?可以加上 -static选项 $ gcc-2.95 -Wall sqrt.c -static -lm -o sqrt_2.95_static $ ls -l sqrt* 上述用四种方式编译sqrt.c,并比较了可执行文件的大小。奇怪的是,-static -lm 和 /lib/libm.a为什么有区别?有知其原因着,恳请指明,在此谢谢了! :) 如果libNAME.a在当前目录,应执行下面的命令: 利用GNU archiver创建库 $ ar cr libhello.a hello_fn.o by_fn.o 关于创建库的详细介绍,可参考本blog的GNU binutils笔记 调试 一般地,可执行文件中是不包含任何对源代码的参考的,而debugger要工作,就要知道目标文件/可执行文件中的机器码对应的源代码的信息(如:哪条语句、函数名、变量名...). debugger工作原理:将函数名、变量名,对它们的引用,将所有这些对象对应的代码行号储存到目标文件或可执行文件的符号表中。 GCC提供-g选项,将调试信息加入到目标文件或可执行文件中。 解决方法: 优化 GCC具有优化代码的功能,代码的优化是一项比较复杂的工作,它可归为:源代码级优化、速度与空间的权衡、执行代码的调度。 GCC提供了下列优化选项: 注意:此处为O!(非0或小写的o,-o是指定可执行文件名)。 time测量指定程序的执行时间,结果由三部分组成: user和sys的和被称为CPU时间. 注意:对代码的优化可能会引发警告信息,移出警告的办法不是关闭优化,而是调整代码。 GNU binutils笔记转载自: zzzppp.cublog.cn
GNU binutils是一组二进制工具集。包括:addr2line ar gprof nm objcopy objdump ranlib size strings strip. 本文归纳他们的常用法。 ar用于建立、修改、提取档案文件(archive)。archive是一个包含多个被包含文件的单一文件(也称之为库文件),其结构保证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。member的原始文件内容、模式(权限)、时间戳、所有着和组等属性都被保存在 archive中。member被提取后,他们的属性被恢复到初始状态。 ar主要用于创建C库文件(关于.o目标文件的生成和共享库的详细介绍,参考gcc笔记) 创建静态库 (1) 生成目标文件: $ gcc -Wall -c file1.c file2.c file3.c 不用指定生成.o文件名(默认生成file1.o, file2.o, file3.o)。 $ ar rv libNAME.a file1.o file2.o file3.o ar生成了libNAME.a库,并列出库中的文件。 $ gcc -Wall -c -fpic file1.c file2.c file3.c -fpic: 指定生成的.o目标文件可被重定址. pic是position idependent code的缩写: 位置无关代码. $ gcc -shared -o libNAME.so file1.o file2.o file3.o 一般地, 连接器使用main()函数作为程序入口. 但在动态共享库中没有这样的入口. 所以就要指定-shared选项来避免编译器显示出错信息. $ gcc -Wall -shared -fpic -o libNAME.so file1.c file2.c file3.c 此后,将main函数所在的程序与libNAME.so连接(注意库连接路径和头文件包含路径,以及连接顺序!参考gcc笔记) error while loading shared libraries: libhello.so: 这是因为与动态库连接的程序在运行时,首先将该动态库加载到内存中,而gcc默认加载动态库文件所在目录为/usr/local/lib, /usr/lib。刚才的程序虽然能编译成功,但如果我们自己建立的动态库没有位于默认目录中,则执行时会应为无法找到它而失败。 export LD_LIBRARY_PATH=动态库所在目录:$LD_LIBRARY_PATH 查看archive内容 $ ar tv archiveNAME t : 显示archive中member的内容,若不指定member,则列出所有。 nm用来列出目标文件中的符号,可以帮助程序员定位和分析执行程序和目标文件中的符号信息和它的属性。 如果没有目标文件作为参数传递给nm, nm假定目标文件为a.out. 这里用一个简单的示例程序来介绍nm的用法: main.c: int main(int argc, char *argv[]) hello.c: void hello(void) bye.c: void bye(void) 运行下列命令: main.o: 结合这些输出结果,以及程序代码,可以知道: objcopy可以将一种格式的目标文件转化为另外一种格式的目标文件. 它使用GNU BFD库进行读/写目标文件.使用BFD, objcopy就能将原格式的目标文件转化为不同格式的目标文件. 以我们在nm中使用的hello.o目标文件和hello可执行为例: $ file hello.o hello file命令用来判别文件类型, 输出如下: $ objcopy -O srec hello hello_srec file命令结果: hello_srec: Motorola S-Record; binary data in text format objdump用来显示目标文件的信息. 可以通过选项控制显示那些特定信息. objdump一个最大的用处恐怕就是将C代码反汇编了. 在嵌入式软件开发过程中, 也可以用它查看执行文件或库文件的信息. 下面我们用上文提到的hello可执行文件和hello_srec可执行文件为例, 介绍objdump的简单用法: $ objdump -f hello hello_srec 输出如下: $ objdump -d hello.o 显示如下: readelf用来显示ELF格式目标文件的信息.可通过参数选项来控制显示哪些特定信息.(注意: readelf不支持显示archive文档, 也不支持64位的ELF文件). 下面利用先前的hello可执行文件演示readelf的简单用法: $ readelf -h hello ELF Header: gprof被用来测量程序的性能. 它记录每个函数被调用的次数以及相应的执行时间. 这样就能锁定程序执行时花费时间最多的部分, 对程序的优化就可集中于对它们的优化. 用一个简单的数值计算程序来掩饰gprof的用法: collatz.c: #include <stdio.h> 先将collatz.c编译成目标文件collatz.o, gcc通过 -pg选项来打开gprof支持: $ gcc -Wall -c -pg collatz.c $ gcc -Wall -pg -o collatz collatz.o 注意:两条命令都要加 "-pg"选项。前一条命令生成collatz.o目标文件。后一条命令生成可执行文件,该可执行文件中包含了记录函数执行时间的指令。 $ gprof ./collatz 关于gprof更多的描述,参考gprof的on-line manual C语言出错信息速查Ambiguous operators need parentheses 给ECOS新手和想大致了解ecos的人!eCos最大的特点是内核可配置。它出生于1997年,相对其他的系统来说是非常年轻的,但是也正是因为出身的晚,所以在设计理念上面是比较新颖的。其全部代码使用C++编写。 嵌入式操作系统uClinux和eCos的比较摘要 uClinux和eCos操作系统是两种性能优良、源码公开且被广泛应用的免费嵌入式操作系统。本文通过对uclinux和eCos的对比,分析和总结了嵌入式操作系统应用中的若干重要问题,归纳出嵌入式系统开发中操作系统的选型依据。 1 两种开源嵌入式操作系统介绍
从表1可知,打开缓冲存储器。对eCos的应用程序性能影响较uClinux的大;反之,关闭缓冲,eCos的应用程序的性能就下降很多。
基于以上结果的分析如下:①造成eCos存储器访问能力优于uClinux的原因是,eCos的应用程序获得的处理器时间较长;②造成读缓冲模式下,存储器访问性能随块长度增长而变好,而其他模式下不变的原因是,与AT76C120的缓冲控制器的回写模式有关。由于AT76C120的缓冲控制器采用了直接回写的缓冲回写模式,缓冲控制器对存储器写操作没有任何缓冲作用,因此当处理器写存储器时基本不会享受到由缓冲控制器带来的好处,相当于直接访问外部存储器。
3 综合应用性能比较
我们看到,eCos和uClinux解码速度都很低,主要是因为完全使用了软件解压缩;而且由于AT76C120的图像显示格式是YCrCb的,而 giflib的解压缩结果是RGB的,因此必须使用浮点运算将RGB的数据转换到YCrCb。AT76C120的ARM7TDMI不支持浮点指令,因此不得不使用软件仿真来完成浮点运算,这其中大部分时间被用在了从RGB到YCrCb的转换上。测试结果基本与前面基本操作系统测试的结果是一致的—— eCos在整体上是优于uClinux的。 4 可移植性 5 开发模式和开发难易度 6 总 结 ——信息来源:杭州启扬智能科技有限公司 May 14 SubVersion Log & Stat 统计工具 - StatSVN最新的STATSVN可以从其官网上下载: http://www.statsvn.org
StatSVN能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表。 比如: 代码行数的时间线; 针对每个开发者的代码行数; 开发者的活跃程度; 开发者最近所提交的; 文件数量; 平均文件大小; 最大文件; 哪个文件是修改最多次数的; 目录大小; 带有文件数量和代码行数的Repository tree。 StatSVN当前版本能够生成一组包括表格与图表的静态HTML文档。 StatSVN使用JFreeChart来生成chart。 简易使用流程是: 2:生成log 3:生成统计结果 注意: 由于SVN的diff的计算算法问题,如果第一次执行statsvn可能会耗费很长时间的,我自己的一个20w行左右的项目,第一运行就花掉了1个多小时,所以请耐心等待,以后再执行就很快了。 附上几张统计结果的图片: April 02 交叉编译场景分析(arm-linux)--序转载自:http://blog.csdn.net/absurd
去年花了一个多月时间,为arm-linux平台编译程序库,其中包括zlib、readline、ncurses、tslib、TinyX、libpng、jpeg、cairo、pango、glib、atk、gtk+、match系列、SCIM、GPE系列。由于之前没有经验,走了不少弯路,虽然从中学到了一些知识,大部分时间都浪费了。最近一些同事和朋友常问我一些关于交叉编译的问题,我想有必要总结一下,和大家分享一些心得。 什么是交叉编译呢?在回答这个问题前,我们先解释两个概念: 主 机:运行编译过程的计算机。 目标机:运行编译结果(可执行文件)的计算机。 一般情况下,主机和目标机是同一类型的计算机,这就是正常的编译,没有什么好说的。所谓交叉编译就是在主机上为目标机编译,比如在PC上编译,然后在手机上运行,这种编译就叫交叉编译。 交叉编译需要交叉编译器,不同的目标机(主要是看芯片类型)需要不同的交叉编译器,比如我们这里要介绍的arm-linux交叉编译,所用的交叉编译器就是arm-linux-gcc系列。 构建一个交叉编译器(toolchain),说简单也简单,说复杂也复杂。原理上很简单,实际情况常常比较复杂,原因是编译器一直处于开发状态,你要了解某个版本的稳定性,要去找patch。有时候还要看你的运气好不好,折腾一个星期才搞定也是很常见的。 网上已经有不少已经构建好了的交叉编译器(toolchain),除非你想了解如何构建交叉编译器,否则直接下载一个来用是比较明智的做法。这里不打算介绍如何构建交叉编译器的知识。 在做交叉编译前,你最好了解autoconf系统工具的用法,遇到问题时,可以快速定位。先找一本autoconf的书看看,可以说是磨刀不识砍柴功,否则后面会浪费更多的时间。 March 31 Bugzilla 安装错误 (Undefined subroutine &DBD::mysql::db::_login called at lib/i386-linux-thread-multi/DBD/mysql.pm line 142, line 228)在安装Bugzilla的过程中,安装好了必须的perl module后 用checksetup.pl检查了一直pending在connect mysql的连接中。Google Serach后发现这个的错误发生情况还不少,但是没有一个适合我用的解决方案。所以经过摸索,写下帮助,或许能减少后来人,走一些弯路: 环境: OS: CentOS 5.1 Bugzilla: 3.1.3 MySQL: 5.0.22 Perl: 5.8.8
前面的安装步骤如下: Step 1: Mysql #groupadd mysql#useradd mysql # yum install mysql # yum install mysql-devel # yum install mysql-server #mysql_install_db #chown -R root:mysql /usr/local/mysql #chown -R mysql:mysql /usr/local/mysql/var #chgrp -R mysql /usr/local/mysql #cp support-files/my-medium.cnf /etc/my.cnf 启动服务方法 #mysqld_safe --user=mysql & 停止服务 #mysqladmin shutdown 为mysql添加用户bugs mysql> GRANT SELECT,INSERT,UPDATE,DELETE,INDEX, ALTER,CREATE,DROP,REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY 'bugs_password'; mysql> FLUSH PRIVILEGES; mysql> create database bugs DEFAULT CHARACTER SET utf8;
Step 2: Apache # yum install httpd 修改apache配置/etc/httpd/conf/httpd.conf添加如下内容: Alias /bugzilla/ "/var/www/bugzilla/" <Directory "/var/www/bugzilla">
Step 3:bugzilla 解压bugzilla的tar包到/var/www/buzilla下 利用bugzilla的脚本#/usr/bin/perl install-module.pl --all 可以自动下载所需的perl module。 修改localconfig [root@localhost bugzilla-3.1.3]# ./checksetup.pl Checking perl modules... Checking available perl DBD modules... The following Perl modules are optional: * NOTE: You must run any commands listed below as root. ********************************************************************** *********************************************************************** GD: /usr/bin/perl install-module.pl GD To attempt an automatic install of every required and optional module /usr/bin/perl install-module.pl --all Reading ./localconfig... OPTIONAL NOTE: If you want to be able to use the 'difference between two http://cyberelk.net/tim/patchutils/ Checking for DBD-mysql (v4.00) ok: found v4.006 Undefined subroutine &DBD::mysql::db::_login called at lib/i386-linux-thread-multi/DBD/mysql.pm line 142, <DATA> line 228. This might have several reasons: * MySQL is not running.
#cp /DBD-mysql-4.006/blib/arch/auto/DBD/mysql/mysql.so /bugzilla-3.1.3/lib/i386-linux-thread-multi/auto/DBD/mysql/mysql.so
March 28 安装DBD::mysql的错误解决在安装Bugzilla过程中遇到一些关于Perl方面的问题,总结了一些经验如下: ===================
=============== Solution =============== 由于DBD::mysql的安装需要基于Mysql的安装,所以需要确保mysql_config中的show的路径都能在系统中找到。如果是tar.gz编译安装的mysql需要记住--prefix的路径;如果是RPM安装的话需要确认是否安装了mysql,mysql-server,mysql-devel,因为它们都会在DBD::mysql的安装中用到。
=============== Example =============== [root@localhost DBD-mysql-4.006]# perl Makefile.PL cflags (mysql_config) = -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv To change these settings, see 'perl Makefile.PL --help' and Using DBI 1.52 (for perl 5.008008 on i386-linux-thread-multi) installed in /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/DBI/
[root@localhost DBD-mysql-4.006]# make test
|
|
||||
|
|