2005年12月4日星期日

科普知识——计量单位

简单的说:
1 KB = 1024 B = 1024 Byte
1 MB = 1024 KB = 1024 B
1 GB = 1024 MB = 1024 x 1024 KB = 1024 x 1024 x 1024 B

复杂的说:

科普知识——计量单位
作者:唐欢
平时我们生活中时常遇见各种计量单位。
重量单位,例如公斤,也叫做千克,我们知道
1公斤 = 1 = 1000

当我们用符号表示的时候,用"g"表示"克",所以
"1000" 被记录为 "1000g"

当数字很大的时候,写起来就变得麻烦了,比如"500公斤"要写成"500 000g",零出现的太多了,容易弄错。人们为了"偷懒",决定再造出一些符号来表示比较大的数字,于是人们决定用英文中的K ilo(千)的首字母" K"来表示"千",于是很自然的
"1" 被记录为 "1Kg"

类似的例子还有长度单位,例如公里,也叫做千米:
1公里 = 1 = 1000
被记录为:
"1000m" 或者 "1 Km"

除了用K表示1000之外,更大的数字如何表示呢?按照K的由来(Kilo),人们又接着定义了一批字母,分别表示不同的数

字首 符号 乘法因数
exa- 代表10的18次幂 E 10的18次幂 = 1,000,000,000,000,000,000
peta- 代表10的15次幂 P 10的15次幂 = 1,000,000,000,000,000
tera- 代表"万亿" T 10的12次幂 = 1,000,000,000,000
giga- 代表"十亿" G 10的9次幂 = 1,000,000,000
mega- 代表"百万" M 10的6次幂 = 1,000,000
kilo- 代表"千" K 10的3次幂 = 1,000
hecto- 代表"百" h 10的2次幂 = 100
deca- 代表"十" da 10 = 10
deci- 代表"十分之一" d 10的-1次幂 = 0.1
centi- 代表"百分之一" c 10的-2次幂 = 0.01
milli- 代表"千分之一" m 10的-3次幂 = 0.001
micro- 代表"百万分之一" μ 10的-6次幂 = 0.000,001
nano- 代表"毫微" n 10的-9次幂 = 0.000,000,001
pico- 代表"万亿分之一" p 10的-12次幂 = 0.000,000,000,001
femto- 代表"千万亿分之一" f 10的 15次幂 = 0.000,000,000,000,001
atto- 代表"百亿亿分之一" a 10的 18次幂 = 0.000,000,000,000,000,001

这其中,有不少符号是我们熟悉的,由此我们就不难理解1(1d m)、1毫米(1mm)等等的表示了。


到了计算机学科中,出现了一个新的计量单位Byte,简写为大写字母"B ",中文叫作"字节"。正如"克"用来表示物体的重量、"米
"表示两点间的距离(或长度),"字节"是表示数据的多少。例如一个ASCII码中的英文字母"F"在计算机内部需要用一个字节来记录,而一个汉字"氓"需要用两个字节来记录。
我们往往会用计算机记录很多的数据,那么表示这些数据的时候我们又一次会遇到"表示很大的数字很麻烦"的问题。人们总是会试图利用已有经验去解决新问题,于是很自然的:
1000 Byte = 1000 B = 1K B
然而事实上,这个式子并不严格的成立。严格意义上应该是:
1 KB = 1024 Byte = 1024 B
为什么这里的进制不再是1000,而是1024呢?因为计算机中使用进制,而现实生活中使用进制。进一步解释就是,生活中我们用字母 K表示整数1000,即的三次方,也可以写成10^3;而计算机领域中,人们发现 的十次方( 2^10)等于1024,与1000很接近,因此也使用字母K来表示了。同样一个字母,放在了不同的地方比是不同大小的数。 不过,由于两个数字差别不大,所以当我们平时生活中说起计算机相关的话题的时候,仍然可以把这里的进位认为是1000。
同"借用了"
字母K一样,计算机领域还使用了诸如M GTP等符号,它们之间的进位严格意义上保持1024,于是:
1 B = 1 Byte
1 KB = 1024 B = 1024 Byte
1 MB = 1024 KB = 1024 B
1 GB = 1024 MB = 1024 x 1024 KB = 1024 x 1024 x 1024 B
1 TB = 1024 GB = 1024 x 1024 M B = 1024 x 1024 KB = 1024 x 1024 x 1024 x 1024 B

这些符号中,仅M经常被人们读作"兆",其他都按照英文字母发音。例如,说一部mp3的容量是"512兆",指它的存储容量是512MB
同样的,我们平时也近似的认为它们之间的换算使用1000而不是1024。例如,假设1G的硬盘空间用来放歌曲,每首歌都是5MB,那么大家会估计的说一共可以放1000/5=200首,其实是1024/5 = 204 首。


到这里,我们应该明白了一个道理:"
数量"这个词分别指代""和"" 两个方面,。
""可以有不同的度量方法,用秤称出重量、用尺子量出距离、用表测出时间等 等。

"
"则可以有不同的表示形式,例如用字母去表示一定的数,1K表示1000。引伸的更远一点的例子是罗马数字,一种用符号及其位置表示数字的方式,I表示1,II表示2,III表示 3,V表示5,X表示10,然后定义了计算规则"写在字母左边的表示减法,右边的表示加法",于是 IV 表示5-1=4,VIII表示5+3=8,IX表示10-1=9 ....

2005年11月23日星期三

HTML参考

HTML参考

学学简单的HTML知识,起码可以帮助我在Google Adsense上赚钱

2005年11月16日星期三

管理处理器的亲和性(affinity)

管理处理器的亲和性(affinity)

管理处理器的亲和性(affinity)

为什么(3 个原因)以及如何使用硬(相对于软)CPU 亲和性(affinity)





级别: 中级

Eli Dow , 软件工程师, IBM Linux Test and Integration Center

2005 年 11 月 14 日

了解 Linux® 2.6 调度器如何处理 CPU 亲和性(affinity)可以帮助您更好地设计用户空间的应用程序。软亲和性(affinity) 意味着进程并不会在处理器之间频繁迁移,而 硬亲和性(affinity) 则意味着进程需要在您指定的处理器上运行。本文介绍了当前的亲和性(affinity)机制,解释为什么和如何使用亲和性(affinity),并给出了几个样例代码来显示如何使用这种功能。

简单地说,CPU 亲和性(affinity) 就是进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性。Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。

2.6 版本的 Linux 内核还包含了一种机制,它让开发人员可以编程实现 硬 CPU 亲和性(affinity)。这意味着应用程序可以显式地指定进程在哪个(或哪些)处理器上运行。

什么是 Linux 内核硬亲和性(affinity)?

在 Linux 内核中,所有的进程都有一个相关的数据结构,称为 task_struct。这个结构非常重要,原因有很多;其中与 亲和性(affinity)相关度最高的是 cpus_allowed 位掩码。这个位掩码由 n 位组成,与系统中的 n 个逻辑处理器一一对应。 具有 4 个物理 CPU 的系统可以有 4 位。如果这些 CPU 都启用了超线程,那么这个系统就有一个 8 位的位掩码。

如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运行。因此,如果一个进程可以在任何 CPU 上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是 1。实际上,这就是 Linux 中进程的缺省状态。

Linux 内核 API 提供了一些方法,让用户可以修改位掩码或查看当前的位掩码:

  • sched_set_affinity() (用来修改位掩码)
  • sched_get_affinity() (用来查看当前的位掩码)

注意,cpu_affinity 会被传递给子线程,因此应该适当地调用 sched_set_affinity





为什么应该使用硬亲和性(affinity)?

通常 Linux 内核都可以很好地对进程进行调度,在应该运行的地方运行进程(这就是说,在可用的处理器上运行并获得很好的整体性能)。内核包含了一些用来检测 CPU 之间任务负载迁移的算法,可以启用进程迁移来降低繁忙的处理器的压力。

一般情况下,在应用程序中只需使用缺省的调度器行为。然而,您可能会希望修改这些缺省行为以实现性能的优化。让我们来看一下使用硬亲和性(affinity) 的 3 个原因。

原因 1. 有大量计算要做

