2005年06月04日

“千点论”终于成为了现实。昨天,沪深股市再创新低,其中,沪综指在盘中连续两次摸至千点大关。
  随着第二批试点即将进行,由于市场以及股票仍需有重新估值的过程,在中期价值投资不明朗之时,市场选择不断弱势下跌成为必然。1000点作为上证综指重要的整数关口,其心理意义远远大于技术意义,在1300点被有效击穿后,1000点的心理支撑可以说是最为强劲。不过,近几日下跌时的明显放量不仅显示有恐慌盘在大量涌出,同时也直接导致了一批前期已经企稳的个股再度破位,如这种局面不能得到有效扭转,1000点将很快被跌破。
  在股指连续下挫至千点之际,一些理念和框架已被打破,这个市场如果靠市场自身的力量已经很难改变目前的低迷运行状况。从起点又回到了起点,短短的几年间,中国的股市经历了一个轮回。从6年前的疯狂到步入理性的回归,再到现如今的迷茫、恐惧……漫漫熊市不尽,何时是头?中国股市怎么了,难道真的会“推倒重来”吗?
——-from 北京青年报


跌的越多越好!,让前几年在股市赚了很多钱的炒家全部破产!中国的股市本来就是黑暗的,或者说变态的,根本不符合游戏规则,而很多人恰恰利用了这种不健康,不透明的环境,大捞不义之财!现在到了偿还代价的时候了!实际上这个社会还是靠实力来维持正常的秩序的,靠炒作和玩概念来积累财富,最终会死的很惨!当然了楼市也是同样的道理!

2005年06月03日

中间件(middleware)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。

 我们知道计算机系统最初阶段多是单机系统,多个用户是通过联机终端来访问。随着网络的出现,产生了客户/服务器的计算服务模式,多个客户端可以共享数据库服务器和打印服务器等。随着计算机和网络技术的飞速发展,许多软件需要在不同厂家的硬件平台、网络协议异构环境下运行,应用的规模从局域网发展到广域网,应用范围面向三层和多层体系结构的分布式环境,在分布式环境中,无论是硬件平台还是软件平台都不可能做到统一,而大规模的应用软件通常要求在软硬件各不相同的分布式网络上运行。应用软件直接使用操作系统、网络协议和数据库等开发,开发者不得不直接面对许多复杂棘手的问题,如操作系统的多样性、繁杂的网络程序设计和管理、复杂多变的网络环境、数据分散处理带来的不一致性问题等等,这些与用户的业务没有直接关系,但又必须解决,耗费了大量的时间和精力,因此开发者迫切需要一种基于标准的、独立于计算机硬件以及操作系统的开发和运行环境,于是,有人提出能不能将应用软件所要面临的共性问题进行提炼、抽象,在操作系统之上再形成一个可复用的部分,供成千上万的应用软件重复使用。这一技术思想最终构成了中间件这类的软件。

 在众多关于中间件的定义中,比较普遍接受的是IDC表述:中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源;中间件位于客户机/服务器的操作系统之上,管理计算资源和网络通信。IDC对中间件的定义表明,中间件是一类软件,而非一种软件;中间件不仅仅实现互连,还要实现应用之间的互操作;中间件是基于分布式处理的软件,最突出的特点是其网络通信功能.主要的作用是建立分布式软件模块之间互操作的机制,屏蔽底层分布式环境的复杂性和异构性,为处于自己上层的应用软件提供运行与开发环境,帮助用户灵活、高效地开发和集成复杂的应用软件。在具体实现上,中间件是一个用应用程序接口定义的分布式软件管理框架,具有强大的通信能力和良好的可扩展性。

根据中间件提供的功能与服务的不同,人们把中间件划分成了很多不同的类别。 广义上可以分为数据访问中间件、远程过程调用中间件、消息中间件、交易中间件、对象中间件等.比较通用的中间件分类是:

1) 终端仿真/屏幕转换

    用以实现客户机图形用户接口与已有的字符接口方式的服务器应用程序之间的互操作。

2) 数据访问中间件

    适用于应用程序与数据源之间的互操作模型,客户端使用面向数据库的API,以提请直接访问和更新基于服务器的数据源,数据源可以是关系型、非关系型和对象型。这类中间件大都基于SQL语句,采用同步通讯方式。此类中间件使应用开发简单化,但如果透过广域网使用,则会带来严重的效率问题,因为在低速网上来回交互SQL语句会使通讯流量过大,同时对数据压缩、加密带来不便。

3) 远程过程调用中间件

    RPC机制是早期开发分布式应用时经常采用的一种同步式的请求应答协议。通过这种协议,程序员编写客户方的应用,需要时可以调用位于远端服务器上的过程。RPC扩展了过程语言中的“功能调用/结果返回”的机制,使得它可以适用于一个远程环境。由于RPC机制是同步方式,因而在工作的时候,要求客户方和服务方均能正确工作才能很好地运行,有一方不能工作将导致RPC失败。在网络故障、机器故障存在的情况下,这一要求是很难保证的。另外,由于大多数 RPC机制很难建立点到点的关系,因而也很难用在面向对象的编程当中。

4) 消息中间件

    越来越多的分布式应用采用消息中间件来构建,通过消息中间件把应用扩展到不同的操作系统和不同的网络环境。基于消息的机制更多地适用于事件驱动的应用,当一个事件发生时,消息中间件通知服务方应该进行何种操作。其核心安装在需要进行消息传递的系统上,在它们之间建立逻辑通道,由消息中间件实现消息发送。消息中间件可以支持同步方式和异步方式,实际上是一种点到点的机制,因而可以很好的适用于面向对象的编程方式。中间件领域目前最热门的技术是异步的消息中间件,异步中间件技术比同步中间件技术具有更强的容错性,在系统故障时可以保证消息的正常传输。

5) 交易中间件

    是专门针对联机交易处理系统而设计的,如银行业务系统、定票系统等。联机交易处理系统需要处理大量并发进程,处理并发涉及到操作系统、文件系统、编程语言、数据通讯、数据库系统、系统管理、应用软件,交易中间件就是一组程序模块,用以减少开发一个联机交易处理系统所需的编程量。

6) 对象中间件

    传统的面向对象技术通过封装、继承及多态提供了良好的代码重用功能,但是这些对象只存在一个程序中,外面的世界并不知道它们的存在,也无法访问它们。面向对象的中间件就是要解决这些问题,面向对象的中间件提供一个标准的构件框架,能使不同厂家的软件通过不同的地址空间、网络和操作系统交互访问。该构件的具体实现、位置及所依附的操作系统对客户来说都是透明的。

    考察当前主流的分布计算技术平台,主要有OMG的CORBA,Sun的J2EE和Microsoft DNA 20000,它们都是支持服务器端中间件技术开发的平台,但都有其各自特点,将分别阐述如下:

