存档

‘嵌入式开发’ 分类的存档

看看牛人们是怎么评价编程语言的

2012年5月22日 没有评论

Basic
一个有过 BASIC 编程经历的人是很难学会好的编程习惯的。作为一个潜在的程序员,他们已经被脑残并且无法修复。– Edsger Wybe Dijkstra,Dijkstra 算法发明者

C
C 语言程序就像一群拿着刀的人在刚刚打过蜡的地板上快速的跳舞。
— Waldi Ravens

罗马帝国衰败的主要原因之一是因为他们缺少0,他们没有办法知道他们的 C 程序已经成功的执行完了。
— Robert Firth

现在是早上五点,你知道那个指针现在什么地方吗?
— 匿名

C++
C 很容易让你朝自己的脚开枪。在 C++ 中,这么做变的困难了,但是你要不注意就会崩掉自己的整条腿。
— Bjarne Stroustrup,C++ 发明者

我发明了“面向对象”,但是我可以明确的是,我不知道什么是 C++。
— Alan Kay,Smalltalk 发明者

C++ 的最新功能是用来修正之前的最新功能的。
— David Jameson

50年的编程语言研究就搞出来一个 C++ ?
— Richard A. O’Keefe

只要你花一点时间研究 C++,你就会发现 C++ 的用户都在寻找一门更好的语言。
— R. William Beckwith.

Java 就是去掉了枪炮,刀剑,还有黑帮的 C++。
— James Gosling,Java 联合发明人

C++ 是一门恐怖的语言。即使选择 C 没有任何优势,只是为了逃避 C++,那这个理由也足够了。
— Linus Torvalds,Linux 发明者

COBOL
使用 COBOL 会让你变的脑残,所以教别人使用 COBOL 就是犯罪。
— E.W. Dijkstra,Dijkstra 算法发明者

Java
如果 Java 真的有垃圾收集的话,大部分程序在刚开始执行的时候就会把他们自己删了。
— Robert Sewell

Lisp
Lisp 不是一门语言,它只是一种构建材料。
— Alan Kay,Smalltalk 发明者

Perl
Perl 是唯一一门在 RSA 加密前后看起来一样的语言。
— Keith Bostic

PHP
PHP 是由不称职的业余选手发明和操纵的,而 Perl 是伟大而阴险的,由一帮高水平的变态专业人士操纵。
— Jon Ribbens

Bash 以及其他 shell
很明显,迁移 shell 要比迁移 shell 脚本更容易。
— Larry Wall,Perl 发明者

最后
世界上只有两种编程语言:整天被人喷的语言,没有人用的语言。
— Bjarne Stroustrup

分类: 嵌入式开发 标签:

LPC1768官方串口驱动库错误

2011年10月29日 2 条评论
/*********************************************************************//**
 * @brief		Determines best dividers to get a target clock rate
 * @param[in]	UARTx	Pointer to selected UART peripheral, should be:
 * 				- LPC_UART0: UART0 peripheral
 * 				- LPC_UART1: UART1 peripheral
 * 				- LPC_UART2: UART2 peripheral
 * 				- LPC_UART3: UART3 peripheral
 * @param[in]	baudrate Desired UART baud rate.
 * @return 		Error status, could be:
 * 				- SUCCESS
 * 				- ERROR
 **********************************************************************/
static Status uart_set_divisors(LPC_UART_TypeDef *UARTx, uint32_t baudrate)
{
	Status errorStatus = ERROR;

	uint32_t uClk;
	uint32_t d, m, bestd, bestm, tmp;
	uint64_t best_divisor, divisor;
	uint32_t current_error, best_error;
	uint32_t recalcbaud;

	/* get UART block clock */
	if (UARTx == LPC_UART0)
	{
		uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART0);
	}
	else if (UARTx == (LPC_UART_TypeDef *)LPC_UART1)
	{
		uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART1);
	}
	else if (UARTx == LPC_UART2)
	{
		uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART2);
	}
	else if (UARTx == LPC_UART3)
	{
		uClk = CLKPWR_GetPCLK (CLKPWR_PCLKSEL_UART3);
	}

	/* In the Uart IP block, baud rate is calculated using FDR and DLL-DLM registers
	* The formula is :
	* BaudRate= uClk * (mulFracDiv/(mulFracDiv+dividerAddFracDiv) / (16 * (DLL)
	* It involves floating point calculations. That's the reason the formulae are adjusted with
	* Multiply and divide method.*/
	/* The value of mulFracDiv and dividerAddFracDiv should comply to the following expressions:
	* 0 < mulFracDiv <= 15, 0 <= dividerAddFracDiv <= 15 */
	best_error = 0xFFFFFFFF; /* Worst case */
	bestd = 0;
	bestm = 0;
	best_divisor = 0;
	for (m = 1 ; m <= 15 ;m++)
	{
		for (d = 0 ; d < m ; d++)
		{
		  divisor = ((uint64_t)uClk<<28)*m/(baudrate*(m+d));
		  current_error = divisor & 0xFFFFFFFF;

		  tmp = divisor>>32;

		  /* Adjust error */
		  if(current_error > ((uint32_t)1<<31)){
			current_error = -current_error;
			tmp++;
			}

		  if(tmp<1 || tmp>65536) /* Out of range */
		  continue;

		  if( current_error < best_error){
			best_error = current_error;
			best_divisor = tmp;
			bestd = d;
			bestm = m;
			if(best_error == 0) break;
			}
		} /* end of inner for loop */

		if (best_error == 0)
		  break;
	} /* end of outer for loop  */

	if(best_divisor == 0) return ERROR; /* can not find best match */

	recalcbaud = (uClk>>4) * bestm/(best_divisor * (bestm + bestd));

	/* reuse best_error to evaluate baud error*/
	if(baudrate>recalcbaud) best_error = baudrate - recalcbaud;
	else best_error = recalcbaud -baudrate;

	best_error = best_error * 100 / baudrate;

	if (best_error < UART_ACCEPTED_BAUDRATE_ERROR)
		{
			if (((LPC_UART1_TypeDef *)UARTx) == LPC_UART1)
			{
				((LPC_UART1_TypeDef *)UARTx)->LCR |= UART_LCR_DLAB_EN;
				((LPC_UART1_TypeDef *)UARTx)->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor);
				((LPC_UART1_TypeDef *)UARTx)->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor);
				/* Then reset DLAB bit */
				((LPC_UART1_TypeDef *)UARTx)->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
				((LPC_UART1_TypeDef *)UARTx)->FDR = (UART_FDR_MULVAL(bestm) \
						| UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK;
			}
			else
			{
				UARTx->LCR |= UART_LCR_DLAB_EN;
				UARTx->/*DLIER.*/DLM = UART_LOAD_DLM(best_divisor);
				UARTx->/*RBTHDLR.*/DLL = UART_LOAD_DLL(best_divisor);
				/* Then reset DLAB bit */
				UARTx->LCR &= (~UART_LCR_DLAB_EN) & UART_LCR_BITMASK;
				UARTx->FDR = (UART_FDR_MULVAL(bestm) \
						| UART_FDR_DIVADDVAL(bestd)) & UART_FDR_BITMASK;
			}
			errorStatus = SUCCESS;
		}

		return errorStatus;
}
将此函数替换库中函数。
分类: 嵌入式开发 标签:

最灵活的机器手

2011年6月17日 没有评论

分类: 嵌入式开发 标签:

TMS320F28035的SPI调试

2011年4月11日 没有评论

调试过程中,发现,数据出现错位情况。最后发现是极性和相位设置问题。这个应该是比较普遍的问题。

分类: 嵌入式开发 标签:

28xx中的EALLOW指令

2011年3月10日 没有评论

TI的DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1的C15位设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。

这些关键寄存器包括器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE 矢量表、系统控制寄存器、GPIO MUX 寄存器、eCAN 寄存器的一部分。

DSP由于在上电复位之后,状态寄存器基本上都是清零,而这样的状态下正是上述特殊寄存器禁止改写的状态。为了能够对这些特殊寄存器进行初始化,所以在对上述特殊寄存器进行改写之前,一定要执行汇编指令asm(“EALLOW”)或者宏定义EALLOW来设置状态寄存器1的C6位。在设置完寄存器之后,一定要注意执行汇编指令asm(“EDIS”)或者宏定义EDIS来清除状态寄存器1的C6位。

在device.h文件中可以找到#define EALLOW asm(” EALLOW”)语句

分类: 嵌入式开发 标签:

蝶变ARM

2011年1月13日 没有评论

1929年开始的经济大萧条,改变了世界格局。前苏联的风景独好,使得相当多的人选择了马克思。惧怕布尔什维克红色力量的人投入了法西斯的怀抱,剩余的人选择了妥协与折中。整个世界的迅速分解使得第二次世界大战成为必然。
1933年,罗斯福成为美国第三十二任总统,开始实施新政。这些新政使美国摆脱了危机,也决定了二战的走向。罗斯福的背后站着的是凯恩斯,凯恩斯的国家资本主义化解了整个资本主义阵营有史以来最大的一次危机。“妥协与折中”得以持续。
战后的世界是属于巨型公司的,这些公司借助国家资本的力量,持续着垄断。垄断的初衷并非都是恶意的,在美国却是一个早在1890年就立法防止的。1911年,美国烟草公司被分拆。1982年,美国电报电话公司被分拆。
这些分拆却很难抵达IT业。1975年成立的Microsoft虽然多次被推入拆分的风口浪尖,却从未被拆分。IBM和Intel多次遭到分拆的威胁,也安然无恙。这些公司的支持者都注意到一个事实,这些公司没有依靠国家资本而获得垄断地位,而是依靠多年苦心积攒的知识产权坚持到现在。
这类垄断之忧不在颛臾而在萧墙之内。在这些巨型IT公司中,最低层的工作人员需要经过多达十几级的汇报关系,才能到达首席执行官。在这十几级汇报链中,向上所传递最多的就是如何粉饰太平。
一些微不足道的小问题在这些大公司中往往也能引发无休止的讨论。为解决某个问题而举行的会议,经常被无休止地扩大,从一个会议扩展为多个会议,从几个人参与变为几十人参与。这个问题变得已不再重要时,内部并无统一意见。
西方巨型公司的弊端在于欧美所倡导的民主代价过于昂贵。撒切尔夫人是欧洲第一个深刻认识到这些问题的最高执政官。历史上,英国并不重视中小企业的发展,在凯恩斯主义盛行的二十世纪五十年代,英国经历了三次大规模的企业兼并,至撒切尔夫人执政,巨型企业大行其道。更多的人发现这些大型企业并不能提高生产效率,大范围的垄断与集中,已使英国经济举步维艰。
上世纪八十年代,撒切尔夫人开始变革,剑锋所指,巨型公司纷纷解体,中小企业如雨后春笋般涌现。撒切尔的私有化,货币控制,削减福利与抑制工党的四项举措,客观上拯救了英国经济,也使这位值得尊敬的女士誉满天下,谤满天下。
ARM在这样的大背景之下诞生,这也注定了这些创始人不会也不愿意使ARM成为巨型公司,这也是取得如此成就的ARM,截至今天人数尚不过两千的最重要原因。ARM最初的简称是Acorn RISC Machine。Acorn Computer创立于1978年,总部位于剑桥,由Andy Hopper(剑桥大学), Chris Curry(Sinclair Research)和Herman Hauser(剑桥大学)创建[48]。
Acorn最初使用MOS Technology 6502处理器搭建处理器系统。MOS Technology 6502处理器是一个8位处理器,设计这颗处理器的工程师来自摩托罗拉的MC6800设计团队[48]。基于6502处理器,Acorn开发了最令其自豪的处理器系统BBC Micro[49]。
在上世纪80年代至90年代,BBC Micro处理器系统主宰英国的教育市场。当时还有另外一个基于6502处理器的系统,Apple II[50]。从这时起,Acorn和Apple这两个设计理念及产品形态类似的公司结下了不解之缘,有些人将Acorn公司称呼为“The British Apple”[51]。也是在这个时候,Acorn迎来了一生中的对手Intel。基于Intel x86构架的PC对同时代的处理器厂商是一场噩梦,很少有公司能够醒来。或者服从,或者消亡,别无选择。Acorn首先选择服从,向Intel申请 80286处理器样片,Intel拒绝了这个请求[52]。
工程师对剩余的处理器,进行了充分的评估。结果令人失望。此时的Acorn没有选择,开始认真地考虑是否需要研制一颗属于自己的处理器。他们没有任何处理器设计经验,为数不多的工程师们除了才华,只有梦想。才华与梦想恰能改变整个世界。
1983年10月,Acorn启动了代号为Acorn RISC的项目,由VLSI Technology负责生产。1985年4月26日,VLSI成产出第一颗Acorn RISC处理器,ARM1。ARM1的结构非常简单,仅有个25,000晶体管,甚至没有乘法部件[52]。当时并没有人留意这颗芯片,更多的人关注 Intel在1985年10月17日发布的80386处理器[36]。
没有人认为这颗略显寒酸的ARM1更给80386带来任何冲击,甚至包括研发这颗芯片的Acorn工程师。做为处理器厂商,与Intel活在同一个时代是一场悲剧,无论是Acorn,IBM亦或是不可一世的DEC。Intel并不是不犯错误,只是有限的几个错误都能被及时修复。才华横溢的 Intel工程师将处理器的故事演绎至巅峰,他们的竞争对手也因此步入地狱。
Acorn不得不选择回避,这也决定了ARM处理器的设计理念是low-cost, low-power和high-performance。这个理念与21世纪智能手机的需求不谋而合,却是Intel强加给ARM的。Intel在不经意间为自己树立了一个强大的对手,这个对手在Intel的庇护之下一步步长大。并不夸张的说,没有Intel就没有ARM的今天。
因为对low-cost和low-power的追求,Acorn选择了RISC,而不是CISC,在上世纪80年代,RISC与CISC孰优孰劣尚无定论。在当时采用RISC技术可以看得到的优势是可以用更少的芯片资源,更少的开发人员实现一个性能相对较高的处理器芯片[53]。Intel使用了 CISC架构,很大程度上也决定了Acorn选择了RISC。刘备的“每与操相反,事乃可成”,对于Acorn就是“与Intel不同,便有机会”。
ARM的成长步伐仍然是缓慢的,陆续发布的ARM2与ARM3并没有激起波澜。为数不多的公司选择ARM3处理器开发产品。一些公司将ARM3处理器用于研发,最有名的公司就是Apple[53]。在当时,Apple也是为数不多的对ARM友善的公司。
Acorn很快遭遇瓶颈,无论是在财务上还是在技术上。销售量达到150万台的BBC Micro并没有给Acorn带来足够多的财富,与席卷天下的PC相比微不足道[54]。ARM3与Intel在1989年发布的80486也没有太多可比性。危机最终降临到Acorn这个年轻的公司,1985年2月,当时的IT巨头Olivetti出资12M英镑收购Acorn 49.3%的股份[55]。Olivetti的庇护并没有给Acorn带来机遇。
Olivetti创建于上世纪初,对智慧与品质近于苛刻的执着使得他们的产品可以在纽约的现代艺术博物馆中陈列,出现在许多经典的影片中。这些产品并没有改变这个公司的最终命运。Olivetti最终涉足PC领域,使用Zilog的Z8000,去挑战在这个领域所向无敌的Intel。
Olivetti收购Acorn后,更多地将ARM处理器用于研发,而真正的产品使用Zilog系列。这段时间是Acorn最艰难的日子。Acorn的创始人Andy Hopper最终选择从Olivetti独立。出乎意料之外,Olivetti支持了Andy的决定。
1990年11月,Acorn(事实上是Olivetti Research Lab),Apple和VLSI共同出资创建了ARM。Acorn RISC Machine也正式更名为Advanced RISC Machine[55]。在1996年,Olivetti在其最困难的时候将所持有的14.7%的Acorn股份出售给了雷曼兄弟[56]。
Apple当时正在为代号为Newton的项目寻找低功耗处理器。Newton项目的终极目标是实现地球上第一个Tablet。Apple对 Tablet的前景寄予厚望,他们直接将公司Logo上的Isaac Newton作为项目的名称。Apple最初的Logo是在苹果树下深思的牛顿。两个Steve[i]将公司命名为Apple,与喜欢吃苹果没有什么联系,是因为苹果而不是鸭梨砸到了牛顿头上。
Newton Tablet的想法过于超前,最糟糕的是Jobs当时并不在Apple。Apple用并不太短的时间证明了一条真理,没有Jobs的Apple和没有乔丹的公牛没有太大区别。1996年3月,Steve Jobs再次回到Apple,两年后取消了这个并不成功的项目[57]。等到Jobs再次推出iPad Newton,已是十几年之后的事情了[58]。
Apple投入3百万美金拥有了ARM公司43%的股份[60],但是并没有完全押宝在ARM公司,Apple真正关注的是在1991年与IBM和Motorola组建的AIM[59]。在1998年,ARM公司在英国和美国同时上市后,Apple逐渐卖出了这些股份。在2010年,Apple即便准备好了80亿美金,却也无法收购ARM。
1990年的ARM公司,财务依然十分拮据,12个员工只能挤在谷仓[ii]中办公,廉价License的商业模式更不被人看好。依靠Apple的鼎力相助,ARM6[iii]得以问世,却没有改变Apple和ARM的命运。Newton项目设计的是本应该属于下一个世纪的Tablet,ARM6被PC处理器和当时多如牛毛的RISC处理器笼罩,无所作为。
上世纪90年代属于PC领域。AMD的异军突起,及其与Intel的竞争,构建了上世纪九十年代处理器领域一道最炫目的风景线,而服务器领域属于 DEC。1992年2月25日,DEC发布的Alpha21064处理器,主频达到150MHz[61],Intel在第二年发布的Pentium处理器,主频仅有66MHz[62]。
整个90年代,处理器世界都在惊叹着Alpha处理器所创造的奇迹。DEC陆续发布的Alpha系列处理器既是放到二十一世纪的今天,设计理念依然并不落后。DEC工程师就是在为二十一世纪设计处理器芯片。在Alpha21x64系列处理器的编号中,’21’代表二十一世纪,而’64’代表64位处理器[63]。
上帝并不青睐DEC公司,科技与商业的严重背离终于酿成了巨大的灾难。Alpha处理器的技术尚未抵达巅峰,DEC的财务已捉襟见肘。 1994~1998年,DEC不断地向世界各地兜售资产。至1997年,DEC出售的资产已遍及五大洲,二十多个国家[64]。1998年1月26日,DEC正式被Compaq收购[65]。在DEC解体的最后一段日子里两个公司最为受益,一个是Intel,另一个就是ARM。
在ARM的起步阶段,鼎力相助的是Apple,最先License ARM内核的是英国本土的GEC半导体公司。在1993年因为Apple的引荐,ARM处理器跋山涉水来到日本,与Sharp建立了合作关系。在此之前 Sharp与Apple一直在合作开发Newton项目。
这些合作并没有缓解ARM的财务危机,ARM一直在追寻真正属于自己的客户。1993年,Cirrus Logic[iv]和德州仪器公司TI(Texas Instruments)先后加入ARM阵营。TI给予了ARM雪中送炭的帮助。TI正在说服当时一家并不知名的芬兰公司Nokia与他们一道进入通信移动市场。TI在DSP领域已经取得了领袖地位,但并不熟悉CPU业务,在屈指可数的可以被操控的公司中,他们最终选择了ARM[67]。
ARM迎来了上天赐予的机会。通过与Nokia和TI的密切合作,ARM发明了16位的Thumb指令集,也真正意义上创建了基于 ARM/Thumb的SoC商业模式[67]。ARM已经逐渐摆脱了财务危机,业务不断扩大。至1993年底,ARM已有50个员工,销售额达到10M英镑。
同年ARM迎来了公司成立以来最重要的一颗处理器内核,ARM7[67]。ARM7使用的Die尺寸是Intel 80486的十六分之一,售价仅为50美金[v]左右。较小的Die尺寸,使得ARM7处理器获得了较的功耗,适合手持式应用[67]。
ARM7处理器引起了当时的处理器巨头DEC的关注。1995年,DEC开始研发StrongARM。与其他License ARM内核的半导体厂商不同。DEC获得了ARM架构的完整授权,DEC可以使用ARM的指令集,设计新的处理器架构,这个特权后来被Intel和 Marvell陆续继承。第二年的2月5日,DEC正式发布SA110处理器,并开始提供样片[68]。SA110处理器迅速得到了业界的认可,Apple正式使用SA110处理器开发MessagePAD 2000 [69]。
StrongARM处理器在设计中注入了Alpha处理器的一些元素。StrongARM使用5级顺序执行的流水线,分离了指令和数据 Cache,添加了DMMU和IMMU功能部件,每个MMU中包含32个全互连结构的TLB,添加了16级深度的WB(Write Buffer)[70]。至此ARM处理器更像是一颗微处理器,而不再是微控制器。
DEC的帮助使ARM处理器达到了前所未有的高度。更为重要的是,这颗160MHz,DMIPS为185的处理器,功耗低于500mW[70]。这不仅引起了工业界的浓厚兴趣,学术界也开始真正关注ARM处理器。1997年,DEC如期发布了第二颗StrongARM芯片,SA1100。 SA1100在SA110的基础上增加了一些外部设计。第二年Intel为SA1100提供了一个伴侣芯片SA1101,SA1100+SA1101也成为了许多PDA厂商的首选。1999年,Intel发布了最后一颗StrongARM处理器SA1110[vi],和对应的伴侣芯片SA1111。
StrongARM的发布并没有使DEC摆脱财务危机。而DEC却找到了一个更容易赚钱的途径。1997年5月,DEC正式起诉Intel,宣称 Intel在设计Pentium,Pentium Pro和Pentium II处理器时侵犯了DEC的10条专利。1997年9月,Intel反诉DEC在设计Alpha系列处理器时侵犯了Intel多达14条专利[72]。
在IT界,这样的官司大多不了了之。1997年11月27日,DEC和Intel选择和解。DEC向Intel提供除Alpha处理器之外的所有硬件设计授权,并进一步支持Intel开发IA64处理器。而Intel花费了625M美金购买DEC在Hudson的工厂,Israel Jerusalem和Texas Austin的芯片设计中心。另外这两个公司还签署了长达十年的交叉授权协议[72]。
DEC的技术注入使Intel的x86处理器迈入新的时代,很快Intel具备了向所有RISC处理器同时宣战的能力,最终一统PC和服务器领域。此外Intel还从DEC获得了StrongARM。克雷格·贝瑞特认为这是上天赐予Intel的机会,x86处理器与StrongARM的组合,将使Intel的处理器遍及世界上任何需要处理器的领域。
为了迎接StrongARM的到来,贝瑞特放弃了Intel自己的RICS处理器,i860和i960。Intel为StrongARM起了一个炫目的名字XScale,动用了积蓄已久史上最为强大的Ecosystem,强势进军嵌入式领域。
一时间,XScale处理器遍及嵌入式应用的每一个领域,用于手持终端的PXA系列,用于消费类电子的IXC/Intel CE系列,用于存储的IOP系列,用于通信的IXP系列。Intel的处理器技术极大地促进了ARM内核的发展,借用PC帝国的Ecosystem使 ARM处理器从生产到设计一步领先于所有嵌入式行业的竞争者。成为XScale处理器试金石的是摩托罗拉半导体的68K处理器。
在XScale系列处理器诞生之前,68K处理器主宰嵌入式领域,Apple Macintosh最初也使用68K处理器。在1997年,摩托罗拉销售了79M片68K处理器,而Intel的x86处理器一共卖出了75M片 [73]。这是68K处理器最后的辉煌。Intel和TI主导的ARM处理器终结了68K处理器。摩托罗拉半导体面对ARM的强势出击毫无准备。ARM处理器不断地蚕食68K的市场份额,直到完全占有。
1995年,摩托罗拉半导体的香港设计中心发布第一颗用于手持式设备的DragonBall处理器,MC68328(EZ/VZ/SZ) [74],这是香港半导体界最好的时代。而StrongARM/XScale很快结束了香港设计中心的幸福生活。面对ARM的挑战,DragonBall最终屈服,DragonBall MX(Freescale i.MX)系列处理器开始使用ARM9。使用ARM内核并没有改变摩托罗拉香港设计中心的命运,这个设计中心最终不复存在。
在工业控制领域,68K内核进化为ColdFire[vii]。ColdFire在HP的中低端打印机中取得的成就几乎是最后的绝唱。在通信领域,摩托罗拉半导体抛弃了基于68K内核的MC68360,研发出基于PowerPC架构的MPC860处理器。这颗处理器是通信时代的经典之作,摩托罗拉半导体陆续推出了一系列基于PowerPC内核的通信处理器,却再也没有重现MPC860时代的君临天下。近期推出的QorIQ[viii]系列处理器面对多核MIPS处理器总是滞后一拍。
摩托罗拉半导体,昔日的王者优雅地没落。摩托罗拉半导体于1955年推出第一个锗晶体管,开创了半导体集成电路产业,在整个60年代一骑绝尘,70年代末迎来了68K的辉煌。即使在1985年,摩托罗拉还是全球第三大半导体公司。而怀抱通吃整个产业链的野心,对封闭式系统的挚爱,使摩托罗拉连同半导体部门在同一棵石头上跌到了一次又一次。至21世纪,摩托罗拉半导体(Freescale)的排名在十名左右,2009年的排名仅为第17位。
击败了摩托罗拉半导体的Intel没有感到一丝喜悦,更多的是寒气。2006年,Intel的业绩跌入低谷,这也使得当时的CEO贝瑞特作出了一个艰难的选择,2006年6月27日,Intel将PXA系列处理器出售给了Marvell[12]。
Intel虽然保留了ARM处理器的授权,事实上却已彻底退出了ARM阵营。这是Intel一个非常谨慎而且坚决的选择。Intel需要扑灭后院的熊熊烈火。在PC领域,AMD率先推出了64位的K8处理器[75],并在2005的Computex上,发布双核处理器Athlon 64。Intel x86最引以为豪的性能优势已不复存在。
这段时间Intel只能依靠工艺与强大的商务能力与AMD的Athlon64处理器周旋。2008年11月,Intel正式发布基于 Nehalem内核,用于台式机的Core i7处理器[76],用于服务器的Xeon处理器,Core i3/i5也如期而至。Nehalem内核使Intel彻底战胜了AMD。这颗处理器也是Intel开始研发x86处理器以来,第三个具有里程碑意义的产品,之前的两个里程碑分别是80386和Pentium Pro。从这时起AMD处理器在性能上再也没有超过Intel。Intel解决了最大的隐患后,却发现ARM处理器已非吴下阿蒙。
ARM7之后,ARM8内核于1996年发布。ARM8内核生不逢时。与ARM7相比,AMR8在没有显著提高功耗的前提下,性能提高了一倍,依然无法和DEC的StrongARM抗衡[77][78]。仅有少量手机在原型设计中考虑过使用ARM8内核,ARM也仅为用户提供了CPU样板。
ARM8的失败并没有阻碍ARM内核的进一步发展,与StrongARM的竞争没有消减ARM阵营的实力,反而激发了ARM处理器不断向前的动力。1997年ARM9正式发布,DMIPS指标首次超过了1.0大关。ARM9是一个重要的里程碑产品。这个产品标志着ARM处理器正式进入微处理器领域,而不再是简单的微控制器。
ARM9将ARM7的3级指令流水线提高到5级,与StrongARM使用的流水线结构较为相似。进一步细化的流水线使得ARM9最高的时钟频率达到220MHz,而ARM8仅为72MHz[78]。ARM9进一步优化了Load和Store指令的效率,ARM9不再使用普林斯顿结构,而转向哈佛结构,使用了独立的指令与数据Cache。
ARM9的指令执行部件分离了Memory和Write Back阶段,这两个阶段分别用于访问存储器和将结果回写到寄存器。这些技术的应用使得ARM9可以在一个周期内完成Load和Store指令,而在 ARM7中,Load指令需要使用3拍,而Store指令需要使用2拍。
此外ARM9可以通过增强的编译器调整指令顺序来解决RAW(Read-after-Write)[ix]类相关。ARM9的这些功能增强,使得在相同的工艺下,其执行性能是ARM7的一倍左右[79]。ARM7并没有被淘汰,简练的设计极大降低了功耗,Apple在2001年10月23日 [80]发布的iPod依然使用了ARM7处理器[81]。
ARM7与ARM9的合理布局,使得ARM阵营迅猛发展。基于ARM7和ARM9内核的SoC处理器迅速遍及世界的每一个角落。ARM内核依然在前进。1998年的EPF(Embedded Processor Forum) ARM10内核正式推出。2000年4月12日,Lucent发布了第一颗基于ARM10的处理器芯片[83]。
ARM10内核的设计目标依然是在相同的工艺下,双倍提升ARM9的性能。而提高性能的第一步是提高指令流水线的时钟频率,而流水线中最慢的逻辑单元决定了时钟频率。ARM10使用了6级流水线结构,但并不是在ARM9的5级流水线的基础上增加了一级,而是进行了细致取舍而调优。最终的结果是在使用相同的工艺时,ARM10内核可使用时钟频率为ARM9内核的1.5倍[82] [84]。
ARM10内核重新使用了ARM8内核的系统总线,将ARM9的32位系统总线提高到64位。这也使得ARM10可以在一个时钟周期内完成两条寄存器与存储器之间的数据传递,大幅提高了Load Multiple和Store Multiple指令的效率[84]。
另外ARM10改动了Cache Memory系统,与ARM9相比提高了存储器系统的效率。ARM10的指令与数据Cache使用虚拟地址,64路组相连结构,引入了高端处理器中流水线与Cache交换数据的Streaming Buffer和Cache Line filling部件[84]。
ARM10内核优化了存储器读指令。实现了最为简单的乱序执行机制。当一条存储器读指令没有执行完毕,其后不相关的指令可以继续执行。ARM10对乘法指令进行了特别的优化,设置了一个新型的16×32的乘法和乘加部件外,同时设置了两级乘法指令流水,使得每一个时钟周期可以执行一条乘法指令 [84]。最后ARM10内核增加了对浮点运算的支持。
从技术的角度上看,ARM10远胜过ARM9,但是没有办法在商业上与ARM9一较高下。ARM10的命运与ARM8惊人的一致。生不逢时的ARM8与StrongARM不期而遇,ARM10与XScale生活在同一年代。
Intel的工程师面对ARM的指令流水线耐不住技痒,ARM10的指令流水线与之前的ARM内核相比,可以说是一个飞跃,而与同年代的高端处理器相比只是一个玩具。Intel的帮助极大促进了ARM处理器的发展。
Intel在保证XScale架构低功耗的同时,引入已经在Pentium Pro系列处理器上非常成熟的Superpipelined RISC技术[85],借助Intel的工艺优势,使得XScale处理器的最高运行频率达到了1.25GHz[86]。此时Intel开发的处理器步入了高频低能的陷阱,1.25GHz的PXA3XX性能仅比624MHz的PXA270的执行效率高25%[86]。
XScale架构并没有使Intel盈利。ICG(Intel Communication Group)部门和WCCG(Wireless Communications and Computing Group)部门给Intel带来的是巨额亏损,ICG在2002~2004年的亏损分别为$817M, $824M和$791M[87]。2003年12月11日,Intel宣布将WCCG合并到ICG中,并在2004年1月1日生效。
这次合并没有挽救XScale的命运。在2006年,AMD的步步紧逼使Intel迎来了20年以来最糟糕的一季财务报表。Intel开始了有史以来最大规模的裁员。2006年7月13日,Intel宣布取消1000个经理职务[89],2006年9月5日,Intel裁员10%[90]。
在此之前Intel将XScale处理器中Marvell还愿意接收的部分出售[12]。Marvell需要的并不是XScale内核,而是 Intel从DEC获得的对ARM指令集的完整授权,很快Marvell推出了基于标准ARM v5/v6/v7的处理器,而不再单独依靠XScale。XScale,这个几乎耗尽Intel全部心血的架构,已经走到了最后尽头。
Intel退出ARM阵营,不是因为缺少$600M现金。和许多人预料的并不相同,Intel并不是为了主推ATOM处理器,而放弃XScale。而是因为Intel用长达八年的时间发现了一个事实,ARM的廉价License策略并不能使之获利,而必须做Atom。
ARM的廉价License的获益者是ARM自身,随着处理器厂商的不断加入, ARM阵营获得了迅猛发展,这也加速了处理器厂商的优胜劣汰。但是Intel发现的事实依然适用于所有正在使用ARM授权的半导体厂商。
最令ARM内核尴尬的是,依靠这个号称最为开放的处理器内核,获取暴利的是一些做着史上最为封闭系统的公司。凭借ARM内核,Qualcomm为 3G专利找到了最佳载体,Apple不断兜售着各类新奇的电子设备。来自通信领域的Cisco,华为陆续加入ARM阵营。ARM,这个来自半导体领域的处理器,并没有使这个领域受益。ARM的出现,极大降低了处理器的设计门槛,使得单纯依靠半导体技术,为做处理器而做处理器的厂商举步维艰。
Intel首当其冲。Intel的错误在十几年前已然犯下。贝瑞特本应该做出对Intel最为有利选择,从DEC那里获得StrongARM后,再亲手终结StrongARM。贝瑞特不经意的失误为Intel的未来树立了一个强大的对手,也使整个处理器世界更加精彩。ARM已经从XScale处理器中获得了足够的能量,已经可以不依赖任何厂商。他们的命运已经牢牢地掌握在自己手中。
2002年12月,ARM1136内核发布[91]。2004年7月19日,ARM1176内核发布[92]。2005年3月10日,ARM1156内核发布[93]。在此之前的ARM处理器虽然得到了广泛应用,但是从纯技术的角度上看这些处理器微不足道。
ARM11基于ARMv6指令集,之前ARM还开发了V1,V2,V2a,V3,V4和V5指令集。ARM使用的内核与指令集并不一一对应。如 ARM9使用V4和V5指令集,XScale使用V5指令集。ARM7最初使用V3,而后使用V4,最后升级到V5。在ARM指令集后还包含一些后缀如 ARMv5TEJ,其中T表示支持Thumb指令集,E表示支持Enhanced DSP指令,而J表示支持Jazelle DBX指令。
ARM v4指令集包含最基础的指令集;v5增强了ARM与Thumb指令间的交互同时增加了CLZ(Count Leading Zero)和BKPT(Software Breakpoint)指令;ARMv5TE增加了一系列Enhanced DSP指令,如PLD(Preload Data),LDRD(Dual Word Load),STRD(Dual Word Store)和64位的寄存器传送指令如MCRR和MRRC。ARM v4和v5在指令集上变化不大,v5也可以向前兼容v4指令集[94]。
而v6指令集并不能100%向前兼容v5的指令集。由于ARMv6对存储器访问模型的大规模更改,完全的向前兼容不再可能。从x86处理器苛求的向前兼容的角度上看,这些改动并不完美,也正是这些不完美使得ARM内核轻装前进。
ARM的指令集使用RISC架构,但是在ARM指令集中包含许多CISC元素。与PowerPC指令集相比,ARM的指令集凌乱得多,这为指令流水线的译码部件制造了不小的麻烦。在ARM内核包含三类指令集,一个是32b长度的ARM指令,一个是16b长度的Thumb指令,还有一类由8位组成的变长Jazelle DBX(Direct Bytecode eXecution)指令集。在ARM架构为数不多的指令集中,有两类指令值得特别关注,一个是Conditional Execution指令,另一个是移位指令。
绝大多数ARM的数据访问指令都支持条件执行功能。所谓条件执行是指指令可以根据状态位,有选择地执行。使用这种方式可以在一定程度上降低条件转移指令预测失败时所带来的系统延时。在计算GCD(Greatest Common Divisor)时,ARM的条件执行指令发挥了巨大的作用,如图2所示。
图2 gcd算法的实现[94]
通过上图可以发现由于SUBGT和SUBLE指令可以根据CMP指令产生的状态决定是否执行,采用该类指令可以显著降低代码长度。ARM指令集还对移位操作进行了特别的处理,事实上ARM不含有单独的移位指令,而使用了Barrel Shifter技术,与其他指令联合实现移位操作。使用这种方法可以有效提高某些运算的效率,如图3所示。
图3 Barrel Shifter的使用
这些特殊的指令使得ARM内核有别于其他处理器内核,但这并不意味着也极大提高了执行效率。首先CMP指令,SUBGT和SUBLE指令有较强的相关性,不能并发执行。此外现代处理器的条件预测单元也可以极大降低条件转移指令的命中率。一些处理器,如x86的CMOV指令和PowerPC的isel指令使用了更小的代价实现了ARM的条件执行功能。
ARM内核在条件执行指令时占用了4个状态位,也进一步影响了指令集和寄存器的扩展。绝大多数RISC处理器中具有32个通用寄存器,而ARM内核仅有16个通用寄存器[x]。ARM的特殊移位操作,增加了指令的相关性,在有些情况下,不利于多发射流水线的实现,也增加了指令流水中预约站 RS(Reservation Station)的实现难度。
计算机体系结构是一个权衡的艺术,尺有所短,寸有所长。不同的内核都有自己最为合适的应用,不经过认真的量化分析不能轻易得出孰优孰劣的结论。不过仍有一个结论,在现阶段依然适用,处理器领域历经多年的优胜劣汰,所剩无几的处理器内核在激烈的竞争中日渐趋同。
ARM11内核使用了现代处理器中常用的一些提高IPC的技术,这是ARM处理器的一个重要里程碑。ARM11内核引起了计算机科学的两个泰山北斗,David A. Patterson和John L. Hennessy的注意。他们以ARM11内核为主体,而不再是MIPS,书写了计算机体系结构的权威著作,《Computer Organization and Design, Fourth Edition: The Hardware/Software Interface》。这也是学术界对ARM处理器有史以来的最大认可。
ARM11可以支持多核,采用了8级流水线结构,率先发布的内核其主频在350~500MHz之间,最高主频可达1GHz。在使用0.13μm工艺,工作电压为1.2V时,ARM11处理器的功耗主频之比仅为0.4mW/MHz。ARM11增加了SIMD指令,与ARM9相比MPEG4的编解码算法实现速度提高了一倍,改变了Cache memory的结构,使用物理地址对Cache行进行索引[95]。ARM11终于开始使用动态分支预测功能,设置了64个Entry,4个状态的 BTAC(Branch Target Address Cache)[95]。
ARM11进一步优化了指令流水线对存储器系统的访问,特别是在Cache Miss的情况之下的存储器读写访问。在ARM11内核中,当前存储器读指令并不会阻塞后续不相关的指令执行,即便后续指令依然是存储器读指令,只有3个存储器读指令都发生Cache Miss的情况,才会阻塞指令流水线[95]。
虽然ARM11没有使用RISC处理器常用的out-of-order加Superscaler技术,在一个时钟周期之内仅能顺序发射一条指令,但是支持out-of-order completion功能,即在执行单元中的不相关的指令可以乱序结束,而不用等待之前的指令执行完毕。
ARM11的这些功能增强,相对于ARM9/10是一个不小的技术飞跃。但是与其他处于同一时代的x86,PowerPC和MIPS处理器相比,仍然有不小的差距。ARM11内核的存活之道依然是性能功耗比。
依靠着强大的性能功耗比,ARM11内核取得了巨大的商业成功。ARM11内核并不是一个性能很高的处理器,但是随着ARM处理器性能的不断提升,量变终于引发了质变。ARM11内核的出现,使得Smart Phone的出现成为可能。
在此之前,基于ARM9,XScale处理器的手机只是在Feature Phone的基础上添加了少许智能部件。自ARM11的问世起,Apple,HTC在智能手机领域异军突起,Motorola一蹶不振。ARM11之后,ARM迎来了爆发式增长,陆续发布了Cortex A8和A9内核。
ARM处理器内核的快速更新,使得Nokia这个对新技术反应迟钝的公司,一步步走向衰退。在2010年9月底开始出货的Nokia N8[96],居然还在使用着680MHz主频的ARM11处理器[97],而这款产品却号称是Nokia最新的旗舰产品,它的竞争对手早已使用了 1GHz主频的Cortex A8处理器。
Cortex处理器是一个分水岭,从1983年开始的ARM内核,迎来了一颗真正意义的现代处理器。此时的ARM已经破茧成蝶,不再是低功耗伴随着低能的处理器。从这一刻起,ARM处理器具备了和Intel,一较高下的能力。2010年4月3日,Apple的Jobs正式发布iPad,ARM随之进入平板电脑领域[99]。ARM已将战火烧到了Intel的后院。
抛弃了XScale架构的Intel,并没有放弃手机处理器。2009年1月23日,Nokia与Intel在手机领域建立长期合作伙伴关系 [103]。2009年6月4日,Intel收购Windriver[102]。2010年5月4日,Intel正式发布用于智能手机和平板电脑,代号为 Moorestown的处理器[100]。2010年8月29日,Intel收购Infinion的无线部门[104]。在2011年左右,Intel将发布用于智能手机,代号为Medfield的处理器[101]。一系列的合作与收购,使Intel具备了进入手机领域的能力。
至此ARM之于PC领域,x86之于手机领域的野心,已昭然若揭。2010年9月9日,ARM正式发布代号为Eagle,5倍ARM9架构的 Cortex A15内核,这颗处理器所关注的应用是高端手机,家庭娱乐,无线架构,还有低端服务器[98]。Cortex A15向世人宣布除了PC,他们还要向Server进军。
ARM,这个曾被Intel鄙视,被其扶植,被其抛弃的处理器,开始直面挑战Intel的x86处理器。这场较量是今后处理器领域5到10年的主旋律。最终结果将影响处理器领域今后20年的格局。不要认为ARM处理器没有进入PC领域的可能,也不要认为ARM处理器可以继续在手机领域中所向披靡。
——————————————————————————–
[i]苹果公司的两个创始人都叫Steve,一个是Steve Wozniak,另一个是众所周知的Steve Jobs。Steven Wozniak是Apple I和Apple II的发明者。两个Steve在1976年4月,在一个车库中成立众所周知的Apple。
[ii]英国的谷仓文化与美国的车库文化相近,都是新技术的摇篮。
[iii] ARM公司从ARM3直接升级到ARM6。
[iv]我最初评估的ARM芯片就是Cirrus Logic的EP7312。当时我还在使用Altera的EPLD,名称是EP7132,我经常混淆这两个名字。在一个机缘巧合之下,粗心的采购将我需要购买的EP7132买成了EP7312,这颗芯片也是我不经意购买的第一颗ARM处理器。
[v]当时的处理器价格高得离谱,50美金已经是很廉价了。
[vi]我从SA1110开始接触ARM处理器,那是一个永远值得回忆的时代。
[vii]我在摩托罗拉半导体部门第一次接触的就是Coldfire处理器,目前这颗处理器仍然在不断发展中,这颗芯片与68K在汇编语言层面兼容,但是目标代码并不兼容。
[viii] QorIQ系列处理器基于E500 mc内核,与E500 v2有些微小差异。我的第一本著作是基于E500内核的《Linux PowerPC详解—核心篇》,当时准备写一套丛书,包括核心篇和应用篇。应用篇主要写外部设备,后来的《PCI Express体系结构导读》源自《Linux PowerPC详解—应用篇》,应用篇应该包含网络协议,PCI Express和USB总线,后来把网络协议部分和USB总线部分删掉了。
[ix]在处理器体系结构中,重点关注的有三类相关问题,RAW,WAR和WAW。使用寄存器重命名技术可以解决WAR和WAW相关。
[x]考虑到ARM在ARM11内核之前都不支持动态分支预测,和多发射,使用条件执行指令还是能够提高ARM7/9内核的执行效率。