基于大量计算的情形通常出现在科学和理论计算中,但是通用领域的计算也可能出现这种情况。一个常见的标志是您发现自己的应用程序要在多处理器的机器上花费大量的计算时间。

原因 2. 您在测试复杂的应用程序

测试复杂软件是我们对内核的亲和性(affinity)技术感兴趣的另外一个原因。考虑一个需要进行线性可伸缩性测试的应用程序。有些产品声明可以在 使用更多硬件 时执行得更好。

我们不用购买多台机器(为每种处理器配置都购买一台机器),而是可以:

  • 购买一台多处理器的机器
  • 不断增加分配的处理器
  • 测量每秒的事务数
  • 评估结果的可伸缩性

如果应用程序随着 CPU 的增加可以线性地伸缩,那么每秒事务数和 CPU 个数之间应该会是线性的关系(例如斜线图 —— 请参阅下一节的内容)。这样建模可以确定应用程序是否可以有效地使用底层硬件。

Amdahl 法则

Amdahl 法则是有关使用并行处理器来解决问题相对于只使用一个串行处理器来解决问题的加速比的法则。加速比(Speedup) 等于串行执行(只使用一个处理器)的时间除以程序并行执行(使用多个处理器)的时间:


T(1)
S = ------
T(j)

其中 T(j) 是在使用 j 个处理器执行程序时所花费的时间。

Amdahl 法则说明这种加速比在现实中可能并不会发生,但是可以非常接近于该值。对于通常情况来说,我们可以推论出每个程序都有一些串行的组件。随着问题集不断变大,串行组件最终会在优化解决方案时间方面达到一个上限。

Amdahl 法则在希望保持高 CPU 缓存命中率时尤其重要。如果一个给定的进程迁移到其他地方去了,那么它就失去了利用 CPU 缓存的优势。实际上,如果正在使用的 CPU 需要为自己缓存一些特殊的数据,那么所有其他 CPU 都会使这些数据在自己的缓存中失效。

因此,如果有多个线程都需要相同的数据,那么将这些线程绑定到一个特定的 CPU 上是非常有意义的,这样就确保它们可以访问相同的缓存数据(或者至少可以提高缓存的命中率)。否则,这些线程可能会在不同的 CPU 上执行,这样会频繁地使其他缓存项失效。

原因 3. 您正在运行时间敏感的、决定性的进程

我 们对 CPU 亲和性(affinity)感兴趣的最后一个原因是实时(对时间敏感的)进程。例如,您可能会希望使用硬亲和性(affinity)来指定一个 8 路主机上的某个处理器,而同时允许其他 7 个处理器处理所有普通的系统调度。这种做法确保长时间运行、对时间敏感的应用程序可以得到运行,同时可以允许其他应用程序独占其余的计算资源。

下面的样例应用程序显示了这是如何工作的。





如何利用硬亲和性(affinity)

现 在让我们来设计一个程序,它可以让 Linux 系统非常繁忙。可以使用前面介绍的系统调用和另外一些用来说明系统中有多少处理器的 API 来构建这个应用程序。实际上,我们的目标是编写这样一个程序:它可以让系统中的每个处理器都繁忙几秒钟。可以从后面的“下载”一节中 下载样例程序


清单 1. 让处理器繁忙

/* This method will create threads, then bind each to its own cpu. */
bool do_cpu_stress(int numthreads)
{
int ret = TRUE;
int created_thread = 0;

/* We need a thread for each cpu we have... */
while ( created_thread < numthreads - 1 )
{
int mypid = fork();

if (mypid == 0) /* Child process */
{
printf("\tCreating Child Thread: #%i\n", created_thread);
break;
}

else /* Only parent executes this */
{
/* Continue looping until we spawned enough threads! */ ;
created_thread++;
}
}

/* NOTE: All threads execute code from here down! */

正如您可以看到的一样,这段代码只是通过 fork 调用简单地创建一组线程。每个线程都执行这个方法中后面的代码。现在我们让每个线程都将亲和性(affinity)设置为自己的 CPU。


清单 2. 为每个线程设置 CPU 亲和性(affinity)

cpu_set_t mask;

/* CPU_ZERO initializes all the bits in the mask to zero. */
CPU_ZERO( &mask );

/* CPU_SET sets only the bit corresponding to cpu. */
CPU_SET( created_thread, &mask );

/* sched_setaffinity returns 0 in success */
if( sched_setaffinity( 0, sizeof(mask), &mask ) == -1 )
{
printf("WARNING: Could not set CPU Affinity, continuing...\n");
}

如果程序可以执行到这儿,那么我们的线程就已经设置了自己的亲和性(affinity)。调用 sched_setaffinity 会设置由 pid 所引用的进程的 CPU 亲和性(affinity)掩码。如果 pid 为 0,那么就使用当前进程。

亲和性(affinity)掩码是使用在 mask 中存储的位掩码来表示的。最低位对应于系统中的第一个逻辑处理器,而最高位则对应于系统中最后一个逻辑处理器。

每个设置的位都对应一个可以合法调度的 CPU,而未设置的位则对应一个不可调度的 CPU。换而言之,进程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了。这些线程的亲和性(affinity)都会传递给从它们派生的子进程中。

注意不应该直接修改位掩码。应该使用下面的宏。虽然在我们的例子中并没有全部使用这些宏,但是在本文中还是详细列出了这些宏,您在自己的程序中可能需要这些宏。


清单 3. 间接修改位掩码的宏

void CPU_ZERO (cpu_set_t *set)
这个宏对 CPU 集 set 进行初始化,将其设置为空集。

void CPU_SET (int cpu, cpu_set_t *set)
这个宏将 cpu 加入 CPU 集 set 中。

void CPU_CLR (int cpu, cpu_set_t *set)
这个宏将 cpu 从 CPU 集 set 中删除。

int CPU_ISSET (int cpu, const cpu_set_t *set)
如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。

对于本文来说,样例代码会继续让每个线程都执行某些计算量较大的操作。


清单 4. 每个线程都执行一个计算敏感的操作

/* Now we have a single thread bound to each cpu on the system */
int computation_res = do_cpu_expensive_op(41);
cpu_set_t mycpuid;
sched_getaffinity(0, sizeof(mycpuid), &mycpuid);

if ( check_cpu_expensive_op(computation_res) )
{
printf("SUCCESS: Thread completed, and PASSED integrity check!\n",
mycpuid);
ret = TRUE;
}
else
{
printf("FAILURE: Thread failed integrity check!\n",
mycpuid);
ret = FALSE;
}

return ret;
}

现在您已经了解了在 Linux 2.6 版本的内核中设置 CPU 亲和性(affinity)的基本知识。接下来,我们使用一个 main 程序来封装这些方法,它使用一个用户指定的参数来说明要让多少个 CPU 繁忙。我们可以使用另外一个方法来确定系统中有多少个处理器:

int NUM_PROCS = sysconf(_SC_NPROCESSORS_CONF);

这个方法让程序能够自己确定要让多少个处理器保持繁忙,例如缺省让所有的处理器都处于繁忙状态,并允许用户指定系统中实际处理器范围的一个子集。





运行样例程序

当运行前面介绍的 样例程序 时,可以使用很多工具来查看 CPU 是否是繁忙的。如果只是简单地进行测试,可以使用 Linux 命令 top。在运行 top 命令时按下 “1” 键,可以看到每个 CPU 执行进程所占用的百分比。





结束语

这个样例程序虽然非常简单,但是它却展示了使用 Linux 内核中实现的硬亲和性(affinity)的基本知识。(任何使用这段代码的应用程序都无疑会做一些更有意义的事情。)了解了 CPU 亲和性(affinity)内核 API 的基本知识,您就可以从复杂的应用程序中榨取出最后一点儿性能了。


参考资料

学习

获得产品和技术

讨论




关于作者


Eli Dow 是位于 Poughkeepsie, NY. 的 IBM Linux Test and Integration Center 的一名软件工程师。他拥有 Clarkson 大学的计算机科学和心理学学士学位,以及计算机科学硕士学位。他的兴趣包括 GNOME 桌面、人与计算机的交互以及 Linux 系统编程。您可以通过 emdow@us.ibm.com 与 Eli 联系。