OMG的CORBA

    公共对象请求代理体系结构(CORBA,Common Ob—ject Request Broker Architecture)是对象管理组织(OMG)基于众多开放系统平台厂商提交的分布对象互操作内容基础上制定的分布式应用程序框架的规范。

    CORBA是由绝大多数分布计算平台厂商所支持和遵循的系统规范,具有模型完整、先进,独立于系统平台和开发语言,被支持程度广泛的特点,已逐渐成为分布计算技术的标准。COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理(ORB, Object Request Broker),规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的“软总线”;在 ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。CORBA的优点是大而全,互操作性和开放性非常好,缺点是庞大而复杂,并且技术和标准的更新相对较慢,在具体的应用中使用不是很多。

Sun的J2EE

为了推动基于Java的服务器端应用开发,Sun在1999年底推出了Java2技术及相关的J2EE规范。

    J2EE的目标是提供与平台无关的、可移植的、支持并发访问和安全的、完全基于Java的开发服务器端中间件的标准。J2EE简化了构件可伸缩的、基于构件服务器端应用的复杂度。在J2EE中,Sun给出了完整的基于Java语言开发面向企业分布应用的规范,其中在分布式互操作协议上,J2EE 同时支持远程方法调用(RMI,Re—mote Method lnvocation)和因特网对象请求代理间协议(IlOP, Intemet Inter-ORB Protocal),在服务器端分布式应用的构造形式包括了Java Scrvlct、JSP (Java ServerPage)、EJB等多种形式,以支持不同的业务需求。

    EJB是Sun推出的基于Java的服务器端构件规范J2EE的一部分,在J2EE推出之后得到了广泛的发展,已经成为应用服务器端的标准技术。 Sun EJB技术是在Java Bean本地构件基础上,发展的面向服务器端分布应用构件技术。它基于Java语言,提供了基于Java二进制字节代码的重用方式。EJB给出了系统的服务器端分布构件规范,这包括了构件、构件容器的接口规范以及构件打包、构件配置等的标准规范内容。EJB技术的推出,使得用Java基于构件方法开发服务器端分布式应用成为可能。从企业应用多层结构的角度,EJB是业务逻辑层的中间件技术,与JavaBeans不同,它提供了事务处理的能力,自从三层结构提出以后,中间层,也就是业务逻辑层,是处理事务的核心,从数据存储层分离,取代了存储层的大部分地位。从分布式计算的角度,EJB像CORBA一样,提供了分布式技术的基础,提供了对象之间的通讯手段。

    从Internet技术应用的角度,EJB和Servlct,JSP一起成为新一代应用服务器的技术标准,EJB中的Bean可以分为会话 Bean和实体Bean,前者维护会话,后者处理事务,现在Scrvlet负责与客户端通信,访问EJB,并把结果通过JSP产生页面传回客户端。

    J2EE的优点是技术先进,架构优秀,真正的三层结构,用Java开发构件,能够做到“Write once,run any—where”,开发大型的应用优势明显,可以配置到包括Windows平台在内的任何服务器端环境中去。缺点是缺少一系列的接口支持,技术进入门槛高,开发起来的难度大。

Microsoft DNA 2000

    Microsoft DNA 2000是Microsoft在推出 Windows2000系列操作系统平台基础上,在扩展了分布计算模型以及改造Back Office系列服务器端分布计算产品后发布的新的分布计算体系结构和规范。

    在服务器端,DNA 2000提供了ASP、COM、Cluster等的应用支持。目前,DNA2000在技术结构上有着巨大的优越性。一方面,由于Microsoft是操作系统平台厂商,因此DNA 2000技术得到了底层操作系统平台的强大支持;另一方面,由于Microsoft的操作系统平台应用广泛,因此在实际应用中,DNA 2000得到了众多应用开发商的采用和支持。

    DNA 2000融合了当今最先进的分布计算理论和思想,如事务处理、可伸缩性、异步消息队列、集群等内容。DNA使得开发可以基于Microsoft平台的服务器构件应用,其中,如数据库事务服务、异步通讯服务和安全服务等,都由底层的分布对象系统提供。

    以Microsoft为首的DCOM/COM/COM+阵营,从DDE,OLE到ActiveX等,提供了中间件开发的基础,如VC,VB, Delphi等都支持DCOM,包括OLE DB在内新的数据库存取技术,随着Windows2000的发布,Microsoft的 DCOM/COM/COM+技术,在DNA2000分布计算结构基础上,展现了一个全新的分布构件应用模型。首先,DCOM/COM/COM+的构件仍然采用普通的COM(ComponentObject Model)模型。COM最初作为Microsoft桌面系统的构件技术,主要为本地的OLE应用服务,但是随着Mi-crosoft服务器操作系统NT和DCOM的发布,COM通过底层的远程支持使得构件技术延伸到了分布应用领域。 DCOM/COM/COM+更将其扩充为面向服务器端分布应用的业务逻辑中间件。通过COM+的相关服务设施,如负载均衡、内存数据库、对象池、构件管理与配置等等,DCOM/COM/COM+将COM、DCOM、MTS的功能有机地统一在一起,形成了一个概念、功能强的构件应用体系结构。而且, DNA2000是单一厂家提供的分布对象构件模型,开发者使用的是同一厂家提供的系列开发工具,这比组合多家开发工具更有吸引力,不足是依赖于Mi- crosoft的操作系统平台,因而在其它开发系统平台如(Unix、Linux)上不能发挥作用。

    中间件的发展趋势