分类: 嵌入式开发 标签:

RT-Thread上海开发者聚会

2010年11月8日 没有评论

今天参加了RT-Thread上海开发者聚会,其实我并不是RT-Thread的开发者,不过总归对RTOS有一点兴趣,有些东西用到了可能就比较着急,为什么不早点了解。至于RT-Thread的介绍,也没有什么必要。Google一下,就知道了。这种聚会的好处之一是可以多认识嵌入式领域的开发者,可以了解更多的资讯。

送了一本书还有一个雷柏的无线鼠,都还不错。

分类: 嵌入式开发 标签:

WUBI安装Ubuntu后,重做XP系统

2010年10月27日 没有评论

通过WUBI安装的Ubuntu,组成了Windows和Ubuntu双系统,但在重新安装过Windows后是不是发现在系统启动时没有了Ubuntu的选项了?其实有一个很方便的办法可以让其重新出现:

拷贝你通过WUBI安装的的Ubuntu目录下的 wubildr.mbr 和 wubildr两个文件到C盘。之后编辑C盘根目录下的 boot.ini 文件,默认是系统级隐藏、只读。在里面加上这么一行
c:\wubildr.mbr=”Ubuntu”

分类: 嵌入式开发 标签:

ARM内核与系统

2010年10月22日 没有评论