2005年11月7日星期一

IBM公布Cell低耗电设计手法概要--技术在线!

【A-SSCC】IBM公布Cell低耗电设计手法概要--技术在线!: "IBM公布Cell低耗电设计手法概要"

【日经BP社报道】

封装于SPE的3种锁存方式概要。在延迟时间和耗电量等指标中依据各指标的优先度,选择了需要采用的锁存方式。
为了在寄存器级别上运用时钟门控设计手法而插入的局部时钟缓冲(LCB)电路结构。
在演讲中利用视频内容所做的演示。介绍了将Cell用作渲染引擎时,为了有效地执行运算处理,如何使用8个SPE进行并行处理的具体事例。
  IBM、美国索尼计算机娱乐(Sony Computer Entertainment of America)及美国东芝电子元器件公司(Toshiba America Electronic Components),在2005年11月1日于台湾新竹开幕的“2005年亚洲固态线路研讨会(IEEE Asian Solid-State Circuits Conference,A-SSCC 2005)”上,就新一代微处理器“Cell”在开发过程中采用的低耗电设计手法,做了一次联合发表。在此次研讨会特设的“产业讨论会(Industry Session)上发表的演讲中,主要介绍了降低耗电的思路及测试结果。据A-SSCC筹划委员会(Program Committee)表示,产业讨论会上采纳的演讲更为重视在产业方面具有重大意义的技术发表,而不是学术上的新颖性。从原则上来讲,要求演讲内容要包括通过实测和模拟等手段得到的测试结果,以及现场演示和视频演示,希望以此能使产业界产生更大的兴趣。

  IBM发表演讲的技术人员首先介绍说,为了降低Cell的耗电量,推进了对8个信号处理器“SPE”的耗电量、电路面积和性能的优化处理。原因在于SPE部分是一个电路面积占整个Cell芯片的6~7成,且消耗大部分电量的电路块。具体来说,在SPE上大体采用了如下5种设计手法。即(1) “latch selection(锁存选择)”;(2)“clock gating(时钟门控)”;(3)“multi-clock domain design(多时钟域设计)”;(4)“dual threshold voltage(双阀值电压)”;(5)“selective use of dynamic circuits(动态电路的选择性使用)”。

  对于第(1)种设计手法,主要选择配置了3种锁存方式。包括“static scannable latch(静态可校验锁存)”、“non-scannable pulse clock latch(非可校验脉冲时钟锁存)”和“scannable dynamic multiplexer latch(可校验动态多路锁存)”。在延迟时间和耗电量等指标中依据各指标的优先度,选择了需要采用的锁存方式。

  对于第(2)种设计手法所讲的时钟门控,在寄存器级别上进行了实际应用。从结构上说,关闭各锁存方式的标准状态(不输入时钟信号),只在必要时接收时钟信号。控制时钟信号开关的信号可在1个周期(11FO4)内生成,从而就能进行更精细的控制。从基于时钟门控的耗电量来说,关闭时约为活动时的 20%左右。在SPE中运行应用程序时,利用时钟门控据悉最多可降低约50%的耗电量。

  在利用视频内容所做的演示中,针对将Cell用作渲染引擎(三维图形绘图处理)时,利用多内核特点更有效地执行运算处理的手法,介绍了有关情况。“从并行处理的程序封装来说,相关经验比较少。即便对于技术人员来说,不少情况下也很难会有具体的印象。于是,作为相关事例之一,我们提出了渲染的并行处理方式。”(IBM)。(记者:堀切 近史)

2005年11月3日星期四

Package Terminology

Packaging Information - Package Reference Guide

Packaging Information

Package Terminology

BGA
Ball Grid Array

CBGA
Ceramic Ball Grid Array


CDIP

Glass-Sealed Ceramic Dual In-Line Package

CDIP SB
Side-Braze Ceramic Dual In-Line Package

CFP
Both Formed and Unformed CFP

CPGA
Ceramic Pin Grid Array


CZIP

Ceramic Zig-Zag Package

Description
Description of package type.

DFP
Dual Flat Package

FC/CSP
Flip Chip / Chip Scale Package

HLQFP
Thermally Enhanced Low Profile QFP

HQFP
Thermally Enhanced Quad Flat Package

HSOP
Thermally Enhanced Small-Outline Package

HTQFP
Thermally Enhanced Thin Quad Flat Pack

HTSSOP
Thermally Enhanced Thin Shrink Small-Outline Package

HVQFP
Thermally Enhanced Very Thin Quad Flat Package

JEDEC
The JEDEC Standard for this package type.

JLCC
J-Leaded Ceramic or Metal Chip Carrier

LCCC
Leadless Ceramic Chip Carrier

Length
The length of the device (in millimeters).

LGA
Land Grid Array

LQFP
Low Profile Quad Flat Pack

Maximum Height
The maximum height above board surface form (in millimeters).

PDIP
Plastic Dual-In-Line Package

PFM
Plastic Flange Mount Package

Pkg
Package designator code used in Texas Instruments part numbers. The link from the Pkg code goes to the package mechanical drawing in PDF format. Each of the PDF files is between 30K and 50K Bytes.

Pins
The number of pins or terminals on the package.

Pitch
The distance between the centers of adjacent pins (in millimeters).

Preference Code
P - Use this package whenever possible
OK - Use if a preferred package is not available
A - Department approval required
X - Do not use

QFP
Quad Flat Package

SIP
Single-In-Line Package

SOJ
J-Leaded Small-Outline Package

SOP
Small-Outline Package (Japan)

SSOP
Shrink Small-Outline Package

TFP
Triple Flat Pack

TO/SOT
Cylindrical Package

TQFP
Thin Quad Flat Package

TSSOP
Thin Shrink Small-Outline Package

TVFLGA
Thin Very-Fine Land Grid Array

TVSOP
Very Thin Small-Outline Package

Thickness
The maximum thickness of the package body (in millimeters).

Type
The abbreviated acronymn for this type of package.

VQFP
Very Thin Quad Flat Package

Width
The width of the device (in millimeters).

*Additional types used in Package Designator Tables - These all are marked "DO NOT USE."

DIMM*
Dual-In-Line Memory Module

HSSOP*
Thermally Enhanced Shrink Small-Outline Package

LPCC*
Leadless Plastic Chip Carrier

MCM*
Multi-Chip Module

MQFP*
Metal Quad Flat Package

OPTO*
Light Sensor Package

PLCC*
Plastic Leaded Chip Carrier

PPGA*
Plastic Pin Grid Array

SDIP*
Shrink Dual-In-Line Package

SIMM*
Single-In-Line Memory Module

SODIMM*
Small Outline Dual-In-Line Memory Module

TSOP*
Thin Small-Outline Package

VSOP*
Very Small Outline Package

XCEPT*
Exceptions - May not be a real Package

Note: In the event of a conflict in dimensions this selection guide and the mechanical drawing, the mechanical drawing shall govern.

2005年10月26日星期三

芯片封装基本类型

DIP (Dual Inline Pckage) --- 双列直插式封装
DIMM (Dual Inline Memory Module) --- 双列直插存贮型组件
Can (Metal Can Package) --- 金属壳封装
BeamChip --- 梁式芯片
Beaml (BeamLead Package) --- 梁式引线封装
Zip tab (Zig Zag Inline with MetalHealHeatsink) --- 带散热片的Z形引线单列直插式
DIPtab (DIPackage with Meatlheatsink) --- 带散热片的双列直插封装
DPAK ()
FP (Flat Package) --- 扁平封装
FPL (Flat Package "L" Leads) --- L引线扁平封装
PLCC (Plastic Leaded Chip Carrier) --- 引线片装
RFMOD (Radio Frequency Module) --- 无线电频率组件
SIP (Single Inline Package) --- 单列直插式封装
SIPtab (SIP with Metal Heatsink) --- 带散热片的单列直插式封装
SOP (Small Outline DIP) --- 短输出双列贴片封装
ZIP (Zip Zag Inline Package) --- Z形引线单列直插式封装
LCC (Leadless Chip Carrier) --- 无引线片载
Module (Modular Package) --- 组合式封装
QFP(F) (Flat Package Quad stgle) --- 四向扁平封装
QUIP (Quad Inline Package) --- 四列直插式封装
QUIPtab (QUIP with Metal Heatsink) --- 带散热片的四列直插封装