网格技术

    中间件技术当前所面临的重大挑战是要在互联网这个复杂的分布式系统中构建应用程序。许多计算机专家认为,将整个互联网的各种资源全部整合在一起,为用户提供统一的服务,是相当困难甚至难以实现的。当然,对于具体的应用领域,具体的网络区域,用中间件技术将其中的各种资源整合在一起还是相当有前景的。目前方兴未艾的网格(GRID)技术实质上即是一个基于互联网的中间件系统,可同时运用网络中所有的CPU、存储器、操作系统、应用软件等资源,用户通过PC、手机或PDA,可从互联网上获取来自全球的资源,互联网将变成一个虚拟的、强大的计算平台。网格的重要特征是对资源的共享和管理,包括:(1) 计算资源。启动程序,监测、控制进程运行;对分配给进程的资源的管理机制;查询功能,确定硬、软件状态、相关负载信息和队列状态等。(2)存储资源。上载、下载文件;对分配给数据传输的资源(空间、磁盘带宽、网络带宽、CPU)的管理机制,确定可用空间、带宽使用率等相关负载信息。(3)网络资源。提供控制分配给网络传输的资源的管理机制;查询网络状态和负载的功能。(4)代码库。管理源码和目标码的机制。另外,网格系统还应包括:①网格特有事务所需要的通信和认证协议,通信协议允许资源之间交换数据,功能包括传输、寻径和名字服务。建立在通信协议之上的认证协议为确认用户和资源的身份提供加密安全机制。②管理一组相关联的资源集合,并负责资源集合之间的交互,包括:目录服务、合作分配资源任务调度服务、监控诊断服务、数据复制服务、支持网格的编程、软件发现服务、团体授权服务等。

面向移动计算

    移动计算问题可以具体展开为三个方面:①用户移动。无论用户处在什么位置,都能为其提供一致的工作环境,包括用户的配置信息和他所“订阅”的服务。②终端移动。使终端设备无论在任何接入点接入网络,都能正常工作,也就是说底层网络对终端设备是透明的。③服务移动。当前,越来越多的服务依赖于移动的资源,甚至服务本身就处在不断移动中,必须保证用户及其终端设备可以随时找到这些服务。据此,移动计算需要一个基础设施将合适的协议、机制、工具集成起来,提供上述三方面的功能。移动中间件正是这样一种基础软件。它随时对移动用户和终端进行跟踪和重定位,保证移动实体的相互通信,克服系统的异构性,并且为开放的网络环境提供安全性。随着网络带宽不断增大,人们对移动设备的服务质量问题的顾虑渐渐打消,而使用移动设备的方便性日益突出。人们要求各种服务都可以在移动的情况下(包括上述三种情况)获得。因而移动中间件具有十分广泛的发展前景。泛化计算(Ubiquitous Computing)是移动计算的极至,指从大型机、PC、到PDA以至安装有处理器的各种各样的日常生活设备之间能够相互通信、协调工作。显然,在这个领域,中间件面临更为复杂的异构环境以及无线通信和动态配置的挑战。

面向服务质量

    传统的单一系统,如大型主机、容错系统等,依赖昂贵的配置与设计来实现高可用性,而高可用中间件主要是在软件层面利用系统的冗余部件(比如机群系统有大量这样的部件)为用户提供高可用功能。这有三个方面的优势:成本低、可扩展性好、更加灵活方便。为了保证数据的可靠性和一致性,还有必要在中间件中增加保证QOS的协议(在CORBA中已经有这样的协议)以实现数据的备份以及各种各样的容错功能。另外,还要保证此方法的响应时间尽可能的快(这里泛指用户响应时间以及切换时间等一切影响服务质量的时间)。随着网络技术的发展,越来越多的用户使用网络提供的服务,这就对服务质量提出了更高的要求,质量低劣的服务是没有市场的。高可用中间件、容错中间件在这一背景下将不断完善和发展。

各种技术的发展对中间件技术产生的影响

    由于中间件系统的主要目的就是整合各种异构系统中的资源,使其协调工作。因此,各种异构系统中各种技术的发展都会或者为中间件系统的开发提供便利,或者设置障碍。Web Service技术就是在XML语言、异步通信机制、以及基于内容的消息传递机制等各种技术发展基础之上提出并发展起来的。又例如,当前移动代理(Mobile Agent)技术在中间件的设计和实现过程中发挥越来越重要的作用,特别是基于互联网的应用以及涉及到移动计算和泛化计算的中间件的设计。移动代码和移动代理技术可以提高分布式系统的灵活性和适应性。

    中间件从本质上是对分布式应用的抽象,抛开了与应用相关的业务逻辑的细节,保留了典型的分布交互模式的关键特征,将纷繁复杂的分布式系统以统一的层面形式呈现给应用。应用在中间件提供的环境中可以更好地集中于业务逻辑上,并以构件化的形式存在,最终自然而然地在异构环境中实现良好的协同工作。构件是一种前沿的软件设计思想,对整个软件行业的发展有着至关重要的推动作用。而中间件作为应用软件系统集成的关键技术,保证了构件化思想的实施,并为构件提供了真正的运行空间。中间件工业化标准的制定、统一及实现,使基于构件的应用开发成为可能,可以预见,软构件技术是软件产业化革命的必然发展趋势。

 
摘要:通常32位ARM嵌入式系统的中断向量表是在程序编译前设置好的,每次编写中断程序都要改C程序的汇编启动代码,相当繁琐。本文给出一种配置ARM 中断向量表新方法。该方法比通常方法仅增加一条指令执行时间,简便高效,功能完备,向量表在运行时动态生成,C程序可以使用固定向量表的启动代码,并可隐藏起来。
    关键词:动态配置 嵌入式系统 ARM 中断向量表

    一般32位ARM嵌入式系统的中断向量表是程序编译前设置好的。在编写32位ARM嵌入式系统的中断服务程序、设置和修改ARM体系结构的中断向量表时,常感到相当麻烦,不得不修改汇编代码,对不喜欢使用汇编代码编程的程序员尤其如此。当需要在程序运行过程中动态修改中断向量的程序时会感到更为不便,不得不增加很多分支处理指令才能实现。为此本文提出一种简便高效的配置方法,实现了ROM固化程序在运行时动态配置ARM嵌入式系统中断向量表的功能。

1 ARM中断向量两种设置方法

    在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中断服务例程的功能。例如:

IRQEntry B HandleIRQ ;跳转范围较小

B HandleFIQ

或IRQEntry LDR PC,=HandleIRQ ;跳转的范围是任意32位地址空间

LDR PC,=HandleFIQ

    LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令附近的存储单元中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。

    之所以使用LDR伪指令,是因为ARM的RISC指令为单字指令,不能装载32位的立即数(常数),无法直接把一个32位常数数据或地址数据装载到寄存器中。下面一般程序与上述伪指令功能等效,但中断向量表描述得更为清晰。其中VectorTable为相对LDR指令的偏移量:

IRQEntry LDR PC,VectorTable+0

;与LDR PC,=HandleIRQ等效

LDR PC,VectorTable+4

;与LDR PC,=HandleFIQ等效

……

VectorTable DCD HandleTRQ

DCD HandleFIQ

……

HandleIRQ

……