没有内容,却一目了然。

分类: 嵌入式开发 标签:

技术者反思录

2010年8月11日 没有评论

1、 分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。”其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生!”所以放在每一条,让刚刚毕业的朋友们早点看到哈!

2、 一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,“我刚毕业,还不知道将来可能做什么?”,“跟着感觉走,先做做看”。因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情!”。

3、 软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦!”四分五裂、各奔东西。那个项目的“成功度”大家可想而知了。

4、 详细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)。请牢记:“如果一个软件开发人员在1、2年内都没有更新过自己的知识,那么,其实他已经不再属于这个行业了。”不要告诉自己没有时间。来自时间管理领域的著名的“三八原则”告诫我们:另外的那8小时如何使用将决定你的人生成败!本人自毕业以来,平均每天实际学习时间超过2小时。

5、 书籍是人类进步的阶梯,对软件开发人员尤其如此。书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到“世外高人”,并不厌其烦地教你。对于花钱买书,我个人经验是:千万别买国内那帮人出的书!我买的那些家伙出的书,!00%全部后悔了,无一本例外。更气愤的是,这些书在二手市场的地摊上都很难卖掉。“拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧。”只有将书本变成的自己智慧,才算是真正拥有了它。

6、 不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次。“对任何事物不究就里”是任何行业的工程师所不应该具备的素质。开发Windows应用程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序;用VC++、Delphi、Java、.Net开发应用程序,花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码;除了会用J2EE、JBoss、Spring、Hibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,很多东西你“知其然且知其所以然”!

