Category: mobile
Posted: September 11, 2008 at 1:23 am | Tags: mtk, vxworks, 动态加载
转至:http://www.cnblogs.com/hpunix/articles/355758.html
整个过程为:
创建文件系统–》下载文件–》加载模块–》查找符号地址并执行
以下为演示该过程的一个简易实现文件,有使用或者引用的话,也
打个招呼,或者给评论一下:
==============START OF THE FILE=============
/*********************************************************
* 版权所有 NP系统工作室。
*
* 文件名称: \FilseSystemCreate.c
* 文件标识:
* 内容摘要: 创建文件系统,在系统启动之后保存文件
* 其它说明:
* 当前版本: S 1.0
* 作 者: william
* 完成日期: 2005-10-12 17:04
* 当前责任人-1:william
*
* 修改记录1:
* 修改日期:2006-3-21 12:00
* 版 本 号:S 1.0
* 修 改 人:william
* 修改内容:创建
* 修改记录2:
**********************************************************/
#include <taskLib.h>
#include <vxWorks.h>
#include <stdio.h>
#include <string.h>
#include <ioLib.h >
#include <symLib.h >
#include <loadlib.h >
#include “dosFsLib.h”
#include “ramDrv.h”
#include “usrLib.h”
typedef int STATUS;
#define ERROR -1
#define OK 0
#define DIAG_RAM_DISK_SIZE (0×100000*10) /* 64M */
#define DIAG_RAM_DISK_NAME “/selfdev/”
STATUS FileSystem_Init()
{
BLK_DEV *pBlkDev;
char *pFileSysRamDiskBase = NULL;
ramDrv();
pFileSysRamDiskBase = malloc(DIAG_RAM_DISK_SIZE);
if(NULL == pFileSysRamDiskBase)
return ERROR;
bzero(pFileSysRamDiskBase,DIAG_RAM_DISK_SIZE);
pBlkDev = ramDevCreate( pFileSysRamDiskBase,
/* start address */
512,
/* sector size */
64,
/* sectors per track */
(int)(DIAG_RAM_DISK_SIZE/512),
/* total sectors 64 MBytes */
0);
/* offset */
if(NULL == pBlkDev)
{
free(pFileSysRamDiskBase);
return ERROR;
}
if(NULL == dosFsMkfs (DIAG_RAM_DISK_NAME, pBlkDev))
{
free(pFileSysRamDiskBase);
return ERROR;
}
return OK;
}
extern SYMTAB_ID sysSymTbl ;
void runModule()
{
STATUS status=ERROR;
int fd;
MODULE_ID hModule ;
FUNCPTR taskEntry = NULL ;
SYM_TYPE * pType ;
if ((fd = open(“/selfdev/youown.o”, O_RDONLY, 0)) < 0)
{
printf(“\nCannot open memory device.\n”);
goto done;
}
if ((hModule=loadModule(fd,LOAD_ALL_SYMBOLS))==NULL)
{
printf(“loadModule error = 0x%x.\n”,errno) ;
goto done;
}
status = symFindByName(sysSymTbl,
“willian_test”,
(char **)&taskEntry,pType ) ;
if (status==ERROR)
{
printf(“symFindByName error=%d\\n”, errno) ;
goto done;
}
else
{
printf(“taskEntryr=0x%x, type=%d\n.”,
(int)taskEntry,(int)*pType);
status = taskSpawn(“test1″,
100,
0,
30000,
taskEntry,
0,0,0,0,0,0,0,0,0,0) ;
if (status==ERROR)
{
printf(“taskSpawn error=%d\n”,errno) ;
goto done;
}
}
done:
if (fd >= 0)
close(fd);
}
int downLoadModules(
char *hostName,
char *srcfileName,
char *destfileName,
char *usr,
char *passwd)
{
………
/*实现下载远端PC模块到本地机*/
return (filesize);
}
STATUS test_dynamic_download()
{
STATUE status = OK;
int fileLenth = 0;
status = FileSystem_Init();
if(status == ERROR)
{
printf(“\nerror occured during init file system\n”);
return ERROK;
}
fileLenth = downLoadModules(“winner2″,
“youown.o”,
“/selfdev/youown.o”,
“target”,
“target”);
if(ERROR == fileLenth)
{
printf(“\nSome error occured when download files\n”);
return ERROK;
}
else
{
if(0 == fileLenth)
{
return OK;
}
}
runModule();
}
=============END OF THE FILE==========
几个需要注意的问题:
1:在文件系统初始化中使用的是MALLOC,该部分是使用的实际是
BSP的空间在实际申请的过程中一定要根据自己可能拷贝的文
件大小和实际的BSP的空间
2:在创建文件系统之后,可以查看该目录的文件列表,或者执行
COPY,前提是必须在TORNADO中选择初始化文件系统组件;
3:在下载文件的过程中,有的BSP初始化已经可以直接通过COPY
在远端FTP SERVER直接拷贝文件,比如:
copy “youown.o”,”/selfdev/youown.o”
这种情况没有必要再调用downLoadModules,至于如何使能,
大家关注的话可以在后边对其专门论述。
4:加载模块的过程可以调用如下代码:
if ((hModule=loadModule(fd,LOAD_ALL_SYMBOLS))==NULL)
同样也可以如下实现:
ld(1,0,”/selfdev/youown.o”);
至于各个参数什么意思,参考HELP就可以找到结论了!
5:在 status = symFindByName(sysSymTbl,
“willian_test”,
(char **)&taskEntry,pType ) ;
中,有可能实际返回错误,但是通过lkup 是可以实际找到的,
对于这个问题,我看网上答案比较少,原因是这样的:
假如你在主机运行shell,默认的远端目标机是没有符号表
(symbol table)的,只有在主机的shell上,你运行LKUP的
时候,才能找到这个符号,不信你可以这样尝试一下,打开两
个SHELL,一个通过串口,一个通过TORNADO的网口,你在其中
一个中能够使用LKUP找到,而在另外一个则不能找到,是不是
呀??
接下来继续解释,我们的symFindByName是在目标机器上
执行的,所以自然的就返回错误了,也是没有找到了!
解决方法是这样的:在目标机中包含符号表,同时将其和
主机保持同步。
Wind River told us to include all this defines in the
config files for the target:
#define INCLUDE_SYM_TBL_SYNC
#define INCLUDE_LOADER
/* object module loading */
#define INCLUDE_NET_SYM_TBL
/* load the symbol table by whatever means */
#define INCLUDE_SHELL
/* target-based shell */
#define INCLUDE_SHOW_ROUTINES
/* optional target-based system utilities */
#define INCLUDE_STAT_SYM_TBL
/* optional target error status routines */
#define INCLUDE_SYM_TBL
/* symbol table package */
#define INCLUDE_UNLOADER
/* optional object module unloading */
#define INCLUDE_WDB
Posted: September 11, 2008 at 12:42 am | Tags: arm, mtk, nucleus, 动态加载, 嵌入式
转至:http://blog.csdn.net/pengzhenwanli/archive/2008/04/23/2319412.aspx#875603
之前有一篇文章是关于嵌入式单地址空间实现动态加载的想法,里面描述的是我根据相关资料进行猜测的地方,以及从技术上来说,可能需要的技术,最近难得有空闲时间,我实现了一下动态加载的。目前已经成功实现,下面说一下实现的过程。
先说一下实现此技术需要的平台:
OS:Nucleus
CPU:ARM7+cache
Baseband:VT3406
ADS1.2
说一下这些东西的来历,Nucleus是实时嵌入式单地址空间操作系统,CPU是介于ARM7与ARM9之间的CPU,BB芯片是VIA出的,这些东西目前都已经收掉不再使用,我也正好离职,从而有时间去实现一下动态加载的问题。
从理论上来说,动态加载很简单,只需要把当前的PC指针指向下一句执行的语句即可。也就是使用如下的ASM就可以实现:
MOV PC, Address
这样就可以顺利执行程序,在我实现的时候,考虑如下问题,程序执行如何返回,参数如何传递,程序执行完毕返回到哪里。
这些问题的解决,看起来比较复杂,其实很简单,程序的返回是放在LR中,这样在上一个函数调用的时候,只要LR的值不变,这样可以在下一个函数调用的时候,同样使用LR,这样就可以顺利返回。关于参数传递,由于ARM中使用r0-r3传递参数,这样只要不更改r0-r3,就可以顺利传递参数。这个地方想明白,我用了好久,特别是返回地址的问题,程序如何执行,应该返回哪里。解决方法如下
实现DynamicLoader(UINT8 *pAddress)
MOV PC, R0
这个地方一定要用ASM实现,否则无法完成需要的功能。由于在调用此函数时,已经把函数的返回地址放到LR中,具体ASM如下:
MOV r0,address
BL DynamicLoader
由于DynamicLoaer的实现问题,没有实际的返回,也就是不需要使用
BX lr
这样来做为函数的返回。这是由于R0所指向的一个函数的开始地址,从DynamicLoader开始,其实执行的是另一个函数,这里的DynamicLoader只是起到了一个跳转的作用。但是又必须使用函数调用的方式来进行,而不能直接跳转,否则函数没有办法返回。由于BL的时候填充了LR,这样在下一个由于实际调用不是使用的B指令,因为并没有设置LR,这样仍旧是在调用DynamicLoader时的LR,因此可以正确返回。
函数可以正确调用并返回,这是程序很大的一个进步,这样就可以实际构造可以运行的程序了。
下面说一下ADS编译为二进制可执行文件的问题,使用编译器如果一开始把所有的数据都放好,这样包括全局变量和静态变量,以及函数的执行地址等,都已在LINK的时候根据指定规则确定实际的运行地址,也就是说所有的函数的实际运行地址在LINK的时候已经确定。这样对于动态运行来说是不可行的,因为既然要动态加载,就需要所有地址都是静态的,因为每次对于读入内存的数据,起始地址是不缺定的,因此不能再LINK时把所有的地址固定死。
解决这个问题有两种方式,一种是在scatter loader中把程序的可执行地址固定好,在LINK时不LINK实际的数据,而在系统启动的时候,把这部分可执行文件拷贝的固定的地址,这样可以作为一个整体运行。但是这种方式由问题,就是应用的大小什么的都是固定死的,不能太灵活,不能根据应用实际调整。
这里使用另外一种方式,选择程序不在LINK的时候把所有的地址固定死,而是使用相对独立的函数调用方式。如下:
原来的方式可能使这这样
BL 0×10008;
而使用相对的地址程序如下:
ADD r5,pc,#18
BL r5
这样虽然多了一句,但是可以做到函数的运行地址是动态指定的,而不是编译为固定的地址。
其实ADS提供了把函数编译为独立地址的方式,
COMPILER使用如下的参数/ropi/rwpi
LINK使用如下的参数-rwpi –ropi
就可以把编译的程序做到运行时地址是独立的。
从上面来开,编译时地址的问题,还有运行时加载的问题,都已经顺利解决。但是这里还有一个问题,就是如何确保动态应用如何每次在使用的时候,都从固定的入口进入的问题。也就是说,虽然有了内存中的运行地址,但是如何保证每次都从固定的函数开始执行呢?如果每次都从编译的可执行文件0地址开始执行,没有办法保证每次调用的是同一个函数。
这个可以通过LINK来保证每次是同一个函数在0地址,使用如下的参数
-first DyanmicAppEntry
这样就可以保证DyanmicAppEntry的入口地址为可执行文件的开始了。
上面的文章解决了动态编译和加载的问题,下面说一下动态应用的问题。如果要使一个应用有价值,比然需要提供本地的功能调用,而且对于手机来说,系统已经基本上实现了大多数的功能,如果在动态应用中再重复实现一些功能,可以说既浪费了空间,又浪费了时间。而且对于硬件相关的功能,必须通过本地调用来进行,这样就需要如何把本地调用传入动态应用中。如上文所说,本地的调用地址都是在LINK的时候确定的没有办法直接在动态应用中使用,这样需要在运行时把本地调用传入动态应用,由于动态应用的入口还有好几个参数可以使用,这样就可以构造一张系统调用的表,在运行的时候传入动态应用,这样可以通过表来调用系统功能,这样就解决了系统本地调用的问题。
这里要特别说一下安全的问题,由于动态应用是直接更改PC指针运行的,这样,如果应用出错,系统可能就CRASH了,无法再继续运行,而且由于可以调用本地系统调用,可能做许多意想不到的功能,这样就可以在系统调用的时候
增加一个中间层,一些核心功能,必须满足一定的权限在可以调用。
Posted: September 11, 2008 at 12:37 am | Tags: arm, dynamic load, mtk, 动态加载, 嵌入式
转至:http://blog.csdn.net/pengzhenwanli/archive/2007/02/26/1514689.aspx
本文的的主要想法是来源于手持设备可运行应用程序和如何实现智能机问题的思考。问题的主要来源是关于可扩充应用程序的考虑,目前大部分手机都是非智能机,也就是不能扩充应用程序
1.智能手机与非智能手机
一般来说,智能手机目前公认三大系统,Windows Mobile,Linux和Symbian,也即是说采用这三种系统的手机,都成为智能机。我认为,从技术上来讲,智能机最主要的特征就是第一可扩充应用程序,也就是说用户可以自行安装需要的程序而不局限于手机自带的,第二就是多用户任务,也就是用户具有同时运行多个应用程序的权力。而非智能手机的操作系统可以说是五花八门,什么都有。但是基本上都有一个核心的特征,就是同时只能运行一个应用程序,而且所有的应用程序都运行在相同的地址空间,而智能机是运行在独立地址空间。一般来说,非智能机也支持多任务,不同的是这些任务共用相同的地址空间。用户操作的UI就是一个单独的任务,用户所能使用的功能基本上就是由UI提供的。
我原来对于非智能机是非常的不屑,认为没有什么发展前途,但是我最近又弄了一个非智能机的手机用了一下,发现很多功能都非常的人性化,从使用上来讲,并不亚于智能机,由此引发了我对于非智机功能的思考。对于智能机来讲可扩充的应用程序一般来说,都是由第三方开发商开发的,稳定性都有所缺陷,并不如原生的系统应用程序稳定。而且有些比较好的用程序价格不菲,我见过使用智能机的人大部分都是使用破解的应用程序,我本人也是。这个行为是违法的,当市场成熟以后,比如像美国,是不太可能的。
智能机由于操作系统功能强大,一般要求系统的硬件性能强劲,这样相应的功耗也大,待机时间相应的缩短。非智能机可以运行在性能较差的硬件上,并且获得的UI表现,不弱于智能机。这样就可以在相同的电力消耗的情况下,获得更长的使用时间。
2.非智能机获得智能机功能必须的要求
如上文所说,只要非智能机实现智能机最主要的两个特征即可获得智能机的功能。一个是用户自行安装应用程序的功能。另一个是同时运行多个应用程序的功能。
3.用户自行安装应用程序的功能
除了智能机以外,目前有两种技术都实现了用户可自行安装应用程序的功能,一个是BREW另一个是Java ME(J2ME)。下面分别说一下这两种技术,BREW技术由Qualcomm(高通)创建,包括一整套的体系,从运营到分发都有。在本文里只是对于客户端技术的说明,对于BREW技术而言,已经非常符合本文中所提及的技术,本文从另一方面来讲,也可以说是分析了BREW的基本技术。BREW技术高通把持的非常严密,目前而言,并没有开放源代码而且对于技术内部也是进行严密的封锁,因此目前出现的文章都是猜测技术的实现,但是对于技术来讲,万变不离其宗,要实现某种技术,有些东西是绕不开的,就像使用CDMA技术,无论是WCDMA,CDMA2000,还是TDS-CDMA都无法绕开CDMA的基本专利一样。BREW技术基本达到了本文的技术要求,既能动态加载,也能同时运行多个任务,而且对于系统功能的使用不像JavaME一样有严重的限制,基本上来说,可以使用系统提供的所有功能。而对JavaME,所提供的功能十分有限,就连存取本地文件都不可以。对于系统功能的使用,如果没有附加的支持,基本上不可能,目前应用最得的是游戏,最多有些网络方面的应用。对于提供系统级别的应用,比如说闹钟等,根本无能为力。也许以后能够提供,但是本人不太看好。另外还有一个就是Flash Lite技术,这个技术我并没有接触,就不详细说了。对于BREW和JavaME我都有相当长时间的接触,了解也比较细致,有些问题还是能够说一下的。
要解决用户可以自行安装应用程序的问题,必须解决以下几个问题,应用程序的加载运行问题,系统API的调用问题。
3.1应用程序加载
对于嵌入系统来讲,与通常的Windows系统不一样,Windows的所用应用程序都在硬盘上,运行的时候根据需要加载到内存中,在运行,或者是使用虚拟内存技术,直接映射的硬盘也可以执行。而嵌入式系统通常是在ROM中,并不需要加载到内存才能运行,直接就可以运行,因此大部分的嵌入式系统都是统一做好一个系统的Image,然后放到ROM中运行。这样所有的地址都在编译期间确定,要是再动态加载应用程序,将会面临运行时地址确认的问题。一般而言,对于嵌入式系统,ROM使用Flash来代替,Flash中一部分作为ROM,另一部分作为嵌入式的文件系统,具体的系统格式这里不作考虑。要是可加载应用程序的话,一般来说是放在文件系统中。这样要运行可动态加载的应用程序,并不复杂,只要把应用程序调入内存中,运行时设置正确的寄存器就可以了。
这里也就是把可执行的文件加载到内存中,由于是单地址空间的,而不是像Windows一样每个应用程序都是独立的地址空间,这样应用程序可以从任意地址开始执行,这样载入内存以后,把当前的执行指针PC这为此内存地址即可。这也是单地址空间的程序可以执行的关键。
3.2系统API的提供
要提供可以运行时call的API,在单地址空间可加载应用程序的约束条件下,可以使用的方法也非常的单调。一般来说,单地址空间的应用程序是统一编译和链接的,这样生成可执行文件以后,所有的地址已经固定了,这样如3.1所说,应用程序如果每个都调用相同的系统API,比如memset等,由于应用程序时独立加载的,这样由于在编译过程中已经把所有的地址确定,所以每个应用必须链接独立的lib,这样造成了空间浪费。如果只是单独的应用,不提供这一步,系统已经可以动态加载了。
但是目前是要求在嵌入式单地址空间实现,必须考虑空间的问题。因此必须解决系统库可以动态加载的问题。也就是库的地址不是在链接的时候确定。只要能够解决编译时的链接问题,就可以做到。
关于
4.同时运行多个应用程序的功能
Posted: September 11, 2008 at 12:01 am | Tags: arm, dynamic load, mtk, 加载, 动态, 嵌入式
摘要
提出一种适用于嵌入式系统的模块动态加载技术,设计实现简单,占用资源少,开销小,并且成功运用于DeltaOS.可提高系统的灵活性和扩属性.介招加载与动态链接的原理和应用情况,解释相关术语,描述基本设计思路:详细说明该技术的核心。即模块声明、调用库、两级重定位表,最后给出结论。
关键词
模块 动态加栽 嵌入式系统DeltaOS
引 言
随着电子技术的飞速发展,嵌人式设备应用越来越广泛,复杂度也越来越高。这使得硬件和软件设计比例发生了很大变化,软件开发的比重越来越大。然而传统嵌入式开发过程中需要将应用与操作系统编译链接成一个整体,然后下载到目标机上运行。如果在调试过程中发现问题,需要重新编链接然后重复下载运行的过程。这样的开发流程周期长而且繁琐,已经越来越不适应快速市场化的需要。
为了适应多样化的嵌入式应用和加快嵌入式系统的开发过程,除了需要可靠的基础平台软件的支持,如带有文件系统、网络协议栈的RTOS和配套的集成开发环境,更重要的是需要可以动态扩展的系统平台。近年来,新一代的嵌入式操作系统已经开始使用动态扩展技术:将基本系统(包括操作系统以及其他共享功能调用库)和应用程序开发分开处理,支持模块更新和动态加载技术。很多主流的传统嵌入式操作系统厂商,如windRiver、Green HilIs、Lynxworks,都推出了面向航空航天、基础通信设备等领域的高可靠、高性能的RTOS版本,支持应用和系统组件的动态加载和更新;而在消费电子领域,相关的操作系统厂商,如symbian、Palm、Microsoft,更是积极推出了具有相应功能的操作系统,在新一代移动设备上得到了广泛应用。
为了成为可动态扩展系统平台,大部分嵌入式操作系统需要使用动态加载技术。总的来说,动态加载是指应用或者系统在运行过程中需要使用某模块的服务,于是通过一系列预定的动作将指定模块加载到系统中,让调用者继续顺利工作。它实现的关键就是加载与动态链接技术。因为加载和动态链接互相依赖,关系紧密,所以将两者放在一起进行讨论。
1 加载与动态链接机制
加载主要负责将模块程序从二级存储设备(比如硬盘或者Flash)搬移到指定内存空间,并且将模块交由系统加载器统一管理。
程序链接分为静态链接、加载时链接和运行时链接。静态链接就是将程序和它运行所需的全部库链接成一个执行文件。它的优点是可以独立运行、速度快,但是它链接生成的代码尺寸比较大。加载时链接是指程序在编译链接时不会把它用到的库链接到执行程序中,而是在它被加载器加载时才解析执行文件,依次把用到的库装载到系统中让其运行。它的优点是程序本身代码量减小,但运行时程序占的内存并没有减小,同时增加了加载器的工作量。动态链接是加载时链接的进一步发展,它是指将库的加载过程延迟到程序运行时执行。这种方式不会给程序引入额外的代码,也不会增加加载器的开销,只有当应用真正使用某库时才会加载该库,减少了不必要的空间占用。它的缺点是可能会有一些运行开销。
嵌入式系统中动态加载和普通的动态链接概念类似,但是嵌入式系统中的加载链接器有其自身的特点:它是交叉加载,主机端做一部分工作,比如程序的重定位,执行文件的解析等等;而目标机端相对简单,主要做模块搜索定位和空间分配,以及指定物理地址或者映射虚拟地址让其运行。一部分嵌入式系统不支持虚拟内存,应用和内核共享存储空间。当系统加载了多个应用到系统中时,一般需要使用overlap技术来解决内存空间有限的问题,即是当多个应用的运行地址空间冲突时,加载器会冻结当前暂时不运行的应用,让新加载的应用使用指定的地址空间,PairnOS中就采用了这样的设计。对于支持虚拟内存的嵌入式系统,加载器的工作被大大简化,每个应用都有可以运行在同样的虚拟的空间,不需要加载器为其重定位或使用overlap技术,因此提高了工作效率。Vxworks6.O,WinCE都使用了这种设计。两种方式在不同的领域都有比较多的应用。
文中提出的模块动态加载技术是基于支持MMU(Memory Management Unit)的32位嵌入式操作系统,采用了加载与动态链接技术。使用该技术构建的嵌人式系统面向高端市场,特别是对系统可靠性、安全性要求很高的领域。在DeltaOS新一代高可靠的版本HAR(High Available Reliable system)的研发过程中,即成功地实现了基于该设计的加载器LambdaLoader,达到了预期的性能要求。
2 模块动态加载的设计
2.1 设计思路
首先定义一些概念:模块、目标程序、接口函数地址表和调用库(call Library)。
①模块,主要是指加载器加载的一个单位,并且这里模块的概念主要是强调它是为应用或者系统提供一系列服务的提供者。
②目标程序,是指模块的使用者。它可以是应用,也可以是另一个模块。
③接口函数地址表(文中也称之为模块重定位表),指在模块中有一个数组表,该数组表的内容是该模块对外提供的函数接口的地址。
④调用库,是供模块调用者链接使用的专有库。它与相关模块一一对应,将封装了的模块接口供目标程序使用。除此以外,它还有一个运行时才确定的模块重定位表地址指针和模块动态查找定位的代码。
如果在系统中要实现动态加载,首先需要一种模块定位机制,使得调用者能够在系统中动态定位需要的模块,其次是要能让模块与目标程序动态的关联在一起,协调工作。为了解决这些问题,需要一系列相关的设计:规定模块的声明方式;简化目标机端模块地址空间定位的工作;重定位表的机制等等。基于这样的设计,系统可以比较顺利地实现动态加载。模块动态加载的工作流程如图l所示。这里描述的主要是目标机端的工作。
2.2 模块的声明
模块首先要定义它的相关属性。这里使用模块声明文件来完成这个工作。模块声明文件中需要定义:模块名字、版本、对外提供的API接口。在系统编译模块程序后,会调用一系列的script代码。这些script会根据模块名字查找模块对应的模块声明文件,并根据该文件生成供模块调用者使用的调用库和与模块一起链接的附加库。
附加库包含系统后台通过调用script生成的接口函数地址表和模块注册函数。在每个模块的初始化函数中,会调用一个模块的注册函数(该函数主要工作是向系统注册模块的名字和接口函数地址表地址)。当模块被加载时,初始化函数会被系统调用,向系统注册模块信息,此后模块交由加载器统一管理。
2.3 调用库
每个模块在提供一个模块重定位表的同时,必须提供一个与之对应的模块调用库。别的目标程序必须并且只能通过调用库来使用这个模块提供的服务。每个调用库都有一个存储本模块重定位表的地址指针变量。该变量在模块被目标程序第一次使用时会被初始化为相应模块重定位表地址。
在模块第一次被目标程序使用即开始动态加载过程时,首先运行的是调用库的库初始化代码(Library initialcode),它通过指定的系统调用来初始化库中的模块重定位表基地址指针。此后每次目标程序使用模块提供的函数接口时,都通过以下公式得到该接口的实际地址:模块接口实际地址=模块重定位表基地址+函数index×4
在该公式中,函数index是指对应函数在模块重定位表中的数组下标值。因为根据模块声明文件生成的调用库中已经包含了每个函数的索引信息(index),同时在32位系统中需要乘以4得到准确的偏移量,所以当调用库中重定位表地址被初始化后,可以通过这样一个简单计算得到指定接口实际地址,完成函数调用。
当一个目标程序使用了模块,并正确动态加载后,其关系如图2所示。目标程序中链接了调用库,包含了函数跳转表和指向模块重定位表基地址的指针(ModuleBase);模块中则链接了附加库,包含了函数接口地址表(模块重定位表)。调用模块函数时,经过动态加载模块的过程以后,目标程序的模块重定位表基址指针指向了对应模块的函数接口表,然后函数调用就可以顺利进行了。