电子工程词典 - ZBT SRAM

FPGA技术网 - 电子工程词典

零 总线变换(Zero Bus Turnaround)SRAM,它是一种类型的SRAM。术语“零总线变换”由IDT公司在1996年十月提出。IDT、Micron和 Motorola各自独立地开发了ZBT技术,并且所有三家公司均基于相同的构架提供兼容的ZBT产品。顾名思义,ZBT SRAM在读周期与写周期切换的时候不需要变换周期。通过利用每一个总线周期,ZBT SRAM为系统提供了最大的吞吐量,从而提供了最大的系统带宽。如果一个系统在数据总线上具有许多随机的、交错混合的读写操作的话,ZBT SRAM的这种特性就带来了非常大的好处。下图演示了ZBT SRAM与传统SRAM之间的区别。




ZBT SRAM具有pipelined和flowthrough两个类型。pipelined器件具有更高的操作频率,而flowthrough器件则具有更短的潜伏期。两种类型的控制信号是相同的,并且比Sync Burst SRAM的控制信号更少。
Pipelined ZBT SRAM

Pipelined ZBT SRAM是一种late-late-read RAM,数据在地址信号的两个时钟周期之后出现。为了实现交错的读和写,它还是一种late-late-write RAM。在读操作过程中,有效数据在地址和控制信号的两个时钟周期之后出现。相似地,在写操作过程中,数据在地址和控制信号被锁存后的两个时钟周期输入。 如下图所示:



Flowthrough ZBT SRAM

Flowthrough ZBT SRAM是一种late- read RAM,数据在地址信号的一个时钟周期之后出现。为了实现交错的读和写,它还是一种late-write RAM。如下图所示:

2005年10月25日星期二

硬件工程师基础知识

硬件工程师基础知识--波可石头: "硬件工程师基础知识"

硬件工程师基础知识

目的:基于实际经验与实际项目详细理解并掌握成为合格的硬件工程师的最基本知识。
1) 基本设计规范
2) CPU基本知识、架构、性能及选型指导
3) MOTOROLA公司的PowerPC系列基本知识、性能详解及选型指导
4) 网络处理器(INTEL、MOTOROLA、IBM)的基本知识、架构、性能及选型
5) 常用总线的基本知识、性能详解
6) 各种存储器的详细性能介绍、设计要点及选型
7) Datacom、Telecom领域常用物理层接口芯片基本知识,性能、设计要点及选型
8) 常用器件选型要点与精华
9) FPGA、CPLD、EPLD的详细性能介绍、设计要点及选型指导
10) VHDL和Verilog HDL介绍
11) 网络基础
12) 国内大型通信设备公司硬件研究开发流程;

二.最流行的EDA工具指导

熟练掌握并使用业界最新、最流行的专业设计工具
1) Innoveda公司的ViewDraw,PowerPCB,Cam350
2) CADENCE公司的OrCad, Allegro,Spectra
3) Altera公司的MAX+PLUS II
4) 学习熟练使用VIEWDRAW、ORCAD、POWERPCB、SPECCTRA、ALLEGRO、CAM350、MAX+PLUS II、ISE、FOUNDATION等工具;
5) XILINX公司的FOUNDATION、ISE

一. 硬件总体设计
掌握硬件总体设计所必须具备的硬件设计经验与设计思路
1) 产品需求分析
2) 开发可行性分析
3) 系统方案调研
4) 总体架构,CPU选型,总线类型
5) 数据通信与电信领域主流CPU:M68k系列,PowerPC860,PowerPC8240,8260体系结构,性能及对比;
6) 总体硬件结构设计及应注意的问题;
7) 通信接口类型选择
8) 任务分解
9) 最小系统设计;
10) PCI总线知识与规范;
11) 如何在总体设计阶段避免出现致命性错误;
12) 如何合理地进行任务分解以达到事半功倍的效果?
13) 项目案例:中、低端路由器等

二. 硬件原理图设计技术
目的:通过具体的项目案例,详细进行原理图设计全部经验,设计要点与精髓揭密。
1) 电信与数据通信领域主流CPU(M68k,PowerPC860,8240,8260等)的原理设计经验与精华;
2) Intel公司PC主板的原理图设计精髓
3) 网络处理器的原理设计经验与精华;
4) 总线结构原理设计经验与精华;
5) 内存系统原理设计经验与精华;
6) 数据通信与电信领域通用物理层接口的原理设计经验与精华;
7) 电信与数据通信设备常用的WATCHDOG的原理设计经验与精华;
8) 电信与数据通信设备系统带电插拔原理设计经验与精华;
9) 晶振与时钟系统原理设计经验与精华;
10) PCI总线的原理图设计经验与精华;
11) 项目案例:中、低端路由器等

三.硬件PCB图设计
目的:通过具体的项目案例,进行PCB设计全部经验揭密,使你迅速成长为优秀的硬件工程师
1) 高速CPU板PCB设计经验与精华;
2) 普通PCB的设计要点与精华
3) MOTOROLA公司的PowerPC系列的PCB设计精华
4) Intel公司PC主板的PCB设计精华
5) PC主板、工控机主板、电信设备用主板的PCB设计经验精华;
6) 国内著名通信公司PCB设计规范与工作流程;
7) PCB设计中生产、加工工艺的相关要求;
8) 高速PCB设计中的传输线问题;
9) 电信与数据通信领域主流CPU(PowerPC系列)的PCB设计经验与精华;
10) 电信与数据通信领域通用物理层接口(百兆、千兆以太网,ATM等)的PCB设计经验与精华;
11) 网络处理器的PCB设计经验与精华;
12) PCB步线的拓扑结构极其重要性;
13) PCI步线的PCB设计经验与精华;
14) SDRAM、DDR SDRAM(125/133MHz)的PCB设计经验与精华;
15) 项目案例:中端路由器PCB设计

四.硬件调试
目的:以具体的项目案例,传授硬件调试、测试经验与要点
1) 硬件调试等同于黑箱调试,如何快速分析、解决问题?
2) 大量调试经验的传授;
3) 如何加速硬件调试过程
4) 如何迅速解决硬件调试问题
5) DATACOM终端设备的CE测试要求

五.软硬件联合调试
1) 如何判别是软件的错?
2) 如何与软件进行联合调试?
3) 大量的联合调试经验的传授;

目的:明确职业发展的方向与定位,真正理解大企业对人才的要求,明确个人在职业技能方面努力的方向。
1) 职业生涯咨询与指导
2) 如何成为优秀的硬件开发工程师并获取高薪与高职?
3) 硬件工程师的困境与出路
4) 优秀的硬件工程师的标准

2005年10月21日星期五

Linux for PowerPC Embedded Systems HOWTO

Linux for PowerPC Embedded Systems HOWTO

找到了这份文档,应该会对EDK学习有所帮助。期望通过EDK工具最终在Vertex2Pro的开发板以及Vertex4芯片的试验板上跑起Linux来。

2005年10月20日星期四

[转贴] 程序人生-我已经努力了七年

来源:http://news.csdn.net/news/newstopic/27/27691.shtml

看了这个,受到鼓舞。

(1)

这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向,所以把我的经历写出来与大家共勉,希望能给刚如行的朋友们一点点帮助。

一转眼我在IT行业学习工作已经七年多了,这期间我做过网页,写过MIS、数据库,应用程序,做过通信软件、硬件驱动、协议栈,到现在做操作系统内核和IC相关开发,这中间走了很多弯路,也吃了不少苦。