HandleFIQ

    一般ARM嵌入式系统的程序都是固化在从00000000H开始的低端ROM空间中,中断向量表VectorTable也是固化在ROM中,所以上述两种方法都无法在程序运行时动态随机修改中断向量表。不论对于初学ARM处理器的程序员还是有经验的程序员,设置中断向量都相当繁琐,必须修改ARM 的C程序的启动代码。一段晦涩的汇编代码很不方便,比较容易出错。

2 X86与ARM处理器中断向量表比较

    实模式X86程序员都熟悉,在X86体系结构的PC系统中,不论是用汇编还是用C语言,都可以动态随机地设置、修改中断向量表—只需要简单地把中断程序例程的入口地址写入到中断向量表数据区,即可完成向量表的设置。

    X86向量表设置方便的原因有两个。其一是中断向量表与程序代码完全分离,中断向量表设置在RAM数据空间,向量表存放的数据是纯粹地址数据;而在ARM向量表中存放的是与中断服务例程入口有关的一条分支指令。另一个原因是,除BIOS外,大多数PC程序都是在运行时加载到RAM中的,程序数据是不加区别的,所以可以很容易在程序运行的过程中从数据生成程序,并可以很容易把CPU控制权转到新生成的程序中。

    表面上看,在ARM第二种中断向量设置方法的向量表VectorTable中也是纯地址数据,不含指令代码,似乎可以把VectorTable设置在RAM数据段中。然而一般ARM体系的ROM代码段和RAM数据段间的偏移远大于2 12,故超出了LDR使用PC为基址的相对寻址范围。

    代码中的VectorTable是一个与当前PC间的一个偏移,LDR指令的相对地址是在编译时计算的,要求VectorTable< 2 12,所以VectorTable不能随意安排在RAM空间中。VectorTable一般只能安排在中断跳转指令附近的代码区内中。

3 ARM结构中中断向量表的动态配置方法

    要在ARM结构中实现与X86中一样方便的在中断向量的随机存取功能,向量表的地址数据必须可以安排在任意32位地址的RAM空间中。为此,中断处理必须增加一条指令,先跳转到向量表,然后执行向量表中动态生成的跳转指令,跳转到中断服务程序,参见下列初始化代码:

;******向量表******

ENTRY

B ResetHandle ;原向量偏移 ,中断号

B ReseHandle ;0×00 ,00

LDR PC,=NewVectorTable+0×08 ;0×04,未定义 ,01

LDR PC,=NeWVector Table+0×10 ;0×08,SWI,02

LDR PC,=NewVectorTable+0×18 ;0×0c,未定义 ,03

LDR PC,=NewVectorTable+0×20 ;0×10,未定义 ,04

LDR PC,=NewVectorTable+0×28;0×14,未定义 0,05

LDR PC,=NewVectorTable+0×30 ;0×18,IRQ ;06

LDR PC,=NewVectorTable+0×38 ;0×1c,FIQ ,07

……

;******代码段******

ResetHandle

……

;***数据段,为NewVectorTable分配数据空间***

NewVectorTable # 128;大小根据需要定义,每向量2个字(8字节);

    程序运行时,中断服务的初始化 程序必须设置好新的中断向量表,即在NewVectorTable表中动态生成下列指令:

NewVectorTable;表安排在RAM顶端0×0c1fff00处(由硬件设定)