2.4 两级重定位表
在嵌入式领域,为了降低性能开销和增加确定性,目标机端加载器不会做程序重定位,而将相关工作在主机端完成,所以目标机端加载的所有程序都是绝对定位后的程序.为了实现系统动态扩展,必须使各个模块能够单独链接生成执行程序,并且运行时不用关心彼此的定位,这样即使一个模块被动态替换后也能同其他程序一起协调运行。这里通过两级重定位表机制来完成这个协调性的工作。
对于内核、操作系统组件模块或提供服务给其他目标程序使用的模块,要维护一张本模块提供的接口函数地址表(即模块重定位表,这里称之为二级重定位表)。为了保证本模块的向后兼容性,模块必须保证其接口函数在模块重定位表中的相对位置固定。即使今后不能提供这个接口函数,也需要将其保留,以保证同以前版本的二进制兼容性。
在模块的初始化代码中,模块通过系统调用向加载器注册这个模块重定位表的地址,注册时需提供模块名和模块重定位表的地址。加载器中管理着一个称为一级重定向表的表格。这个表的表项是“模块名”到“模块重定位表地址”的映射。因为这只是一个映射关系,所以各个模块对应的表项在一级表中的具体位置是可以改变的。
二级重定位表如图3所示。
使用两级重定位表的规则如下:
①模块可通过模块重定位表向其他目标程序提供接口函数;
②目标程序要使用别的模块提供的接口函数必须通过对应模块的调用库来实现;
③目标程序在使用别的模块提供的接口函数之前,必须通过加载器提供的系统调用服务获取对应模块重定位表来基地址初始化对方的调用库。
结 语
该设计实现了在嵌入式系统中的模块动态加载与更新,使得在嵌入式软件开发过程中,开发人员可以更有效的设计系统,共享资源,达到提高效率、产品快速市场化的目的。在基于DeltaOS的实现中,可以完成应用的任意加载卸载,系统组件的动态更新;多个应用可以共享一个全局的模块;一个应用可以同时使用多个模块等等。整个系统扩展性和灵活性大大提高,较好地满足了实际需要。但是设计中对容错性、健壮性的考虑还不够,在应用与模块的间接调用处理上还有优化的空间,所以在这些方面还需要进一步改进。
Posted: August 31, 2008 at 7:16 pm | Tags: audio, j2me, mobile, mtk, stream, 流媒体
Jffmpeg应该是对 ffmpeg 这个C编写的工具的Java封装。
另一个封装的是
http://fobs.sourceforge.net/
FOBS, the C++ & JMF wrapper for ffmpeg.
Cleverpig said:“
Quote:
其实,感觉上可以自己编写一套流媒体规范的实现,比如将源文件指定为wav格式或者其它的raw格式,然后分段发送到mobile。。
但是这样做确实效率低,而且浪费带宽。本人研究了一下Tea Vui Huang的mobilecast实现有些心得,在此与大家讨论一下:
1。使用MMS发送radiocast:由于MMS服务可以使用图片、音乐等多媒体元素,而且技术比较成熟,所以将它作为radiocast的载体是方便的选择。而对于mobile用户来讲,cast的使用方式可以采用请求和订阅两种模式;
2。radio文件格式的选择:对于某些手机不能支持mp3格式文件,即使支持mp3也受到memory size的限制,所以采用更为普遍、压缩比更大的amr格式是比较好的choice;
3。amr文件的分割:由于目前大多数手机仅能支持100KB左右的彩信,所以最佳的cast长度应该是50秒。比如将大约5分钟的mp3文件分割为6个 amr章节文件,每个章节文件所包含的audio长度为45-50秒。而每个amr格式的压缩比将是普通mp3格式3-6倍。按照播放率为 600KB/min的mp3格式计算,保守地假定amr格式压缩比为mp3格式的6倍,amr格式的播放率为100KB/min,而45秒的amr文件大 小为75KB。
所以Tea Vui Huang的做法是很clever的。” |
我试验过了,利用ffmpeg的这两个参数,可以控制让ffmpeg来将一个大mp3劈分成许多小段的独立播放的amr文件。
-ss time_off set the start time offset
-t duration set the recording time
比如你写这么个perl文件,然后运行:
Code:
@inputFilename = "C:\\opt\\media\\changjin.wma";
@outputFilename = "C:\\opt\\media\\changjin";
for($i=1,$j=1;$i<=1000;$i+=10,$j++)
{
system("C:\\software\\ffmpeg.exe -i @inputFilename -ac 1 -acodec amr_nb -t 10 -ss $i @outputFilename.$j.\".amr\"");
}
就把一个大文件拆分成许多小amr了,每一个amr文件只有17KB。
Qinjiwy said:“
Quote:
提一个优化的小建议
如果分段太小,播放的间断太多的话,用户感觉上和系统开销都不是很合适.
可以考虑多开几个线程, 另外,每个文件不一定要一样大,可以考虑
文件逐渐增大,从目前移动网速计算,
压缩比高的amr语音文件播放的时间要比下载的时间长.在第一次下载后开始播放的这段时间中,就
可以下载比第一次下载大的文件了,这样能减少网络开销 |
”
Cleverpig said“
Quote:
| to qinjiwy:这个边收听边下载的方法可以作为一个应用程序选项,因为并不是每个人都需要不间断的听,也许只想听第一段试试看,如果好的话再继续听下去。而且有些人还可能直接从中间的部分收听,如果这时文件变大的话,可能等待时间更长。 |
”
Posted: August 31, 2008 at 7:15 pm | Tags: audio, j2me, mobile, mtk, stream, 流媒体
cleverpig said“
Quote:
之所以有些格式的媒体文件不支持分段播放,是因为它们文件中不含有索引信息。
就像在以顺序方式读取文件时无法seek一样。。
这个问题可以通过人工(或者用程序)将文件分割后部署放到服务器上来解决。 |
”
以及“
Quote:
| 随着iTunes4.9版的发布,podcaster(pod播客们)能够建立自己的podcast,并可以通过增加幻灯片式的图片使其更加吸引人。而且 在附加信息中的URL还可使用户门自由的找到其他的podcast资源。这成为了podcast世界的“大地震”。目前这一特性移植到手机上是通过划分“ 章节”来完成的,即将podcast资源文件划分为多个章节,这样做才能让没有“重播/定位”能力的手机进行播放。
但是另一个挑战将摆在移动用户面前,例如:移动收听必须对中断事件进行管理。当我们正开始播放20-40分钟的podcast时,一个电话或者短信突然到 来,这些情况将使播放被迫中断。此时我们只能选择重新打开podcast从头再听或者是没有心情从头听。另外媒体文件格式问题也是对移动用户的“噩梦”, 大多数手机都不支持mp3或者AAC这种podcast的文件格式,但它们都支持.3gp的标准AMR格式文件。而且能够保存几兆mp3或者AAC文件) 的手机目前也不是很普及。
但是Tea Vui Huang制作的javacast改变了这一切。这个软件就是将mp3音乐转换为手机可以播放的.3gp 标准amr(audio recording format)格式。大家可以到http://www.ringtone4me.com/看看,上面有一些具有此类功能软件链接。
javacast的作者——Tea Vui Huang也是Mobcast的作者, 已经制作了一套处理工具将转换Podcast到一个java Midlet中(用户只需要在手机中调用javacast无线下载这个j2me应用程序,并可以播放podcast)。这使那些podcasters们通 过简单的增加一个下载这个midlet的链接就能很容易是获得他们的podcast。 |
”
Huang的Mobcast,确实非常著名,几个月以前,在我写toodouPodcastMidlet时就看过许多人介绍过他,但是就是连不上http://www.geocities.com/tvhuangsg/m…��睹真容。
转换各种格式的video为3gp,转换各种格式的audio为amr,这些在开源软件mplayer手下是随手拈来,只需要看懂mplayer的各种参数即可做到了。所以拜mplayer所赐,我也能够制作手机看交通实况录像,都要感谢那些mplayer的开发人员!
“移动收听必须对中断事件进行管理”,这个确实需要考虑。当进入Paused状态时,需要通知播放线程暂停,同时连接线程暂时就不要去抓取服务器的媒体数据了;等界面切换回来后,播放线程继续replay,连接线程继续下载音乐。
斑竹说“可以通过人工(或者用程序)将文件分割后部署放到服务器上来解决”,我想也是,简单的文件分割是不够的,或者说仅仅适合于wav这种原始数据格 式。应该事先将音乐文件用mencoder分解成一段一段的音乐文件放在服务器上,mencoder将处理每一段的格式问题保证能独立播放,这样手机下载 起来只需要按照编号一段一段地下载即可,服务器不再需要运算和添加头信息。
美中不足,如果两个player切换播放,中间会有一个卡啪声。
cleverpig said“
Quote:
| 有兴趣的话可以看jffmpeg,是一种能够处理音频视频的java媒体框架。 |
”以及
“
Quote:
| 想了一下,提出一个“移动音频流网关”的想法:可以使用服务器采用“实时”转化格式的方式,将mp3、wav等格式音频转换为amr格式,当然也可以做分 段,无论音频源是什么(甚至是podcast)都可以下载到手机上收听。但这样做的话,服务器的负载是个问题,尽管已用采集过的音频源不用再次处理。 |
”
其实,我原来写的toodouPodcast就是这么一个概念,由于那些播客们提供的音乐格式不符合手机播放,所以我都用toodouPodcast这么 个java web service调用ffmpeg工具进行音频转换。转换格式,确实是一个很费CPU资源的事情,而且时间很长,如果用户多的话,对服务器压力极大。
那么现在做做分段也不错,这样,更适合手机用户。
Jffmpeg应该是对ffmpeg这个C编写的工具的Java封装。
另一个封装的是
http://fobs.sourceforge.net/
FOBS, the C++ & JMF wrapper for ffmpeg.
Posted: August 31, 2008 at 7:13 pm | Tags: audio, j2me, mobile, mtk, stream, 流媒体
看到很多很多人持续在问这个问题。
以前我也听说,好像kvm底层实现不太支持j2me来做streaming video/audio,但我不知道那人为什么这么说。
那么现在国外有一个人提出下面这种思路,并且号称在Nokia6260[相关数据:诺基亚 6260 Nokia62602.0 (3.0436.0) SymbianOS7.0s Series602.1 ProfileMIDP-2.0 ConfigurationCLDC-1.0]
上真实实现了(两种网络方式:蓝牙和GPRS都试验过),但我怀疑他的前提条件是“你的手机必须允许同时实现player的多个实例进入prefetched状态(预读取声音流)”:
第一步:
声明两个Player;
第二步:
HttpConnection开始向服务器请求该audio文件的第一部分字节,我们定这次读取的字节数为18KB;
第三步:
等第一部分数据到位后,Player A开始realize和prefetch,并开始播放;
第四步:
在Player A播放同时,(18KB的amr数据可以播放10秒钟),HttpConnection继续请求第二部分数据(假设GPRS每秒钟传输3KB,那么18KB需要传输6秒,算上前后通讯损失的时间,应该不会超过10秒钟);
第五步:
第二部分数据到位后,假设Player A还没有播放完(这需要调整你的每一部份数据字节数来使得假设成立),那么将数据喂给Player B让它realize和prefetch;
第六步:
Player A播放完后,得到事件通知,于是让Player B开始播放。
如此往复。
大家看看此种理论可否。
我自己在nokia 7610上测试了一下,我上面说的前提被证明是可行的:“你的手机必须允许同时实现player的多个实例进入prefetched状态(预读取声音流)”。真实Nokia手机确实可以如此:
两个线程中各自有一个Player,都开始做m_player.realize();和m_player.prefetch();,然后等候。
先播放线程1的Player,等她播放完后,
通过
Code:
/*
* 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕
*/
public void playerUpdate(Player player, String event, Object data){
if(event == PlayerListener.END_OF_MEDIA){
try{
System.out.println("playerUpdate>>PlayerListener.END_OF_MEDIA");
stopGauge();
playForeground();
}catch(Exception e){
e.printStackTrace();
}
}
}
来通知第二个线程的Player播放。
这样是可以的。
qinjiwy说“可以,不过前提是该音频文件允许分段播放,有些音频文件就是不允许的.”,你说得对。确实有很多格式的媒体文件不支持分段播放。我所知道的是wav可以,mp3也可以。
服务端每次只读取这两种媒体文件的某一部分,如果是mp3文件的话,我暂时不知道是否每次需要加上特殊的头信息。
但是如果是WAV文件,那么肯定每次都要加上WAV特定的头,要不然Player也无法播放。
这种形式肯定是可行的。因为以前我在VC++上写Text To Speech程序时,就是这么做的:WAV文件的前若干个字节肯定是头信息,这是一定的,随后跟的全是RAW DATA;我每一次读取WAV的RAW DATA若干字节后,传给我的播放线程,他需要给这段RAW DATA前加上一个WAV HEADER,然后就可以正常播放了。
Posted: May 2, 2008 at 2:10 am | Tags: linux, mobile, 平台, 开发, 手机, 技术, 生活, 类, 芯片
From: http://www.bouhe.com/mobile-marketing/1694
诺基亚、爱立信公司的首席技术技官都已驻扎在硅谷办公,他们不得不来到这里,因为他们突然发现苹果和谷歌已经开始威胁到他们的业务。2007年,iPhone、Gphone无疑是最热门的词汇,就连微软也提出了Mphone(Multi-phone)的概念,认为手机应该融合多种无线技术、多种输入技术和多种应用功能。
“2008年会成为MID(移动互联网设备)元年。”业内人士预测。这一判断主要是基于明年上半年英特尔公司即将推出可以放在口袋里的移动终端,而45纳米技术的突破以及多核技术的应用,可以满足MID芯片的移动性和无处不在的计算,并同时降低功耗和尺寸。作为PC互联网时代的最大赢家,英特尔希望将其霸主地位延伸到移动终端领域。就连全球最大的网络书店亚马逊也新推出了手持终端——电子书阅读器,开始软硬兼备。
随着手机和互联网的融合,越来越多的公司开始涉足手机及其他移动终端的生意,硅谷已然变成了手机谷。而围绕着终端的变革,原有的硬件、软件、服务、内容等公司都开始跨越产业链上的多个环节,致使原有的产业边界越来越模糊。以往我们耳熟能详的公司如诺基亚、苹果、谷歌等已经不能单一定位了,它们早已不单是手机、电脑和搜索公司了,而是在移动互联网的大背景下,走到了同一条竞争线上。
随着微软、英特尔、诺基亚、谷歌、苹果等全球巨头加入到移动互联网的战役中,既有的产业格局也会出现新的变化。苹果和谷歌已经成为事实上的虚拟运营商,在它们的平台上会开发和开放各种应用,移动运营商未来的地位会下降。事实上,苹果公司一直和AT&T等移动运营商捆绑销售,并和运营商进行分成。而谷歌打算用46亿美元竞拍美国700MHz的一个无线频段,更有传言,谷歌会收购美国第三大电信运营商Sprint Nextel。
相比苹果、谷歌对移动通信市场的入侵,中国的移动互联网行业还呈现比较封闭的状态,但这并没影响到国内众多创业公司的参与热情。曾有VC感慨,现在只要是和手机相关的商业计划书,十之八九都是手机客户端软件,例如手机聊天、手机下载等各色各样的手机软件。这些公司几乎百分之百都号称要做成手机平台,以黏住用户。
移动终端的影响力之大,在于其离用户最近。作为最终用户,人们与外界的联系节点已由最早家庭的邮政编码,到PC时代的一串IP地址,再转移到移动电话的手机号码。联系的终端越变越小,但却越来越跟随、紧贴用户。在众多公司抢占终端的过程中,用户需求成为最终的变量。在这一点上,无论是iPhone还是Wii的热卖,在于其最先洞察并引领用户需求,通过改善人际交互的界面方式,将用户从键盘中解放出来,满足用户对于自由的渴望。
但仅仅成为一个酷品还不足够,用户更需要终端上的服务和内容。在这一点上,iPhone还远远不够。移动互联网不仅仅是将互联网搬到手机上,看YouTube、上Facebook,随着医疗健康、教育、金融等服务在手机上实现,一定会诞生新的商业模式。
一台便携的移动终端,随时随地连接互联网,围绕这个目标,移动运营商、芯片厂商、终端厂商、互联网服务商、内容提供商史无前例地集体参战,成为过去一年最热闹的场景。而在这场战争背后,首先是对终端的争夺,人机交互界面从键盘到多点触控(multi-touch)率先成为风潮。
当苹果公司的iPhone在欧美手机市场刮起旋风的时候,另外一个手机“门外汉”也把自己的利益触角伸向了这个领域,这家公司就是全球最大的互联网公司谷歌。
对于这家在互联网上取得了巨大成就的公司来说,谷歌进入手机市场并不需要像苹果公司一样自己设计并制造出一款特立独行的酷品手机GPhone来争取用户,而是采用了它更为擅长的方式——用开放的软件平台使自己成为一个联盟的组织者,就像在互联网上用AdSense建立了自己的广告联盟一样。
在2007年11月5日谷歌宣布的手机联盟中有34家企业成员,包括摩托罗拉、T-Mobile、HTC(宏达电)、高通及中国移动等34家全世界不同国家和地区的移动运营商、手机芯片提供商和手机生产商等等。谷歌将为联盟的成员免费开放一个基于Linux的手机操作系统平台“Android”。谷歌称,这个平台是完全开放的综合性移动平台,供联盟成员在此基础上开发新产品、改进服务和压缩用户成本。
在互联网上,谷歌用这种免费提供软件的方式获得了大量的广告收入,2007年前三个季度,谷歌的广告收入达到了约118亿美元,它的这种模式将一直靠卖操作系统软件为生的微软搞得非常被动,如今谷歌又希望能在手机平台上重演这一幕。
在苹果、谷歌这样的新势力纷纷用新模式、新平台进入封闭的电信市场的背景下,以手机为最终表现形式的移动通信市场会发生怎样的深刻变化?也许我们可以从25年前发生在PC行业上的一切来寻找答案。
25年前,整个PC行业还处于群雄割据的状态,没有一个整体性的产业标准,各个PC制造商都有属于自己的一套独立的操作系统,他们靠自己强大的渠道和产品设计能力去争取用户,而微软在这个时候却用软件捆绑机器的销售方式统一了大多数的PC平台,一定意义上这也统一了PC行业。
回到现在正在发生剧烈变化的手机行业里,当手机作为基本语音通话工具时,固定标准是存在的,而当手机逐渐发展成为一个个人随身数据平台,类似于一台小型PC时,这似乎又回到了25年前PC行业的混乱时代,在这个混乱的各自为政的时代,用何种模式、何种平台来统一手机终端就成为了未来这个产业中最大的悬念,在这个悬念破解之后,又会在其背后引发一系列更大更复杂的产业变革。
统一平台下的入侵计划
中国是全球最大的移动市场,在2007年11月底,中国手机用户数已经超过了5.39亿。如此庞大的市场也驱使众多的风险投资及创业者在其中淘金,北京天腾时空信息科技有限公司就是其中之一。
这家由创业基金扶持的公司成立于 2005 年,号称拥有领先的移动多媒体通信和软件研发实力,他们正在开发适用于不同型号手机的第三方客户端软件。这项工作并不容易,因为中国市场上的手机型号实在是太多了,他们要根据系统的不同、机型的不同来对开发出的软件做出调整。尽管如此,天腾时空的CEO马腾对未来还是充满着信心:“我们正在构建一个移动生活圈,把互联网上的东西都带到手机上,我们的目标就是让所有人自由,让大家的网络生活摆脱那根网线和电源线。”
把互联网上的所有东西带进小小的手机终端,这个梦想驱使着中国无数的创业公司在其中寻找着机会,尽管他们坚信手机与互联网的结合是未来的趋势,但是以他们的力量,在中国移动把持的移动运营市场上还是显得太薄弱,现在有了全球最大的互联网公司谷歌的加入,互联网侵入手机的征程就显得不再那么坎坷了。
在谷歌看来,全球有30亿部手机,但是在大多数情况下,手机只被设定为语音通信和发送短消息的一种工具,通过手机上网获取及发布信息的功能被忽略掉了。“这给用户带来了不必要的麻烦,并限制了他们可以享用到的服务。”谷歌移动服务总监Andy Rubin认为,这样的缺陷实际上是过去几十年间移动通信行业迅猛发展的副产品,尤其是移动电话的市场割据更加深了这一点。在这种情况下,手机制造商有充足的商业理由来开发他们各自的受保护的软件,而且运营商也更在意他们眼前所能获得的利益。
这种“各自为政”的发展方式意味着应用服务的提供商必须花大量的精力来实现不同系统的兼容,他们大量的精力和技术人员都花在了如何让自己的软件能顺畅地运行在不同型号的手机上,而不是从用户的利益出发进行创新。
缺乏共享软件平台,也打击了移动领域外的商业力量的积极性,他们不愿意投入更多的时间和资金来挖掘手机更广泛的应用潜力。每当提起正在做手机客户端及免费WAP的公司,风险投资商们都会苦笑着摇摇头。“这种缺乏统一平台的做法使研发的成本居高不下,从而阻碍了创新。”Andy Rubin说。
谷歌的Android平台至少让我们能看到这样一种可能,即在开放的互联网运作模式下,一个如YouTube、Facebook这样的创意,都能通过一个统一的平台将服务惠泽于互联网上的每个人。这也是互联网上能产生对用户有利并促进商业公司收入增长的新服务及新模式的主要原因。
现在,要让互联网顺利的入侵进手机,谷歌所要做的就是用免费提供软件的方式先尽可能地统一手机的平台,然后再依托互联网向这个被自己洞开的门户源源不断地输入各种应用和内容。
“用这款诺基亚6131i手机坐公交车可以直接当公交卡使用”,“可以直接在诺基亚手机上学习新东方的英语课程。”2007年12月11日,在北京举办的诺基亚“完全互联生活2008”大会的一侧,众多诺基亚旗下的公司及合作伙伴展示着诺基亚基于移动互联网推出的新的应用服务。其全球副总裁邓元鋆也宣布诺基亚从2007年开始已经成为了一家互联网公司。2007年8月,诺基亚就已经在全球宣布推出了Ovi(芬兰语中意为“门户”)网络服务,服务内容包括了在线地图、在线游戏和在线音乐商店。
最近几年来,诺基亚在全球收购了一大批提供各种互联网应用服务的公司:2006年8月,斥资6000万美元收购了拥有160万首歌曲的音乐网站Loudeye;2007年7月,收购美国多媒体公司Twango,Twango主要提供为互联网上共享、发布多媒体信息搭建平台的服务;紧接着在9月份,他们又收购了一家名为Enpocket的移动广告公司;10月初,诺基亚又宣布以81亿美元收购美国的Navteq公司,Navteq是汽车导航系统、个人导航设备和其他企业数字地图及基于网络地图系统的主要供应商,同时还拥有提供美国交通信息的Traffic.com网站,这也是诺基亚迄今为止最大的一笔收购; 12月,诺基亚又收购了为手机用户提供共享电脑文件的Avvenu公司。
一系列的收购行动使这家全球最大的手机制造商逐渐成为了一家提供互联网综合服务的公司,通过整合一系列的应用,他们将互联网服务引入到了自己生产的手机平台上。
诺基亚是全球手机行业的霸主,在全球手机市场上的市场占有率接近40%,在中国,2007年的前三季度,他们就卖出了5050万部手机,目前约有超过1.3亿中国用户在使用诺基亚。作为一家处于产业链下游的公司,诺基亚已经不满足于只是制造和销售手机了,它不仅要牢牢掌握住终端,而且还想把握住这个未来的信息渠道。
谷歌成立的Android联盟在一定程度上也在威胁着诺基亚。诺基亚是另一个手机软件平台Symbian的控制者,虽然诺基亚控制的Symbian联盟不具备像Android联盟这样将移动终端、芯片、运营、软件应用、设计等产业链的各个层面的力量都集成在一起的能力。不过依靠市场占有率的绝对优势,诺基亚并不惧怕手机领域的新闯入者,2007年上半年Symbian智能手机在全球共出货3460万部,Symbian智能手机累计出货量已经达到1.45亿部,在智能手机市场的份额达到72%。目前诺基亚、摩托罗拉和索尼爱立信手握全球六成以上的市场占有率,这意味着Symbian至少将在相当一段时间内横行智能手机市场。
诺基亚想用自己的实际行动证明,诺基亚的手机霸主地位是任何一家公司都无法撼动的,现在它在维持霸主地位的同时正主动向互联网靠拢。显然不用怀疑诺基亚适应变化的能力,它已有将近140年的历史,之前卖过劳保用品,也制造过电视机,因此,诺基亚公司坚信,与其自身所经历过的困难相比,目前向互联网转型的所有困难都显得微不足道。
重构手机价值链
整个移动通信领域,2007年最受关注的公司是苹果。自从6月份推出iPhone以来,iPhone至今已销售了超过140万部。更为重要的是,iPhone的出现开启了一个新型的与电信运营商分享收益的模式。
苹果运用的是彻底封闭型平台策略,苹果通过与当地电信运营商的业务捆绑销售产品,从用户收入中抽取一定分成。苹果在美国与运营商AT&T、在德国与T-Mobile、在英国与O2、在法国与Orange都采取了这样的合作方式。以苹果与AT&T的合作为例:苹果公司每月从已经与AT&T签署iPhone服务协议的每位用户中可抽取3美元费用;而新用户,苹果每月则可从每位用户中抽取高达11美元的费用。
为什么苹果能与移动运营商分成?答案之一就是,苹果的iPhone能通过WiFi的方式接入互联网,使得每位用户的ARPU值增加,为运营商带来除语音通话之外的数据业务收入。
曾传言苹果在2007年11月份与中国移动探讨过这种合作模式,但是对于靠语音及短信业务为主、且在移动产业链中处于主导地位的中国移动来说,他们并不喜欢手机产业中新出现的一些商业模式。这也证明了谷歌移动服务总监Andy Rubin对封闭的电信行业的判断,利润流向了少数的几家具有垄断性质的手机制造商与移动运营商那里,这种方式有碍于这个行业创新应用的产生。
随着谷歌这样的互联网公司将触角逐渐伸向电信领域,并且诺基亚也在主动向着互联网转型,曾经强硬封闭的运营商也只能慢慢地走向开放。移动业务价值链势必会有一个重构的过程。
据悉,谷歌打算用46亿美元竞拍美国700MHz的一个无线频段,并向美国联邦通信委员会(FCC)提出了参加拍卖的四个条件:要求获胜者向手机用户开放应用,开放设备,向移动运营商开放批发服务,向内容提供商开放网络。这就意味着,谷歌决意要彻底改变原有电信业的商业模式。除此之外,又有传言说谷歌会收购美国第三大电信运营商Sprint Nextel。
全球最大的互联网公司反过来收购一家电信运营商,如果这样的事情真的在2008年发生,那整个电信行业就会步入一个新的时代,不管怎么说,互联网入侵移动通信市场的序幕已经真的拉开了。
狂欢吧,身体!
在电影《迷失东京》中,女主角斯佳丽·约翰逊用好奇的眼神观看着一名玩着跳舞游戏的日本男子,他大汗淋漓,正操作一种需要手舞足蹈甚至360度旋转身体才能配合画面节拍的游戏。在东京,拥有这种运动式大型游戏机的游戏厅非常多,电影选择这个场景也是有意突出西方人对奇特的日式娱乐的惊讶。
然而,从2006年底开始,一款由日本任天堂公司开发的名为“Wii”的游戏机迅速风靡欧美家庭,这款电视遥控器般大小的游戏机正像上世纪80年代的卡拉OK一样,它凭借更接近自然的交互方式让全家老少都能参与到游戏中来。一时间,自由交互式操控的复兴给整个游戏机产业注入了新的活力。
在Wii诞生之前,游戏业多少有些尴尬:上班族没时间玩,老年人上手又太难,小孩子受到家长的严格监督和管制。实际上,大多数人的游戏经验都只停留在童年,游戏随着玩家长大成人遭到放弃甚至厌恶和抵制。多数人后天的发展不仅没有打开体验的更广阔天地,反而是一步步进入专业化、职业化的路径,再也没机会感受自身生活范围以外的世界。
Wii的出现改变了这一切,Wii的设计师宫本茂也因此成为英国《经济学人》的“年度创新大奖”的获得者,“当今电子游戏界的关键人物”的评价也从另一个角度证明了Wii的创新价值。
Wii的重要性在于,设计者宫本茂坚信,游戏必须与每个人的日常生活发生联系;游戏必须更加深入社会,得到整个社会的理解。这可以看作这位游戏设计大师的游戏世界观,正是这样的信仰产生了Wii的颠覆性创想。这种信仰也正好道出了游戏的本质——游戏本来就是生活的延伸,是人们工作之余的一种经验扩展,游戏让人获得习以为常的生活里难以体会到的感受,甚至是经验和知识,怎么能将大部分人隔离于游戏之外呢?
被束缚的自由
“硅谷海盗”乔布斯似乎比一般人更加难以忍受密密麻麻的按键和狭小的屏幕给人的束缚感,素来爱凭自我感受来判断技术趋势的他坚信:技术进步不应该成为束缚人自由的枷锁。iPhone证明乔布斯又“赌”对了。这款手机在把实体按键简化到只剩一个之后,更是利用多点触控(multi-touch)屏幕让自由轻松的触控体验发挥到了极致。他曾经描述,自己过去在使用手机时,看着密密麻麻的按键却找不到一个简单的功能时,头脑中就只有把手机砸掉的冲动,何谈使用它正常工作。
交互设计大师、“Macintosh”之父杰夫·拉斯基(Jaf Raskin)早就指出,好的设计不会让使用者养成对今后工作不利的习惯,但设计人员却经常有意无意地给用户设下坏习惯的陷阱。事实上,良好的设计应该在给用户带来帮助的同时,把对其未来可能出现的限制性障碍降到最低,保持使用者自由的可扩展性。
实际上,界面的不自由长久以来是一个被忽视并且有点积重难返的问题,越来越复杂的设备和使用者界面,大大增加了拉斯基所说的陷阱的数量,而解放使用者自由就需要下更大的决心和冒更大的风险颠覆传统。
当互联网信息过载让人们淹没在信息海洋中时,谷歌充当了颠覆者的角色,它只在网页上显示一个输入框;当手机开始附加各种原来PC的功能而变得日益复杂,学习成本上升时,iPhone开创性地只保留一个实体按钮。大刀阔斧地删减界面信息、按钮和选项,使用户不用进行多余的思考,即可快速进入想要达成的任务。
Wii mote被设计成客厅里最具亲和力的电视遥控器样式,让你接触无距离感,拿起它你就知道如何使用,而玩好它却又需要时间和技巧。正如谷歌简单的输入框背后有复杂的运算;苹果电脑薄薄的《使用说明》上第一句话是,“你的苹果电脑被设计为你能很快设置并且马上开始使用”,说明书的封面上印着一行灰字:“Congratulations,you and your MacBook were made for each other.”很有从此“人机合一,形影相随,只有我懂你”的性感意味。
正是因为这样,根据互补资源价值相关的原理,心理需求上互补的、无线的、可移动的和能带来真实触感的资源将变得稀缺而更有价值。这就是解放四肢的Wii和自由触控的iPhone之所以获得极大成功的深层社会心理学原理。
从芯片到设备的连锁爆发
基于社会心理学上的新需求是商业应用市场爆发的充分而非必要条件,Wii、iPhone等颠覆键盘和鼠标操作方式的产品之所以在2007年爆发,也必须有一些上游技术方面的必要条件。
实际上,从1980年施乐实验室帕洛阿尔托研究中心(PARC)的计算机“STAR”算起,“鼠标+图像化界面”在计算机上的应用已经走过了37年历史,最早的鼠标连线还是在其后部,更像是老鼠的尾巴 。其实正是CPU芯片计算能力的增强,使得计算机可以模拟出更丰富的图形化界面效果,鼠标这种低技术含量但实用的发明才有用武之地。
同样,iPhone的多点触控技术和更简单的Wii mote手柄的单点触控技术都不是新发明,它们之所以在2007年大行其道,除了符合人们普遍对密密麻麻的键盘和狭小屏幕的厌烦心理,更根本的原因是芯片计算能力的进一步增强。 LUPA开源社区’B!I*G2^ m5T-P1^
英特尔高级副总裁、前CTO 帕特·基辛格在谈到45纳米芯片的突破以及“多核”技术的未来影响时表示,更低功耗、更强性能和更丰富功能的芯片为无线的、模拟图形的和能感知触觉的计算提供了更好的技术准备。用户可以不用为了机器刻意改变行为习惯,而机器具备了更精确的识别人的动作并做出更丰富反馈的能力。
简单说,计算能力的进步使得我们已经可以抛弃“计算机中古时代”的键盘和鼠标,拥抱更现代、更性感和更自由的多点触控技术。它为交互性更强的应用打开了新的天地,比如,当iPhone靠近人脸时,多点触控屏幕会自动感应,让触控点全部关闭,因为这时候你正在接听电话,不需要任何按键,而当机器感受到你进入其他场景的信号时,你正好需要的按键又会聪明地出现。当机器能以人的自然动作为中心时,机器的操作大大降低了门槛,几乎不需要学习。
从购买和使用Wii的人群也可以看出,难以掌握复杂操作的学龄前儿童和对新的电子设备接受度最差的中老年人,都可以轻松学会使用Wii。这更加证明了过去繁琐的操作和束缚自然动作的低级交互方式扼杀了许多人获得新鲜体验的自由。Wii也成为了圣诞节流行的一款送给小孩子的礼品。虽然这会让使用者耗费更多的动作及体力,不过,却能够在操控过程中获得更多的乐趣。这种操作方式抛弃了目前所使用的键盘(按钮)、鼠标,将进一步体现出人性化操控界面的未来趋势。
到目前为止,Wii已经销售了超过1300万台,Xbox360早推出1年,但是已经不敌Wii的风头,以几十万台的差距落后,而PS3则只有500多万台售出,而且增长缓慢。虽然市场上开始出现拙劣模仿者和盗版游戏,就像当初MP3厂商模仿iPod一样,而且同类厂商开始降价应对Wii的冲击,但Wii依然在营造产品紧缺的状态,坚持不降价,保证了极高的利润率。任天堂的市值也一路攀升,超过索尼近一倍,成为日本证券市场上仅次于丰田的第二大市值的公司。
宫本茂已经沿着解放身体的思路把Wii驶入家庭健身器市场,Wii fit系列游戏包括了滑雪、跳舞、瑜伽、俯卧撑、呼啦圈和英式足球等。设备上,Wii又推出了平衡板(Wii balance),可通过在上面运动和改变姿势来操控屏幕上的虚拟角色。
微软的客厅战争也打算以多点触控技术作为杀手锏。去年春天,网上开始流传一段Microsoft Surface的视频,其演示的多点触控技术令观者赞叹不已。Surface大大的触摸屏可以响应很多种手势,而且,当你把电子设备放在它的触摸屏上时,Surface电脑马上会“看到”你的设备(通过隐藏的多个摄像头),并即时在屏幕上展现出各种可能的操作。比如你放个数码相机上去,它就会问你是否要查看照片,这种简单的操作一旦推向市场很可能像Wii一样改变家庭PC产业。
苹果公司也已经展示了下一代应用触控屏幕的台式电脑iMac,惠普公司的PDA产品iPaq在触控技术上也做了独特的尝试,主要是实现了在小小屏幕上用手指实现精确到毫米的控制。三星电子全球CEO尹钟龙也认为下一代手机要性感并且易于操作,今年他们推出了触摸屏手机SGH-P520,以应对来势汹汹的iPhone。而iPhone也在触感互动上深入探索,在申请按压虚拟按钮仍然有弹回感觉的技术专利。
苹果公司预计iPhone的销量在2008年1月14日的Mac world大会之前达到500万部,但从近20%的产品被购买后没有开通AT&T的服务,可推测这些产品是流入了非美国市场破解后使用,看来iPhone病毒式的扩散威力还只是开了个头。
iPhone的热销引发了同类厂商的跟随效应。去年,在芯片技术领域,国内厂商美芯半导体的销售人员惊奇地发现,他们投资的适合计算空间平衡改变的芯片,其销售业绩大大高于其他芯片产品。这些芯片主要应用于交互式的游戏机、可感知使用者行为的手机等设备上。
实际上,通过iPhone的热卖我们完全可以预见到,下一阶段的芯片必须为下一代手机等电子产品的这些特点做足准备:用容量有限的电池(意味着芯片的功耗必须是低的),功能越来越丰富(意味着芯片支持更多任务同时运行),越来越便携(意味着更好的支持无线通信)而且更讲求视觉和触感体验(意味着模拟计算等能力更强)。目前,唯一独立存在的GPU(图形处理器)厂商Nvidia公司,就是由于专注于这个越来越重视视觉体验的消费电子市场,才取得了这两年的高速成长。可以预测适合这些特点的芯片的爆发性需求应该会在2008年日渐明显。
另外,IT咨询顾问公司InStart的殷建松认为,2008年值得期待的是46英寸屏幕的电子设备的出现,iPhone和iPod Touch的屏幕是3.5英寸,而46英寸的屏幕视觉和触觉体验效果更好,并且仍然能放入口袋中。像iPod Touch一样仅仅作为游戏、娱乐和信息浏览器的工具也是46英寸的屏幕最为合适,它恰好是体验和便携性的平衡。
以上种种都为我们描绘出一个能够更加全面和丰富地感知人的自然行为的未来世界,这个世界的基础应该是一种无所不在的感知、收集、识别,最后做出更丰富和人性化反馈的计算机。在这个用户体验极大丰富和更自由交互的世界面前,引领时代的厂商们已经占好了跑道,各就各位。
Posted: January 16, 2008 at 11:46 am | Tags: blog, class, command, linux, mtk, register, ror, 测试, 类, 缓存
AT命令使计算机或终端与调制解调器通讯,所有命令行必须由ASCII字符“AT”开始并由 <Enter> 结束。除了A/指令和推出(缺省为+++)。这些将在后面讨论。字母”AT”用以提醒调制解调器注意,其后将有一条或多条命令出现, “AT”及其后的字母可以是大写或小写。
AT必须同为大写或小写。如”At”或”aT”是不允许的。
一串命令可以写在一行里。为了便于阅读可以加或不加空格。命令中或命令间的空格会被忽略,命令行的最多字符数为39(包括”AT”)。在输入一条命令期间,可以用退格键(backspace)改正除”AT”以外的错误。若命令行中任一处出现语法错误,本行其后的内容将被忽略,并返回ERROR。大数带有超出正常范围的参数的命令将不被接收并返回 ERROR.本章列出所有设置调制解调器的命令。包括控制ACTIVE调制解调器的贺氏标准AT命令集。贺氏V系列命令集和扩展命令集
AT命令集的描述
符号 * 表明该命令的设置可用AT&Wn命令存于两个用户方案中的一个
A/ 重执行命令
重执行前一AT命令行,主要用于连接时占线,无应答或号码错误。这一命令必须单独构成一命令行并由”/”字符结束,(<Enter> 不能用于结束命令)。
+++ 退出字符 缺省:+
切换调制解调器从在线状态到命令状态,而不会中断数据连接。可以通过改变S寄存器S2的值来改变这一字符。
AT=x 写入被选的S寄存器
这一命令将数值x写入当前被选的S寄存器,一个S寄存器可由ATSn命令选择,若 x 是一个数字,所有S 寄存器将返回 OK 响应。
AT? 读被选的S寄存器
这一命令读并且显示被选的S寄存器的内容。一个S寄存器可由ATSn命令选择。
ATA 应答
它必须是命令行中的最后一条指令。调制解调器在应答方式下继续执行连接程序。在与远端调制解调器交换载波后进入连接状态,如果在由寄存器S7规定的时间内(缺省值=50秒)没有检测到载波, 调制解调器将挂机。在连接过程中,通过DTE输入的任何一个字母都将中断这一命令。
ATBn* 选择ITU-T或Bell模式 缺省=0
ATB0 选择在1200和300bps速率下通讯的ITU-T V.22和V.21协议
ATB1 选择在1200和300bps速率下通讯的Bell 212A和103协议
ATCn 载波控制缺省=1
包含这一命令只是为了保证兼容性,执行号只是返回一结果码而没有其它作用。
ATC1 正常传输载波切换
ATDn 拨号
它必须是命令行中的最后一条指令, ATD命令使调制解调器摘机后, 根据输入的参数拨号,以建立连接。如果不带参数,调制解调器摘机后,不拨号进入发起方式。
使用标点可使命令更易读懂。圆括号,连字符和空格符会被忽略。拔号命令行中如果出现了非法字符,则该字符及其后的内容将被忽略。调制解调器允许的拨号命令长度为36个字符。
参数:0-9 A B C D * # L P T R ! @ W , ; ^ S=n
0-9 DTMF 符号0到9
A-D DTMF 符号A,B,C和D。在一些国家中不使用这些符号
* “星”号(仅用于音频拨号)
# “#”号(仅用于音频拨号)
J 为本次呼叫执行在可提供的最高速率下的MNP10链路协商(可选)
K 使本次呼叫MNP10链路协商期间电源电平可调(可选)
L 重拨上一次拨过的号码
P 脉冲拨号
T 双音频拨号
R 逆叫方式。允许调制解调器使用应答方式呼叫只能作为发起使用的调制解调 器, 必须作为命令行中的最后一个字符输入。
! 使调制解调器按照S29中规定的值挂机一段时间再摘机。
@ 使调制解调器等待5秒钟的无声回答
w 按照寄存器S7中规定的时间,在拨号前等待拨号音。
, 在拨号过程中,按照寄存器S8中规定的时间,暂停
; 拨号后返回命令状态
^ 打开呼叫音
() 被忽视,用于格式化号码串
- 被忽视,用于格式化号码串
<space> 被忽视,用于格式化号码串
S=n 用AT&Zn 命令存在地址n处的号码拨号
ATE* 命令回应 缺省:1
ATE0 关闭命令回应
ATE1 打开 命令回应
ATHn 摘挂机控制 缺省:0
ATH0 使调制解调器挂机
ATH1 当调制解调器处于挂机状态,使调制解调器摘机,返回响 OK,等待进一步的命令。
ATIn 识别
I0 报告产品代码
I1 报告ROM中预先计算的校验和
I2 计算校验和并与ROM中的校验和比较,返回”OK”或”ERROR”结果码
I3 报告固件修正
I4 报告OEM定义的识别串
I5 报告国家代码参数
I6 报告固件修正
I7 报告调制解调器数据泵类型
ATLn* 扬声器音量 缺省:2
ATL0 扬声器低音量
ATL1 扬声器低音量
ATL2 扬声器中音量
ATL3 扬声器高音量
ATMn* 扬声器控制 缺省:1
ATM0 关闭扬声器
ATM1 扬声器在呼叫建立握手阶段打开至检测到来自于远端调制解调器的载波后关闭
ATM2 扬声器持续开
ATM3 扬声器在应答期间打开。当检测到来自于远端的调制解调器的载波和拨号时关闭
ATNn* 调制握手 缺省:1
ATN0 要求调制解调器S37选择连接速率,若S37=0,则连接速率必须与发出的上一条AT命令的速率相匹配。如果所选择的速率可用不止一个通讯标准实现(如Bell212A或ITU-T V.22 速率在 1200bps)调制解调器同时参考ATB 命令选择。ATN1 允许时使用双方调制解调器都支持的任一速率握手,使能够自动检测。在这一方式下,ATB命令被忽视,调制解调器只用ITU-T方式连接。
ATOn 进入数据在现状态 缺省:0
ATO0 使调制解调器从命令在现状态直接返回数据在线状态,不经过自动均衡。
ATO1 使调制解调器从命令在现状态返回数据在状态,经过自动均衡。
ATP* 设脉冲拨号为缺省
ATQn* 结果码显示 缺省:0
ATQ0 调制解调器向DTE发送结果码
ATQ1 禁止调制解调器向DTE发送结果码
点击查看S寄存器详解!
ATSn 设S寄存器n为缺省寄存器
ATSn? 读S寄存器
读S寄存器中的内容,所有的S寄存器都可以读
ATSn=x 写入S寄存器
将 x值写入指定的S寄存器n
ATT* 设音频拔号为缺省
ATVn* 结束码类型 (消息控制) 缺省:1
ATV0 发送短型 (数字型) 结果码
ATV1 发送长型 (字符型) 结果码
ATWn* 协商进程报告 缺省:0
ATW0 不报告纠错呼叫进程
ATW1 报告纠错呼叫进程
ATW2 不报告纠错呼叫进程,CONNECT xxxx指示DCE速率。
ATXn* 扩展结果码 缺省:4
ATX0 调制解调器忽视拨号音和忙音。当由盲拨建立连接时,发送CONNECT信息。ATX1 调制解调器忽视拨号音和忙音。当由盲拨建立连接时,CONNECT XXXX 反映的是比特速率
ATX2 调制解调器忽视忙音,但在拨号前等待拨号音,如果5秒钟内检测不到拨号音,则发送NO DIAL TONE 信息,连接建立后 发送 CONNECT xxxx反映比特速率。
ATX3 调制解调器忽视拨号音,若检测到忙音,发送BUSY信息,当由盲拨建立起连接时, CONNECT XXXX 反映的是比特速率。
ATX4 如果5秒钟内检测不到拨号音,发送NO DIAL TONE 讯息,检测到忙音, 发送BUSY信息。连接建立后发送CONNECT XXXX 反映比特速率。
ATYn* 控制长间隔拆接 缺省:0
ATY0 不允许长间隔拆接
ATY1 允许长间隔拆接
ATZn 复位 缺省:0
重新调出由用户方案规定的动态配置
ATZ0 软复位并重新调出用户方案0
ATZ1 软复位并重新调出用户方案1
AT&An* 握手异常终止(备选) 缺省:1
AT&A0 在握手时禁止用户进行异常终止。当拨号或应答时,握手不能异常终止,只有DTR 信号下降。AT&A1 用户可以在握手时进行异常终止.在接收到DTE的字符后,发起和应答可以在握手期间随时进行异常终止.
AT&Cn* RS232-C DCD 设置缺省:1
AT&C0 DCD为ON,不论来自远端的调制解调器的数据载波的状态为何。
AT&C1 DCD 跟随来自于远端调制解调器的数据载波的状态
AT&Dn* RS232-C DTR 设置缺省:2
决定了调制解调器与来自串口的DTR信号相关的操作。由于跟踪DTR的下降引起的操作在下表列出:
| |
&D0 |
&D1 |
&D2 |
&D3 |
| &Q0 |
NONE |
2 |
3 |
4 |
| &Q1 |
1 |
2 |
3 |
4 |
| &Q2 |
3 |
3 |
3 |
3 |
| &Q3 |
3 |
3 |
3 |
3 |
| &Q4 |
1 |
2 |
3 |
4 |
| &Q5 |
NONE |
2 |
3 |
4 |
| &Q6 |
NONE |
2 |
3 |
4 |
1 调制解调器断开连接并发送结果码OK
2 若在数据状态下,则进入命令状态,并发送结果码OK
3 调制解调器断开连接并发送结果码OK, DTR 为 OFF时不能自动应答
4 调制解调器执行热启动(即与ATZ命令相同)
AT&Fn 重新调用工厂 设置缺省:0
&F0 重新调用作为V.42bis自动可靠方式的出厂缺省设置
&F1 重新调用作为MNP5自动可靠方式的出厂缺省设置
&F2 重新调用作为DIRECT方式的出厂缺省设置
&F3 重新调用作为MNP10方式自动可靠方式的出厂缺省设置(可选)
AT&Gn* 设置保护音 缺省:0
AT&G0 无保护音
AT&G1 无保护音
AT&G2 1800HZ保护音
AT&Jn* 电话插头选择 缺省:0
包含这一命令只是基于兼容性的考虑,没有任何功能
AT&J0 不操作任何功能
AT&J1 不操作任何功能
AT&Kn* DTE/调制解调器流 控制缺省:3
AT&K0 关闭流控制
AT&K3 使用RTS/CTS流控
AT&K4 使用XON/XOFF流控
AT&K5 使用透明XON/XOFF流控
AT&K6 使用RTS/CTS和XON/XOFF流控(作为传真方式下的缺省)
AT&Ln* 传输线类型 缺省:0
AT&L0 拨号线
AT&L1 二线专线 (备选)
AT&L2 四线专线 (备选)
AT&Mn* 通讯方式
与AT&Q0-3相同
AT&Pn* 拨号脉冲占空比 缺省:0
AT&P0 39%61%占空比@10PPS
AT&P1 33%67%占空比@10PPS
AT&P2 39%61%占空比@20PPS
AT&P3 33%67%占空比@20PPS
AT&Qn* 通讯方式 缺省:5
AT&Q0 选择直接异步操作
AT&Q1 选择同步模式一操作
AT&Q2 选择同步模式二操作
AT&Q3 选择同步模式三操作
AT&Q4 选择自动同步模式操作
AT&Q5 选择纠错模式操作
AT&Q6 选择标准模式下的异步操作
AT&Rn* RS232-C RTS/CTS 设置缺省:0
AT&R0 CTS跟踪RTS, 本地DTE发送的RTS由OFF变为ON经过由寄存器S26所规定的以10微秒为增量的延迟后,CTS变为ONAT&R1 调制解调器忽视RTS,除非使用了AT&K3命令,CTS保持为ON
AT&Sn* RS232-C DSR 设置缺省:0
AT&S0 DSR始终为ON
AT&S1 DSR根据EIA-232-C的规定操作
AT&Tn* 测试和诊断 缺省:4
测试只能在非纠错方式下(标准或直接模式)下的异步操作中进行,除参数7和8以外,要中止正在进行中的测试必须首先敲入退出符。若S18非零,则测试经由S18规定的时间后自动中止并显示OK。AT&T0 终止进行中的测试
AT&T1 启动本地模拟回环
AT&T3 在本地启动远端数字回环·,若连接未建通,返回ERROR
AT&T4 允许调制解调器响应来自远端的进行远程数字环回测试的请求
AT&T5 拒绝调制解调器响应来自远端的进行远程数字环回测试的求
AT&T6 启动远端数字环回测试,若连接未通,返回ERROR
T&T7 启动远端数字环回自测试,若连接未建通,返回ERROR
AT&T8 启动本地模拟环回自测试
AT&V 看当今配置及用户参数
AT&V0 查看当前配置、用户方案和存储的电话号码
AT&V1 显示最后一次数据连接的详细情况
AT&Wn 储存用户参数 缺省:0
AT&W0 作为用户0存贮
AT&W1 作为用户1存贮
AT&Xn* 选择同步时钟源 缺省:0
AT&X0 调制解调器提供传输时钟,内部时钟。 AT&X1 DTE提供传输时钟,外部时钟。
AT&X2 由调制解调器从接外载波信号中提供传输时钟,从属接收时钟
AT&Yn* 指示缺省用户参数 缺省:0
在硬复位后可选择将使用的用户方案。
AT&Y0 选择用户方案0
AT&Y1 选择用户方案1
AT&Zn=x 储存电话号码(n=0-3) 缺省:0
将一36位数字电话号码(x)存放在一指定电话号码表中(n), 作以后拨号用(参见命令ATDS=n)
AT\An 最大MNP块的大小缺省:2
AT\A0 设最大块为64个字符
AT\A1 设最大块为128个字符
AT\A2 设最大块为192个字符
AT\A3 设最大块为256个字符
AT\Bn 发送中断信号(n=1-9) 缺省:3
当在非MNP连接期间输入此命令,调制解调器向远端调制解器发送一中断信号,中断信号长度参数为n值的100倍(以毫秒 为单位),在MNP模式下,输入此命令,调制解调器向远端调制解调器发送一链路注意码PDU
AT\Gn 调制解调器到调制解调器的流控制 缺省:0
AT\G0 关闭流控(XON/XOFF)
AT\G1 打开流控(XON/XOFF)
AT\Jn DTE速率自动调整控制 缺省:0
AT\J0 关闭匹配线路速率的DTE速率调整功能
AT\J1 打开匹配线路速率的DTE速率调整功能
AT\Kn 中断控制 缺省:5
在数据传输期间收到来自DTE的中断信号时,调制解调器作出如下响应AT\K0,2,4 调制解调器进入连机命令状态,而不向远端发送中断信号
AT\K1 调制解调器清空终端的缓冲器并向远端调制解调器发送中断信号
AT\K3 调制解调器不清空终端的缓冲器,但向远端调制解调器发送中断信号
AT\K5 调制解调器随发送的数据发送中断信号. 调制解调器在连机命令状态时数据传输过程中,做如下操作
AT\K0,1 调制解调器清空终端的缓冲器,并向远端调制解调器发送中断信号
AT\K2,3 调制解调器不清空缓冲器,但向远端调制解调器发送中断信号
AT\K4,5 调制解调器随传输的数据按顺序发送中断信号 在非纠错模式下收到来自DTE的中断信号时,调制解调器做如下操作
AT\K0,1 调制解调器清除终端的缓冲器,并向本地DTE发送中断信号
AT\K2,3 调制解调器不清除缓冲器,但向本地DTE发送中断信号
AT\K4,5 调制解调器随接收的数据按顺序发送中断信号
AT\Ln MNP块传输控制 缺省:0
AT\L0 对于MNP链路连接使用流模式
AT\L1 对于MNP链路连接使用块模式
AT\Nn 操作模式控制 缺省:3
AT\N0 选择标准速度缓存模式(无纠错)
AT\N1 选择直接模式(等效于&M0,&Q0)
AT\N2 选择可靠模式,可靠连接失败会使调制解调器挂机
AT\N3 选择自动可靠模式
AT\N4 选择LAPM纠错模式,LAPM纠错连接失败会使调制解调器挂机
AT\N5 选择MNP纠错模式,MNP纠错连接失败会使调制解调器挂机
AT\Vn 单线连接信息 缺省:0
AT\V0 关闭单线连接信息。
AT\V1 打开单线连接信息。
AT%C* 压缩控制 缺省: 3
AT%C0 关闭数据压缩 AT%C1 打开MNP5数据压缩
AT%C2 打开V.42bis数据压缩
AT%C3 打开MNP5和V.42bis数据压缩
AT%En 开/关自动均衡 缺省:2
控制是使调制解调器自动监听线路质量并请求均衡(%E1)还是当线路质量不好时降速,线路质量好时升速。
AT%E0 关闭线路质量监听和自动均衡。
AT%E1 打开线路质量监听和自动均衡。
AT%E2 打开线路质量监听和速率自动调整上升或下降。
AT%E3 打开线路质量监听和采用快速挂机的自动均衡。
AT%L 报告接收灵敏度
返回接收信号的电平值,提供以下数值
001=-1dBm接收电平
002=-2dBm接收电平
: :
043=-43dBm接收电平
AT%On 选择应答或呼叫模式 缺省:1
AT%O0 选择应答式模
AT%O1 选择发起式模
AT%Rn 选择接收灵敏度 (适用於专线型号) 缺省:0
AT%R0 -43dBm
AT%R1 -33dBm
备选:适用於拔号线型号,JP2跳线:-33dBM 连接1-2 针;-43 连接2-3针
AT%Q 显示线路信号质量
返回眼图指标(EQM)值的高字节,该字节的表示范围为0到127,当这一数值为70DC±10(依赖于线路速率)或更大时,若已使用了AT%E1命令则调制解调器将自动均衡,标准连接时这一数在0到15之间。到60时则为较差连接。
AT#CIDn 呼叫者身份鉴定 缺省:0
AT#CID=0关闭呼叫者身份鉴定
AT#CID=1打开DTE格式化形式的呼叫者身份鉴定
AT#CID=2打开DTE非格式化形式的呼叫者身份鉴定
AT#CID? 从调制解调器中恢复当前呼叫者身份鉴定方式
AT#CID=? 返回调制解调器允许模式的列表,表中各部分间用逗号隔开
AT-SDR=n 鉴别性振铃 缺省:0
AT-SDR=0 允许任何振铃、并报告”RING”
AT-SDR=1 允许一类型振铃
AT-SDR=2 允许二类型振铃
AT-SDR=3 允许一及二类型振铃
AT-SDR=4 允许三类型振铃
AT-SDR=5 允许一及三类型振铃
AT-SDR=6 允许二及三类型振铃
AT-SDR=7 允许一、二及三类型振铃
| 振铃类型 |
振铃时段模式 |
| 1 |
响2秒、停4秒 |
| 2 |
响0.8秒、停0.4秒、响0.8秒、停4秒 |
| 3 |
响0.4秒、停0.2秒、响0.4秒、停0.2秒、响0.8秒、停4秒 |
AT+MS* 选择线路调制方式
命令格式为(336型号):
AT+MS=<模式>,<自动模式>,<最小速率>,<最大速率>
缺省值为 AT+MS=11,1,300,33600 (336型号)命令格式为(560型号):
AT+MS=<模式>,<自动模式>,<最小速率>,<最大速率>,
<x_law>,<rb_signal>,<maxup_rate>
缺省值为 AT+MS=12,1,300,56000,33600 (560型号)
AT+MS? 向包含所选选项的DTE发送一信息流
AT+MS=? 向包含所提供选项的DTE发送一信息流
| 自动模式 |
选 项 |
| 0 |
关闭自动模式 |
| 1 |
打开自动模式 |
| 模式 |
调制方式选择 |
可能 波特率(bps) <最小 波特率> <最大 波特率> |
| 0 |
V.21 |
300 |
| 1 |
V.22 |
1200 |
| 2 |
V.22bis |
2400或1200 |
| 3 |
V.23 |
1200 |
| 9 |
V.32 |
9600或4800 |
| 10 |
V.32bis |
14400,12000,9600,7200 或4800 |
| 11 |
V.34 |
33600,31200,28800,26400,24000,21600,19200, 16800,14400,12000,
9600,7200,4800或2400 |
| 12 |
V.90 |
56000,54667,53333,52000,50667,49333,48000,46667,45333,42667,
41333,40000,38667,37333,36000,34667,33333,32000,30667,29333,
28000 (560型号适用) |
| 56 |
K56flex |
56000,54000,52000,50000,48000,46000,44000,42000,40000,38000,
36000,34000,32000 (560型号适用) |
| 64 |
Bell 103 |
300 |
| 69 |
Bell 212 |
1200 |
<x_law> 是一个可选的数字,用来确定码类型,选择是:
0 = u-Law 1 = A-Law注意:ATZ命令将复位<x_law>值为0 (u-Law)。
<rb_signaling> 是一个可选的数字,用于配置一个发送数据的调制解调器产生“丢失位”信号或不产生“丢 失位”信号;或配置一台接收数据的调制解调器检测“丢失位”信号或不检测“丢失位”信 号。选择是:
0 = 发送数据的调制解调器产生丢失位信号。接收数据的调制解调器检测丢失位信号。1= 发送数据的调制解调器不产生丢失位信号。接收数据的调制解调器不检测丢失位信号。
注意:ATZ命令将复位<rb_signaling>值为0。
Maxup_rate : 连接速率的最大值。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1535176
Posted: January 14, 2008 at 4:39 pm | Tags: cache, flash, RAM, SDRAM, 介绍, 历史, 图片, 开发, 技术, 类, 缓存, 芯片
终于知道为什么SDRAM都被CPU当做Internal RAM来用。
凡是对电脑有所了解的朋友都知道内存这玩意,可是,可能有不少朋友对内存的认识仅仅局限在SDRAM和DDR SDRAM这两种类型,事实上,内存的种类是非常多的,从能否写入的角度来分,就可以分为RAM(随机存取存储器)和ROM(只读存储器)这两大类。每一类别里面有分别有许多种类的内存。以下就让我们看看内存到底有些什么种类吧!