我 上的是一个三流的高校,就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了,大一开 学前的假期我就开始了学习,记得我买的第一本书是《计算机基础DOS3.0》,大家别吓着了,其实当时已经普及了DOS6.22了,只是我在书店里看到了 DOS4.0,5.0,6.0的书,以为像英语那样是第四、五、六册,记得当时到处找 DOS1.0,现在想想也幸好我没有找到:)开学前我学完了PASCAL,那时既没有计算机也没有人可以请教,我连程序是什么的概念都没有,只好死记硬背 代码,然后拿纸写,我一直到大三才有了一台486,在这之前用纸写了多少程序我也记不清楚了,只知道最长的一个我拿A4大小的草稿纸写了30多页,我的C 语言、C++、VC都是在这样的条件下入门的。所以说条件是可以克服的,希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房,我的 心情激动的无与伦比,但是一上机我立刻傻了眼,他们用的是英文版的Win3.1,我的那点DOS知识都见了鬼,上机提心吊胆的一阵瞎摸,一不小心把 Word弄成了全屏,怎么都还不了原,当时真是心急如焚,我以为机器被我弄坏了。第一个C语言程序,就是那个经典的HelloWorld,我调了几个星 期,上机机会非常少,也没有书告诉我开发环境(TC2.0)需要设置,而且开始我都不知道有编译器,我甚至自作聪明把写好的程序扩展名从.c改成. exe,结果可想而知。大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了,大一下四门课挂了彩,三类学校就是这点好,挂上一二十门 也照样毕业。不过扯远点说,我那么刻苦都及不了格,可见我们国家的计算机教育有多死板。

大二准备学VC和BC,当时难以取舍,后来选了 VC,不为别的,只为书店里两本书,VC那本便宜6块钱。我的努力在班上无人能及,学的日夜不分,大三有了计算机后更是如此,很多次父亲半夜教训我说我不 要命了,我一直觉得自己基础差,记忆又不行,条件也不好,所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋,让我哭笑不得。 我用的是486,16M内存,1G硬盘,当时同学们的配置都是P166MMX,我安装一个Windows NT4.0需要一个通宵,编译一个BC5.0向导生成的程序需要近两个小时,我的显示器是个二手的,辐射非常大,开机屏幕冒火花,看起来很酷的:),有一 次程序写的太久,觉得怎么白色的编辑器背景变成了紫色,以为显示器坏了,后来才发现眼睛不行了,不过说来也奇怪,到今天我的视力还能保持1.5,真是个奇 迹。但是就是那台破机器陪伴了我两年,让我学会了VC、Delphi、SQLServer等。后来那台机器给我阿姨打字用,据她说一天她正打的开心,一股 青烟夹着火苗从显示器钻出来,之后它才寿终正寝。

大三假期找了个机会在一个计算机研究所实习,与其说实习不如说是做义工,工作了两个月一 分钱没有拿。但是这两个月对我的发展帮助很大,让我早一步了解了社会,刚去的时候我当然是一窍不通,在那里我熟悉了网络,学会了Delphi和 Oracle。由于工作很认真,得到了比较好的评价,在一位长者的引荐下,我开始和他们一起做项目,这使我在大三大四就有了自己的收入,大四又找了两家 MIS公司兼职,虽然钱不多,但是在学生期间有1000多的收入我已经非常满足了,我终于用自己赚的钱把计算机换了。大四下开始找工作,这时我的工作经验 已经比较多(当然现在想想非常幼稚),开始听父母的想去那个研究所,实习过那个部门也希望我能去,但是不知道为什么最后不了了之,这种单位就是比较官僚, 我一气之下就到了我兼职的一个公司做MIS的TeamLeader。在大三到毕业一年的时间,做过了各种MIS,从煤气、烟厂、公安、铁路、饮食到高校, 什么有钱做什么,工作也很辛苦,经常加班和熬通宵,从跟客户谈需求到设计、编码、测试、交付都要上。那时觉得很有成就感,觉得自己还不错,现在想想真是很 肤浅。

刚走上工作岗位的学生很容易被误导,各种开发工具让人眼花缭乱,同时也觉得很受公司器重,但这样工作永远是一个低层次的开发者。不 要跟我说什么系统分析有多么多么重要,多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗,国内又有几个公司能够做的很到位很规范?我是 ISO9000内审员,也在Rational公司受过多次培训,拿了4个证书,还有一个公司让我去做CMM。这些我听过很多,但是很多事情到国内就变了性 质,一个公司不是通过了ISO9000或者CMM就能规范了,我现在在一家有几十年历史的外企工作,里面的管理不是一般国内企业能及的。作为一个毕业不久 以前没有步入过社会的学生,几乎不可能在很短的时间掌握系统分析和设计,面向对象、UML只是一个工具,关键是人本身的思想,不是说你熟悉了C++、 Rose就能够做出好的设计,相反如果你具备了很高的素质,你可以用C写出比别人用C++更加模块化的程序。

话说远一些,国内软件开发行 业有一个怪圈,很多人觉得VC > Delphi > VB,真是很搞笑。这几个软件我都做过开发,说白了他们都是工具,应该根据应用的需要选择采用哪个,而不是觉得哪个上层次。如果你因为用某个开发工具很有 面子而选择的话,只能说明你很浅薄。如果说层次,那么这些工具都不上层次,因为它们用来用去都是一些系统的API,微软的朋友不会因为你记住他们多少个 API或者多少个类就会觉得你很了不起,你永远只是他们的客户,他们看重的是你口袋里的银子。我也做过系统内核,我也封装过很多API,同样我也不会看重 那些使用这些API做二次开发的客户,除非他能够作出自己独到的设计。

至于有人认为C++ > C那更是让人笑掉大牙,不妨你去打听一下,现在有几个操作系统内核是用C++写的,又有几个实时系统用的是C++,当然我也不是说C++不好,但是目前的 内核和实时系统中C++还无法与C匹敌,至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言,而在于你干什么工 作。你的设计体现了你的技术层次。

这样干了一年我觉得非常苦闷,做的大多数都是熟练工种的活,个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海,寻求更好的发展,并且打算放弃我以前的MIS转到通信行业。

(2)

写 到这里不能不提到我女朋友,我们是在来上海前半年认识的,她大四在我公司实习,公司派她给我写文档,我们的感情发展的很快。她告诉我很多事情,她家原本是 改革开放的第一批暴发户,她母亲爱打牌,输掉了几百万,还欠了很多债,她有男朋友,但是她对他没有感情,只因为他给了她母亲两万多块钱,后来还强迫她写了 四万块的借条,她男朋友背叛过她并且不止一次打她,现在逼她结婚不然就要她还钱。这人居然还是一个高校的老师!她母亲把父亲给她的学费花了,因为拖欠学费 她没有办法拿到毕业证。她母亲现在有病需要钱,我拿出了自己的一点积蓄并且跟朋友们接了一些,替她交了学费并给她母亲看病(后来才知道看病的钱又不知所 终,就连她母亲是不是有病我都不知道,但她也是没有办法)。这个时候我家知道了一些事情,坚决反对我和她在一起,她原来的男朋友也极力破坏。无奈之下我们 决定早一定离开这个伤心的城市,并且瞒着我们家。由于时间仓促,我只准备了4000块钱,她仅有的几百块钱也被她母亲要去了,我买了三张票,一张是中午 的,两张是晚上的,中午我的家人把我送上船,他们一离开我就下了船,我和她乘坐晚上的船离开了这个我和她生活了很多年的城市,带走的只是一身债务。没有来 过上海的我们两个性倔强,都不愿意去麻烦同学和朋友。来到上海是傍晚6点半,我们都不知道该去哪里,我们找了一个20块钱的旅馆,这个房间连窗户都没有, 7月份的天气酷热难耐,房间里非常闷热。第二天我们开始租房子,因为身上的钱不多,我们基本都是步行,花了一个星期时间,不知道在浦东转了多少圈后找到了 一个400块的房子,但是我们都不了解上海是付三压一,还要付半个月的中介费,买了一些锅碗瓢盆后,我们身上只有800块钱了,工作都还没有着落,这 800块钱要支持到我们拿到第一个月工资,为了省钱我们自己做饭,每天买菜只花两块钱,她非常喜欢吃(也可能她在大学经常挨饿的愿意),看到她现在这样省 吃俭用我真的很不忍心。她以前的男朋友也没有放过她,经常打电话来骚扰,并且来上海看她,还说了不少恐吓她的话,她过于善良,说他以前毕竟帮助过她,叫我 不要与他一般见识。以后的每天在家就是苦等面试通知,原本我想迅速找一家MIS公司解决眼前的困难,但是她坚持让我不要放弃自己的理想,终于功夫不负有心 人,我找到了一家通信公司,4000块的工资虽然赶不上MIS公司给我开出的价位,但也够在上海生存。她也找到了工作,第一天上班她哭了,这是她来上海第 一次流泪,我心里很难受也很感动。