LDR PC,[PC,#4];指令代码为0xe51ff004,功能为PC〈-[PC+4]

nVt00 DCD ISR_RESET_HANDLE

LDR PC,[PC,#4];与LDR PC,nVt01指令等效

nVt01 DCD ISR_UNDEF_HANDLE

LDR PC,[PC,#4]

nVt02 DCD ISR_SWI_HANDLE

LDR pC,[PC,#4]

nVt03 DCD ISR_UNDEF_HANDLE

LDR PC,[PC,#4]

nVt04 DCD ISR_UNDEF_HANDLE

LDR PC,[PC,#4]

nVt05 DCD ISR_UNDEF_HANDLE

LDR PC,[PC,#4]

NVt06 DCD ISR_IRQ_HANDLE

LDR PC,[PC,#4]

nVt07 DCD ISR_FIQ_HANDLE

……

可用C函数在NweVectorTable中生成含上述指令的向量表,具体实现如下:

#define VECTOR_TABLE 0×0c1fff00

//向量表首地址,根据实际硬件来配置

#define INSTRUCTION_LDR_PC 0xe51ff004

//加载PC寄存器的指令码

//设置向量C函数,ISR_Handle中断服务程序地址

void SetVector(unsigned char no,unsigned long int ISR_Handle){

unsigned long int * pVectorTable;

//定义32位无符号数指令,指向向量表

pVectorTable=((unsigned long int *)(VECTOR_TABLE+(no<<3)));

*pVectorTable++=INSTRUCTION_LDR_PC;

//在向量表中放置LDR PC,[PC,#4]指令

*pVectorTable=ISR_Handle;//设置中断服务例程入口地址

}

//读取向量C函数,no代表中断号

unsigned long int GetVector(unsigned char no){

unsigned long int *pVectorTable;

pVectorTable=((unsigned long int *)(VECTOR_TABLE+(no<<3)));

return *(++pVectorTable);//返回中断处理程序入口地址

}

    使用上述初始化代码和向量设置函数,除复位向量外,其它所有中断向量都可以指向了在RAM数据区中的新向量表,并给定一个统一的中断编号。中断服务程序可以放在任何模块文件中编译连接,不需要修改原向量表代码,但在打开中断使用中断服务例程前必须使用C函数SetVector()设置中断向量。

4 结论

    本文提出的中断向量表配置策略和实现方法,简便高效,仅比标准处理方法增加一条指令的执行时间。当把ARM的C初始化汇编代码中所有中断源(包括扩展的内外部中断源)的向量都指向了新向量表,并统一编号,此后编写任何中断服务程序几乎不需要修改汇编代码,C初始化代码完全可以对C程序员隐藏起来,并可以像在X86体系下一样动态地设置和修改中断向量。

 
xScale应用程序性能的优化策略

摘要:XScale是一款具有高性能、低功耗特性的ARM兼容嵌入式微处理器架构。XScale引入了多种硬件特性提高其处理能力,但也给应用程序的优化带来了困难。本文介绍XScale体系结构的特点,从开发工具选择、系统设计和编程开发等多个角度讨论对XScale应用程序进行优化的策略和技术。

    关键词:XScale 编译优化 优化策略ARM

引言

    XScale体系结构是采用Intel Pentium技术实现的ARM兼容的嵌入式微处理器架构,并对ARM体系结构进行了增强,具有业界领先的高性能和低功耗特性被广泛应用于消费电子、无线通信、多媒体和网络交换等嵌入式应用领域。XScale引入了一系列高性能微处理器的设计技术,总体性能显著地超出同主频的ARM微处理器。然而,由于受功耗、成本和体积等因素的制约,嵌入式微处理器的处理能力与桌面系统相比仍存在较大差距。通常需要对嵌入式应用程序进行性能优化,以满足嵌入式应用的性能需求。

    业界对嵌入式系统的性能优化进行了很多研究与实践。文献为XScale优化编译器的设计提供了多种优化技术,也可用于一些应用程序的手工优化;文献从应用程序编程的角度讨论了ARM嵌入式系统软件设计优化技术;文献讨论了提高C/C++嵌入式应用程序性能的一些技巧,其中多数技术可以由优化编译器中实现。

    本文在总结XScale优化编译器设计和XScale嵌入式系统设计开发工作的基础上,从系统设计、开发工具选择、编译优化和编程开发等角度讨论和提出了XScale应用程序的优化策略和技术。

1 XScale体系结构

    XScale微架构引入了Pentium处理器工艺和系统结构技术,实现了Pentium微处理器体系结构的一系列高性能技术,达到了高性能、低功耗和小体积等嵌入式系统要求的特性。

(1)超流水线

    Xscale的超流水线(SuperPipeline)技术,如图1所示,由整数处理(integer)、乘加(MAC)和存储(memory)3条流水线组成。3条流水线的长度是6到9段,前4到5段共享,后面分支部分并行工作可有效提高处理器性能。

(2)高主频

    采用Pentium工艺技术,XScale主频可以超出普通ARM微处理器主频数倍,在保持较低能量消耗的前提下,高达600MHz以上。如PXA27X的主频可高达724MHz。

(3)存储体系

    XScale实现了一个高效的存储器体系结构,为其超流水线的高效运行提供数据资源。XScale存储体系功能主要包括32KB D- Cache、32KB I-Cache、2KB Mini Dcache、Fill Buffers、ending Buffers以及4.8GB/s带宽的存储总线,使处理器可以高效访问存储器。

(4)分支预测

    XScale实现了基于统计分析的分支预测功能部件,减少由于分支转移冲刷指令流水线的次数,也有效地提高了处理器的性能。

(3)指令集体系结构

    针对ARM数据处理能力的不足,XScale对ARM的乘加逻辑进行了增强,增加了8条DSP指令。XScale处理器还可集成Flash闪存和无线MMX逻辑功能。这些特性有效地提高了XScale数据处理能力。带有无线MMX的PXA27X在312MHz主频运行处理多媒体应用时,其性能与 520MHz ARM处理器相当。

(6)省去不常用的逻辑功能

    为了节省处理器芯片体积和降低运行功耗,XScale体系结构没有实现昂贵的浮点运算部件和除法部件。这些是嵌入式应用中不常用的运算。当需要这类运算时,可以通过软件方法实现。

    XScale复杂的体系结构给嵌入式应用程序的优化带来了更大的困难。

2 性能优化技术

    XScale处理器性能的发挥很大程度上依赖于应用程序的优化技术。XScale嵌入式应用系统的性能优化可以下几个方面考虑。

2.1 算法结构优化

    实现某种应用功能通常可采用多种算法或方法,不同算法的复杂度和效率差别很大。选择一种高效的算法或对算法进行优化,可以使应用程序获得最大的优化性能。常用的优化技术有以下几种。

(1)选择高效算法

    如果算法效率低下,再快的处理器也会显得不够有,而一个高效的算法却可以弥补处理器性能的不足。

    考虑从已排序好的n个元素a[0:n-1]中找出某一特定元素x。如果采用顺序搜索方式,从a[0]到a[n-1]逐个比较这n个元素,需要O (n)次比较。而如果采用二分搜索方法,则仅需O(logn)次比较。当n为2 31时,前一算法平均需要比较2 31次,后一算法平均仅需比较31次。两者所需时间相差达10 8倍。

(2)递归算法非递归化

    采用递归过程实现算法具有结构清晰、程序简练易读、正确性容易证明的特点;但递归算法通常需要执行大量的过程调用,并在堆栈中保存所有返回过程的局部变量,效率往往较低。当应用程序存在性能问题时,使用循不迭代方法将递归算法转换成非递归算法往往可以使程序性能提高数倍。文献对八皇后问题和 Fibonacci数列的递归算法与非递归算法进行了性能比较试验,结果如表1所列。

表1 递归算法和非递归算法的性能对比

     算法优化是首选的优化技术。

2.2 编译优化

    随着编译技术的成熟,很多编译器都实现了较强的代码优化功能,可在编译过程中自动对应用程序进行优化,改进一些不合理的结构,生成效率较高的目标代码。

    多数编译器都可基于数据流分析实现别名分析、常数拆叠、常数传播、公共子表达式消除、冗余代码和死码删除、循环不变量的移动、循环逆转、循环展开、函数嵌入等与体系结构无关的优化。

    GNU gcc、WindRiverdiab、Intl XScale Compiler等常见编译器都针对XScale体系结构进行了优化设计,可以有效地利用XScale/ARM指令的条件执行、条件设置和操作数移位等功能,使一条指令完成多个操作,缩短指令序列的长度;减少跳转指令的数目,减少冲刷流水线的次数;按照XScale超流水线要求,利用3地址指令、多字传送指令、DSP乘加指令和MMX指令等,生成高效的指令序列,提高应用程序的性能。

    一些优化编译器可借用并行程序设计技术,进行相关性分析,获得源程序的语义信息,采用软件流水线、数据规划、循环重构等技术,使应用程序呈现更好的局部性,提高Cache命中率,从而提高计算密集型应用程序的性能。对于矩阵计算等计算密集型程序,一些高性能优化编译器生成的代码可以高出普通编译器产生的代码十倍之多。

    应用程序开发过程中应该充分利用编译器的代码优化功能,在编码时将主要精力集中在业务逻辑算法流程的设计上,提高编程效率和代码可读性。

2.3 编程优化

    编译优化是静态优化。优化编译器可以自动完成程序段和代码块范围内的优化问题,但编译器很难获取程序语义信息、算法流程和程序运行状态信息。很多情况下也需要编译人员以某种方式将程序运行状态信息传递给编译器,或进行手工优化。以下是常用的编译优化技术。

(1)使用inline函数

    多数编译器支持inline关键字。如果一个函数被设计成一个inline函数,那么在调用它们的地方将会用函数体来替代函数调用语句,这样将会彻底省去函数调用的开销。使用inline的最大缺点是函数在被多处调用时,代码量将增大。

(2)减少函数调用参数

    根据ARM过程调用规范,4个以下的形参通过寄存器传递,第5个以上的形参通过存储器栈传递。显然,通过存储器栈传送参数的开销较大。函数调用形参限制在4个以内,可以降低函数调用的开销。

(3)在Switch是一种使用普通的编程技术。编译器为之产生if-else-if嵌套代码,并按照顺序进行比较,发现匹配则跳到满足条件的语句执行。编程时,根据发生的相对频率排序,将最可能发生的情况放在第一位,最不可能的情况放在最后一位,可以提高Switch语句块的执行速度。

    实际上,程序中if条件的处理也有类似的特性。

(4)避免使用C++的昂贵功耗

    C++在支持软件工程、面向对象程序设计、结构化对C进行卓有成效的改进,但在代码尺寸、执行速度等方面比C语言差一些。C++的类机制与C语言的结构差别不大,但C++的多重继承、虚拟基类、模板和运行类型识别等特性对代码尺寸和运行效率有负面影响。对这些功能要慎重使用,可以通过试验测试其影响的大小。

(5)减少或避免执行耗时的操作

    应用程序的主要执行时间通常花费在关键路径代码段或程序模块,关键路径程序模块往往包含循环或嵌套循环。减少循环或内层循环中昂贵操作的执行频率可以显著地提高应用程序的效率。常见的耗时操作有:I/O操作、文件访问、图形界面操作和系统调用等。

表2列出了XScale常见的I/O处理、系统调用和文件访问等昂贵操作的代价。

表2 XScale常见最昂贵操作的代码

    对于文件访问等操作,每次读入和写出一个较大的数据块,或使用内存映射技术访问文件,可以减少相关系统调用执行的次数,从而提高程序执行的性能。下面是一个使用这种优化技术的示例。

优化前代码:

int data_in,int data_out;

int file_in,file_out;

for(;;){

read(file_in,data_in,1);

data_out=decode(&data_in);

write(file_out,&data_out,1);

}

优化后代码:

int data_in[1024],

int data_out[1024];

int file_in,file_out;

for(;;){

read(file_in,data_in,1024);

}

(6)用查表代替计算

    在处理器资源紧张和存储器资源相对富余的情况下,可以用牺牲存储空间换取速度的方法。例如需要频繁计算正弦和余弦等函数数值时,可预先将函数值计算出来,置于内存,供以后查找。

2.4 高性能开发工具

    应用程序的可执行代码通常由编译器编译产生的目标代码和链接程序从系统库提取的库例程两部分组成。

    选择一种优化能力强的编译器和开发工具可以生成更加高效的代码。WindRiver Diab、GNU gcc、GNUpro和Intel XScale Compiler都针对XScale体系结构进行了优化。

    嵌入式应用程序通常包含大量的系统函数调用。在XScale平台上的测试结果表明:MediaBench的应用程序大约有50%的执行时间花费在系统库函数,选用高效的系统运行库(runtime library)也可使应用程序的运行效率获得提升。如glibc库的缓冲区的大小是newlib的数十倍,所以在处理输入输出操作方面具有更高的效率。

2.5 特定于XScale体系结构的优化

(1)避免除法

    XScale没有除法部件和整数除法指令,除法是由软件实现的。软件实现的除法效率很低,应该尽可能避免除法和计算余数等运算。有时可以将除法转变为乘法。下面两侧是除法操作优化的示例。

①用关系运算符两边乘除数消除除法操作

优化前:if((x/y)>z)

优化后:if(x>(y*z))

②将除法转换为乘常数和移位操作

优化前:v.x=(v1.x+v2.x+v3.x)/3

优化后:使用常数乘数0×5555转换成

v.x=(int)(((_int64)(v1.x+v2.x+v3.x)*

(_int64)0×55555)>>16);

(2)避免浮点运算

    XScale没有实现浮点部件。浮点运算是通过系统库实现的,代价很高,通常也应该避免,有时可以转换成整数运算。包含浮点运算的库例程有格式化输入输出(scanf/printf)等。XScale中常见浮点运算的代价如表3所列。

表3 XScale常见浮点运算的代价

(3)使用GPP和IPP库

    XScale的很多硬件特性是针对多媒体嵌入式应用的特点而设计的,很难在编译器中支持这些特性。为此,Intel公司对多媒体处理、图形处理和数值运算的一些典型操作和算法进行了手工优化,设计成程序库,分别称为GPP/IPP库。这些库例程可以很好地发挥XScale硬件的计算潜能,达到很高的执行效率。用IPP库实现除法和平方根的性能如图2所示。

    由图2可以看出,使用IPP/GPP库使相关操作的性能获得大幅提升。

3 性能优化策略

    应用程序的性能优化与缩短开发周期、软件工程和OOP的目标之间通常存在矛质。嵌入式系统需要性能优,但性能优化需要人力物力投入,会增加开发时间,降低程序的可读性,排斥使用新的开发工具和编程语言。而软件工程的目标是使用高效的开发工具。编程语言和编程规范提高程序的可读性、可靠性,缩短开发周期,降低项目成本。为此应该在二者之间寻找一种平衡。通常可以采取以下策略和原则;

①将算法结构优化作为首选优化技术,设计高效的应用程序流程和算法;

②根据功能、性能差异和投资预算选择高效的编译器、系统运行库、图形库、中间件等;

③使用性能监测工具识别占主要执行时间的关键路径程序模块,采用一切优化手段对关键路径代码和程序模块进行优化,挖掘应用程序性能;

④非关键路径的流程控制代码按照软件工程的要求,采用高效率程序语言和开发工具实现,提高设计开发效率。使用编译器进行优化。

结语

    XScale体系结构按照嵌入式应用的要求,采用Pentium系列微处理器设计技术和工艺设计的一款性能突出的ARM兼容嵌入式微处理器。 XScale体系结构引入了多种硬件特性增强处理器的性能,但也给应用程序优化带来了挑战。发挥XScale体系结构的性能,需要操作系统、编译器、运行库、连接程序和装载程序等各层系统软件的支持,需要在嵌入式项目的系统规范、开发工具选型、系统设计和编码等多个阶段考虑对应用程序进行优化。
 

几天以来一直在思索程序员的未来,或者说自己的未来,现在终于理出了头绪!知道自己下一步该如何行动了,我想用4年的时间去成就一个梦想,还是很划算的!

2005年06月01日

程序员这个名字给许多人的第一感觉就是:埋头苦干不抬头看路﹝

     第一次见到周奕,正是这种感觉﹝当时,我在一个好朋友的公司里,他说等会有一个程序高手会来,要给我介绍一下﹝不出所料,一见面,就是那种大家都能想出来的程序员形象:背着计算机包,一副没有睡醒的模样﹝我站在他身边看他写程序,笨得要死,用笔记本计算机的触摸板,一个像素一个像素地画图标﹝我问他为什么不随身带一个外接鼠标,他说习惯了﹝我是一个没有耐心的人,见不得这样绣花般的工作,找了一个籍口,早早开溜﹝

 
    我和周奕只此一面而已﹝能记住他,完全是因为他的名字太容易记了﹝后来,我的朋友告诉我,说周奕编了一个软件,在互联网上销售,每月能够有几万美元进帐,两个月能买一辆宝马﹝好像是个传奇,我也没太放在心上,中国互联网的泡沫太多了,我对※赚钱§已没有感觉﹝后来我同朋友聊天,无意中说起,有一个朋友在网上卖软件一个月能挣2万美元,立刻激起了公愤,他们说了几十条理由,说决不可能,条条都似乎很有理﹝这反倒激起了我的兴趣﹝为此,我一定要查个究竟,没想到这一查,一座巨大的冰山陡然升出海面,其背后摧毁式的力量,让人胆战心惊﹝

 
    如果你没有听说过周奕这个名字,你一定听说过※理德轻松排版§,那就是他的作品.

 
    周奕的经历非常坎坷﹝他是一个非常优秀的程序员,曾经单枪匹马写出排版软件,曾经在DOS时代辉煌无限﹝单纯从程序员的角度看,周奕非常成功﹝中国编写过商用排版软件的,不过几人:殷步久﹜求伯君﹜王选﹜周奕﹝王选在排版软件行业得到了极大的发展,虽然后来公司的业务发展成为方正计算机集团,排版业务的地位下降,但即使到目前,方正采编系统在中国的各个报社应用依然十分广泛﹝求伯君带领下的金山公司,虽然今年WPS的状况不佳,但总归是成长起来一个软件公司﹝可惜,周奕是这个领域的失败者﹝

 
    中国的软件公司最喜欢打出民族品牌,希望用民族的热情来带动一个公司的发展﹝但过去和将来的事实都肯定能证明:只有世界的,才是民族的﹝

 
    周奕在中关村混迹了8年,从1991年开始搞软件产品开发,最早作名片排版软件开发﹝虽然市场反映很不错,但后来盗版不断出现,销售受到很大的影响﹝理德轻松排版,走的是低价位通用产品市场﹝这个市场中,竞争非常激烈﹝由于产品价格太低,市场成本很高(给经销商的折扣很大,广告费很高,产品回款率不高),一年辛苦下来,也没有什么积累,但是※用软件实实在在地像比尔﹞盖茨那样去赚钱§,是周奕投身软件行业的最大动力和梦想﹝

 
    理德轻松排版是一个很不错的软件,这个软件的销售由张旭负责,后来这个产品没有成功,张旭去了金山公司,做副总经理﹝此时的周奕,无所事事,对整个中国软件行业伤心失望到了极点﹝一个偶然的因素,他开发了一个※最没有市场价值,可笑的软件§〞〞批评他的人如是说﹝这个软件就是把MP3文件刻录到光盘上,还原成为音乐CD的一个小软件﹝※有谁会用这种破软件,简直是逆潮流而动,有这么多随身的MP3播放机,会有人花钱买一个刻录软件?再说,刻录软件多得要命﹝凡是买刻录机的人,都会得到这样的软件,§我的一个朋友慷慨激昂,说得非常在理,但不符合最终的事实﹝

 
    ※偶然的因素让我走上了开发共享软件的道路﹝说起写MP3 CD Maker,要回溯到1998年﹝当时国内掀起了VCD热潮,中关村很多家公司做起了VCD刻录软件的生意,我也对这个市场很感兴趣,当时市面上大家刻录VCD的办法一般是用WinOnCDVideoPack,这些都是国外的软件,国内通常采用组合几种软件的办法,给用户解决VCD刻录的问题:先用采集和编辑软件处理视频,再用MPEG软件压缩,最后用刻录软件刻录,由于步骤太多,用户用起来很麻烦,严重影响销售进度﹝影像合成我有个朋友做了,想让我做个刻录模块,令我兴趣大增,就开始钻研VCD刻录技术﹝等VCD技术研究透了,又开始研究SVCD,在一次朋友聚会上,又聊到刻录技术上,聊到把MP3刻成音乐光盘是个好主意,虽然MP3格式的好歌很多,但只能在计算机上听,不能到随身听上听是个遗憾,虽然解决办法也有,但先把MP3转换成成WAV格式的文件再刻,浪费几百兆硬盘实在恶心,我考虑完全可利用多线程的编程办法,一边解压一边刻录,全部操作在内存中完成,一点硬盘空间也不用,想到这些,我恨不得马上编程把它实现,这肯定是个受欢迎的工具软件﹝这样一个软件,非常适合作为一个共享工具软件﹝§

 
    但如果就这样写一个软件让大家用,周奕就和一般只会低头拉车的程序员没有区别了﹝可贵的是,周奕抬头看了路﹝而探路的过程,是如此的简单!

 
    ※对共享软件的好奇心,让我去研究那些靠卖注册码获得收入的共享软件作者到底能不能挣钱﹝在这以前,我使用过很多共享软件,但都是在村里买来的盗版光盘上的,都附带着破解的注册码,我也实在不能理解为什么国外那些写共享软件的人还能挣钱﹝但我还是想研究一下﹝第一步,我到www.download.com上找到50个流行的共享软件,给每个作者发了一封email,信的大概内容是说:我是个共享软件的新手,想请教您做共享软件赚钱吗?一年赚1000美元,5000美元或10000美元,或者是更多?

 
    反馈回来的答案令人吃惊﹝大多数的作者回了信,没有一个说他们不赚钱,但多数不肯透露具体数字,有些人告诉我,他们根本不需要找工作上班了,另外一些人告诉我,他们还雇得起两三个人为他们工作﹝虽然没有数字,但我知道,在美国,一年赚不到3万美元的共享软件作者,是肯定要去找工作的,那可是30万人民币啊,不是小数字!进一步的发现更让人吃惊,Winzip ACDSee的作者竟然是千万富翁!金钱的诱惑实在锐不可当,我立刻投身进入了共享软件的天地:做海外市场,挣美元!§

 
    这一步走得实在是太小了,一般的人都能想到※不就是发几个E-mail吗?§这一步迈得实在是太大了,整个中国的程序员都把眼光放在这个生活﹜工作的土地,没有几个人想到互联网已完全可以把我们的触角伸向世界的每个角落﹝我们常常说,互联网把世界变成村庄﹝但更多的人,是把这个现实当作儿戏,没有想过,互联网真正能够为一个人,一个公司做些什么?我们的软件行业天天骂中国的盗版量太大,美国多好多好﹝难道他们就没有一点周奕的勇气,放眼全球,看在美国能不能挣到钱?

 
周奕曾为他的软件开发了中文版,※托朋友销售,结果不理想§﹝如果他只把自己的视野放在国内,这个软件肯定会成为大家饭后的笑料﹝


   
后来,周奕花了几千元,注册了zy2000.com这个网站,在美国租用了服务器﹝至于付费的问题,周奕认为相当简单:※国外有专门针对共享软件作者的信用卡代理公司,在共享软件行业已是惯例了,选一家在程序员群体中口碑好的就行了﹝根据我的经验,这些服务公司的信誉和服务质量比我想象的还要好,付款准时不说,还处处为你考虑﹝§

    ※第一笔钱是从银行汇来的,无比兴奋,※开了头就无法收拾了,每月的销售都成两倍﹜三倍的增长,不知道什么时候是个头,我也就全力以赴投入英文版的开发和市场推广了,其它什么都顾不得了§,周奕在写给我的E-mail里这样说﹝在他出国之前,每月从互联网上收到的软件注册费大约在4万美元左右﹝

    ※可以说,我每个星期的投入都有回报,因为刚进入这一领域,从不懂到懂,每一点进步都能看得到,这种成就感难以形容﹝自从我来美国以后,我现在月销售收入已超过5万美元﹝我有20%的费用再投入到市场营销和研发上了,当然,我还为自己买了一辆BMW(宝马)﹝§

   依靠自己的劳动获得回报,能够过上富裕的生活,是许多程序员的向往﹝国内除了张小龙(Foxmial的作者)﹜洪以容(Netant的作者)之外,能够买得起宝马的人实在不多,周奕做到了﹝一个没有什么名声的小软件,远比他做过的大型软件带给自己的收入多﹝

    周奕还不算成功,尽管一个软件足以让他个人生活优越,过得无忧无虑﹝但这个软件还根本不能构成一个产业,也不会在共享软件领域有长远的积累﹝微软新版本的Windows   Mediaplayer加入了类似的功能,只要再前进一小步,就足以覆灭周奕这个软件涉足的整个市场,威胁一触即发﹝周奕个人的问题我们不过多关心,但是这条他走过的路,确实给中国共享软件人和软件公司以很大的启发﹝如果我们的软件公司不拿出精力和勇气来开拓海外市场,整天还是忙于炒作※概念﹜理想§,终有一日,这些失去了技术的软件公司,他们的名字会永沉历史长河﹝金山公司大规模推动低价软件市场,去年每套28元的金山词霸销售了50万套﹝按照合理的毛利率计算,金山每套软件挣5元,总共是250万元的利润﹝如果去掉市场费用﹜人工费用,所剩无几﹝如果说周奕还不算太成功,那么国内众多软件公司面临的就是大失败﹝整个大环境已经发生了改变,许多软件公司远远没有明白互联网给软件行业真正带来的好处,反而要投入巨资,进入一些自己根本不精通的行业领域重新开拓业务,这实在是:盲人瞎马夜半临深池﹝

※怎样形容互联网呢?想象一下,从前有些商人是专门靠在沙漠里卖水赚钱的,可如今,沙漠开始下雨了!§

1.美国的税收

    美国的税收极重,赚来的钱将近一半要缴税,但目前在美国网上的消费免税﹝一般来说,在美国的普通商店里买东西,要加上8%左右的消费税,但如果在网上买,这个税该不该收就比较有争议﹝现在基本的情况是:购买纯数字化的商品,如下载软件﹜下载音乐基本上不收消费税,但如果购买有形的商品,需要邮寄或送到家里,如你购买商品的网站在你所在的州有※物理存在§(即注册在本州岛或有任何分支机构或办事处在本州岛),顾客就需要交消费税﹝至于所得税,任何人都要交,不管收入是怎么得来的,不管你的钱转帐到哪里!

2.实例统计哪些人会购买共享软件?

    这是周奕自己软件销售时所做的某一个月统计,虽然在客观上有一些局限性,但是对希望进入这个行业的个人和公司,都有非常大的帮助﹝

    周奕针对自己的共享软件8月份的销售情况作了一番统计,可以让 大家了解在全球范围内,都有哪些国家的人购买共享软件,由于软件只有英文版,因此统计还有一定的局限性:

    美国(1813套)﹜加拿大(98套)﹜英国(80套)﹜荷兰(32套)﹜澳大利亚(32套)﹜德国(17套)﹜挪威(17套)﹜西班牙(16套)﹜法国(15套)﹝销售量在15套以下的有:墨西哥﹜巴西﹜比利时﹜意大利﹜奥地利﹜瑞士﹜韩国﹜新西兰﹜阿根廷﹜丹麦﹜香港﹜以色列﹜芬兰﹜日本﹜新加坡﹜南非﹜关岛﹜爱尔兰﹜波兰﹜瑞典﹜土耳其﹜阿联酋﹜智利﹜哥伦比亚﹜塞浦路斯﹜厄瓜多尔﹜希腊﹜马里亚娜群岛﹜尼加拉瓜﹜巴拿马﹜葡萄牙﹜斯洛文尼亚﹜萨尔瓦多﹜泰国﹜乌克兰﹜乌干达﹜委内瑞拉﹝

   看看这些国家或地区的名称,这就是互联网所带来的真正※国际市场§﹝

3.现在就行动

    从共享软件市场来看,中国开发的软件所占的份额还太小﹝国内软件开发高手很多,关键是找准市场,找对营销的路子﹝出路当然有,但需要付出大量的时间和精力去开拓﹝我们新出的这本▲程序员◎杂志,就是这样一群有技术,有产品,有想法,不甘寂寞的程序开发者的乐园﹝我们愿帮助国内这些高手们走出自己独特的发展道路,这是我们办刊的最大心愿﹝

   在互联网上有ASP-shareware.orgEuro-share.com,这是两个很好的组织,可以让共享软件作者们交流开发和营销的心得技巧,让大家掌握进军海外市场的成功秘诀﹝本刊的合作伙伴Csdn.net(中国软件网)也聚集大量中国顶尖的程序员,可以到此寻找合作伙伴,共同进军互联网新市场﹝