7、 在一种语言上编程,但别为其束缚了思想。“代码大全”中说:“深入一门语言编程,不要浮于表面”。深入一门语言开发还远远不足,任何编程语言的存在都有其自身的理由,所以也没有哪门语言是“包治百病”的“灵丹妙药”。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是:用面对对象工具开发某些关键模块时,为什么不可以借鉴C、C51、汇编的模块化封装方式?用传统的桌面开发工具(目前主要有VC++、Delphi)进行系统体统结构设计时,为什么不可以参考来自Java社区的IoC、AOP设计思想,甚至借鉴像Spring、Hibernate、JBoss等等优秀的开源框架?在进行类似于实时通信、数据采集等功能的设计、实现时,为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式?为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题???“他山之石、可以攻玉”。

8、 养成总结与反思的习惯,并有意识地提炼日常工作成果,形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知,对软件开发人员而言,有、无经验的一个显著区别是:无经验者完成任何任务时都从头开始,而有经验者往往通过重组自己的可复用模块、类库来解决问题(其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面)。这并不是说,所有可复用的东西都必须自己实现,别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是,最好还是自己实现,这样没有知识产权、版权等问题,关键是自己实现后能真正掌握这个知识点,拥有这个技能。

9、 理论与实践并重,内外双修。工程师的内涵是:以工程师的眼光观察、分析事物和世界。一个合格的软件工程师,是真正理解了软件产品的本质及软件产品研发的思想精髓的人(个人观点、欢迎探讨)。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作,但从软件工程师这个角度来看,这只是外在的东西,并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论,并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题,才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题,并在具体实践中验证和修正这些思想与方式,最终形成自己的理论体系和实用方法论。