一、RAM(Random Access Memory,随机存取存储器)

RAM的特点是:电脑开机时,操作系统和应用程序的所有正在运行的数据和程序都会放置其中,并且随时可以对存放在里面的数据进行修改和存取。它的工作需要由持续的电力提供,一旦系统断电,存放在里面的所有数据和程序都会自动清空掉,并且再也无法恢复。
根据组成元件的不同,RAM内存又分为以下十八种:
01.DRAM(Dynamic RAM,动态随机存取存储器):

这是最普通的RAM,一个电子管与一个电容器组成一个位存储单元,DRAM将每个内存位作为一个电荷保存在位存储单元中,用电容的充放电来做储存动作,但因电容本身有漏电问题,因此必须每几微秒就要刷新一次,否则数据会丢失。存取时间和放电时间一致,约为2~4ms。因为成本比较便宜,通常都用作计算机内的主存储器。
02.SRAM(Static RAM,静态随机存取存储器)

静态,指的是内存里面的数据可以长驻其中而不需要随时进行存取。每6颗电子管组成一个位存储单元,因为没有电容器,因此无须不断充电即可正常运作,因此它可以比一般的动态随机处理内存处理速度更快更稳定,往往用来做高速缓存。
03.VRAM(Video RAM,视频内存)

它的主要功能是将显卡的视频数据输出到数模转换器中,有效降低绘图显示芯片的工作负担。它采用双数据口设计,其中一个数据口是并行式的数据输出入口,另一个是串行式的数据输出口。多用于高级显卡中的高档内存。
04.FPM DRAM(Fast Page Mode DRAM,快速页切换模式动态随机存取存储器)

改良版的DRAM,大多数为72Pin或30Pin的模块。传统的DRAM在存取一个BIT的数据时,必须送出行地址和列地址各一次才能读写数据。而FRM DRAM在触发了行地址后,如果CPU需要的地址在同一行内,则可以连续输出列地址而不必再输出行地址了。由于一般的程序和数据在内存中排列的地址是连续的,这种情况下输出行地址后连续输出列地址就可以得到所需要的数据。FPM将记忆体内部隔成许多页数Pages,从512B到数KB不等,在读取一连续区域内的数据时,就可以通过快速页切换模式来直接读取各page内的资料,从而大大提高读取速度。在96年以前,在486时代和PENTIUM时代的初期,FPM DRAM被大量使用。
05.EDO DRAM(Extended Data Out DRAM,延伸数据输出动态随机存取存储器)

这是继FPM之后出现的一种存储器,一般为72Pin、168Pin的模块。它不需要像FPM DRAM那样在存取每一BIT 数据时必须输出行地址和列地址并使其稳定一段时间,然后才能读写有效的数据,而下一个BIT的地址必须等待这次读写操作完成才能输出。因此它可以大大缩短等待输出地址的时间,其存取速度一般比FPM模式快15%左右。它一般应用于中档以下的Pentium主板标准内存,后期的486系统开始支持EDO DRAM,到96年后期,EDO DRAM开始执行。。
06.BEDO DRAM(Burst Extended Data Out DRAM,爆发式延伸数据输出动态随机存取存储器)
这是改良型的EDO DRAM,是由美光公司提出的,它在芯片上增加了一个地址计数器来追踪下一个地址。它是突发式的读取方式,也就是当一个数据地址被送出后,剩下的三个数据每一个都只需要一个周期就能读取,因此一次可以存取多组数据,速度比EDO DRAM快。但支持BEDO DRAM内存的主板可谓少之又少,只有极少几款提供支持(如VIA APOLLO VP2),因此很快就被DRAM取代了。
07.MDRAM(Multi-Bank DRAM,多插槽动态随机存取存储器)

MoSys公司提出的一种内存规格,其内部分成数个类别不同的小储存库 (BANK),也即由数个属立的小单位矩阵所构成,每个储存库之间以高于外部的资料速度相互连接,一般应用于高速显示卡或加速卡中,也有少数主机板用于L2高速缓存中。
08.WRAM(Window RAM,窗口随机存取存储器)

韩国Samsung公司开发的内存模式,是VRAM内存的改良版,不同之处是它的控制线路有一、二十组的输入/输出控制器,并采用EDO的资料存取模式,因此速度相对较快,另外还提供了区块搬移功能(BitBlt),可应用于专业绘图工作上。
09.RDRAM(Rambus DRAM,高频动态随机存取存储器)

Rambus公司独立设计完成的一种内存模式,速度一般可以达到500~530MB/s,是DRAM的10倍以上。但使用该内存后内存控制器需要作相当大的改变,因此它们一般应用于专业的图形加速适配卡或者电视游戏机的视频内存中。
10.SDRAM(Synchronous DRAM,同步动态随机存取存储器)

这是一种与CPU实现外频Clock同步的内存模式,一般都采用168Pin的内存模组,工作电压为3.3V。 所谓clock同步是指内存能够与CPU同步存取资料,这样可以取消等待周期,减少数据传输的延迟,因此可提升计算机的性能和效率。
11.SGRAM(Synchronous Graphics RAM,同步绘图随机存取存储器)

SDRAM的改良版,它以区块Block,即每32bit为基本存取单位,个别地取回或修改存取的资料,减少内存整体读写的次数,另外还针对绘图需要而增加了绘图控制器,并提供区块搬移功能(BitBlt),效率明显高于SDRAM。
12.SB SRAM(Synchronous Burst SRAM,同步爆发式静态随机存取存储器)
一般的SRAM是非同步的,为了适应CPU越来越快的速度,需要使它的工作时脉变得与系统同步,这就是SB SRAM产生的原因。
13.PB SRAM(Pipeline Burst SRAM,管线爆发式静态随机存取存储器)
CPU外频速度的迅猛提升对与其相搭配的内存提出了更高的要求,管线爆发式SRAM取代同步爆发式SRAM成为必然的选择,因为它可以有效地延长存取时脉,从而有效提高访问速度。
14.DDR SDRAM(Double Data Rate二倍速率同步动态随机存取存储器)

作为SDRAM的换代产品,它具有两大特点:其一,速度比SDRAM有一倍的提高;其二,采用了DLL(Delay Locked Loop:延时锁定回路)提供一个数据滤波信号。这是目前内存市场上的主流模式。
15.SLDRAM (Synchronize Link,同步链环动态随机存取存储器)

这是一种扩展型SDRAM结构内存,在增加了更先进同步电路的同时,还改进了逻辑控制电路,不过由于技术显示,投入实用的难度不小。
16.CDRAM(CACHED DRAM,同步缓存动态随机存取存储器)
这是三菱电气公司首先研制的专利技术,它是在DRAM芯片的外部插针和内部DRAM之间插入一个SRAM作为二级CACHE使用。当前,几乎所有的CPU都装有一级CACHE来提高效率,随着CPU时钟频率的成倍提高,CACHE不被选中对系统性能产生的影响将会越来越大,而CACHE DRAM所提供的二级CACHE正好用以补充CPU一级CACHE之不足,因此能极大地提高CPU效率。
17.DDRII (Double Data Rate Synchronous DRAM,第二代同步双倍速率动态随机存取存储器)

DDRII 是DDR原有的SLDRAM联盟于1999年解散后将既有的研发成果与DDR整合之后的未来新标准。DDRII的详细规格目前尚未确定。
18.DRDRAM (Direct Rambus DRAM)

是下一代的主流内存标准之一,由Rambus 公司所设计发展出来,是将所有的接脚都连结到一个共同的Bus,这样不但可以减少控制器的体积,已可以增加资料传送的效率。
二、ROM(READ Only Memory,只读存储器)
ROM是线路最简单半导体电路,通过掩模工艺,一次性制造,在元件正常工作的情况下,其中的代码与数据将永久保存,并且不能够进行修改。一般应用于PC系统的程序码、主机板上的 BIOS (基本输入/输出系统Basic Input/Output System)等。它的读取速度比RAM慢很多。
根据组成元件的不同,ROM内存又分为以下五种:
1.MASK ROM(掩模型只读存储器)
制造商为了大量生产ROM内存,需要先制作一颗有原始数据的ROM或EPROM作为样本,然后再大量复制,这一样本就是MASK ROM,而烧录在MASK ROM中的资料永远无法做修改。它的成本比较低。
2.PROM(Programmable ROM,可编程只读存储器)
这是一种可以用刻录机将资料写入的ROM内存,但只能写入一次,所以也被称为“一次可编程只读存储器”(One Time Progarmming ROM,OTP-ROM)。PROM在出厂时,存储的内容全为1,用户可以根据需要将其中的某些单元写入数据0(部分的PROM在出厂时数据全为0,则用户可以将其中的部分单元写入1), 以实现对其“编程”的目的。
3.EPROM(Erasable Programmable,可擦可编程只读存储器)

这是一种具有可擦除功能,擦除后即可进行再编程的ROM内存,写入前必须先把里面的内容用紫外线照射它的IC卡上的透明视窗的方式来清除掉。这一类芯片比较容易识别,其封装中包含有“石英玻璃窗”,一个编程后的EPROM芯片的“石英玻璃窗”一般使用黑色不干胶纸盖住, 以防止遭到阳光直射。
4.EEPROM(Electrically Erasable Programmable,电可擦可编程只读存储器)

功能与使用方式与EPROM一样,不同之处是清除数据的方式,它是以约20V的电压来进行清除的。另外它还可以用电信号进行数据写入。这类ROM内存多应用于即插即用(PnP)接口中。
5.Flash Memory(快闪存储器)

这是一种可以直接在主机板上修改内容而不需要将IC拔下的内存,当电源关掉后储存在里面的资料并不会流失掉,在写入资料时必须先将原本的资料清除掉,然后才能再写入新的资料,缺点为写入资料的速度太慢。
Previous Page Next Page