由于是全新的行业,我把自己降到了零点,我学的VC、Delphi、数据库派不上用场,摆在我面前的是 嵌入式、协议、信令一些我从未接触过的知识。我知道我没有退路,于是拼命的学习,我把自己当做一个应届毕业生一样,一分努力一分收获,半年过去我终于熟悉 了工作,并且得到了公司的表彰,薪水也加了一级。后面的日子里我们省吃俭用,把欠朋友的1万多块钱还了,日子终于上了正轨。这时女朋友告诉我她想考研究 生,我也很支持,于是她辞职在家备考。

另外,在这里我要感谢我的ProjectManager,他原来是一个大通信公司的产品经理,对人 非常和善,我从他那里学到了很多知识,而且他也给了我许许多多无私的帮助。在工作上他给我充分的空间和信任。记得公司安排我维护一个接入服务器软件,由于 代码量不算太小(5万行),资料和文档都不齐全,我维护起来非常吃力,所以想重新把它做一遍,公司领导不太支持,可能觉得工作量太大,但是他极力支持我, 私下里他让我放手去做,我的维护工作他挤时间做。在他的支持下,我花了半年时间完成了接入服务器的软件,并且实现了一个相对完整的TCP/IP协议栈。在 这里我学会了嵌入式系统设计、驱动开发、TCP/IP和很多通信的知识,我花了一年时间终于使自己从MIS开发转到了通信行业,并且站稳了脚跟。我的开发 大量是对硬件的直接操作,不再受微软的操作系统,VC、Delhpi这些开发工具的约束,我终于看到了另外一片天空。

(3)

我 做事情喜欢追根问底,随着开发的深入,软件开发与硬件联系越来越紧密,硬件知识的匮乏又对我的发展产生了障碍,而且芯片技术基本上掌握在国外公司的手里, 这对做系统级设计是一个非常大的制约,一个新产品出来,第一道利润(也往往是最丰厚的利润)常常都被IC公司如Intel、Motorola赚去了,国内 的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍,并打算离开通信行业,进入IC设计相关领域。

当然我明白如果我对硬件了解的非常 少,没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础,学一些相关知识为以后做准备。就像我开始从MIS转到通信一样, 我看过大量通信方面的书,并且给一个ISP做过 RADIUS计费分拣台,在这样的背景下这家通信公司才给了我这个机会。我在的通信公司是做系统设计的,有不少PCB Layout硬件人员,平常我就注意向他们学习,由于我做的是软件,在公司看硬件资料不好意思,所以开始只好在家看,刚来上海工作我连续一年都在加班,后 来不加了,因为我要挤出时间学习,通常我12点左右睡,第二天5点半起,我上班比较早,地铁上如果人不多我也用来看书。学习当然不会是一帆风顺的,有些实 在不懂的问题就积累起来问硬件人员,他们的帮助使我学习进度快了很多,因为在没有人点拨的情况下自学,我的一半时间是花在解决疑难问题上,但这种问题经常 是别人的一句话就可以让我豁然开朗,我非常庆幸我有这样的学习环境。在后面的一年里,我学会了看硬件原理图,学会了简单的硬件设计(模拟电路方面还有不小 的差距),事情就是这样的,当你安安份份做软件,别人永远认为你是软件开发人员,在你开始学习硬件时别人未必会认同,有位中兴通讯的朋友还对我说过,一个 人不可能把所有东西都学完。我也明白这一点,但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的,同事们也都习以为常了。这 个时候我可以把硬件资料堂堂正正的拿到公司看,没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD(软交换的终端设备)系统方案,包含 软硬件的选型、设计等内容,这个方案得到了公司和同事们的认同,让我感到非常欣慰。

技术是相辅相成的,当我的硬件有了一定的进步后,我的 软件设计也有了很大的提高,我可以从更深层次理解问题,我做的接入服务器CPU是Motorola PowerPC860,熟悉的朋友都知道860 QMC与软件的批量数据传输通常采用BD表的方式,硬件人员做驱动的时候习惯采用固定BD表,每接收或发送数据都将数据从BD表拷贝到用户Buffer, 或从用户Buffer拷贝到BD表,由于理解的比较深入,我自己重新实现了这个过程,采用动态BD表的方式,驱动从一个网口接收数据,提交给我的软件进行 三层交换,直至从另外的接口发送出去,没有进行一次拷贝。这样的设计大大提高了性能,使系统的指标接近理论值。软硬件的结合使我的设计水平上了一个台阶。 我现在写的这个操作系统,编译后我把程序反编译成汇编,找出其中不优化的代码,然后在C程序中进行调整。举个例子,很多CPU没有专门的乘法指令,这个大 家应该都知道,在这种CPU上进行一个乘法操作常常会花费大量的指令周期,有的朋友会说这个我知道,我会尽量避免采用×号,但是事情往往不是那么简单,你 知道C语言中数组的下标操作是怎么实现的吗?仔细看看反汇编的代码你就会明白,同样是通过下标的定位操作,C编译器会有时候会产生位移指令,但有时候会用 乘法实现,两者效率往往是天壤之别,所以明白这些问题你才能将系统性能提升到极致。这些问题就不多说了,有兴趣的话以后可以共同探讨。

话 说远一点,我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识,尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常大的帮 助,否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司 Project Manager那里也得到了验证。他告诉我们公司现在的802.11芯片产品的软件经理原本是做该芯片硬件设计的,某某某原本是做软件的,现在在做IC, 类似的例子还有很多,只是在国内这样的风气不是非常流行。

我有一些心得体会与大家分享,只有当我干好本职工作后,我才会学习与工作关系不 大的技术,这样公司的上司才不至于反感,在入门阶段的问题我通常不去问那些资深人士,而是问一些资历比较浅的朋友,比如刚毕业不久的学生,因为他们往往会 跟你详细的讲解,而资深人士通常觉得你的问题太简单,所以回答的也很简单,我又不好意思多问。等技术上了一定的层次后我才会问他们,他们也能给你比较深入 的回答。另外,有些朋友说我机会比较好,他们也希望能从事新的工作可惜没有机会,我听了只有苦笑,我的机会了解的人都应该知道,我没有出生在什么IT世 家:)也没有谁一路提拔我,所有的路都是自己走出来的,我母亲去世比较早,我的后母(我叫她阿姨)看着我努力过来的,一次她看我大年30还在写程序,她说 像我这样努力木头都能学出来。

(4)

我的最终目的是IC而不是PCB,所以我下一步的准备开始学习IC设计的知识。公司 的同事没有懂IC设计的,后面的路又要靠自己了,我买了不少相关的书,在网上也查了很多的资料,我花了大量的时间去学习VHDL,并且用软件进行了一些简 单的设计和仿真(没有设计ASIC,只是针对FPGA),随着学习的深入,我渐渐明白了IC设计的基本流程,同时也明白了这条路的艰辛。这个时候我已经做 好了跳槽的准备,我向一家业界又一定知名度的IC设计公司投了简历,并通过了漫长的面试(4个多小时)。其他的一切我都比较满意,唯独薪资差强人意,我也 明白原因,因为我是这个行业的新人,我没有经验,我再一次将自己清零了。公司老板问我6000多一个月能不能接受,我知道他也是照章办事。想想我通信行业 的朋友们,基本上都是年薪10万以上,月薪过万的也比比皆是,朋友们也帮我介绍了不少待遇不错的公司,我该怎么选择,当时我很犹豫,我热爱我的事业,我向 往我的追求,但我也是一个普通的人,我也需要养家糊口,我也想早一点买房买车。生活给我出了一道难题。

爱因斯坦在63岁时说过“一个人没 有在30岁以前达成科学上的最大成就,那他永远都不会有。”这句话给了我很大的压力和震动,我马上就26岁了,离30只有四年时间,我必须抓紧这几年宝贵 的时间,努力达到我技术上的最高峰。为了这个理想,为了能离自己的梦更近一些,我选择了这家IC公司,我明白自己的薪资和公司刚进来的硕士研究生相差无 几,但为了今后的发展只能忍受,一切又得重新开始。换行业是一个非常痛苦的过程,尤其从一个春风得意的位置换到一个陌生的岗位,感觉象从温暖的被子里钻出 来跳进冰水中,让人难以接受。在原来那家通信公司,我是唯一两年时间涨了五次工资的员工,公司和同事都给了我极大的认可,工作上也常常被委以重任。但现在 这一切都成了过去,在新的公司我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始,我把自己看作新毕业的学生,我要用自己的努力得到公 司的认可。进入新的行业是非常痛苦的,我告诉自己必须忍受这一切,虽然外面有很多诱惑,但是既然作出了选择我就不允许自己轻易放弃。

我现 在已经在这家新公司上了一个多月的班,开始非常艰难,现在慢慢适应了。第一个月结束时, Team Leader找我谈话,说我是新进员工中最优秀的一个,我心里很欣慰,这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友,她给了我很大的支持和鼓 舞,每次在我动摇的时候她都在鼓励我,让我坚持自己的理想,刚来上海是她让我不要勉强去做MIS,这次也是她让我顶住了月薪过万的诱惑,没有她我可能不会 有今天的成绩。

现在的公司有自己的操作系统,自己的CPU、DSP和其它芯片,在这里我能学到世界上最先进的技术,我们的设计开发不再完全依赖别人的硬件和系统,这让我很开心。我打算等工作步入正轨后,全力学习新的知识,实现我的理想。

在后面的两年里我给自己定下了几个目标:

一.努力做好本职工作,在工作上得到公司和同事们的认同;

二.努力学习IC硬件设计知识,多向同事请教,并利用一切机会多实践;

三.实现我的实时操作系统的主要部分,完成TCP/IP协议栈模块,并免费发布源代码;

四.和我女朋友结婚并买一套小房子,这是最重要的,因为我明白事业是可以重来的,但是珍贵的感情很难失而复得。

在这里提一下我现在开发的操作系统,它是一个实时嵌入式系统,目前支持以下特性:

a.支持时间片轮转调度和基于优先级调度,最多64个优先级;

b.抢占式实时内核;

c.为了便于移植,主体用标准C实现;

d.汇编代码非常少,不到100行;

e.支持任务管理,各任务有独立的堆栈;

f.进程同步和通信目前完成了Semaphore,Message Queue正在调试;

g.实现了定时系统调用;

h.可以在windows上仿真调试

我还打算下一步实现优先级反转保护,Event Flag,Data Pipe,内存管理(以前实现过)、驱动接口等。

在这之后我还会努力完善它,比如加入文件系统,协议栈、调试接口等。希望朋友们提出自己的意见和建议,在此不胜感激!

(5)

后记:

就 像有的朋友说的,我的经历或许会给一些朋友产生误导,在这里我必须说明一下。我来上海以前学习过于拼命,常常晚上只睡3个多小时,我身高1米71,那时只 有108斤(我现在130多),家人也说我这样拼命活不过60岁,但是当时的我太固执,我对他们说只要能实现理想活50岁我就够了。那时的拼命使我的身体 受到了影响,有一次早上突然腰肌剧痛难忍,痛的我倒在床上站不起来。虽然我现在已经比较注意,但有时候还会隐隐作痛。后来在女朋友说服了我,来上海以后我 不再如此。我经常引用父亲的一句话“身体是革命的本钱”。

而且我也发现拼命不是办法,我可以熬一两个通宵,最多的一次我连续工作了三天三 夜,但是我半个月都没有恢复过来,这样是不是得不偿失?学习工作应该是一个长期的过程,像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度,我 要保证每天尽量有相对充沛的精力,一些年轻的朋友觉得自己也应该拼命努力,这让我多少有些担心,如果我的故事能让你在学习工作上多一点兴趣,我会感到很开 心,但如果误导了某些朋友,让你做一些不值得的付出,我会感到很内疚。

技术没有贵贱只分,我以前换行业是因为自己的兴趣所致,而不是对哪 个行业有什么偏见。我希望我的经历不要给朋友一个错误的导向,觉得我始终向更高的技术发展。其实各行各业做到顶尖都是很困难的。话又说回来虽然技术没有贵 贱,但是门槛是有高低的,无论如何,做IC的门槛要比做网页的高,这一点无可否认。国家各种人才都是需要的,但是作为个人奋发向上的想法还是应该有的,努 力在自己喜欢的行业上做的更好,而不应该停留在比较肤浅的层次上。

我是一个自己觉得比较有自知之明的人,或许我最大的优点就是知道自己有 很多缺点:)。我的故事中很多的曲折和错误都是由我的缺点造成的,希望大家用审慎的眼光看待我的经历,不要被我的“花言巧语”所迷惑。我学习有些随心所 欲,这给我带来了无尽的麻烦,也大大阻碍的我的发展。记得我小时候成绩比较出色,但是后来学习严重偏科,导致我中学成绩一再滑坡,也没有考上什么好的学 校,小时候的一个朋友,当时的成绩和我相仿,但是没有我这个缺点,她上了清华,后来在去了美国深造,在一个著名导师手下研究理论科学,这未尝不是一条更好 的出路。另外我的学习方法也是在不断改善中的,过去的学习过于讲究数量和时间,那样学习既苦而已效率不高,现在我非常注意学习的效率和技巧,这样才是学习 的捷径(当然不是指投机取巧),比如说学一相对陌生的技术,如果有条件,不妨问一问有经验的人,不需要问很多,往往他不经意的几句话会给你非常大的帮助, 甚至超过你看一个星期的书。带着这样的思想再去学习你会节省很多时间,这样何乐不为呢?这些年中我学了不少的东西,由于开始非常盲目,所以学的东西杂乱无 章,现在回想起来让我啼笑皆非,我把大量的时间浪费在一些没有必要深入了解的知识上,毕竟一个人的精力是有限度的。很多朋友很我一样都背过五笔字形,的确 它是一个不错的输入法,但是对一个研发人员它绝对不值得你去背,你的时间应该花在有价值的地方。我这样的事情还做过很多,我背过CCED、WPS的命令和 快捷键,在dBase基本退出历史舞台后我还花了很多时间去学习它的使用。所以我的学习在前期缺乏规划,没有明确的短期目的、中期目标,只有一个虚无飘渺 的长期的理想。这就像做设计一样,好的设计是从需求抽象到代码有很多过程,而不能得到了需求就立刻开始开始编码。

当然这么些年的学习和工 作多多少少有些收获,下面我说说我的一些学习的心得,这些方法未必正确,我也在不断探索和改进中。我的学习和工作有相对明确的目标,我不会一时心动而去学 习某一技术,在下决定之前我会考虑很多,包括长期的发展,个人路线的规划,需要付出的代价、可能遇到的困难及解决的办法等等,在决定后还会制定更加明确的 计划,包括短期、中期和长期的,身边可以利用到的资源(包括好的书籍、资料、软硬件环境,也包括有经验的朋友或者师长),以及每一个阶段是怎么过渡到高一 阶段的计划,往往在一个学习阶段一旦上路后会走的相对顺利,但是跨阶段通常比较麻烦,比如从学习基础知识转到实践。另外我买书也有自己的方法,现在世面上 高质量的书远不如低质量书多,对于一个陌生的技术,往往在第一次买书会选择错误,即使买到一本好书但是它的方向也未必适合你,所以我通常会先在网上查找一 些该技术的介绍,有了一点点概念后再去买一本比较薄、相对便宜并且内容相对泛泛而谈的书,这是国内作者最善于写的书:),再把它浏览一遍后我就会基本明白 这门技术的要点,后面买书和制定计划就会明确的多。否则一开始就想找本好书往往比较困难,而且买回来后努力学习,有时候学了一半才发现是本低质量的书或者 是相对过时技术,让人非常懊恼。另外让有经验的人帮你介绍,通常也是一个不错的选择。

(6)

有些朋友想学通信、嵌入式开 发,但总觉得自己没有软硬件环境,我就按我的了解给大家介绍一下怎么建立这样的环境,当然我了解的只是我学习和工作的方向。通信我做的是数据网方面的工 作,包括TCP/IP、二三层交换、对接入网、H.323和软交换也有一点认识。这些软硬件环境都是可以在PC上构建的。你甚至可以在一个没有网卡的PC 上建立一个包含多个路由器、接入服务器、VoIP网关、网守、主机等的仿真网络环境,而且与实际的网络相当接近,当然这需要你有清晰的网络概念和一定的网 络知识,我一直在努力开发一套软件将这个过程简化,目前试验已经做完,我可能会将它融入我的操作系统外围扩展软件中。这样的方法我无法用简单的语句讲的很 清楚,我可以说一下大概的思想,就是在PC上实现仿真网卡,(知道 Windows怎么在没有网卡的机器实现虚拟网卡技术的朋友都应该会明白),然后每一个仿真网卡对应一个虚拟设备,如路由器或者主机。你也可以借助第三方 工具完成部分工作,如VmWare等。我现在就是利用一个仿真网卡做自己的开发的。

至于嵌入式开发环境更加容易实现,PC就是一个非常大 的硬件平台,现有的嵌入式操作系统通常都支持X86,你可以在上面做开发,通过软盘Boot或者使用虚拟机装载,我用VxWorks做了试验,在一台PC 上跑Windows和VxWorks两个系统。另外Windows上的兼容DOS的16位仿真X86环境也为很多操作系统提供了绝佳的试验环境,我的操作 系统在Windows上就是这样实现的。Linux在嵌入式中应用也比较广泛,它在网上有大量的资料,而且也相对比较容易实践。同时很多完善的嵌入式开发 环境支持软件仿真,如 Tornado、WinCE等。

前段时间处理了很多事情,一直没有写下去,花光了所有的积蓄买了一套房子,同时把 户口的事情也基本办完了,这几天稍微缓口气。昨天跟我的一个老上司见面聊了半天,心里感慨万千。他从外在条件看让不少外人羡慕,二十多岁做过到了863项 目的负责人,博士毕业的爱人单位也非常好。现在三十出头的他在一个通信公司做产品经理,工资虽然不算高但也有一两万,而且还持有股份。但是我们了解的人才 理解他的艰辛。“白领”这个词在一些人看来是仿佛是一个动人的光环,但是在我看来是一个无奈的名字,每天行走在大街上,来来往往的车流中有多少是“白领” 的?又有几个“白领”住的起高档的住宅?在上海一套别墅300万不足为奇,按揭贷款下来总额接近600万,年薪二十万在上海算是一个中高级“白领”,高额 的税金去掉了你百分之几十的收入后,这样算下来不吃不喝也要四十多年,加上生活的其他开支,注定了你与这样的住宅无缘。看着外面一套套别墅,一辆辆好车, 我不知道它们是谁的,但我知道其中没有什么白领。我觉得自己很渺小,在这个喧闹的都市中我如同一只蚂蚁,但我有不甘于平凡,我不愿做一个单纯的“白领”。

其 实很多朋友并不了解我,我不是一个追逐时尚技术的人,我只是不愿意做一个所谓的“白领”,更加不愿意做一个单纯的“程序员”。我不甘愿平凡的生活一辈子。 我在不断的努力,我的方向非常明确,我要做多数人不做和做不到的事情,很多朋友对我这样频繁的换方向不理解,觉得一个人只要熟悉一种技术就可以了,对于这 样的看法我只能说你浅薄,现在的大的系统和产品往往都是软件、硬件和应用相结合的,我要做的不是哪个方面的专家,而是希望能够成为系统设计师。我不相信一 个只精通发动机的专家能够设计一辆好车,同样我也不相信对硬件一窍不通的人能做出一个操作系统,或者一个对财会没有一点概念的人能设计出一个优秀的财务软 件。在工作中我发现社会上非常缺乏边缘人才,尤其是在国内。在国外一个人软硬件兼修非常普遍。如果设计产品的人只了解他的专业那么是很难有出色的设计。所 以我必须趁着自己年轻学的更加广泛一些,这样才能提高自己的综合素质,这也是为什么高校那么多非专业课程。学习工作了这些年,实际上都没有脱离IT这个行 业,我现在的公司开发一个系统时,先是将最终功能列举清楚并分析可行性,然后划分哪些是用芯片实现,哪些是用硬件电路实现,哪些是用软件实现,这样的设计 才能做出最好的系统。如果一个设计者单纯只懂一个方面是不可能做到这一点的。

自负常常伴随着无知,记得我大学毕业时,论文答辩会上我和专 家组组长争起来了,因为我对自己的设计非常得意,而他虽然是鸡蛋里挑骨头,但是由于知识非常有限,我无法回答他的问题,所以有些“恼羞成怒”。我原来一直 喜欢用“所谓”最好的开发工具,记得做过一个愚蠢的设计,一个排课表的软件我用VC+Oracle开发。这些经历我牢记在心,时刻提醒自己学会谦虚。我的 亲身经历加上我对一些身边朋友的观察发现这样一个现象。当一个人只会他认为最好的技术,而对其他的一无所知,这样的人经常是目空一切。

从 第一个“Hello World”到今天的操作系统,前前后后写了很多代码,从这中间我也积累了很多心得。由于我是在没有人指导的情况下自学编码的,所以走了很多弯路,也犯了 不少错误。最初我写程序全凭自己的感觉,写一个新程序对结构设计不很重视,以为学好语言,数据结构就可以写出好的程序,其实远不是这样的。没有设计的情况 下,也可以写,但是程序无法写的很大、很复杂。我个人的经验是这样的系统超过8000行我就无法控制了,以前我用VC写过一个Windows下的应用程 序,大概8000行左右我对它失去了控制,整个代码一团糟,这8000行倒是可以相对稳定的运行,但是我没有能力再增加什么新的代码,动辄前后冲突,要么 就是新代码与旧设计格格不入,需要调整旧的程序。最开始我写程序喜欢追求代码的精巧,别人很多行写出来的代码自己只写很少就可以实现,感觉那样比较酷。其 实这样也是非常错误的,我现在写程序非常注重结构设计,为了结构清晰我愿意牺牲一点效率。

下面一段话是我写程序的座右铭,希望与大家共勉:

Make it right before you make it faster.

Keep it right when you make it faster.

Make it clear before you make it faster.

Do not sacrifice clarity for small gains in efficiency.

Brian Kernighan

另外补充一点:我和我的女朋友现在非常好,双方的家人都认可了,我们决定在近期结婚。

(完)

WISHBONE总线简介

WISHBONE 总线规范是一种片上系统IP核互连体系结构。它定义了一种IP核之间 公共的逻辑接口,减轻了系统组件集成的难度,提高了系统组件的可重用性、可靠性和可移植性,加快了产品市场化的速度。WISHBONE总线规范可用于软 核、固核和硬核,对开发工具和目标硬件没有特殊要求,并且几乎兼容所有的综合工具,可以用多种硬件描述语言来实现。

灵活性是WISHBONE总线的另一个优点。由于IP核种类多样,其间并没有一种统一的间接方式。为满足不同系统的需要,WISHBONE总线提供了四种不同的IP核互连方式:


  • 点到点(point-to-point),用于两IP核直接互连;

  • 数据流(data flow),用于多个串行IP核之间的数据并发传输;

  • 共享总线(shared bus)(见图1),多个IP核共享一条总线;

  • 交叉开关(crossbar switch),同时连接多个主从部件,提高系统吞吐量。


<wishbone总线,共享总线结构>
图1

开篇

linuxeden上开始了第一个blog试着写写。但是其服务器状态不稳定,造成几次写好的文章丢失现象,加上后台管理系统升级使得预先设好的格式全乱。今天身为用户,知道一两次的不稳定便会失去了上帝的信赖,他日作了服务提供者,一定也要记得要尽全力为用户着想,才是生存之道。
今天才发现了这里,三个原因让我决定试试看这个:一是google的支持;二是“恢复章帖”这个小功能,虽然还没有试验过;三是在也不用让自己的blog地址是形如“http://www.linuxeden.com/forum/blog/index.php?blogId=126933” 的东西了。当然,或许还有更吸引人的功能没让我马上看见。
满意的话陆续把以前的记录搬过来。