10、心态有多开放,视野就有多开阔。不要抱着自己的技术和成果,等到它们都已经过时变成垃圾了,才拿出来丢人现眼。请及时发布自己的研究成果:开发的产品、有创意的设计或代码,公布出来让大家交流或者使用,你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具,5、6年之后的今天,还是那个样子,今天流行的好多Windows系统工具都比自己的晚,但进化得很好,且有那么多用户在使用。并且,不要保守自己的技术和思想,尽可能地与人交流与分享,或者传授给开发团队的成员。“与人交换苹果之后,每个人还是只有一个苹果;但交换思想之后,每个人都拥有两种思想”,道理大家都懂,但有多少人真正能做到呢?

11、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品,千万不要因为没有钱赚而不做。网络早已不再只是“虚拟世界”,网上有很多的开源项目、合作开发项目、外包项目,这都是涉猎工作以外的知识的绝好机会,并且能够结识更广的人缘。不要因为工作是做ERP,就不去学习和了解嵌入式、实时、通信、网络等方面的技术,反过来也是一样。如果当他别人拿着合同找你合作,你却这也不会,那也不熟时,你将后悔莫及。

12、书到用时方恨少,不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明: “对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。”教育心理学界为感谢西蒙教授的研究成果,故命名为西蒙学习法。可见,掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识,有空花时间看看,韬光养晦、未雨绸缪。

13、本文的总结与反思:

A:不要去做技术上的高手,除非你的目标如此。虽然本文是关于提高软件开发知识的建议,做技术的高手是我一向都不赞同的。你可以提高自己的专业知识,但能胜任工作即止。

B:提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理,可以很容易地延伸、应用到生活的其它方面。

C:在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质,尤其是那些目标不在技术方面的朋友。

分类: 嵌入式开发 标签: