2008年7月28日星期一

60条经典网话

1、吃自助最高境界:扶墙进,扶墙出。
  2、结婚必备条件:有车有房,父母双亡。
  3、没有钱,没有权,再不对你好点,你能跟我?
  4、拿份报纸上厕所,俺是读书人。
  5、上Google上百度一下。
  6、女人一定要对自己好一点。一旦累死了,就会有别的女人花你的钱,住你的房,睡你的老公,打你的娃!
  7、你的丑和你的脸没有关系……
  8、长个包子样,就别怨狗跟着。
  9、争吵的时候,男人和女人的区别就像步枪和机关枪的区别。
  10、爷爷都是从孙子走过来的……
  11、老天,你让夏天和冬天同房了吧?生出这种鬼天气!
  12、鸟大了什么林子都有!
  13、听说女人如衣服,兄弟如手足。回想起来,咱这尊千手观音竟然裸奔了20多年!
  14、不怕虎一样的敌人,就怕猪一样的队友。
  15、夏天就是不好,穷的时候我连西北风都没得喝……
  16、随你大小便!
  17、怀才就像怀孕,时间久了才能让人看出来。
  18、没什么事就不要找我,有事了更不要找我。
  19、你以为我会眼睁睁地看着你去送死?我会闭上眼睛的。
  20、锻炼肌肉,防止挨揍!
  21、天使之所以会飞,是因为她们把自己看得很轻……
  22、我想早恋,可是已经晚了……
  23、拥抱真是个奇怪的东西,明明靠的那么近,却看不见彼此的脸。
  24、揍你个性生活不能自理!
  25、当你穿上爱情的婚纱,我也披上了和尚的袈裟……
  26、其实我是一个天才,可惜天妒英才!
  27、请你以后不要在我面前说英文了,OK?
  28、思想有多远,你就给我滚多远!
  29、男人的谎言可以骗女人一夜,女人的谎言可以骗男人一生!
  30、好久没有人把牛皮吹的这么清新脱俗了!
  31、老板,钱对你来说真的就那么重要吗?讲了三个多小时了一分钱都不降?
  32、起那么早干嘛?夜总会还没开门呢!
  33、一觉醒来,天都黑了。
  34、我要是做了人事部经理,第一件事就是提拔自己做老总。
  35、我每天除了吃饭的时间全在减肥,你还说我没有毅力?
  36、水能载舟,亦能煮粥。
  37、买了电脑不上宽带,就好比酒肉都准备好了却在吃饭前当了和尚。
  38、只要你敢死,我就敢埋!
  39、人又不聪明,还敢学人家秃顶?
  40、有一个很古老的传说——能在XX校园里看到美女的人会长生不老……
  41、如果连你也不理我,我就变成狗不理了……
  42、生,容易;活,容易;生活,不容易。
  43、打死你我也不会说。
  44、钱可以解决的问题都不是问题。
  45、念了十几年书,想起来还是幼儿园比较好混!
  46、连广告也信,读书读傻了吧?
  47、戒烟容易,戒你太难!
  48、不吃饱哪有力气减肥啊?
  49、睡眠是一门艺术——谁也不能阻挡我追求艺术的脚步。
  50、奈何桥上的老婆婆都卖上百事可乐了,你叫我怎么忘记你?
  51、早起的鸟儿有虫吃,早起的虫虫被鸟吃。
  52、如果我做了皇帝,一定封你当太子。
  53、只要锄头舞的好,哪有墙角挖不倒?
  54、天哪,我的衣服又瘦了!
  55、我在女友手机里的名字是“他”,分手后,我就变成了“它”。
  56、避孕的效果:不成功,便****。
  57、我和你不一样,因为我是人。
  58、问君能有几多愁,恰似一群太监上青楼。
  59、我真想亲口管你爷爷叫声:“爹!”
  60、我喝水只喝纯净水,牛奶只喝纯牛奶,所以我很单纯……

2008年7月24日星期四

MTK(联发科)手机主芯片详解

MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228
均为基带芯片,所以芯片均采用ARM7的核。

MT6305、MT6305B为电源管理芯片。

MT6129为RF芯片
RF3146(7×7mm)、RF3146D(双频)、RF3166(6×6mm)为RFMD的PA。

MT6205为最早的方案,只有GSM的基本功能,不支持GPRS、WAP、MP3
等功能。(2003年MP)

MT6218为在MT6205基础上增加GPRS、WAP、MP3功能。MT6217为MT6218的cost down方案,与MT6128 PIN TO PIN,只是软件不同而已,另外MT6217支持16bit数据。(2004年MP)

MT6219为MT6218上增加内置AIT的1.3M camera处理IC,增加MP4功能。
8bit数据。(2005年MP)

MT6226为MT6219 cost down产品,内置0.3M camera处理IC,支持GPRS、WAP、MP3、MP4等,内部配置比MT6219优化及改善,比如配蓝牙是可用很便宜的芯片CSR的BC03模块USD3即可支持数据传输(如听立体声MP3等)功能。

MT6226M为MT6226高配置设计,内置的是1.3M camera处理IC。(2006年MP)

MT6227与MT6226功能基本一样,PIN TO PIN,
只是内置的是2.0M camera处理IC。(2006年MP)

MT6228比MT6227增加TV OUT功能,内置3.0M camera处理IC,
支持支持GPRS、WAP、MP3、MP4。

MTK(联发科)手机主芯片详解!
我公司供应的MTK手机套片详解:
MT6205、MT6217、MT6218、MT6219、MT6226、MT6227、MT6228均为基带芯片,所以芯片均采用ARM7的核(2004年MP)。
MT6305、MT6305B为电源管理芯片。
MT6129为RF芯片,射频处理器,转换射频信号
RF3146(7×7mm)、RF3146D(双频)、RF3166(6×6mm)为RFMD的PA。
MT6205 只有GSM的基本功能,不支持GPRS、WAP、MP3等功能
MT6218 为在MT6205基础上增加GPRS、WAP、MP3功能。
MT6217 为MT6218的cost down方案,支持16bit数据,功能与6218相同,只是软件不同。(2004年MP)
MT6219 在MT6218上增加内置AIT的1.3M camera处理IC,增加MP4功能。8bit数据。(2005年MP)
MT6226MT6219 cost down产品,内置30万 摄相头处理IC,支持GPRS、WAP、MP3、MP4,内部配置比MT6219优化及改善,比如配蓝牙是可用很便宜的芯片CSR的BC03模块USD3即可支持数据传输(如听立体声MP3等)功能
MT6226M MT6226的高配置设计,内置的是1.3M camera处理IC。(2006年MP)
MT6227与MT6226功能基本一样,与MT6226功能相同,内置200万相素摄相头处理IC。(2006年MP)
MT6228 在MT6227的基础上内置300万相素摄相头处理IC,增加TV OUT视频输出功能,支持支持GPRS、WAP、MP3、MP4。(2006年MP)
从MT6226后软件均可支持网络摄像头功能,也就是说你的机子可以用于QQ视频


(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)

2008年7月23日星期三

IT人,不要一辈子靠技术生存

IT人,不要一辈子靠技术生存
(http://blog.csdn.net/mac_cm)

我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOT。NET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊).

一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事 市场开发,跑腿的人,没有前途。

不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)

更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。

也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。

比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给他换个地方,他马上会成为一个勤奋且出众的人。)

二、在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。

有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。

朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。

如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)

三、你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。

如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。

创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。

2008年7月22日星期二

嵌入式应用软件任务划分的原则

嵌入式应用软件任务划分的原则

(http://blog.csdn.net/mac_cm)

在基于实时操作系统(RTOS,RealTime Operating System)的单片机应用软件设计中,“任务”是一个很重要的概念。有专家指出[1],把一个应用系统分为多少个任务且定义每一个任务各负责什么事情,这是一门艺术。对于任务的划分,并没有一个人人都要遵守的规则,不同的人来设计一个同样规格要求的系统,会有不同的方案。然而,到目前为止,很难看到有关论文对任务划分的方法有比较详细而系统的介绍。本文将深入研究划分任务的方法,并在此基础上,从实用的角度给出编写基于RTX51 Tiny实时操作系统的应用软件的指导方针。

1 任务的概念和应用软件开发过程

在嵌入式实时多任务系统开发中,用C语言代码表示的任务是一个无限的循环程序。任务不能有返回,不能有退出出口,但是任务可以被杀死,包括被别的任务杀死或自杀[2]。任务的概念与操作系统中的进程概念相同,一个任务是独立的执行进程,可以与其他的并发任务竞争CPU时间。

基于RTOS的单片机应用软件开发过程:首先是根据系统设计方案明确应用软件的功能,然后结合RTOS的并发特性(或准并发特性),对应用软件要实现的功能进行大小适当的划分,也就是把应用软件的功能按照一定的原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

2 任务划分的原则

任务划分有3个原则,分别介绍如下。

2.1 原则1

原则1是将同一个外设的访问放在一个任务中。

对每个独立的硬件(例如串行通信端口)进行操作的驱动程序段放在一个任务中。也就是说,要想对某个设备资源进行操作,只有依靠执行相应的任务来实现。这样无论何时切换任务,都不会对任何独立的“外设”造成影响。

这样做能够避免嵌入式操作系统的特殊问题——资源冲突和重入问题,而且利于系统维护与升级。各个任务之间要实现通信,可以调用os_send_signal函数及全局变量来实现。

所谓“资源冲突”,就是任务A在访问某个资源时,恰好发生了任务切换——由任务A切换到任务B,任务B也访问这个资源且改变了它的状态,这样当再次执行任务A时,就可能发生冲突或带来不确定性。而所谓“重入”,是指假设任务A在运行某个函数,发生任务切换后,任务B也运行这个函数,这样就会破坏任务A执行这个函数时的现场,从而可能导致任务A执行函数时结果不正确。这种问题尤其容易出现在串行接口器件的操作中,例如串口,串行的A/D、D/A器件等。

2.2 原则2

原则2是要通过任务分割提高系统的实时性。

在嵌入式多任务实时系统中,任务是指一个程序分段。这个程序分段被操作系统当作一个基本单元来调度。典型地,每个任务都是一个无限的循环。

RTOS本质上就是嵌入的实时内核,它负责管理各个任务,或者说是为每个任务分配CPU时间,并且负责任务之间的通信。实时内核可分为可剥夺型和不可剥夺型两类。因此,按照所使用内核的不同,嵌入式实时系统也可分为两类:使用不可剥夺型内核的嵌入式实时系统和使用可剥夺型内核的嵌入式实时系统。

2.2.1 长任务的定义

在RTOS中,长任务就是指整个任务的执行时间较长,超出了RTOS中其他某一个或某几个任务的实时要求容限,而对整个RTOS的实时性构成威胁的那些任务。需要注意的是,长任务与复杂任务不能混淆,复杂任务的执行时间不一定长,简单任务也可能会构成长任务。

2.2.2 长任务对RTOS的影响

当使用可剥夺型实时内核时,长任务由于执行的时间较长,因而更容易被高优先级的任务打断;一旦高优先级的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说任务被挂起了,那个高优先级的任务立刻得到了CPU的控制权。这样会出现两个问题:一是长任务可能在一次执行的过程中被频繁打断,长时间得不到一次完整的执行;二是长任务被打断时,可能要保存大量的现场信息,其目的是为了保证在高优先级任务执行完返回后,长任务能得以继续执行。然而,这样做要占用一定的系统资源,同时保存现场本身也是要占用CPU时间的,因此,实时性也会下降。

当使用不可剥夺型实时内核时,长任务对RTOS的影响更为明显,因为在这种内核中,任务的响应时间取决于最长的任务执行时间。也就是说,由于长任务的存在,任务的响应时间要变长。其结果是CPU长时间停留在长任务中,其他任务得不到实时的响应,甚至根本得不到执行,系统的实时性势必要下降。

总之,无论是使用可剥夺型内核,还是使用不可剥夺型内核,长任务都会对RTOS构成严重的威胁。

2.2.3 长任务问题的解决方法

解决长任务问题最有效的途径是进行任务分割。所谓“任务分割”是指将影响系统实时性的长任务分割成若干个小任务。这样单个任务的执行时间变短,系统的任务响应时间变短,实时性得以提高。

(1) 对任务的分析与计算

当然,长任务的分割必须结合系统中所使用的内核,以及各任务对实时性的要求等情况,进行必要的分析与计算,才能保证分割的合理性和有效性,具体的步骤如下。

① 分析系统共有多少个任务,这些任务对实时性的要求有多高,求出各个任务所要求的最低执行频率(f1,f2,…,fn)。

② 计算目前各任务的实际执行时间(t1,t2,…,tn)

③ 确定系统中的长任务。如果max(t1,t2,…,tn)≤min(1/f1,1/f2,…,1/fn),则此系统中不存在长任务。如果max(t1,t2,…,tn)>min(1/f1,1/f2,…,1/fn),则存在长任务,而且执行时间为max(t1,t2,…,tn)的那个任务就是要找的长任务。

④ 分析此长任务是否需要分割,分析一下是什么原因导致执行的时间过长,这个时间是否能够通过程序的优化来缩短?如果能,则不需要进行任务分割;否则,要对这个长任务进行分割。

(2) 实施长任务分割

常用的任务分割的方法有以下两种:

① 将长任务按功能分为若干个小模块,每一个模块构成一个小任务,每个小任务实现一种相对独立的功能,且要保证执行时间t

② 有的长任务比较特殊,例如键盘任务和动态LED数码管显示任务,很难按照上面的方法把它分成若干个功能相对独立的小模块。这时,一般是按照方便保存现场信息的原则,将其强制分割成若干个小任务,每个小任务在min(1/f1,1/f2,…,1/fn)时间内主动保存现场信息、放弃CPU的控制权,等到再次被内核调度时继续执行。这种分割方法相对而言较复杂,各任务之间界限不是很明显,看似未经分割,但实际上它却是由多次任务中断来完成的。

2.3 原则3

原则3是要将软件工程中的“解耦原则”用于任务划分。

可以采用软件工程中的解耦原则对应用程序进行任务的划分。任务之间的耦合是影响软件复杂程度的一个重要因素,应该采取下述设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。具体方法可参见软件工程方面的书籍,例如文献[3]。

3 基于RTX51 Tiny的应用软件设计指导

RTX51是一个德国Keil Software公司开发的用于8051系列单片机的多任务实时操作系统[4]。RTX51有2个不同的版本。

(1) 完全版RTX51 Full

完全版RTX51 Full允许4个优先级的任务时间片轮转调度和抢先式的任务切换,可以并行地利用中断功能。信号和信息可以通过邮箱系统在任务之间互相传递,可以从一个存储池中分配和释放内存,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号或信息。

(2) 小型版RTX51 Tiny

小型版RTX51 Tiny是RTX51的一个子集,它可以很容易地在没有任何外部存储器的单片8051系统上运行。RTX51 Tiny仅支持时间片轮转任务切换和使用信号进行任务切换,不支持抢先式的任务切换,可以并行地利用中断功能,可以强迫一个任务等待中断、超时以及从另一个任务或中断发出的信号,不能进行信息处理,也不支持存储器分配或释放。RTX51 Tiny是一种不可剥夺型实时操作系统内核。

基于RTX51 Tiny实时操作系统的单片机应用软件设计,首先应该根据RTX51 Tiny操作系统的准并发特性,对应用软件要实现的功能进行大小适当的划分——按照上述3个原则划分为若干个任务模块,并对各个任务间的通信和时延进行仔细的确认。

编写基于RTX51 Tiny的应用软件的指导方针如下:

① 包含头文件rtx51tny.h在应用程序中。

② 不要写C语言主函数main()。RTX51 Tiny操作系统内核中已经有它自己的主函数main()。

③ 应用程序应该至少包括1个任务函数(task function)。

④ RTX51 Tiny应用程序必须中断使能(EA=1),因为RTX51 Tiny操作系统使用了定时器T0中断。

⑤ 应用程序至少调用1个RTX51 Tiny系统函数(如os_wait);否则,链接器将不会把RTX51 Tiny的系统库包含到应用程序中。

⑥ 任务task0是应用程序中第一个执行的函数。在任务task 0中,必须调用os_create_task函数来运行其他任务。

⑦ 任务task函数不必退出或返回。任务task必须使用一个while(1)结构或其他类似的结构。任务task函数不带参数,也没有返回值。使用系统函数os_delete_task挂起(halt)一个运行的任务。

⑧ 中断服务程序的编写方式,与不使用RTX51 Tiny操作系统下的编写方式相同。

⑨ 编译和链接应用程序有2种途径,一种是使用集成开发环境μVision 2 IDE,另一种是使用命令行工具CommandLine Tools。一般采用德国Keil Software公司提供的集成开发环境 μVision 2 IDE。

利用Keil Software公司提供的集成开发环境 μVision 2 IDE,创建RTX51 Tiny应用程序的开始的步骤如下:

① 运行Keil Software公司的集成开发环境 μVision 2 IDE。

② 运行菜单命令Project→Options for Target‘Target 1’,打开Target对话框,并在对话框中选择Target选项卡。

③ 从Operating system下拉列表框中选择RTX51 Tiny,如图1所示。



图1 选择RTX51 Tiny实时操作系统

4 结论

本文给出了划分任务的3个原则,分别是“对同一个外设的访问放在一个任务中”、“通过任务分割提高系统的实时性”和“软件工程中的‘解耦原则’用于任务的划分”。实践证明,这些任务划分的原则是行之有效的。另外,从实用的角度给出了编写基于RTX51 Tiny实时操作系统应用软件的指导方针。实际上,RTX51 Tiny实时操作系统对目标系统的硬件需求是很低的,随着半导体技术的发展,能够运行嵌入式实时操作系统的单片机芯片是很容易采购得到的。

人们越来越清楚地认识到,在嵌入式系统设计中引入实时操作系统的必要性[5]。在许多嵌入式系统中,不但要求系统能够及时响应随机发生的外部事件,并对其作出快速处理,通常还需要同时执行多个任务,并对每个任务作出实时响应。实践证明,对于这样的应用,采用嵌入式实时操作系统作为应用软件的设计平台和运行平台是一个良好的选择。

我在软件公司成长的第四年

我在软件公司成长的第四年
(http://blog.csdn.net/mac_cm)

前言:去年此时,将我在软件公司成长的三年工作总结放予网上,得到多方关注和很多朋友的肯定,一年来,收到了很多来自各地的求助、咨询等等邮件,也曾与大家共同分享工作心得。今年是我在软件公司的第四年,这一年,我做了些什么,又有哪些收获呢?承接上一年的总结,继续将今年的工作总结与大家分享,且来看看“我在软件公司成长的第四年”。

辞旧迎新的这段时间里,看到的,听到的,到处与总结、盘点有关。什么娱乐大盘点,十大新闻,十大电视剧,十大游戏,十大美女,十大流行金曲,十大小说,十大软件,十大富豪……只要沾得上边的,都可以好好排榜一番。而我,也早在心里酝酿,要好好总结今年一番,工作上的,生活里的,一年时间,如果不想让记忆就此流过,是有很多事情可以着笔的。

2005,是我在SK工作的第四个年头。很多人问我,在一个公司呆这么久,不会觉得乏味没有新鲜感吗?我回头想想去年、前年、大前年的工作,与今年相比,无论是公司里的人还是事,又是翻天覆地的变化。如果说是寻找新鲜感,我倒希望计划不要赶不上变化太多。且来看看,我这一年的工作是怎样一步一步从量变走向质变?

一月,春节到来之前,工作主要是总结和收尾。在这一个月内,我除了继续配合完成一些项目的收尾工作以外(包括江西产权系统IC卡的测试、包装、整理测试缺陷报告、功能规约、准备发货光盘、写用户手册;茂名项目用户手册的编写),我完成了个人年终总结,公司质量总结分析报告,参加研发中心部门总结会议,公司年终总结会议……一连串的总结,带来了很多对2005的暇想。内心里,期盼“一年更比一年好”的同时,也在思索着,自己的职业生涯该如何定位,三年了,还要不要继续留在同一间公司或是寻找另一片天空?在与多位领导交谈过后,我还是决定继续留在SK,尝试从配置管理员转变为总裁办公室秘书的新工作,那个时候,我其实并不清楚,接下来迎接我的有些什么?

二月,春节过后,就是计划大展拳脚的时候,我的工作也团绕计划来开展。参加公司的年度经营会议、营销中心会议,做好会前的议程安排、会议资料的准备、会议的主持以及会后的记录整理工作。在这个月,公司确定了今年的工作计划、营销计划,并与每一位中层管理干部、销售人员签订了“个人责任书”,试将考核落于始,先定目标再考核完成情况;同时,公司确定以业绩考核为重点市场,并将工作的重点放在三月份将要在河北廊坊召开的全国业绩考核工作会议的宣传工作上。经过多方努力,最后发行了一份业绩考核内刊,作为会议的宣传资料,我在其中主要是资料的收集、整理、校对、排版和资源的协调等工作。

三月,我的工作慢慢向营销部门靠近。半是忐忑中接下了tany移交的与代理沟通、网站留言客户的跟进工作,开始近距离接触市场、接触客户。这个月,我整理了公司相关的产品、市场宣传资料,并将所有的文档归类、扫描,形成CHM格式的电子宣传册。这份宣传册内容齐全丰富,在后续的客户跟进中派上了一些用场,只是由于容量太大,传输困难,现在已经束之高阁;与全国各地的代理联系沟通,用电话、邮件的形式解答代理所提的一些关于公司产品、政策等方面的问题,跟进合同的续签工作;对网站的留言进行电话跟进,在不泄露公司机密的前提下,尽可能满足各方需求,发送相关的资料;为了方便公司人员了解市场行情,开始尝试每周制作市场简报,将一周发生的行业信息、市场信息形成周报格式的文档,供大家参考。

四月,公司在确定要将融资工作作为今年的工作重点之一以后,商业计划书的写作也进入了紧锣密鼓阶段。都没有融资经验,摸石头过河的大家,希望请来的专业人士能够给出专业指导的同时,也开始了解商业计划书的相关格式、写作注意事项,并协助整理写作一些需要的材料;人员流动频繁的四月,在负责美工、测试、网管的同事相继离职,又没有新人接替工作的时候,我便临时兼任了这些工作,整理他们留下来的文档,熟悉先前的工作,解决诸如断网、重装系统等等工作,身兼数职,四处救火,淋漓尽致地发挥着万金油般的作用。

五月,融资工作初有起色,我们满心雀跃地迎接有可能成为公司战略伙伴的北京刘总的考察,作好演示PPT、演示系统、接待等一切准备工作。在公司人才紧缺的情况下,我这个菜鸟水平的人被推上了前方战场,第一次开始对外讲解、演示工作。战战兢兢之中,在经过几次三番的预演——提出意见改进——再预演——再提出意见改进——继续预演——继续提出意见改进的排练之后,我从一开始吞吞吐吐、心跳加快到正式演示时镇定自若、吐字清晰,花费了无数心血,这其中的喜乐悲辛,也只有当事人才能体会了。虽然最后因为种种原因融资没有成功,我在演示方面的表现却得到了肯定。整个五月,突然多了很多演示锻炼的机会,到南海CZ局给局长的演示,对青岛现场考察客户的系统演示,每一次演示,都意味着要写PPT,要准备演示系统,演示数据,要排练预演,为了不会说错话忘掉说什么,甚至写好台词,反复背诵。学习的过程,至今想来仍是一个苦涩的过程。在经过反复多次给处长、局长甚至国家领导演示之后,我相信自己已经完全可以胜任“演示”这项工作了。

六月,我开始了第一次全过程参与售前、现场开发实施的项目——深圳天健数据导入系统。从售前提供相关的系统说明文档,到签单后出差到现场参与项目工作,我第一次,实实在在地与客户接触,参与项目的具体工作。我主要是以EXCEL专家的身份协助客户制作清查表格,除了帮助客户解决在制表过程中无法实现的效果以外,更多的是作为劳动力帮助制表加快项目进度。当然,还少不了在项目过程中的一些需求整理、进度报告、客户方与我方开发人员的沟通工作。在深圳出差的一个月,几乎是我工作四年来最辛苦的一个月,状态一直是busy,busy,busy,一整天,除了腾出喝水、上厕所的时间以外,就是不断地键盘鼠标键盘鼠标,做着机械人般的重复劳动。成百上千份EXCEL表格,几乎是我这辈子见过、做过最多的表格。连续多日的高强度劳动,还抽时间回来公司去南海出差演示了一次,我感到前所未有的憔悴。不过,收获也很多很多。学会了怎样更好地与客户沟通;跟同事以认真、负责、专业的态度赢得了客户的认可;体验了另一个城市的工作和生活……感谢公司,给了我这样的一个机会。

七月,从深圳出差回来之后,已有一个月没有接触过公司里的工作,免不了收拾整理一番,心情、工作、状态。各个项目配置库的整理、备份,各个项目进度、系统功能的熟悉了解也变成了这一年来阶段性的、空闲下来做的工作。除去这些,静心工作,研究了sharepoint的安装、使用,可惜因为安装环境复杂等问题未能使用;起草了全国行政事业性国有资产的市场计划,重新设计表格整理客户资料;参与四川机关事务管理局的来访接待讨论会议,并准备相关的演示PPT、系统,以及演示。这一个月,以干零活、杂活为主,在回顾、总结、计划中度过。

八月,喜讯到来,公司签下了高明CZ局的单。有了深圳的第一次近距离接触客户,这一次便显得顺理成章。我又一次参与了从系统演示到现场安装、实施、培训的售前售后全过程工作。在琢磨如何做好这些技术支持工作的时候,我在支点网上找到一个网友写的《项目经理九阴真经》一文,如获至宝,除了好好研读,还全部下载成文,整理排版,并发给全公司同事共享,这本书得到了老板和众同事的好评,几乎成了我在此后做售前和售后工作时指导的明灯。去高明出差的一个星期,也是感慨良多,收获良多(见高明出差小记)。

九月,传来了东莞CZ局客户的需求,我便开始了又一个项目的跟进工作。写方案建议书,准备演示PPT,演示系统和数据,直到现在,三个月过后,这个项目经过在商务、需求多方面不断促进,至今还在跟进,在这中间,做了大量的沟通,需求、业务流程分析,原型演示的设计等工作,当然,这离不开其他同事的密切配合。融资工作在五月份北京刘总的考察未能取得成功之后,便没有再取得进展。这段时间,我加足马力在网上搜索风险投资公司的资料,把大大小小、国内国外的投资机构都搜罗了一番,一一发送邮件,看能不能因此找到一个对我公司感兴趣的投资商。这中间也收到一些回信,几个邮件来回之后还是觉得不适合。融资的工作大概不是随便发商业计划书给某某人、某某公司就可以轻而易举地打动人心进而成功的吧,公司未能在这项工作上取得突破,是我们2006年要继续探索的路。

十月,经过一年的艰苦努力、奋力拼搏,我们终于在九月里签下了开发区项目,这几乎是公司在黑暗中前进的一盏明灯,让我们看到了未来的丝丝希望。为了做好这个长期以来列为一号工程的单,研发部门调配了所有可出动的人手,我也加入了该项目组。计划是做实施培训工作,前期做的大多是配合link进行现场调研,需求分析,准备相关的演示PPT。到如今后期的阶段性测试工作也做完了,实施和培训工作却始终未能开展。一个项目的成功,开发方高度重视、技术精湛、产品功能齐全或许占很大的因素,但绝对与客户的重视、配合程度紧密相联,而这,往往是我们怎么努力也很难左右的。做政府部门业务之难、之变化多端我想无论是公司领导、销售人员还是开发人员都在这个项目中体会得淋漓尽致。除此之外,就是其它项目的配合,省厅设备清查EXCEL表格的修改,茂名项目的实施方案确定、表格整理、数据导入系统,甘肃国资委系统演示的跟进等等。

十一月,工作的重点主要围绕东莞和深圳两大售前项目开展。前者主要是到现场进行需求的调研、业务流程分析以及调研后演示系统的设计、开发跟进;后者主要是协助准备投标相关的标书,演示系统等。两项看似简单的工作,却也让人好好体验了一番忙碌,一直想静下心来好好地测试青岛项目的业绩考核系统,也因为这两项工作草草而过。

十二月,年底了,本该收尾盘点的时候我们却尽力作最后的冲刺,售前售后同时抓,想抓住新年的尾巴,为今年的努力写下壮丽的一笔。事情却往往难尽人意,辛苦跟进了一年的深圳项目废标了,踌躇满志想争取的湖北项目也未能拿下。尽管挫折重重,该争取的还是要继续争取,该努力的还是要继续努力,这一个月,还涉及了东莞演示系统的修改跟进;茂名项目的需求整理,修改跟进;天津城投项目系统的测试;辅助省厅项目的相关文档写作及项目跟进,也算是“尽人事,听天命”了。

回头看看这一年的工作,囊括了文职、演示、技术支持、网管、测试、配置管理、市场方方面面,在回答别人问我是做什么的时候,这仍然是一个让我左右为难的难题,即便公司冠我以“总裁办公室主管”一职仍然觉得什么也不像。甚至一度很为自己的职业定位而困扰,不知道“万金油”何年何月才能变成“特效药”?感谢九月里那一次意外的offer,让我有机会重新审视自己的职业定位,与T总深谈过后,更加明白了自己的优势劣势,坚定了自己的信念。尽管“万金油”也许成不了“特效药”,却时时能被人想起,时时派上用场发挥作用,又有何不可呢?

这一年来,很少可以对工作做月以上的计划,工作总是随着每个月甚至每一周项目/公司内务的轻重缓急变化而变化,今天难以预料明天的事。这当然与公司的市场、业务不稳定有很大的关系,不光个人、整个公司也很难计划。这便使很多工作的开展有点像打游击,开了个头却难以再配备足够资源进行后续的工作开展:比如融资,比如业绩考核市场公关,比如全国行政事业资产市场的计划……回过头来看的时候才发现,当时那么重要的一件事,以为会带来很大影响,其实并没有改变什么,甚至无足轻重,做了跟没做效果差不多。不知道是我们执行力不够,没有好好按照计划去完成既定的目标,亦或是在做决策的时候没有把好关?这些问题要留待我们慢慢去思考。

2005,个人接触到的新东西很多,学到的也不少。从前台——配置管理——总裁办公室秘书——总裁办公室主管,从综合管理部——开发部——总裁办公室的变化我想自己又前进了一步,上了一个新台阶,工作上的进步是我这个本命年里最好的礼物。只是想到公司的业绩、业务,心头却有太多的无奈和遗憾,为什么我们付出了那么多的心血和汗水,从老板、中层到普通员工,从销售、开发到后勤部门,每个人都付出了很多努力,说起来都有一肚子的辛酸,可换来的收获却仍是那么少那么少?遇到感情中、生活上的挫折时,每每想起T总这几年来面对公司的重重困难,始终满怀信心、笑着面对的态度,就会变得坦然起来。是啊,要长期在挫折中坚持前路必胜的信念,那需要多大的坚持和勇气啊。经营一个公司面对那么多的困难尚且如此,感情中、生活上又有什么不可以的呢?

日子一定会越来越好的,于公司,于个人,均如此,我越来越相信!

2008年7月21日星期一

软件项目研发的酸甜苦辣

软件项目研发的酸甜苦辣
http://blog.csdn.net/mac_cm

不管您是做过项目还是没有做过项目,项目总在您的身边。在这篇文章中将由有着10余年软件项目研发经验的邓子云先生和您分享“项目人生”的感悟。

  今天突然接到希赛网周泉的电话,问及我在IT业闯荡10余年有些什么感受,回想起这10余年来从事IT项目,特别是软件项目研发的一幕一幕,感慨良多,确实需要回头看看了,借助希赛网这个平台,我愿意和大家分享,这些年真的是“酸甜苦辣”,但又乐在其中。

  软件人的日子总是生活在项目中,不断地研发一个一个的项目,“项目人生”是生活历程的恰当写照,百味交杂,“酸甜苦辣”。

  (1)软件项目研发的“酸”

  软件项目真的成功了吗?先要想想成功的标准是什么。一是看是否满足了客户的需求;二是看是否达成了项目的既定目标,包括盈利目标、研发人力资源发展目标等。如果结合这两点来看,成功的项目并不多。从我从事的20余个项目来看,成功的仅占约五成。客户需求没完没了,根本不可能满足;超出预算是经常的事,保本经营打个市场就算幸运。

  软件企业、软件人的日子总是那么艰辛,项目收尾的时候皆大欢喜的情况并不多见,总是有点“酸”,一来客户总算放你一码,让你做的软件先用着,一个项目做下来,结果还是不完善,开发人员总觉得委屈。二来标的总不能100%到位,签的合同100万,甲方让你分期得到,还要留点余款,谁叫你是乙方呢?他是你的衣食父母,能给你就不错了。

  (2)软件项目研发的“甜”

  也不知道为什么,每新启动一个项目,总是充满了激情;每收尾一个项目总是酸中带喜。原来做程序员的时候看到自己的程序在为客户跑着一笔的业务时心里就高兴,有成就感;后来做项目经理时,一到系统上线时就兴奋得睡不着觉,要检验成果了,要切换系统了,一个细节也不能错过。

  (3)软件项目研发的“苦”

  真的苦,长年加班、出差在外,知识又学不完。加班是家常便饭,“没有加过班的软件人肯定不是地球人”。编写代码,调试程序,测试和修改只怕都得自己做,项目组人多点总算有个测试员了,代码还得自己改,改了再测。

  开发人员根本不清楚明天的项目场子会在哪座城市,说不定公司还会把自己以“修身养性”为名安排到僻静之所净心开发。作为项目经理在外的时间就更多了,手头的项目越多,只怕要跑的地方也越多,多项目管理的项目经理就象是名星“走穴”。

  也不知道下一个项目需要采取什么技术,Java吧,跨平台,技术体系相当庞大,开源技术满天飞;.NET吧,工具多,用来方便,不过许多客户明确要求用J2EE。工作10余年,20余个项目,操作系统用过Windows、UNIX、LINUX等;中间件用过Weblogic、Websphere、Tomcat、Tuxedo、MQ、CICS、MT等;数据库用过ACCESS、SQL Server、SYBASE、infomix、Oracle、DB2等;软件开发语言用过Java、ASP、VB、C#等;开源框架技术用过Struts、Hibernate、Spring等;真不知道明天用什么,自己也把握不了。做项目经理总可以把握了吧,幸好不要写太多的代码了,但是技术攻关只怕还得项目经理来参与;客户关系协调得项目经理来做(这可能是许多技术人员力所不及的)。

  (4)软件项目研发的“辣”。

  碰到利害的客户这是一“辣”,要不是能侃(这种一般不懂专业,还真不好侃),就是憋着(这种一般很专业,侃不开),这时候得自己“辣”一点,前者和他一起侃大山,后者想办法调剂一下,就对方聊感兴的专业领域,找知音。找不到合适的人手又是一“辣”,现在招一名熟练的Java程序员只怕真难,程序员易找,工程师难寻,“辣”得饥渴。

  软件人必将尝遍“酸甜苦辣”,才有可能逐步成长成熟,虽然每个项目能带给我们诸多的烦恼,真的是做程序员时想着做项目经理可能就轻松了,做项目经理时就想着还是做程序员境界更高,但肯定是乐在其中,不断地迎接一个一个项目带来的挑战,克服一个一个的困难,这样必然会有所收获,愿我们一起共勉,继续软件项目的征程。

MMS彩信

MMS彩信
http://blog.csdn.net/mac_cm

一、概述
MMS彩信大家都看到过,或者都编辑过。在这里,利用一系列的文章来说明彩信的编辑、发送和接收的过程。首先这里,简单描述一下彩信的编辑过程。这是彩信的第一步。
二、MMS的表述(presentation)语言——SMIL概述
MMS由一系列类似于“power point style”类型的slide组成,由这些slide来组织各种格式的文本、音频、视频信息。这些我们在发送或者接受彩信的时候都有切身的体会,就不说了。
为了把这些多媒体信息组织到一起,通过网络发送,并且这些信息在接收者那里能够保证按照发送者的样式进行播放。这里就需要采用一种技术,用于描述彩信的组织和播放方法。这种方法就是利用SMIL语言。看过这个语言的规范之后,我想大部分熟悉HTML和XML的人都会会心的笑了,的确,这就是SMIL语言。
MMS使用SMIL(Synchronized Multimedia Integration Language)的子集作为表述语言,SMIL是由W3C(world wide web consortium)制定的基于XML的表述语言标准(可以参见附录中之处的RFC文档)。相当于HTML之于web。SMIL语言可以控制多媒体对象的layout和timing(播放时间)。
在初期,MMS只使用了SMIL的简单基础子集,称作“MMS SMIL”。每个MMS信息都是由SMIL表述语言文件组成。在这个文件中所有的slide有相同的layout。每个slide至少包含两个region,一个包含文本,一个包含图像。事实上,每个slide都是一个frame,每个frame包含layout和指向内容(text、images、audio、video)的索引。每个slide的播放周期以秒计算,在每个slide的内部,文本和图像的播放时间可以单独设定。
由于每个移动设备的尺寸不尽相同,所以SMIL被设计成可以根据终端的不同表现形式作以重新安排。简单说来,SMIL具有下列特点:
§ 来自于W3C的规范定义
§ SMIL只是简单地限定了各种message元素在何时、在什么地方显式
§ SMIL文件以标记开始,接下来是head和body标记,最后以结束
§ Head标记元素限定了
§ Body标记元素限定了被插入内容的参考索引(references),并且限定了何时、何地播放以及每个元素播放的时间。
下面一段文字来自于IBM,说明了在MMS之外SMIL的广泛用途。
SMIL 2.0 是同步多媒体集成语言(Synchronized Multimedia Integration Language),它已开始成为将多媒体集成到 Web 内容的重要新方法。SMIL 提供基于 XML 的方法来控制多媒体元素的定时和表示,它已开始获得众多大的软件供应商和工具制作商的支持,这使得开发人员使用它变得越来越容易。
SMIL 支持已开始成为 Adobe、Microsoft 以及(也许是最重要的)媒体传递领先者 Real Networks 支持的技术之一。众多较小的供应商已开始提供 SMIL 创作工具和播放器。
在不久的将来,随着对当前 2.0 规范支持的增长,对于任何在工作中需要某种形式的多媒体资产控制的开发人员,使用 SMIL 将成为他们的标准策略。如果把正在增长的工具创建者的名单作为某种指示,那么用 SMIL 构建表示也会变得更简单。
RealNetworks正如前面 提到的那样,最广泛的 SMIL 2.0 实现可能来自 Real Networks。RealOne Player 支持 SMIL 2.0 语言概要文件(SMIL 2.0 Language Profile),它结合了 SMIL 支持的大多数(尽管不是全部)模块。除了支持大多数标准 SMIL 模块以外,RealNetworks 还开发了自己的几个 SMIL 扩展。要使用这些扩展,开发人员必须遵守标准 XML 声明.
Microsoft通过使用少量的 一系列基于 SMIL 的 XML 元素和属性,Microsoft 的 HTML+TIME 给 HTML 页面添加了定时和多媒体支持。为了给 HTML 文档添加定时,开发人员要向现有的 HTML 元素添加新属性。创建新元素是为了使向 HTML 页面添加媒体变得简单。
为了使用任何 HTML+TIME 元素,开发人员必须在 HTML 标记中声明 XML 名称空间 t:
不同于上述这两个供应商,大多数创作工具和播放器开发人员主要分为两种,
§ 一种是只关注 SMIL 的完整台式机部署
§ 另一种至少要关心一下用于占用资源较小的移动设备的基本 SMIL 2.0 子集。
此外,随着无线网络的发展,关注 MMS 部署的 SMIL 播放器应该对 SMIL 创作有新的考虑。
三、SMIL简单示例
下面给出了一个MMS消息的SMIL示例:

<-head>
<-meta name="title" content="vacation photos">
<-meta name="author" content="Danny Wyatt">


height="80" left="0" top="0" />
height="40" left="0" top="80" />


<-body>










具体的SMIL描述语言的解释可以参见附录的参考文档,那里给出了每种标记的解释说明。
至于在手机软件上实现,也不是很困难的事情。想想看。
利用结构数组,把所有的MMS中的slide存储到其中,最后,结合SMIL语言的规范,把彩信
打包成上述文件的格式,注意,这里,并不需要把具体的多媒体文件内容添加到smil文件中,只需要加在smil文件中,作为附件就可以了。具体的数据的加载,请看下一篇——MMS的打包部分吧!

一、MMS的封装(Encapsulation)——MIME
对于使用SMIL语言描述的MMS,在通过无线网络发送的时候,我们必须通过某种方式把SMIL和附属的内容包装在一起,一边能够以一个unit(整体)的形式发送出去,以便SMIL文件各个部分内容的reference变得有效。
这个解决的办法就是MIME(Multipart Internet Mail Extensions)规范,这个规范的最初作用是在email的plain text的主体中加入不同的内容。比如说,发送带有附件的email,这个时候你就使用了MIME的规范。MIME负责把所有的独立的文本、图像、声音、视频内容以及SMIL文件本身捆绑在一起,这个规范称为MIME Encapsulation Aggregate Documents,用于告诉接受的终端这个MMS的内容是相互相关(related to one another)并且相互参考的(referenced to one another)。
1. MIME封装示例
下面是根据RFC文档给出的MIME的封装示例:
Content-Type: multipart/related; boundary="boundary-example";
type="text/html"
--boundary-example
Content-Type: text/html; charset="US-ASCII"
... ... ... ...
... ... ... ...
--boundary-exampleContent-Type: image/gifContent-ID: <97116092511xyz@foo.bar.net>Content-Location: fiction1/fiction2--boundary-exampleContent-Type: image/gif
Content-ID: <97116092811xyz@foo.bar.net>
Content-Location: fiction1/fiction3
--boundary-example--§ Content-type
位于信息头部的content-type用于通知接收的终端消息的各个不同部分的内容是相互关联的、并且可能是相互索引的(refer to one another)。
§ Boundary
Boundary用于分割各个不同的消息part。第一个部分是一个html类型的消息,这里只是取得了相关的部分。第二和第三部分省略了实际的images图像的实体。
§ Location and ID
在HTML文本部分我们可以看到,我们可以利用两种方式来索引消息内容的不同部分。这两种不同的方式是 content-ID 和 content – Location。
如果一部分的消息体想通过content-ID指向(refer to)另外一部分的消息体,可以使用“CID”.
关于MIME的部分的信息可以参考附录中列出的RFC文档(RFC2387和RFC2357)。
2. 利用MIME封装MMS的示例
下面给出一个利用MIME封装MMS的示例:
Content-Type: multipart/related;
Type="application/smil"; Start="";boundary="----=_Part_24362_271418.1110357304160"
------=_Part_24362_271418.1110357304160
content-type: text/x-vCalendar;Charset=UTF-8;Name="slide1.vcs"
content-id:
content-location: slide1.vcs
Content-Transfer-Encoding: base64
QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjEuMA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMDUw
MzA4VDA5MDAwMFoNCkRURU5EOjIwMDUwMzA4VDEwMDAwMFoNClNVTU1BUlk7Q0hBUlNFVD1VVEYt
ODtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOuaYr+WQpg0KQ0FURUdPUklFUztDSEFSU0VUPVVU
Ri04O0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6QVBQT0lOVE1FTlRTDQpFTkQ6VkVWRU5UDQpF
TkQ6VkNBTEVOREFSDQo=
------=_Part_24362_271418.1110357304160
content-type: application/smil;Charset=UTF-8;Name="20050309163706.smil"
content-id:
Content-Transfer-Encoding: base64
PHNtaWw+PGhlYWQ+PGxheW91dD48cm9vdC1sYXlvdXQgd2lkdGg9IjE3NiIgaGVpZ2h0PSIxNzQiLz48cmVnaW9uIGlkPSJmdWxsIiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjE3NCIgbGVmdD0iMCIgdG9wPSIwIiAvPjwvbGF5b3V0PjwvaGVhZD48Ym9keT48cGFyIGR1cj0iNXMiPjx0ZXh0IHNyYz0ic2xp
ZGUxLnZjcyIgcmVnaW9uPSJmdWxsIiAvPjwvcGFyPjwvYm9keT48L3NtaWw+
------=_Part_24362_271418.1110357304160--
下图给出的图示说明各个部分之间的关系:
3. 一个完整的MIME封装MMS示例
下表给出了一个完整的MIME封装MMS的示例:
MIME Object Date: Fri, 14 Dec 2001 15:13:21 -0500 (EST)
X-Mms-Expiry: Thu, 20 Dec 2001 21:52:25 -0500 (EST)
X-Mms-Delivery-Time: Wed, 19 Dec 2001 21:52:25 -0800 (PST)
X-Mms-Priority: Normal
X-Mms-Sender-visibility: Show
X-Mms-Message-Class: Personal
X-Mms-Delivery-report: yes
X-Mms-3GPP-MM3-Version: 4.3.0
From: mms-email-sample@sample-email.ericsson.com
To: +12345@mmc.sample-mms.ericsson.com
Subject: Sample SMIL
Mime-Version: 1.0
Content-Type: multipart/related; boundary="----
=_MIME_Boundary_MMS_Reference_Sample_001"
MIME Headers "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME Start boundary
Content-ID:
Content-Type: application/smil; charset="US-ASCII"; name=index.smil

<-head>





<-body>







SMIL document "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary
Content-Type: text/plain; name=mms.txt
Content-Transfer-Encoding: 7bit
Content-ID:
Content-Disposition: attachment; filename=mms.txt
This is a sample MMS message, for use as a reference.
Text Document
"----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary
Content-Type: image/gif; name=sample.gif
Content-Transfer-Encoding: base64
Content-ID:
Content-Disposition: attachment; filename=sample.gif

R0lGODlhZQBQAPcAAOYeAClUpyAtb/XNjlo8RqoUFHSa2ZCKjHiCWrzf/2iQ1J
m66Yeq4cXm/6ys


kBiJkjiJlFiJlniJmJiJmriJnNiJnviJoBiKogh5AQEAOw== Image "----=_MIME_Boundary_MMS_Reference_Sample_001" MIME boundary



二、 MMS的MIME结构
综述来说,每个MMS信息按照MIME规范的基本结构如下图所示:
从图示看出,每个MMS都是由MMS Header和MMS Body组成,MMS Header根据WAP-209协议和RFC2387的规定,由一系列的域组成,下表列出了部分的域(给出的示范的内容表示),其中有些是强制必须实现的(用黑体表示)。
X-Mms-Message-Type
m-send-req
X-Mms-Transaction-ID
1234
X-Mms-MMS-Version
1.0
Date
星期五, 18 三月 2005 06:43:40 GMT
From
mms-editor@toolkit
To
33333333333333
Cc
33333333333333
Bcc

Subject
test
X-Mms-Message-Class
Personal
X-Mms-Expiry
星期六, 19 三月 2005 06:43:40 GMT
X-Mms-Delivery-Time
星期五, 18 三月 2005 06:43:40 GMT
X-Mms-Priority
low
X-Mms-Sender-Visibility
Show
X-Mms-Delivery-Report
No
X-Mms-Read-Reply
No
Content-Type
application/vnd.wap.multipart.related; start="" type="application/smil"
1. MMS承载的内容elements
MMS只是用于发送消息的载体,根据规范,我们可以发送各种不同类型的内容元素。这些内容元素组成MMS中各个不同的部分。根据元素类型的不容,每个part Header部分的content-type也不尽相同。下面给以示例:
§ 文本:
文本包含很多类型,普通文本的类型可以表示为——text/plain,而vcard类型的文本表示为text/x-vCard。
§ 静态图像
静态图像存在各种不同的类型,根据不同的编码方式由不同的后缀名表示。如image/gif 和image/jpeg。

ADS1.2进行嵌入式软件开发

ADS1.2进行嵌入式软件开发

http://blog.csdn.net/mac_cm
概述 嵌入式应用程序通常都是在样机环境下调试与开发的,这种环境与最终产品之间并不完全相同。因此,在系统调试阶段就考虑应用程序在最终目标硬件中的运行情况是非常重要的。 本文旨在讨论如何将一个开发/调试环境下的嵌入式应用程序转移到最终独立运行的目标系统中去,并提到了ARM ADS1.2开发工具包的一些功能特性及其在这个过程中所起到的作用。
使用ADS开发嵌入式程序时,需要着重考虑以下几个问题:1.与硬件相关的C语言库函数的使用;2.某些C语言库函数使用了调试环境中的资源,要把这些使用的资源重定向到目标系统中的硬件上来;3.可执行映象文件的存储器映射必须根据目标硬件的存储器分布进行裁剪;4.在主程序执行前,嵌入式应用程序必须先完成系统的初始化。一个完整的初始化包括用户的启动执行代码和ADS中C库函数的初始化过程。

图1 Semihosting的实现举例


图2 C语言库函数结构

图3 缺省的存储器映射

图4 连接器布局规则
缺省的工程项目设置刚开始一个嵌入式应用软件开发时,ADS用户可能并不完全清楚目标硬件的一些参数指标。比如有关外设、存储器地址分布,甚至处理器类型等一些细节,可能还没有最终确定。为了在所有这些细节全部就绪前就能进行软件开发,ADS工具有一套程序构建和调试的缺省设置。了解这套缺省的工程项目设置方法,对于掌握最终的移植步骤非常有好处。
ADS1.2C语言函数库Semihosting在ADS的C语言函数库中,某些ANSIC的功能是由主机的调试环境来提供的,这套机制有一个专门术语叫Semihosting。Semihosting通过一组软件中断(SWI)指令来实现。如图1所示,当一个Semihosting软中断被执行时,调试系统先识别这个SWI请求,然后挂起正在运行的程序,调用Semihosting的服务,完成后再恢复原来的程序执行。因此,主机执行的任务对于程序来说是透明的。
C语言库函数结构从概念上来讲,C语言库函数可以被分成两部分,一是ANSIC语言规范本身的一部分,一是只受某一特定ANSIC层次支持的函数,如图2所示。其中一些ANSIC的功能是由主机调试环境调用驱动程序级的函数完成的。例如,ADS的库函数printf()把输出信息输出到调试器的控制台窗口,这个功能通过调用__sys_write()实现,__sys_write()执行了一个把字符串输出到主机控制台的Semihosting软中断服务程序。
缺省的存储器映射如果用户在程序编译时没有指定映象的存储器映射分布,ADS将为生成的目标代码和数据分配一个缺省的存储器映射图,如图3所示。目标印象被连接至地址0x8000,存储和执行区域都位于该地址开始的空间。RO(只读)部分放在前面,接着是RW(读写)部分,最后是ZI(零初始化)部分。在ZI部分之上紧跟着HEAP,所以HEAP的确切地址要在连接时才能确定。STACK的基地址是在应用程序启动时由一个Semihosting操作提供。这项Semihosting操作返回的地址值视不同调试环境而定:ARMulator返回配置文件peripherals.ami中的设置值;缺省为0x08000000。Multi-ICE返回的是调试器内部变量$top_of_memory的值;缺省为0x00080000。
连接器布局规则连接器对代码和数据在存储器系统中的分配,遵循一套规则,如图4所示。映象首先按照属性以RO-RW-ZI的次序进行排列,在同一种属性里面代码先于数据。然后连接器将输入段根据名字的字母顺序进行排列,输入段的名字与汇编代码里面的块名字指示一致(在汇编程序中用AREA关键字)。在输入段中,来自不同对象的代码和数据放置次序与在连接器命令行中指定的对象文件次序一致。在需要灵活分配代码和数据放置位置的情况下,建议用户不要简单地依靠这些规则。后面会介绍一种如何控制代码和数据布局的机制Scatterloading。

图5 缺省的ADS初始化过程

图6 C库函数重定向

图7 scatter文件语法

图8 分散加载的简单样例
启动应用程序大多数嵌入式系统在进入应用主程序之前有一个初始化的过程,该过程完成系统的启动和初始化功能。缺省的ADS初始化过程如图5所示。总体上,初始化过程可以分成两部分来看:_main负责设置运行映像存储器映射;_rt_entry负责库函数的初始化。_main完成代码和数据的复制,并把ZI数据区清零。这一步只有当代码和数据区在存储和运行时处于不同的存储器位置时才有意义。接着_main跳进_rt_entry,进行STACK和HEAP等的初始化。最后_rt_entry跳进应用程序的入口main()。当应用程序执行完时,_rt_entry又将控制权交还给调试器。函数main()在ADS中有特殊的意义。当一个程序工程项目中存在main()时,连接器会把_main和_rt_entry中的初始化代码连接进来;如果没有main()函数,初始化过程就不会被连接,结果就会导致一些标准的C库函数无效。
根据目标环境裁减C库函数缺省状态下C库函数利用Semihotsting机制来实现设备驱动的功能。但一个真正的嵌入式系统,要使用到具体的外设或硬件独立于主机环境运行。C库函数重定向用户可以定义自己的C语言库函数,连接器在连接时自动使用这些新的功能函数。这个过程叫做重定向C语言库函数,如图6所示。举例来说,用户有一个I/O设备(如UART)。本来库函数fputc()是把字符输出到调试器控制窗口中去的,但用户把输出设备改成了UART端口,这样一来,所有基于fputc()函数的printf()系列函数输出都被重定向到UART端口上去了。下面是实现fputc()重定向的一个例子:externvoidsendchar(char*ch);intfputc(intch,FILE*f){/*e.g.writeacharactertoanUART*/chartempch=ch;sendchar(&tempch);returnch;}这个例子简单地将输入字符重新定向到另一个函数sendchar(),sendchar()假定是一个另外定义的串口输出函数。在这里,fputc()就好像目标硬件和标准C库函数之间的一个抽象层。
在C语言库函数中禁用Semihosting在一个独立的嵌入式应用程序中,应该不存在SemihostingSWI操作。因此,用户必须确定在所有调用到的库函数中没有使用Semihosting。为了保证这一点,在程序中可以引进一个符号关键字_use_no_semihosting:在C代码中,使用#prgrama #pragmaimport〈_use_no_semihosting_swi〉在汇编程序中,使用IMPORTIMPORT_use_no_semihosting_swi这样,当有使用SWI机制的库函数被连接时,连接器会进行报错:Error:Symbol_semihosting_swi_guardmultiplydefined为了确定具体是哪一个函数,连接时打开-verbose选项。这样在结果信息输出时,该库函数上将有一个_I_use_semihosting_swi的标记。Loadingmembersys_wxit.ofromc_a_un.1.Definition:_sys_exitReference:_I_use_semihosting_swi用户必须要把这些函数定义成自己的执行内容。有一点需要注意,连接器只能报告库函数中被调用的Semihosting,对用户自定义函数中使用的Semihosting则不会报错。
根据目标硬件定制存储器映射分散装载(Scatlerloading)在实际的嵌入式系统中,ADS提供的缺省存储器映射是不能满足要求的。用户的目标硬件通常有多个存储器设备位于不同的位置,并且这些存储器设备在程序装载和运行时可能还有不同的配置。Scattertoading可以通过一个文本文件来指定一段代码或数据在加载和运行时在存储器中的不同位置。这个文本文件scatterfile在命令行中由-scatter开关指定,例如:armlink_scatterscat.scffilel.ofile2.0在scatterfile中可以为每一个代码或数据区在装载和执行时指定不同的存储区域地址,Scatlertoading的存储区块可以分成二种类型:装载区:当系统启动或加载时应用程序的存放区。执行区:系统启动后,应用程序进行执行和数据访问的存储器区域,系统在实时运行时可以有一个或多个执行块。映像中所有的代码和数据都有一个装载地址和运行地址(二者可能相同也可能不同,视具体情况而定)。在系统启动时,C函数库中的__main初始化代码会执行必要的复制及清零操作,使应用程序的相应代码和数据段从装载状态转入执行状态。1.scatter文件语法scatter文件是一个简单的文本文件,包含一些简单的语法。My_Region0x00000x1000{thecontextofregion}每个块由一个头标题开始定义,头中至少包含块的名字和起始地址,另外还有最大长度和其他一些属性选项。块定义的内容包括在紧接的一对花括号内,依赖于具体的系统情况。一个加载块必须至少含有一个执行块;实践中通常有多个执行块。一个执行块必须至少含有一个代码或数据段;这些通常来自源文件或库函数等的目标文件;通配符号*可以匹配指定属性项中所有没有在文件中定义的余下部分。2.简单分散加载样例图8所示样例中,只有一个加载块,包含了所有的代码和数据,起始地址为0。这个加载块一共对应两个执行块。一个包含所有的RO代码和数据,执行地址与装载地址相同;同时另一个起始地址为0x10000的执行块,包含所有的RW和ZI数据。这样当系统开始启动时,从第一个执行块开始运行(执行地址等于装载地址),在执行过程中,有一段初始化代码会把装载块中的一部分代码转移到另外的执行块中。下面是这个scatter描述文件,该文件描述了上述存储器映射方式。LOAD_ROM0x4000{EXE_ROM0x00000x4000;Rootregion{*〈+RO〉;Allcodeandconstantdata}RAM0x100000x8000{*〈+RW,+ZI〉;Allnon-constantdata}}3.在分散文件中放置对象在大多数应用中,并不是像前例那样,简单地把所有属性都放在一起,用户需要控制特定代码和数据段的放置位置。这可以通过在scatter文件中对单个目标文件进行定义实现,而不是只简单地依靠通配符。为了覆盖标准的连接器布局规则,我们可以使用+FIRST和+LAST分散加载指令。典型的例子是在执行块的开始处放置中断向量表格:LOAD_ROM0x00000x4000{EXEC_ROM0x00000x4000{vectors.o〈Vect,+FIRST〉*〈+RO〉};moreexecregions...}在这个scatter文件中,保证了vextors.o中的Vect域被放置于地址0x0000。4.RootRegion(根区)根区是一个执行块,它的加载地址与执行地址是一致的。每个scatter文件至少有一个根区。分散加载有一个限制:创建执行块的代码和数据(即完成复制和清零的代码和数据)无法自行复制到另一个位置。因此,在根区中必须含有下面的部分:_main.o,包含复制代码/数据的代码;连接器输出变量$$Table和ZISection$$Table,包含被复制代码/数据的地址。由于上面两个部分的属性是只读的,因此他们被*〈+RO〉通配符语法匹配。如果*〈+RO〉被用在了非根区中,则在根区中必须显式地指明另一个RO区域。下面是一个例子:LOAD_ROM0x00000x4000{EXE_ROM0x00000x4000;rootregion{_main.o〈+RO〉;copyingcode*〈Region$$Tabl0e〉;RO/RWaddressestocopy*〈ZISection$$Table〉;ZIaddressestozero}RAM0x100000x8000{*〈+RO〉;allotherROsections*〈+RW,+ZI〉;allRWandZIsections}}

上期主要介绍了基于ARM的嵌入式系统软件开发中,怎样来对必要的C库函数进行移植和重定向,以及如何根据不同的目标存储器系统进行程序编译和连接设置。本期介绍程序中的存储器分配和如何根据设置正确初始化系统。
放置堆栈和heapScatterloading机制提供了一种指定代码和静态数据布局的方法。下面介绍如何放置应用程序的堆栈和heap。* _user_initial_stackheap重定向应用程序的堆栈和heap是在C库函数初始化过程中建立起来的。可以通过重定向对应的子程序来改变堆栈和heap的位置,在ADS的库函数中,即_user_initial_stackheap()函数。_user_initial_stackheap()可以用C或汇编来实现,它必须返回如下参数:r0:heap基地址;r1:堆栈基地址;r2:heap长度限制值(需要的话);r3:堆栈长度限制值。当用户使用分散装载功能的时候,必须重调用_user_initial_stackheap(),否则连接器会报错:Error: L6218E: Undefined symbol Image$$ZI$$Limit (referred from sys_stackheap.o)
*存储器模型ADS提供了两种实时存储器模型。缺省时为one-region,应用程序的堆栈和heap位于同一个存储器区块,使用的时候相向生长,当在heap区分配一块存储器空间时需要检查堆栈指针。另一种情况是堆栈和heap使用两块独立的存储器区域。对于速度特别快的RAM,可选择只用来作堆栈使用。为了使用这种two-region模型,用户需要导入符号use_two_region_memory,heap使用需要检查heap的长度限制值。对这两种模型来说,缺省情况下对堆栈的生长都不进行检查。用户可以在程序编译时使用 -apcs/swst 编译器选项来进行软件堆栈检查。如果使用two-region模型,必须得在执行_user_initial_stackheap时指定一个堆栈限制值。

图9 重定向_user_initial_stackheap()

图10 基本初始化过程

图11 ROM/RAM重定向和映射
表1
系统复位和初始化目前情况,一般假设程序从C库函数的初始化入口_main开始执行。实际上,所有的嵌入式程序在启动时都要执行一些系统级的初始化操作。在此讨论这方面的内容。初始化过程图10中显示了一个基于ARM的嵌入式系统的基本初始化过程。可以看到,在_main之前加入了一个复位处理模块reset handler,它在系统上电复位时立即启动。标识为$sub$$main的新代码块在进入主程序之前执行。复位处理模块reset handler通常是一小段汇编代码,在系统复位时执行。它至少完成应用程序中使用到的所有处理器模式的堆栈初始化工作。对于含有本地存储器系统的内核(比如含cache的ARM内核),配置工作也必须在这一段初始化过程中完成。当完成系统初始化之后,通常程序会跳向_main,开始C库函数的初始化过程。系统初始化过程一般还包括另外一些内容,中断使能等,这些大多安排在C库函数的初始化完成之后执行。$sub$$main()完成这部分功能。向量表(vector table)所有的ARM系统都有一张中断向量表当出现异常需要处理时,必须调用向量表。向量表一般要位于0地址处。
表2
表3
表4
表5
表6
表7
表8
表9
表10
存储器配置*ROM/RAM重定向当系统启动的时候,为了保证0地址处有正确的启动代码存在,需要非易失性的存储器。一种简单的方法,就是把系统0x0000开始的一块地址分配给ROM。其缺点是,由于ROM的访问速度比RAM慢很多,当执行中断响应需要从中断向量表跳转时,会给系统性能带来损失;同时,在ROM中的向量表内容也不能被用户程序动态修改。另外一种可行的方案如图11所示。ROM位于地址0x1000开始的地方,但是在系统复位时又被存储器控制器映射到0x0000地址处。这样当系统启动之后,在地址0x0000看到的是ROM,系统执行这块ROM中的启动代码,启动代码跳转到真正的ROM的地址,并让存储器控制器移除对ROM的地址映射。这时0x0000地址处的存储器又恢复回了RAM。__main中的代码把向量表copy到0x0000处的RAM中去,使得异常时能被正确响应。表1为ARM汇编中执行ROM/RAM重定向和映射的一个例子。它以ARM公司的Integrator平台为基础的,该方法适用于类似ROM/RAM重定向方法的所有平台。第一条指令完成从ROM的映射地址(0x00000)到真实地址的跳转。地址标号instruct_2是ROM的真实地址(0x180004)。然后通过设置Integrator平台上的相应控制寄存器,移除ROM的地址映射。代码在系统一启动就被执行。所有关于地址重定向/映射的操作必须在C库函数初始化之前完成。
*本地存储器配置许多ARM处理器都有片上存储器系统,如cache和紧密耦合存储器(TCM)、存储器管理单元(MMU)或存储器保护单元(MPU)。这些设备都要在系统初始化过程中正确配置,并且有一些特殊的要求需要考虑。由前文可知,_main中的C库函数初始化代码负责程序运行时的存储器系统设置。因此,整个存储器系统本身必须得在__main之前完成初始化工作,如MMU或MPU必须在reset handler里面完成配置。紧密耦合存储器(TCM)的初始化同样须在_main之前完成(通常在MMU/MPU之前),因为一般程序都需要把代码和数据分散装入TCM。需要注意的是当TCM被使能后,不再访问被TCM屏蔽的存储器。关于cache的一致性问题,如果cache在_main之前使能的话,那么当_main里面进行从装载区到执行区的代码和数据拷贝时(因为在拷贝过程中指令和数据在本质上都是被当作数据处理),指令会出现在数据缓冲区。避免此问题的方法是在C库函数初始化完成后再使能cache。*Scatter loading与存储器配置无论是通过ROM/RAM重定向还是MMU配置的方法,如果系统在启动和运行时存储器分布不一致,scatterloading文件中的定义就要按照系统重定向后的存储器分布情况进行。以上文ROM/RAM重定向为例:LOAD_ROM 0x10000 0x8000{EXE_ROM 0x10000 0x8000{reset_handler.o (+RO, +FIRST)...}RAM 0x0000 0x4000{vectors.o (+RO, +FIRST)...}}装载区LOAD_ROM被放置在0x10000处,代表了重定向之后代码和数据的装载地址。
堆栈的初始化程序中可能用到的处理器模式,都需要定义一个堆栈指针。在表2中,堆栈位于stack_base标识的地址中。这个符号可以是存储器系统中的一个直接地址,也可以在另外的汇编文件中定义,由scatter文件来定义分配地址。表2代码为FIQ和IRQ模式各分配了一个256字节的堆栈,用户可以用同样的方法为其他模式也分配堆栈。最简单的方法就是进入相应的模式,然后为SP寄存器指定相应的值。如果想使用软件堆栈检查,还必须指定一个堆栈长度限制值。堆栈指针和堆栈限制的数值会作为参数自动传递到C库函数的初始化代码__user_initial_stackheap中,在__user_initial_stackheap中不应该修改这些值。硬件初始化 $sub$$main()一般来说,应该把所有的系统初始化代码与主应用程序分离开来,但是有几个例外,比如cache和中断的使能,需要在C库函数初始化之后执行。表3代码显示了如何使用 $sub和 $supper 。连接器把呼叫main()的函数替换成呼叫$sub$$main(),完成cache和中断的使能,并最终跳向main()。
执行模式考虑为主应用程序选择一个处理器执行模式非常重要,这取决于系统的初始化代码。许多在启动过程中使用到的功能,如MMU/MPU的配置、中断的使能等,只能在特权级模式下进行。如果需要在特权极模式下运行自己的应用程序,只要在退出初始化过程之前改变到相应的模式就行了,没有其他任何问题。如果使用user模式,必须保证所有只能在特权模式下执行的功能完成之后,才能进入user模式。因为system模式和user模式使用相同的寄存器组,reset handler应该从system模式退出,_user_initial_stackheap在system模式下完成应用程序堆栈的初始化。这样在处理器进入user模式后,所有的堆栈空间都已经被正确设置好了。
对存储器布局的进一步考虑在scatter文件中分配硬件地址虽然可以在一个scatter文件中描述代码和数据的分散布局,但是目标硬件中的外设寄存器,堆栈和heap配置仍然直接采用硬件地址在程序源代码中进行设置。如果把所有存储器地址相关的信息都在scatter文件中进行定义,避免在源文件中引用绝对硬件地址,对程序的工程化管理是有大好处的。*在scatter文件中定义目标外设地址通常外设寄存器的地址在程序文件或头文件中定义,也可以声明一个结构类型指向外设寄存器,结构的地址定位在scatter文件中完成。举例来说,目标定时器上有2个32位的寄存器,可以用表4来映射这些寄存器。为了把结构放置在指定的存储器地址上面,创建一个新的执行区(见表5)。scatter文件便把timer_regs结构定位在了地址0x40000000。注意,在启动过程当中这些寄存器的内容不需要清零,改变寄存器的内容可能影响系统状态。在执行区上加UNINIT属性可以防止ZI数据在初始化过程中被清零。在scatter文件中分配堆栈和heap在许多情况下,用scatter文件来定义堆栈和heap的地址会带来一些好处,主要有:所有的存储器分配信息集中在一个文件里;改变堆栈和heap的地址只要重新连接就行了,不需要重新编译。*显式地放置符号在ADS1.2环境下,这是最简单的方法。在前文中引用过2个符号stack_base和heap_base,这2个符号在汇编模块中创建,在scatter文件中各自的执行区里定位(见表6)。表7文件中,heap基地址定位在0x20000上,堆栈基地址位于0x40000。现在heap和堆栈的位置就可以非常方便地进行编辑了。*使用连接器产生的符号这种方法需要在目标文件中指定好heap和堆栈的长度。这在一定程度上减弱了本节开头描述的两个优点。首先在汇编源程序中定义heap和堆栈的长度。关键词SPACE用来保留一块存储器空间,NOINT则可以阻止清零操作(见表8)。注意在这里的源文件中并不需要地址标号。然后这些部分就可以在scatter文件中对应的执行区里定位了(见表9)。连接器产生的符号指向每一个执行区的基地址和长度限制,这些符号可以被_user_initial_stackheap调用的重定向代码使用。在代码中使用DCD来给这些值定义更有意义的名字,可以增强代码的可读性(见表10)。文件把heap基地址定位在0x15000,堆栈地址定位在0x4000。Heap和堆栈的位置可以通过编辑对应执行区的地址方便地改变。

(本人长期提供MTK手机平台代码和资料,需要联系QQ:85313653
开发系统软件清单: 1. 手机程序源代码 2.烧写程序下载工具 flashtool 3.ads1.2 ,ads1.2update,activeperl:编译工具和辅助工具 4. Trace 工具:catcher 5.手机工程测试工具: META (Mobile Engineering Testing Architecture) is designed to provide the functionality of RF testing, NVRAM access testing, speech related testing of advanced feature – melody and voice memo. 6.UI制作工具: MCT 开发系统硬件清单: 1.开发用手机板 2.烧拷线一条 3.USB线一条 4.旅行充电器一个 5.锂电池两个 6.硬件原理图 开发系统文档清单: 1mtk 软件培训(MTK_Training) 2 mtk 软件系统和调试 ( SW System and Debug ) 3.mtk 软件MMI设计(MMI Design Doc0 4.mtk 软件设备驱动(Device Driver) 5.Mtk手机校准(Factory) 6.Mtk手机工具使用说明(Tool Document)
)

2008年7月17日星期四

Android,Google的移动平台

Android,Google的移动平台
(http://blog.csdn.net/mac_cm)

Google的Android移动平台计划显然野心不小,为移动电话创建一个开源平台的说法似乎对开发者也颇具吸引力,然而在Android平台问世以前,开发者已经在使用诸多现在的主流移动软件开发平台,Google这个新移动开发平台能否让这些开发者抛弃一切从头再来吗?
在过去的一年中,整个IT业界都在急切的等待这个在山景城的互联网巨人宣布它的移动电话计划,期间一度有谣言称这个互联网公司即将推出它的Gphone手机,一个据传可以挑战苹果的iPhone的东东。现在Google公布了它的答案,其目标绝不是一个简单的硬件产品,而是为众多移动手机提供一个软件开发平台。
图1、谣言中的Gphone手机
在近日的一次电话会议上,Google公司官员揭开了它的移动平台战略。这是一个叫做“Android”的移动软件开发平台,一个自由、开源的移动操作系统。这个平台将可以让开发者更轻松的创建新移动应用软件,推出这个平台的原因是Google认为在今天的移动操作系统上开发应用还过于困难。
Google的美好愿望与开发者的冷静反应
Google希望借助于Android平台可以带来更便宜、更高级的智能手机,尽管基于这个平台的首款移动手机在明年年底之前还不会推出,Android的技术规范却早在本月初就已经早早发布。
虽然Google对这个新的平台给予了很大的希望,一个比较现实的问题是,开发者们会围绕它编程吗?开发者们会立即(或者不远的将来)在Android上开发足够的应用吗?这个平台让我们感到兴奋之余,能否真正带来实际的好处或者仅仅是失望?
图2、Google新平台能否成功?
要想找到这些问题的真正答案,或许西雅图的人们更有资格比其他地方的人们来回答这些问题,因为众所周知这里聚集着众多移动软件开发者。来自十二个左右的西雅图新兴公司、老牌公司和个人开发者的一个比较一致的意见是,尽管它们多数已经知道最近Google发布的这个平台,但是并没有立即在Android平台上进行开发的计划。
据这些公司表示,这个刚刚推出的移动软件开发平台还有很多问题,而且如果为了转向这个平台而停止已经正在进行且有望赚钱的项目,这是一种非常不成熟的做法。
Google为了推广这个平台,开出了100万美元的悬赏来吸引人们开发Android平台上最佳应用,尽管如此它们还是表示,不会立即拥抱这个新的移动开发平台。
Ontela公司正在开发一个移动图片共享应用,其首席执行官Dan Shapiro表示,“或许一些新兴公司现在更愿意使用它(Android平台),我可以想象到那些正在创业的家伙可能会认为这是一个巨大的奖励,但是对我们来说,我们要对现有客户负责,这是我们更加关注的事情。”
来自Action Engine公司的高级创新技术架构师Chris Lihosit表示,上周一他听到这个消息后首先做的几件事情之一是把这个开发者工具下载下来,先了解一下。经过试用后他表示,尽管某些功能看上去非常不错,但是Action Engine对它并不感兴趣。
“明确的来说,如果是周末需要消遣的时候,我很乐意去使用它,感受它的新功能给我带来的震撼,”Lihosit表示,“但是,我不知道它是否能成为我的工作中的一部分。”
结盟知名厂商 能否挑战市场现有主流系统?
Google自己也意识到凭借一己之力很难让这个移动开发平台发扬广大,它需要更多的帮手,因此这个搜索巨人正在与其他33家公司联手组建一个名叫“开放手机联盟(Open Handset Alliance)”的组织,联合开发Android移动平台系统。这33家公司名单中不乏名气不小的公司,诸如T-Mobile、Sprint Nextel、英特尔、Qualcomm、摩托罗拉、HTC和eBay。另外还包括一些规模小但专业性比较强的公司。
图3、开放手机联盟能否让Android启航?
移动软件开发者是比较分散的群体。他们可能在新兴公司工作,也可能在大型股份化公司,或者作为咨询者之类的自由职业者,甚至他们中有的人是在业余时间来开发移动手机应用软件。
开发者的支持与使用这个平台的手机的数量是互相支持的关系。没有开发者的支持,Google将难以得到足够多的应用——诸如音乐服务、移动游戏、社交网站和类似的服务——来推动运营商销售基于Android平台的手机,以及让消费者有兴趣来购买它们。要想引起引起开发者注意,没有什么比市场上存在被数百万消费者使用的数百万个基于Andrioid平台手机更重要。
今天的高端智能手机操作系统中,Symbian、微软和黑莓(Black Berry)三家移动操作系统是最为流行的主流系统。开发者使用不同的语言来在现有的手机上开发应用,诸如Sun公司的Java、C++(被微软使用)和Qualcomm的Brew等。
Android平台是基于开源软件Linux的。而且麻烦的是,Android在上面创建了它自己的软件层,尽管开发者也可以使Java来进行开发,但Android平台版的Java和今天在移动开发领域被广泛使用的Java版本并不一致。因此,现有的使用移动Java创建的应用程序不一定就能在更丰富、更强大的Android平台上使用。
由于这个原因,某些开发者表示,Android可能给移动应用带来了更多令人头疼的问题。
Google新平台让给开发者带来的新问题
Pelago公司的创始人兼首席执行官Jeff Holden表示,要想让移动应用软件支持所有现有平台几乎是一件不可能的事情。
位于西雅图的Pelago现正在一个移动Java版本上开发它的Whrrl服务,Whrrl服务可以根据用户手机的位置和用户的社交网站来推荐饭店和服务。
“我们认为Android是另一个不同的平台,因此它增加了移动手机应用更加具有分裂性的局面,”Holden表示。“我认为它是一个有趣而且有价值的平台,它是只有像Google这样的公司才能做得到的一件事情,尽管它不是一个草率的产品,但是仓促移植应用到它上面却不值得推荐。”
上面说的“移植”,是开发者必须对那些已经基于某个语言创建好应用程序进行重新加工修改,以让它们可以运行在更多的手机上。此外,一个程序还必须针对不同的手机进行调整,举个例子来说,每个型号手机的屏幕大小和按键都是不一样的。对于一个支持数百种手机的移动手机软件,开发商可能要对其进行多次修改。
位于美国贝佛的Action Engine公司主要是从事 Mobile 应用开发,比如提供媒体发布商和移动网络运营商面向手机用户端的发布平台。它表示,它花费了大约三年的时间来让它的应用软件支持所有平台,而且现在它依然在修改一个不久可以支持黑莓手机的版本。
“要让你的应用支持Android平台,可能要花费你9到12个月的时间,”Action Engine的开发者Lihosit表示。
另一个挑战是为不同平台进行开发给企业带来的成本问题。
IceBreaker是一家位于美国贝佛城的公司,其主打产品是一个移动交友平台,其销售副总裁表示,公司一直在尽力避开开发基于手机的应用程序,而是通过一个移动Web上提供它的服务,即用户可以通过手机连接互联网来使用这个服务。现在它正在考虑是否创建基于手机的应用程序,因为这样可以提供给用户更酷的功能。
开发这种应用大约需要205000美元的成本,其中包含三个开发者三个月、一个设计者两个月和一个产品经理的工作量的工资和福利,Levine表示。与之对比的是Google要在创新大赛中对10个公司派发的275000美元的奖金。
“没有人在讨论的一个难于回答的问题是,一个应用程序如何能够很好的工作在所有手机和跨越所有运营商,”Levin表示。“传说中的最高境界是一次编写处处运行,但是至今没有人能够解决这个问题。”
Dashwire的创始人兼首席执行官Ford Davidson表示,公司的开发团队对于Google的新平台感到激动,而且Google所主办的大赛的奖金也是公司资金的一个好来源。但是他还是打消了立即拥抱这个平台的念头。
“是的,它的新功能非常酷,但是我们不得不保持专注,”Davidson表示,他的服务是帮助人们通过互联网管理他们的电话。“我们还有很多手机在那儿等待我们服务的推陈出新。”
Android能否成功还需时间验证
如果Google想取得成功,它将必须具有某些其他平台所不具备的东西,开发者们表示。至今为止,Google所能说出的Android的最大不同之处就是这个平台是开放性的。
从实践的层面上来说,这意味着手机用户界面的每一方面都可以被定制化。开发者甚至可以修改非常细小的事情,诸如拨号面板的外观等。
Android还将允许应用程序之间的交互。在某些情况下,一个开发者从一个用户日历或联系人中获取信息来创建一个一个定位应用程序,可以交流在一个预定时间用户和他(她)的朋友在什么地方。
但是Pelago的首席技术官兼共同创始人之一Darren Erik Vengroff表示,即使Android具有诸如此类的内置功能,运营商是否允许开发者访问这种用户信息还是一个未知的事情。
Sprint Nextel的发言人Scott Sloat表示,Google公司这个平台的基本指导思想肯定将是开放式的,允许开发者更多的参与到其中。但是现在预言其究竟能取得什么样的成功还为时过早。