Android Display System — Surface Flinger

http://yueguc.javaeye.com/blog/873395

SurfaceFlinger 是Android multimedia 的一个部分,在Android 的实现中它是一个service ,提供系统 范围内的surface composer 功能,它能够将各种应用 程序的2D 、3D surface 进行组合。在具体讲SurfaceFlinger 之前,我们先来看一下有关显示方面的一些基础 知识 

1 、原理 分析

让我们首先看一下下面的屏幕简略图:


每个应用程序可能对应着一个或者多个图形界面,而每个界面我们就称之为一个surface ,或者说是window ,在上面的图中我们能看到4 个surface ,一个是home 界面,还有就是红、绿、蓝分别代表的3 个surface ,而两个button 实际是home surface 里面的内容。在这里我们能看到我们进行图形显示所需要解决 的问题:

    a 、首先每个surface 在屏幕上有它的位置,以及大小,然后每个surface 里面还有要显示的内容,内容,大小,位置 这些元素 在我们改变应用程序的时候都可能会改变,改变时应该如何处理 ?

b 、然后就各个surface 之间可能有重叠,比如说在上面的简略图中,绿色覆盖了蓝色,而红色又覆盖了绿色和蓝色以及下面的home ,而且还具有一定透明度。这种层之间的关系应该如何描述?      

我们首先来看第二个问题,我们可以想象在屏幕平面的垂直方向还有一个Z 轴,所有的surface 根据在Z 轴上的坐标来确定前后,这样就可以描述各个surface 之间的上下覆盖关系了,而这个在Z 轴上的顺序,图形上有个专业术语叫Z-order 。  

    对于第一个问题,我们需要一个结构来记录应用程序界面的位置,大小,以及一个buffer 来记录需要显示的内容,所以这就是我们surface 的概念,surface 实际我们可以把它理解成一个容器,这个容器记录着应用程序界面的控制信息,比如说大小啊,位置啊,而它还有buffer 来专门存储需要显示的内容。

    在这里还存在一个问题,那就是当存在图形重合的时候应该如何处理呢,而且可能有些surface 还带有透明信息,这里就是我们SurfaceFlinger 需要解决问题,它要把各个surface 组合(compose/merge) 成一个main Surface ,最后将Main Surface 的内容发送给FB/V4l2 Output ,这样屏幕上就能看到我们想要的效果。

    在实际中对这些Surface 进行merge 可以采用两种方式,一种就是采用软件的形式来merge ,还一种就是采用硬件的方式,软件的方式就是我们的SurfaceFlinger ,而硬件的方式就是Overlay 。

2 、OverLay

     因为硬件merge 内容相对简单,我们首先来看overlay 。 Overlay 实现的方式有很多,但都需要硬件的支持。以IMX51 为例子,当IPU向内核申请FB 的时候它会申请3 个FB ,一个是主屏的,还一个是副屏的,还一个就是Overlay 的。 简单地来说,Overlay就是我们将硬件所能接受的格式数据 和控制信息送到这个Overlay FrameBuffer,由硬件驱动来负责merge Overlay buffer和主屏buffer中的内容。

    一般来说现在的硬件都只支持一个Overlay,主要用在视频播放以及camera preview上,因为视频内容的不断变化用硬件Merge比用软件Merge要有效率得多,下面就是使用Overlay和不使用Overlay的过程:

 

    SurfaceFlinger中加入了Overlay hal,只要实现这个Overlay hal可以使用overlay的功能,这个头文件在:/hardware/libhardware/include/harware/Overlay.h,可以使用FB或者V4L2 output来实现,这个可能是我们将来工作的内容。实现Overlay hal以后,使用Overlay接口的sequence就在 : /frameworks/base/libs/surfaceflinger/tests/overlays/Overlays.cpp,这个sequnce是很重要的,后面我们会讲到。

    不 过在实际中我们不一定需要实现Overlay hal,如果了解硬件的话,可以在驱动中直接把这些信息送到Overlay Buffer,而不需要走上层的Android。Fsl现在的Camera preview就是采用的这种方式,而且我粗略看了r3补丁的内容,应该在opencore的视频播放这块也实现了Overlay。

3、SurfaceFlinger

     现 在就来看看最复杂的SurfaceFlinger,首先要明确的是SurfaceFlinger只是负责merge Surface的控制,比如说计算出两个Surface重叠的区域,至于Surface需要显示的内容,则通过skia,opengl和 pixflinger来计算。 所以我们在介绍SurfaceFlinger 之前先忽略里面存储的内容究竟是什么,先弄清楚它对merge 的一系列控制的过程,然后再结合2D ,3D 引擎来看它的处理过程。

3.1 、Surface 的创建过程

    前面提到了每个应用程序可能有一个或者多个Surface , 我们需要一些数据结构来存储我们的窗口信息,我们还需要buffer 来存储我们的窗口内容, 而且最主要的是我们应该确定一个方案 来和SurfaceFlinger 来交互这些信息,让我们首先看看下面的Surface 创建过程的类图 :


在IBinder 左边的就是客户端部分,也就是需要窗口显示的应用程序,而右边就是我们的Surface Flinger service 。 创建一个surface 分为两个过程,一个是在SurfaceFlinger 这边为每个应用程序(Client) 创建一个管理 结构,另一个就是创建存储内容的buffer,以及在这个buffer 上的一系列画图之类的操作。

因为SurfaceFlinger 要管理多个应用程序的多个窗口界面,为了进行管理它提供了一个Client 类,每个来请求服务的应用程序就对应了一个Client 。因为surface 是在SurfaceFlinger 创建的,必须返回一个结构让应用程序知道自己申请的surface 信息,因此SurfaceFlinger 将Client 创建的控制结构per_client_cblk_t 经过BClient 的封装以后返回给SurfaceComposerClient ,并向应用程序提供了一组创建和销毁surface 的操作:


    为应用程序创建一个 Client 以后,下面需要做的就是为这个 Client 分配 Surface , Flinger 为每个 Client 提供了 8M 的空间 ,包括控制信息和存储内容的 buffer 。在说创建 surface 之前首先要理解 layer 这个概念,回到我们前面看的屏幕简略图,实际上每个窗口就是 z 轴上的一个 layer , layer 提供了对窗口控制信息的操作,以及内容的处理 ( 调用 opengl 或者 skia) ,也就是说SurfaceFlinger 只是控制什么时候应该进行这些信息的处理以及处理的过程,所有实际的处理都是在 layer 中进行的,可以理解为创建一个 Surface 就是创建一个 Layer 。不得不说 Android 这些乱七八糟的名字,让我绕了很久……

创建 Layer 的过程,首先是由这个应用程序的 Client 根据应用程序的 pid 生成一个唯一的 layer ID ,然后根据大小,位置,格式啊之类的信息创建出 Layer 。在 Layer 里面有一个嵌套的 Surface 类,它主要包含一个ISurfaceFlingerClient::Surface_data_t ,包含了这个 Surace 的统一标识符以及 buffer 信息等,提供给应用程序使用。最后应用程序会根据返回来的 ISurface 信息等创建自己的一个 Surface 。

 

Android 提供了 4 种类型的 layer 供选择,每个 layer 对应一种类型的窗口,并对应这种窗口相应的操作: Layer ,LayerBlur , LayerBuffer , LayerDim 。不得不说再说 Android 起的乱七八糟的名字, LayerBuffer 很容易让人理解成是Layer 的 Buffer ,它实际上是一种 Layer 类型。各个 Layer 的效果大家可以参考 Surface.java 里面的描述:/frameworks/base/core/java/android/view/surface.java 。这里要重点说一下两种 Layer ,一个是 Layer (norm layer) ,另一个是 LayerBuffer 。

Norm Layer 是 Android 种使用最多的一种 Layer ,一般的应用程序在创建 surface 的时候都是采用的这样的 layer ,了解Normal Layer 可以让我们知道 Android 进行 display 过程中的一些基础原理。 Normal Layer 为每个 Surface 分配两个 buffer :front buffer 和 back buffer ,这个前后是相对的概念,他们是可以进行 Flip 的。 Front buffer 用于 SurfaceFlinger 进行显示,而 Back buffer 用于应用程序进行画图,当 Back buffer 填满数据 (dirty) 以后,就会 flip , back buffer 就变成了 front buffer 用于显示,而 front buffer 就变成了 back buffer 用来画图,这两个 buffer 的大小是根据 surface 的大小格式动态变化的。这个动态变化的实现我没仔细看,可以参照 : /frameworks/base/lib/surfaceflinger/layer.cpp 中的 setbuffers() 。

两个 buffer flip 的方式是 Android display 中的一个重要实现方式,不只是每个 Surface 这么实现,最后写入 FB 的 main surface 也是采用的这种方式。

LayerBuffer 也是将来必定会用到的一个 Layer ,个人觉得也是最复杂的一个 layer ,它不具备 render buffer ,主要用在camera preview / video playback 上。它提供了两种实现方式,一种就是 post buffer ,另外一种就是我们前面提到的 overlay, Overlay 的接口实际上就是在这个 layer 上实现的。不管是 overlay 还是 post buffer 都是指这个 layer 的数据来源自其他地方,只是 post buffer 是通过软件的方式最后还是将这个 layer merge 主的 FB ,而 overlay 则是通过硬件 merge 的方式来实现。与这个 layer 紧密联系在一起的是 ISurface 这个接口,通过它来注册数据来源,下面我举个例子来说明这两种方式的使用方法:

前面几个步骤是通用的:

// 要使用 Surfaceflinger 的服务必须先创建一个 client

sp<SurfaceComposerClient> client = new SurfaceComposerClient();

// 然后向 Surfaceflinger 申请一个 Surface , surface 类型为 PushBuffers

sp<Surface> surface = client->createSurface(getpid(), 0, 320, 240,

            PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);

// 然后取得 ISurface 这个接口, getISurface() 这个函数的调用时具有权限限制的,必须在 Surface.h 中打开:/framewoks/base/include/ui/Surface.h

sp<ISurface> isurface = Test::getISurface(surface);

//overlay 方式下就创建 overlay ,然后就可以使用 overlay 的接口了

sp<OverlayRef> ref = isurface->createOverlay(320, 240, PIXEL_FORMAT_RGB_565);

sp<Overlay> verlay = new Overlay(ref);

//post buffer 方式下,首先要创建一个 buffer ,然后将 buffer 注册到 ISurface 上

ISurface::BufferHeap buffers(w, h, w, h,

                                          PIXEL_FORMAT_YCbCr_420_SP,

                                         transform,

                                         0,

                                         mHardware->getPreviewHeap());

mSurface->registerBuffers(buffers);

3.2 、应用 程序对窗口的控制和画图

Surface 创建以后,应用程序就可以在 buffer 中画图了,这里就面对着两个问题了,一个是怎么知道在哪个 buffer 上来画图,还一个就是画图以后如何通知 SurfaceFlinger 来进行 flip 。除了画图之外,如果我们移动窗口以及改变窗口大小的时候,如何告诉SurfaceFlinger 来进行处理呢 ?在明白这些问题之前,首先我们要了解 SurfaceFlinger 这个服务 是如何运作的:

从类图中可以看到 SurfaceFlinger 是一个线程类,它继承了 Thread 类。当创建 SurfaceFlinger 这个服务的时候会启动一个SurfaceFlinger 监听线程,这个线程会一直等待事件的发生,比如说需要进行 sruface flip ,或者说窗口位置大小发生了变化等等,一旦产生这些事件, SurfaceComposerClient 就会通过 IBinder 发出信号,这个线程就会结束等待处理这些事件,处理完成以后会继续等待,如此循环。

SurfaceComposerClient 和 SurfaceFlinger 是通过 SurfaceFlingerSynchro 这个类来同步信号的,其实说穿了就是一个条件变量。监听线程等待条件的值变成 OPEN ,一旦变成 OPEN 就结束等待并将条件置成 CLOSE 然后进行事件处理,处理完成以后再继续等待条件的值变成 OPEN ,而 Client 的 Surface 一旦改变就通过 IBinder 通知 SurfaceFlinger 将条件变量的值变成 OPEN ,并唤醒等待的线程,这样就通过线程类和条件变量实现了一个动态处理机制。

了解了 SurfaceFlinger 的事件机制我们再回头看看前面提到的问题了。首先在对 Surface 进行画图之前必须锁定 Surface 的 layer,实际上就是锁定了 Layer_cblk_t 里的 swapstate 这个变量。 SurfaceComposerClient 通过 swapsate 的值来确定要使用哪个 buffer画图,如果 swapstate 是下面的值就会阻塞 Client ,就不翻译了直接 copy 过来:

// We block the client if:

// eNextFlipPending:  we’ve used both buffers already, so we need to

//                    wait for one to become availlable.

// eResizeRequested:  the buffer we’re going to acquire is being

//                    resized. Block until it is done.

// eFlipRequested && eBusy: the buffer we’re going to acquire is

//                    currently in use by the server.

// eInvalidSurface:   this is a special case, we don’t block in this

//                    case, we just return an error.

所以应用程序先调用 lockSurface() 锁定 layer 的 swapstate ,并获得画图的 buffer 然后就可以在上面进行画图了,完成以后就会调用 unlockSurfaceAndPost() 来通知 SurfaceFlinger 进行 Flip 。或者仅仅调用 unlockSurface() 而不通知 SurfaceFlinger 。

一般来说画图的过程需要重绘 Surface 上的所有像素,因为一般情况下显示过后的像素是不做保存的,不过也可以通过设定来保存一些像素,而只绘制部分像素,这里就涉及到像素的拷贝了,需要将 Front buffer 的内容拷贝到 Back buffer 。在 SurfaceFlinger 服务实现中像素的拷贝是经常需要进行的操作,而且还可能涉及拷贝过程的转换,比如说屏幕的旋转,翻转等一系列操作。因此 Android 提供了拷贝像素的 hal ,这个也可能是我们将来需要实现的,因为用硬件完成像素的拷贝,以及拷贝过程中可能的矩阵变换等操作,比用memcpy 要有效率而且节省资源。这个 HAL 头文件 在: /hardware/libhardware/hardware/include/copybit.h

窗口状态变化的处理是一个很复杂的过程,首先要说明一下, SurfaceFlinger 只是执行 Windows manager 的指令,由 Windows manager 来决定什么是偶改变大小,位置,设置 透明度,以及如何调整 layer 之间的顺序, SurfaceFlinger 仅仅只是执行它的指令。PS : Windows Manager 是 java 层的一个服务,提供对所有窗口的管理 功能,这部分的内容我没细看过,觉得是将来需要了解的内容。

窗口状态的变化包括位置的移动,窗口大小,透明度, z-order 等等,首先我们来了解一下 SurfaceComposerClient 是如何和SurfaceFlinger 来交互这些信息的。当应用程序需要改变窗口状态的时候它将所有的状态改变信息打包,然后一起发送给SurfaceFlinger , SurfaceFlinger 改变这些状态信息以后,就会唤醒等待的监听线程,并设置一个标志位告诉监听线程窗口的状态已经改变了,必须要进行处理,在 Android 的实现中,这个打包的过程就是一个 Transaction ,所有对窗口状态 (layer_state_t) 的改变都必须在一个 Transaction 中。

到这里应用程序客户端的处理过程已经说完了,基本分为两个部分,一个就是在窗口画图,还一个就是窗口状态改变的处理。

4 、 SurfaceFlinger 的处理过程

了解了 Flinger 和客户端的交互,我们再来仔细看看 SurfaceFlinger 的处理过程,前面已经说过了 SurfaceFlinger 这个服务在创建的时候会启动一个监听的线程,这个线程负责每次窗口更新时候的处理,下面我们来仔细看看这个线程的事件的处理,大致就是下面的这个图:

 


 

先大致讲一下 Android 组合各个窗口的原理 : Android 实际上是通过计算每一个窗口的可见区域,就是我们在屏幕上可见的窗口区域 ( 用 Android 的词汇来说就是 visibleRegionScreen ) ,然后将各个窗口的可见区域画到一个主 layer 的相应部分,最后就拼接成了一个完整的屏幕,然后将主 layer 输送到 FB 显示。在将各个窗口可见区域画到主 layer 过程中涉及到一个硬件实现和一个软件实现的问题,如果是软件实现则通过 Opengl 重新画图,其中还包括存在透明度的 alpha 计算;如果实现了 copybit hal 的话,可以直接将窗口的这部分数据 直接拷贝过来,并完成可能的旋转,翻转,以及 alhpa 计算等。

下面来看看 Android 组合各个 layer 并送到 FB 显示的具体过程:

4.1 、 handleConsoleEvent

当接收到 signal 或者 singalEvent 事件以后,线程就停止等待开始对 Client 的请求进行处理,第一个步骤是handleConsoleEvent ,这个步骤我看了下和 /dev/console 这个设备有关,它会取得屏幕或者释放屏幕,只有取得屏幕的时候才能够在屏幕上画图。

4.2 、 handleTransaction

前面提到过,窗口状态的改变只能在一个 Transaction 中进行。因为窗口状态的改变可能造成本窗口和其他窗口的可见区域变化,所以就必须重新来计算窗口的可见区域。在这个处理子过程中 Android 会根据标志位来对所有 layer 进行遍历,一旦发现哪个窗口的状态发生了变化就设置标志位以在将来重新计算这个窗口的可见区域。在完成所有子 layer 的遍历以后, Android 还会根据标志位来处理主layer ,举个例子,比如说传感器感应到手机横过来了,会将窗口横向显示,此时就要重新设置主 layer 的方向。

4.3 、 handlePageFlip

    这里会处理每个窗口 surface buffer 之间的翻转,根据 layer_state_t 的 swapsate 来决定是否要翻转,当 swapsate 的值是eNextFlipPending 是就会翻转。处理完翻转以后它会重新计算每个 layer 的可见区域,这个重新计算的过程我还没看太明白,但大致是一个这么的过程:

从 Z 值最大的 layer 开始计算,也就是说从最上层的 layer 计算,去掉本身的透明区域和覆盖在它上面的不透明区域,得到的就是这个 layer 的可见区域。然后这个 layer 的不透明区域就会累加到不透明覆盖区域,这个 layer 的可见区域会放入到主 layer 的可见区域,然后计算下一个 layer ,直到计算完所有的 layer 的可见区域。这中间的计算是通过定义在 skia 中的一种与或非的图形逻辑运算实现的,类似我们数学中的与或非逻辑图。

4.4 、 handleRepaint

计算出每个 layer 的可见区域以后,这一步就是将所有可见区域的内容画到主 layer 的相应部分了,也就是说将各个 surface buffer里面相应的内容拷贝到主 layer 相应的 buffer ,其中可能还涉及到 alpha 运算,像素的翻转,旋转等等操作,这里就像我前面说的可以用硬件来实现也可以用软件来实现。在使用软件的 opengl 做计算的过程中还会用到 PixFlinger 来做像素的合成,这部分内容我还没时间来细看。

4.5 、 postFrameBuffer

最后的任务就是翻转主 layer 的两个 buffer ,将刚刚写入的内容放入 FB 内显示了。


Capture for YouTube subtilte

想要抓YouTube字幕? 用這個吧 Google2SRT

http://sourceforge.net/projects/google2srt/files/Google2SRT/0.5.2/Google2SRT-0.5.2.zip/download


Mastering the Android Media Framework

http://www.bestechvideos.com/2009/06/04/google-i-o-2009-mastering-the-android-media-framework

Google I/O 2009: Mastering the Android Media Framework

  • Video is free for view

Some monks might take a vow of silence, but Android certainly hasn’t. Attend this session, and help your app find its voice. Android engineer David Sparks will explore the multimedia capabilities of the Android platform, lifting the covers on the infrastructure to show you how it works and the right (and wrong!) ways to use it. You’ll learn how things work under the hood, how to dodge the common media-related developer pitfalls, and how to write secure and battery-efficient media code

David Sparks


PAC: Parallel Architecture Core

按一下以存取 %A5%5D%A4lpac.pdf

Android 系統架構-包含四個主要層次

最底層為Linux系統核心

第二層為函式庫(Library)部分

第三層為應用軟體架構(Application Framework)

最上層為Java應用程式

MPU (ARM922T) : PACDSP initialization, LCD configuration 以及flow control•

DDR2 : 存放H.264 bitstream, 重建畫面資料, MPU 程式•

AXI SRAM :存放PACDSP 程式執行碼•

PACDSP 1 : 執行H.264 解碼PACDSP DMA : Bitstream ,中間運算或重建畫面資料搬移•

PACDSP 2 : 執行H.264 解碼PACDSP DMA : Bitstream ,中間運算或重建畫面資料搬移•

EMDMA : Inter 畫面參考資料搬移• LCD : Display 解碼出的重建畫面

ARM上執行的程式

主要負責的工作包含LCD controller 及PACDSP的初始化,設定H.264解碼時所需的資訊,並啟動LCD將解碼完的YUV資料顯示到螢幕上

PACDSP上執行的程式

執行H.264的解碼

在Android架構,總共是由5個部份來組成。分別是:
(1)Applications(應用程式)
(2)Application Framework(應用程式架構)
(3)Libraries(函式庫)
(4)Android Runtime(Android執行環境)
(5)Linux Kernel(Linux核心)

 

http://ithelp.ithome.com.tw/question/10011551

http://ithelp.ithome.com.tw/question/10011625

http://ithelp.ithome.com.tw/question/10011689

 

在這個章節中,首先,來討論Applications(應用程式)及Application Framework(應用程式架構)。

在Android架構,總共是由5個部份來組成。分別是:
(1)Applications(應用程式)
(2)Application Framework(應用程式架構)
(3)Libraries(函式庫)
(4)Android Runtime(Android執行環境)
(5)Linux Kernel(Linux核心) 

在這個章節中,首先,依由上而下的順序來討論Applications(應用程式)及Application Framework(應用程式架構),後續再討論Libraries(函式庫)、Android Runtime(Android執行環境)及Linux Kernel(Linux核心)。
Applications(應用程式)及Application Framework(應用程式架構)的圖形,如圖所示。下述為各層級的描述。

Application(應用程式)
在Android SDK(軟體開發套件)所用的手機模擬器及未來實體的手機中,都會有一系列以Java語言撰寫的核心應用程式,包含電子郵件程式、簡訊程式、日曆、地圖、瀏覽器、聯絡人與其它應用程式。讓使用者一開始就可以使用這些基本的功能來操作應用手機。

Application Framework (應用程式架構)
在Android SDK(軟體開發套件),也定義了能讓開發者可以完整使用與核心應用程式相同的應用程式標準介面(API),應用程式架構是為了要簡化元件的重新利用而設計的,應用程式可以發佈功能並為其它應用程式所使用,但是,要受限於應用程式架構的安全限制,使用者也用同樣的機制用來新增、置換元件。

目前所有的應用程式是由Services(服務)及Systems(系統)來組成,包含有:
A.Views System(建構程式原件):用來建構一個應用程式的基本原件,包含了在開發系統畫面時,常用的lists、grids、text boxes、buttons控制項,甚至是嵌入式的瀏覽器。有興趣想要看程式控制項的讀者可以參考下述網址:http://code.google.com/android/reference/view-gallery.html
B.Content Providers(內容提供者):可以用來讓應用程式可以存取或分享資料給其它應用程式。
C.Resource Manager(資源管理員):提供各種非程式碼的資源讓應用程式去使用,例如:本地化字串、圖形或排版相關檔案。
D.Notification Manager(訊息管理員):提供應用程式在狀態列(Status Bar)的地方顯示應用程式自定的警示訊息(Alert)。
E.Activity Manager(活動管理員):管理所有應用程式的生命週期及一般性的回溯導航處理(navigation backstack)。例如:開啟應用程式要用到的資源準備及關閉應用程式時,釋放出記憶體及相關資源等工作。
F.Window Manager(視窗管理員):用來管理所有開啟的視窗程式。
G.Location Manager:用來管理地圖服務的相關功能。
H.Telephony Manager:用來管理有關使用者撥打與接收電話的相關功能。
I.Package Manager:管理所有安裝在Android系統內的程式。

在這個章節中,承接上一個章節,再來討論Libraries (函式庫)的部份。而Libraries (函式庫)的圖形,如圖所示。下述為各層級的描述。

Libraries (函式庫)
在Android SDK(軟體開發套件)包含一組系統元件,可以讓開發者呼叫來使用,而這一組系統元件使用的是C/C++的函式庫,開發者可以透過應用程式架構使用這些功能。
而這些核心函式庫列表如下:
A.Surface Manager(外觀管理員):主要的功能是讓開發者可以去存取顯示系統及管理的功能,在「顯示」與「存取操作」間的對應、互動以及實現無接縫的2D/3D多應用程式之間的整合。例如:在2D、2D顯示上的合成、疊合動作。

B.Open GL | ES:主要是依OpenGL ES 1.0規範所定義的3D繪圖引擎。可以將硬體的3D功能做最佳化的處理顯示。

C.SGL:主要是處理有關顯示2D方面的繪圖引擎。

D.Media Framework:主要是以PacketVideo公司的OpenCORE為基礎所發展成多媒體函式庫,有支援多種聲音及影像格式。例如:MPEG4、H.264、MP3、AAC、AMR、JPG、PNG、GIF等格式。

E.Free Type:主要是處理有關顯示點陣圖及向量字形方面的處理。

F.SSL:是Secure Socket Layer的縮寫,主要是處理有關保護網頁通訊的協定。

G.SQLite:SQLite也是一套開放性原始碼的關連式資料庫,其特點在於輕量性方面的設計結構,更適合在手機上使用。

H.Web Kit:是一個的網頁瀏覽器引擎,讓Android發展出專屬的瀏覽器,也可以讓開發者利用這個引擎來做不同的應用。

I.libc:就是BSD標準系統C函式庫。但是,針對Linux嵌入式裝置進行過最佳化的調整。

在這個章節中,最後要討論就是負責跟硬體溝通的底層核心同時也是最重要的Android Runtime(Android執行環境)及Linux Kernel(Linux核心)部份。
Android Runtime(Android執行環境)及Linux Kernel(Linux核心),如圖所示。下述為各層級的描述。


Android Runtime
在Android SDK(軟體開發套件)的Android Runtime分成二個重要的元件來執行系統,雖然Android是用Java來開發、撰寫應用程式,但卻不使用Java Runtime來執行Java程式,而是自行研發Android Runtime來執行程式。
這二個重要元件分別是Core Libraries(核心函式庫),另一個是Dalvik Virtual Machine(Dalvik 虛擬機器)。

A.Core Libraries(核心函式庫)
Core Libraries(核心函式庫)裡頭已經包含了絕大多數Java所需要呼用的函式,接著每一個Android應用程式都會以自屬的process(程序)。而且Android不是用一個Dalvik虛擬機器來同時執行多個Android應用程式,而是每個Android應用程式都用一個自屬的Dalvik虛擬機器來執行。

B.Dalvik Virtual Machine(Dalvik 虛擬機器)
Dalvik Virtual Machine(Dalvik虛擬機器)是一種暫存器型態的虛擬機器。在撰寫開發時就已經設想用最少的記憶體資源來執行,以及前述的「同時可執行多個VM個體」。這樣的設計,讓系統在執行程式可以最佳化的方式來執行,節省更多的資源。有關Dalvik Virtual Machine(Dalvik虛擬機器),會在下一個章節,做更詳細的說明。

Linux Kernel(Linux核心)
在Android SDK(軟體開發套件)的作業系統是用Linux,其版本為2.6版。而所提供的核心系統服務,如下所述:
A.安全性(Security)
B.記憶體管理(Memory Management)
C.行程管理(Process Management)
D.網路堆疊(Network Stack)
E.驅動程式模型(Driver Model)包含下述這些常規的驅動程式:
(1)Display Driver
(2)Keypad Driver
(3)Camera Driver
(4)WiFi Driver
(5)Flash Memory Driver
(6)Audio Driver
(7)Binder(IPC) Driver
(8)Power Management

此系統核心同樣是作為硬體與軟體架構之間的抽象層(Abstraction Layer)。來做為相互溝通的工作。


RISC 精簡指令集(Reduce Instruction Set Computer)

http://taiwan.cnet.com/enterprise/glossary/term/0,2000062921,2000057856,00.htm

RISC  精簡指令集(Reduce Instruction Set Computer)

為一種處理器架構,與傳統的複雜指令集(CISC)不同,RISC指令格式統一、種類少,容易學習、設計與開發程式。

電腦中所採用的中央處理器又可分為RISC與CISC兩種,其間的差異在儲存於中央處理器中的指令集(instruction set)數目不同。

由於RISC指令精簡,得以提高處理器效能,然而相對需要更為複雜的外部編程。RISC架構內的指令大概有90%交付硬體直接完成,只有10%左右的指令乃以軟體組合的方式進行。

相對於傳統電腦,一個複雜的指令往往要許多處理循環才能完成,但RISC電腦卻能在單一處理環境下執行許多複雜的指令,讓許多應用能更快速、更有效率的達成。基於此項科技具備簡易與快速的特質,現今已為高效能電腦所必備的內建架構。

RISC架構較為精簡,不像CISC囿於執行步驟過多,導致閒置的單元電路等待時間延長,而不利於平行處理的應用。單就效能比,RISC定址方式遠比CISC少,處理效能與速度顯然優於CISC架構。但是,在指令執行時間方面,RISC執行速度較CISC為慢。

此外,在RISC架構下,程式開發者必須謹慎選用適合的編譯器,不僅需要重先編寫的應用軟體程式碼持續擴大,也會耗費(需要)更多、更快記憶體空間。現階段,RISC體系多用於非x86陣營的高性能微處理器,廠商包括APPLE、SGI/MIPS、IBM、SUN、HP等

 


高科技盲流

吳誠文 http://nthucad.cs.nthu.edu.tw/~yyliu/personal/txt/high_tech.html

  二零零三年深秋的新竹市並未有落葉蕭瑟的景象;火紅的鳳凰花頂著夏日餘威
仍然盛開著。晚上九點在新竹科學園區的一家IC設計公司,燈火通明中,
一群工程師仍然勤奮地在工作;一個無線網路的計畫使他們個個心裏充滿著期待。
他們的主管才剛準備要整理桌上文件結束一天的忙碌;他若不是為了
要在兒女上床前趕著見他們一面是不會這麼早離開的,至於年輕的工程師們
則尚未有此煩惱。把鏡頭往後一拉,我們毫不驚訝地看到整個新竹科學園區,
甚至延伸到緊臨的竹北與湖口,這個台灣的高科技心臟並未打烊。半導體廠
是輪班不停地運轉著的,而IC設計公司也經常夜不閉戶。這個地區的工程師
與主管們每週實際工作時數大多超過六十小時,許多甚至超過八十小時。
他們很少休假,一個人可以當兩個人用。

全球公認的高科技重心無疑仍是美國矽谷。它經歷了近五十年的成長與繁華,
創造了無數個奇蹟與富豪。五十年的歲月刻劃出了數不盡的傳奇,而令人驚訝的是
我們竟也開始聽到它喃喃抱怨它的中年危機。二零零三年深秋的聖荷西市
晚上九點,一零一號公路暢行無阻,看不到三年前同時間的擁擠的下班車潮。
在一間老字號的中國餐館裏,用過晚餐的一群黃面孔而年近五十且已離鄉背井
超過二十年的工程師們正勤奮地討論著他們已規劃兩年即將付諸行動的夢想──
回國創業。他們有些人已自認無法再等;雖然經濟仍不是問題,
然而中年失業的失落與徬徨並非外人可以想像。這樣的討論餐會夾雜著心酸、
期待與希望──面臨遷徙所造成的家庭結構改變的心酸,返回故鄉對年邁雙親
再盡一點孝心的期待,與創造事業第二春的希望。深秋的矽谷在舊金山灣
海風輕霧的浸潤下令人感受到相當的寒意。這一群有三十年感情的大學同班同學
決定不要對矽谷的未來太早下定論,畢竟這也可能只是一個比較長的寒冷季節,
陽光總會用另一個面貌再度光臨。然而「今人不見古時月,今月曾經照古人」,
矽谷的未來雖然可能長遠得很,他們幾個中年工程師卻已是歲月不饒人。心意已決!

地點回到東方,巨龍睜大好奇的雙眼,看著身旁已力爭上游數十年,仍在奮力
與命運搏鬥的小龍。什麼它都要看,什麼它都要學,無人可擋,無法可擋,
無由可擋。「小小的台灣做得到的我們豈有不能做得更好的道理?」
二零零三年深秋的上海市,夜晚九點從黃埔江瀰漫擴散的寒意擋不住勤奮的
工程人員持續改造上海的跨世紀大工程與台商異鄉拼鬥跨海擴展版圖的
行動與意圖;寒意徹夜被樓滅樓起的工程吵雜聲與一江之隔的台式酒店裏的
歌舞喧囂聲所淹沒。第一波傳統產業似已站穩腳步;第二波高科技產業接踵而至。
戰場逐漸在轉移。酒店裏分別從美國矽谷與新竹科學園區來此聚首的老朋友們
除了飲酒作樂外也細心交換在此生存的心得,個個眉宇間顯現著的既有戰戰兢兢的
期待,亦有破釜沈舟的無奈。縱橫四海的豪情壯志及誰與爭鋒的從容自信
其實在這裏並不多見。詭譎的氣氛,奇特的上海,劇變中的世界。
除了酒店的老闆外,誰能看得清這一切?

時間倒回到二零零三年春天的某一個早晨,新竹某大學電機系的一位教授
正在課堂上對一群學生講著他對學生未來的看法。這位教授在台灣唸大學,
在美國唸研究所,拿到博士學位後回國任教。他從事IC設計與測試的研究
已近二十年。在新竹這個美麗大學校園內台灣相思樹已染成滿山金黃
而學生面臨就業或深造選擇的季節,這位教授這樣告訴學生:「你們大多數
現在無法體會,學術研究對一個大學競爭力的意義與重要性。不從事研究的教師,
永遠只能傳授別人的知識,而有些知識他自己永遠也不會真正明白的。
要明白一門學問,深入瞭解其知識,甚至開創新的知識,唯有從事研究,
別無他途。」

學生們面無表情,教授繼續說:「我們國家的競爭力未來必須仰賴高級研發人力,
不只是依賴普通的工程師與低成本的生產製造環境。大學的教育品質
及研究水準的提昇尤其關係重大。而突破性的研究不光只靠教授,
還需要大量優秀的研究生參與。適才適所,才能發揮影響力。我今天要提醒你們
把握時光好好學習,並鼓勵你們在未來進入研究所磨鍊自己研究的能力,
以便將來發揮自己最大的影響力。」大多數學生無法體會,而有部分學生
眼望窗外藍天,作好迎接老生常談的準備。

新竹科學園區那家IC設計公司的主管在離去前,一面誠心叮嚀他的工程師屬下們
要早點回去休息,不要累壞身體,一面又憂心地詢問產品開發的進度。
矽谷的許多高科技公司主管已逐漸瞭解新竹科學園區的競爭力有極大的因素
來自高素質、高戰鬥力而相對便宜的工程師人力。由於過去二十幾年來
台灣各大學的長足進步及整體人才培育環境的大幅改善,台灣已建立起訓練
高科技工程師的能力。這些工程師的同質性非常高,容易指揮;略施小惠,
則工作無怨無悔。這些工程師在新竹科學園區工作,就像二三十年及更早以前
他們的前輩們絡繹於途到美國留學並到矽谷工作,帶給矽谷許多工作無怨無悔的
高素質而廉價的工程師人力,間接促進矽谷的繁榮,而部分人力回流
也對過去二十幾年來台灣高科技產業之發展造成加速的作用。那家IC設計公司的
工程師大多擁有台灣各大學的碩士學位。他們當中不管家在台東、屏東、雲林、
或澎湖,許多是從小離鄉求學,力爭上游的父母親的驕傲。他們不管在高雄、
新竹、台南、或台北唸大學,最後都落腳於新竹,進入讓鄉親們羨慕的高科技行業。
十年過往,金錢與股票將像水泥一樣把這些人牢牢地凝固於新竹。
他們能不能免於再次被連根拔起,被迫離開這第二故鄉?

那位新竹的教授在成群紅尾伯勞北返路過的校園中繼續對學生說:
「一個國家的競爭力大半取決於社會中堅分子的競爭力,所以你們不能自外於
這個責任。未來的時代,你們的競爭對象在全球各地。夢想有點小聰明
就可以白手起家,累積大財富是非常危險與不智的事,前幾年網際網路公司的慘狀
可為殷鑑。」教授重複前言,開始長篇大論:「一個人再聰明,沒有嚴格的教育
是難以激發他的智慧的,而持續的鑽研深造是將智慧發揚,產生影響力的
唯一途徑。對你們而言,進入好的研究所是鑽研深造的最直接與有效的選擇。

現在的研究所教育已不再只是為了培養學者;我們更期望它能培養具未來數十年
競爭力的人,不論是學者還是工程師或企業家。大家如果去看看那些世界級的公司,
無不致力於持續研發先進技術。一個公司若只是僱用工程師作成熟產品的開發,
永遠在景氣波濤下載浮載沉,學習別人技術而無法發明技術,則永遠不可能
成為受崇敬的世界級公司。台灣未來要走出自己的路,絕對要以產生世界級公司
為目標。要達到這個目標,不能只做成熟產品的開發,也必須從事研究,
大量增加高級研究人力,致力於研發自有先進技術。這是一條台灣必走的路,
各位同學是否有雄心壯志及遠見與我們的國家,我們的企業一起成長呢?
你們準備好了嗎?面對未來跨國界的競爭,你們瞭解對手的實力嗎?
你們應不甘願於當一個追隨者,只是在計算三五年的股票而已。

我鼓勵你們多花一點時間看一看、想一想。看一看別人怎麼往前邁進,
在世界上一直領先,讓我們苦苦追趕不上;想一想你們的未來,
要如何成為世界的領先者。你們這個年齡,要慎重的去想這件事,
不要成天再玩浪費生命的三腳貓的把戲。如果你們不能善用聰明的頭腦
好好思考這個問題,好好在這段學習的黃金時期充實自己,提昇競爭力,
未來就只能隨波逐流,躺在時代的巨輪下而不是去趨動它。我鼓勵你們,
跟著老師們一起奮鬥、一起學習、一起研究、一起創新、一起成長。

我鼓勵你們唸研究所,尤其是有能力者要進到博士班深造。
我們的企業很快就會瞭解,他們要趕上世界一流公司的關鍵之一
是要有大量創造技術的人才,而這樣的人才不但要聰明、勤奮、
更要受過嚴格的訓練,並給予研究發展的舞台與空間。」
少數學生開始閉目思考,而多數學生認為杞人憂天,繼續欣賞窗外藍天。

在新竹那個教授口沫橫飛的同時,北京一所全中國頂尖的重點大學計算機系裏
有一位教授正帶著一群助手(較資淺的教授及博士後研究人員)及研究生,
幾乎不眠不休地想完成一件台灣的大學迄今尚無法想像的大規模IC設計實作計畫。
這個計畫雖然台灣或其他先進國家的教授們不會認定是學術性高的計畫,
可是他們不得不相信北京這位教授勇往直前苦幹實幹的精神一定會逐漸提昇
該校的研究水準。大陸的學生一樣同質性高,略施小惠則不眠不休,無怨無悔。

大陸在台灣走過的路上直追過來,且多帶著一份蠻幹的霸氣。新竹的隱憂,
北京還未及想像。台灣的高等教育美國化,大陸也依樣在學習。新竹的教授
繼續著他的演講:「老師們希望學生不只是成績好,也要培養熱忱的心胸,
專注的精神,堅定的態度,以邁向明確的目標;更要有一顆謙虛而好學的心,
以增加團隊力量為榮。總之,就是要敬業。老師的責任是傳道、授業、解惑,
而很明顯的敬業是把這個工作做好的前提。如果學生也能展現出敬業的精神,
必將得到老師們的信任而願傾囊相授。敬業會是你們一輩子做任何事
成功的要素。」學生們多半同意,然對於自己能否身體力行則半信半疑。
北京的學生也許也這樣想,但是成功的慾望已逼著他們一頭栽進,勇往直前。
不管新竹、北京、或上海,學生們計算他們未來的方式都是一樣的──
金錢與股票。新竹的學生也許已早一點看到那個盲目工作之後的陷阱,
中年的健康與家庭雙重危機。新竹陷阱已悄悄在北京與上海佈建。

二零零三年深秋在美國東部一個全世界最重要的IC測試學術會議裏,
新竹的這位教授帶著他一手訓練的四位學生(其中兩位已是助理教授)
發表了兩篇論文。全世界同領域頂尖的學者專家每年會來此研討會集會討論,
發表研究成果。如同以往,尚未有大陸的論文。可是大家知道這是早晚的事。
大陸多年來累積的眾多留美學生已代表著美國著名學校及公司充斥在會場各個角落,
發表論文,參與討論,反而台灣留學生已寥寥無幾。新竹的論文得到相當高的評價。
在這個領域,台灣已經初步展現自我訓練人才以及自主研究的實力。
新竹的教授回想過去幾年來許多政府官員、學者專家、及工業界代表性人物等
時常在媒體及其他公開場合對多數台灣優秀學生不再出國留學表示深度憂慮,
卻似乎從未深究原因及看清未來。他對此一直深感疑惑。

在當年稍早濕氣高漲的新竹的春天,教授接著對學生說:「出國留學的熱潮
有其相當無奈的歷史因素,當這些因素消失後熱潮自然消退。過去的留美熱潮
幸運的在適當時機轉成一股幫助台灣的動力,然而歷史無法重複,
雖然經驗可以為鑑。

歷史無法重複──時間的巨輪現在已把台灣推到一個令我們頗為興奮的
新天地的入口。台灣已悄然報名參與第一級的競賽,逐漸遠離老二主義,
我們別無選擇,別無後路。在這第一級的競賽,研究自主、技術自主、人才自主,
一切得靠自已。仰賴美國訓練人才的時代已宣告結束,而優秀人力留在台灣
若能好好訓練亦是台灣提昇競爭力的必要動力。所有只會深表憂慮的人
應該即刻反省,轉憂為喜,並著手為參與競賽的選手們提供最好的訓練環境
與最佳的競賽條件。」講到這裡,教授警覺到他可能無意間正引導學生
走向新竹陷阱。他必須提出迴避新竹陷阱的叉路。

一九九四年某個仲夏夜的廣州車站擠滿了無業農工,這個東南沿海各大城
普遍的景象持續數年讓大陸政府官員傷透腦筋。盲流到處流竄,
造成極大的社會成本。所幸近幾年來大陸經濟高度成長,創造許多就業機會,
這個壓力暫時得到舒緩。

再看看二零零三年深秋夜裏的這個上海酒店,裏面聚著的幾位多年老友,
他們當初都是在貧窮的台灣成長,因嚮往美國的富庶繁華而離鄉背井,
負笈遠渡重洋,學成後各自在新世界不同的角落棲息下來,又先後移居矽谷。
如今他們比還在矽谷宣誓決心的另一班人早一步依著他們的直覺分別回到台北
與新竹,再先後聚集上海,期待上海是他們的第二個新世界。他們其中一個人
在矽谷住了十八年,在新竹住了五年,現在一個人搬到上海定居(妻子兒女
仍留在美國)。接近午夜時分,當他一面唱著KTV台語歌「黃昏的故鄉」
一面想起在台灣南部鄉下去年才剛過世的老母親,不禁潸然淚下,泣不成聲。
曲未終,人已散。他開始思考他的人生。這幾個高級知識分子,從事高科技產業,
受到台灣及大陸政府的歡迎。他們只不過是跟著前輩及同儕的腳步,憑著直覺,
努力在自己的行業辛勤工作,期待能出頭,從未逾越專業。

時代浪潮把他們跟所有其他人一起捲入一個與外界隔絕的漩渦當中。
彼此看不清楚,甚至也看不清楚自己,只知道大家都在一起。他們並不知道
在當年稍早的春天時,新竹的教授已經對學生說了:「當然高科技產業
不能自外於整個社會,所以你們要對這個社會盡可能的了解,
並對過去出現過的問題有所警惕。遊牧民族逐水草而居,他們並不耕種。
盲流追逐人云亦云的工作機會,他們只求出賣勞力謀得溫飽。許多高科技工作者
追逐金錢股票,他們出賣腦力。問題是人兩腳,錢四腳。錢不像水草般顯而易見,
予取予求。它比較像人云亦云的工作機會。有相當多的高科技工作者
四處追逐金錢股票而居。他們也許被稱為高科技遊牧民族,但是他們不像遊牧民族
對水草有透徹之瞭解與掌握,他們也甚少花時間思考、體驗、及領悟多樣化的人生。
他們活在一個與外界隔絕的漩渦當中。他們的同質性高,價值觀及行為模式相近,
因此也難成就大事業,難成長為大企業家。」

一九八一年初夏,台南縣玉井的果農因芒果豐收而令人意外地陷入絕境;
芒果竟然多到氾濫成災,大家競相拋售,使價格慘跌。當年他們為著前一年的
好價錢而搶種,市場機制把他們的心血無情地吞噬,致使農會史無前例的
將數十噸刻意收購的芒果往曾文溪裏倒,而果農眼淚往肚裏吞。每一位農民
都是憑著直覺,跟著同儕一起種相同的水果的,怎麼會受到老天的處罰呢?
相隔十多年,台灣的影像掃描器橫掃全球,誘使許多廠商高度投資,
然而榮景之後,接下來便步入玉井果農的後路。玉井效應使果農與高科技業者
類似的故事在台南、屏東、新竹與台北等地一再重演,雖然主角會換,產品會換。
不但人的同質性高,思考方式類似,做事方式類似,檢討的結果也一樣。
大家都在漩渦裏度日子。

一九九九年初,台灣一個訪問教授在史丹福大學裏一個舉世聞名的研究群裏
給了一個演講。那個演講的內容完全是他與在台灣指導的研究生做的成果。
演講之後史丹福大學該研究群也開始從事相關研究,一直持續至今,
反而台灣的教授已把研究重心轉移到大家都認為比較重要的問題上。
台灣各大學獨立研究的能力持續在成長,可惜同質性太高。學術界不大可能會有
玉井效應,可是不能排除盲流現象的存在。同樣在一九九九年初,
日本北九州市政府正在規劃一個耗資鉅大的工程,他們要把日漸沒落的
北九州市重工業轉型為以IC設計為主的高科技業。北九州市並不孤單,
他們的想法重複出現在全球各工業城市。現在全世界已有許多城市像北九州市一樣,
想法已化為實際行動,工程已紛紛啟動。激烈的人才爭奪戰在全球各處展開。
玉井並不孤單。

至於新竹那家IC設計公司的工程師,他們的鄉親較難估算的是新竹這第二故鄉
最終將帶給他們的是什麼。無法談舒適安逸的生活,無法談衣錦還鄉的歸期,
不過也許可以談EPS及他們的產品銷售到多少人的手中。

二零零三年春天最適合郊遊踏青的這一天,離下課只剩下數分鐘,
學生早已蠢蠢欲動,新竹教授終於講到他的結論了:「今天我們要教育的
不是要在過去數十年競爭的人,而是要在未來數十年競爭的人。
雖然歷史可以為鑑,你們的競爭力卻無法來自墨守成規。記取教訓固然可取,
而培養逆游而上的勇氣、學習跳脫漩渦的方法更為重要。

要長久快樂的生活在這片土地,你們必須要能不斷的研究,並且以耕種代替遊牧。」
下課鐘響,學生們快步邁向未來。


SOC 跟你什麼關係?

http://beaver.dlc.ncnu.edu.tw/projects/emag/article/200506/SOC跟你什麼關係.pdf
吳誠文
清華大學電機資訊學院院長 5/25/2005
一、序曲
許多人聽過 SOC,不過可能並不真正瞭解它是什麼東西。其實
它並不會比ROC 還要令人難以理解。
有人把 SOC 翻譯成單晶片系統(System-on-a-Chip),意指一個
電子系統被整合到單一晶片上。後來發現用單一晶片實現一個完整電
子系統對大多數應用而言仍然是困難的,有時也不切實際,因此把範
圍再放寬,把SOC 解釋成晶片系統(System-on-Chip),意指使用高
整合度晶片所實現的電子系統。如果要吹毛求疵的話,這跟傳統的系
統晶片(System Chip)意思不太一樣,因為晶片系統是一個系統,而
系統晶片是一個晶片。
對大多數人來講,這樣粗淺的解釋也許不夠,尤其是如果你不知道什
麼是晶片,什麼是系統。這樣的話,我先引述李家同教授的教誨:「我
們的積體電路裡面會越來越複雜,比方說,我們可能要有一個簡單的
CPU、記憶體、和一個訊號處理器。我們自然可以自行設計所有的單
元,但這不太可能,以經濟眼光來看,這也是不划算的。所以我們一
定會利用別人已經設計好的單元,而將他們整合起來,但是所謂整
合,也不是將別人已做好的晶片放在一起,外面加以封裝,而成為一
個新的晶片,而是利用別人的設計,重新佈局,重新拉線,做成一個
新的晶片。SOC 因此絕不是一個簡單的封裝問題而已,SOC 是利用
別人已有的智慧財產,加上自己的整合技術而造成的。」對此微言大
義,我後文會加以解釋。
不過,我也要利用這個機會提醒各位,在2000 年之前股票分析
師一窩蜂地看好的SOC 概念股如今似乎多已風光不再,而你對它們
仍然念念不忘還是已經心灰意冷了呢?也許當年你偶爾走進新竹市
光復路旁的水源市場,聽過吵雜人群中這樣的對話:
賣菜的歐巴桑:「王太太,你先生不是在科學園區那個X 公司當司機
嗎?聽說他們公司是做SOC 的喔?」
買菜的歐巴桑:「是啊!他們公司股票剛上櫃,這幾天都一直漲,夭
壽喔!」
賣菜的歐巴桑:「真的啊!那現在還可不可以買啊?」
買菜的歐巴桑:「安啦!我先生說他們總經理常常告訴他,我們ROC
以後就是要靠這個SOC。」
– 2 –
賣菜的歐巴桑:「那這個SOC 到底是什麼東西啊?」
買菜的歐巴桑:「最新的高科技啦!反正講妳也不懂,你要買的話,
動作要快,今天又漲了!」
現在你大概聽不到這樣的對話了!(什麼?水源市場已被拆了?),
但你還是不死心嗎?‥‥是嗎?‥‥唉!那我就只好犧牲睡眠把這
篇文章寫完吧!
二、晶片與晶圓
晶片的英文是 Chip。猜猜看這世界上名氣最大的Chip 是哪一種
Chip?CPU Chip?Memory Chip?不是不是,是Potato Chip(洋芋
片)!當然今天我們不談食品工業,我們只談矽晶片(Silicon Chip)。
其實晶片的正式名稱是積體電路,也就是IC(Integrated Circuit)。它
是由半導體材料(主要是矽、鍺及某些III-V 族化合物半導體)製成
的,所以IC 產業亦屬於半導體產業。
圖一

圖一是我們在清華大學最近設計製作完成的一個密碼處理器
(CP)晶片的照片[1]。這個晶片的面積大約是3mm × 4mm,含有超
過200 萬個電晶體。晶片是由晶圓(Wafer)切割下來的。如果用8
– 3 –
吋晶圓來製作這樣的晶片,則一片晶圓可以生產超過2000 個晶片。
如果一個8 吋晶圓廠月產三萬片晶圓,全部用來生產這個CP 晶片,
則一年可生產36 萬片晶圓,超過7 億2 仟萬顆晶片。如果清大委託
晶圓代工廠生產這顆晶片,代價是一片晶圓伍萬元,則這個晶圓廠的
年產值大約為180 億元。可是如果清大把這些晶片都賣掉,每顆賣
300 元,則我們光是這個產品所造成的產值就超過2,160 億元。封裝
與測試成本略低於晶圓成本,所以如果這些晶片都能賣掉,且價錢維
持300 元壹顆,則清大不但錢多得花不完(這是李家同教授對我們的
印象),還可以接濟其他學校(這是李家同教授對我們的期待)。當然
如果CP 晶片價錢只能賣一顆30 元,那清大的股票就變成水餃股了。
如果我們改用12 吋晶圓來生產CP 晶片,則每片晶圓可以生產超過
4500 個CP 晶片,即晶片的產能變為2.25 倍。如果12 吋晶圓的價錢
如預期可以降到低於8 吋晶圓的2 倍,則晶片成本可以大幅降低,又
可以利用產能優勢影響市場,這是為什麼許多半導體大廠紛紛投資蓋
12 吋晶圓廠的主要原因。
當然,蓋晶圓廠是一個極龐大的投資,是否要蓋,考量沒有這麼
簡單。這裡要強調的是,如果晶片的價錢高(其價值來自於市場的高
需求且具有難被取代的特性),則每單位投資IC 設計的獲利遠大於IC
製造。關鍵是,如何設計出市場所需而難被取代的產品呢?
三、IC 設計產業背後的辛酸
過去二十幾年來台灣的經濟成長主要仰賴高科技產業,而其兩大
支柱是PC 產業及半導體產業。早期的半導體公司都是屬於整合設計
與製造的公司,稱為IDM(Integrated Design and Manufacturing)公
司。世界上著名的IDM 公司非常多,如Intel,AMD,TI,Philips,
IBM,Toshiba,Hitachi,NEC,Samsung,華邦,旺宏等等,不勝枚
舉。他們設計IC,同時自己生產,大多不假手他人。自從台積電
(TSMC)在台灣以晶圓代工之經營模式成立後,IC 產業的垂直分工
變成了一項台灣奇蹟,並逐漸改變了全球的IC 產業營運模式。圖二
顯示出台灣IC 產業垂直分工的概況(2004 年工研院經資中心資料)。
繼台積電之後,聯電(原來是IDM 公司)也把設計部門獨立出去,
成立多家專業IC 設計公司,而本身則轉型為晶圓代工廠。如今台積
電與聯電已是全球最大的兩家晶圓代工廠,而包括美日歐在內的世界
級公司為了維持競爭力,也陸續調整公司架構與經營模式,紛紛把IC
設計部門獨立出去,並逐漸減少或停止晶圓廠的投資。由於晶圓代工
業的成功,使得全球晶圓代工廠急速增加,連藍色巨人IBM 都加入
這個產業,成立晶圓代工部門。也由於晶圓代工的成功,促成無晶圓
– 4 –
廠(Fabless)IC 設計公司如雨後春筍般在全球各地紛紛成立。
圖二

由圖二可以看出,光是在台灣,IC 設計公司已有二三百家(拜
託不要問我IC 設計公司是做什麼的,我已經寫得頭昏眼花了,如果
真的不知道,可以回家問媽媽)。由於不必投資晶圓廠,成立IC 設計
公司門檻大為降低,因此也間接促成從矽谷到台灣的IC 設計公司創
業熱潮。如今全球無晶圓廠IC 設計產業北美佔了約六成的產值,而
台灣則近三成,僅次於美國。
但是,那個賣菜的歐巴桑五年前買的股票不久便因網路泡沫破
滅,價錢像溜滑梯一樣一路跌到剩下原來的三分之一,到現在也只緩
慢回升到約二分之一的價錢,起起伏伏,前途堪虞。連那些股票分析
師與王太太都已見風轉舵,琵琶別抱,對SOC 失去信心,那我還在
這裡寫什麼?(唉!是李家同教授逼我寫的!)我得告訴你們實話,
這不是最好的時代,也不是最壞的時代。情況有點複雜,不過看完我
在半昏睡狀態提出的下列幾點「精闢」的見解後,你一定會比我還清
楚IC(設計)產業到底是何去何從。
(一)看價值不要看產值!
經濟部最喜歡談產值,因為那可以用來嚇人。可是今天的
半導體及平面顯示器產業(經濟部引以為傲的兩兆產業)的高
產值代表的是高投資與高社會成本,但不代表高獲利。我們若
以台灣生產的IC 與世界知名公司(如Intel)的IC 價值相比,
– 5 –
便會恍然大悟。每單位面積(mm2)的晶片價值,台灣生產的
IC 平均不到美金一角,而Intel 的CPU 可以賣到美金三塊半或
更高。如果以清大的CP 為例,面積是12mm2,那在台灣一般
的期望價值只有美金一塊二,大約是台幣40 塊錢,而不是原
先我所期望的300 塊錢。同樣面積的Intel 晶片價錢是美金42
塊錢,大約是台幣1,400 元。這是怎麼回事?大量社會成本被
隱藏(或忽略)了,研發成本被大幅刪除(或灌水)了,獲利
被壓縮了;咬著牙拼命的結果,產值看起來一路扶搖直上(因
為低價搶了別人的市場,當全世界有錢國家的工廠),外滙存
底十年來也成長了兩倍以上,但是令人心痛的事實是平均國民
所得卻原地踏步;而這還只是表面的數字。
台灣全島都變成工業區的背後,我們欠大地的債並沒有仔
細去計算,而子孫當然還不知道他們得還。等他們會算了,恐
怕將發現『實質』國民所得竟是快速的負成長。婆娑之洋,美
麗之島,安在哉?
(二)垂直分工,水平也要分工!
台灣出名的是台灣牛,刻苦耐勞,無怨無悔,至死不渝(恐
怕到頭來亦不知是怎麼死的)。傳統文化是大家一窩蜂做相同
的產品(且是別人早就定出規格的產品),惡性競爭,槍口一
致對內,在外面卻卑躬曲膝。不管是IC 設計或其他相關產業,
同質性均高,彼此殺得你死我活。這一點我不再詳細講,請參
考我的另一篇文章「高科技盲流」[2]。
(三)寧要孩子,不要房子!
政府附和許多高科技業大老闆們的論調,宣稱人力缺口不
斷加大,危及經濟成長。台灣人口密度已相當高,但是高耗資
源的製造業不斷擴充蓋廠的結果,表面是產值與就業機會的提
昇,背後是低獲利的心酸與長遠無情的負面影響。政府除了短
期的政策(如矽導計畫增加IC 設計師資員額、加強培訓、引
進外勞、國防役、碩士專班等),最近也加緊宣傳,鼓勵生育。
殊不知盲目提昇產值致使環境與生活品質惡化及相對(實質)
國民所得降低方是造成國民不願(或無法負擔)生育的最大原
因。寧願好好為子孫著想,不一定要一直蓋廠(房子)。
(四)要用功唸書、作研究,不要努力上網打電動!
啊!對不起,這是我的職業病,每篇文章都會忍不住要教
訓學生。不過天下興亡,匹夫有責。要興要亡,還是得你們自
己決定。讀一讀我的「高科技盲流」[2]吧!
– 6 –
雖然我還有其他高見,不過也許這已經可以解釋股票市場
的表現了吧?原來五年來投資大眾是充滿理性的,看得如此的
深遠。難道全世界(包括ROC)所寄予厚望的SOC 不是經濟
成長的轉機嗎?其實它跟全球化(Globalization)一樣是一把
兩面刃,揮刀的人要非常小心(尤其不能看葵花寶典)。
四、要命的 SOC!
前面說過,SOC 是晶片系統。在台灣,做IC 的公司都宣稱他們
在做SOC,而有趣的是許多做系統的公司也宣稱他們在做(或要做)
SOC,因為如此才能避免被譏為趕不上時代,使投資人怯步。真的都
在做SOC 嗎?要判斷一個晶片產品是不是SOC,我們可以看看它符
不符合下面已經很鬆的三個條件:
1.是否大量使用智財(IP)核心?
2.是否使用平台式(Platform-Based)設計方式?
3.是否使用軟硬體共同設計方式?
嚴格一點的話,還要再加上下面兩個條件:
4.有完整的類比介面
5.整個系統整合到單一晶片
由於我眼睛已充滿血絲,我只能勉強草草用前三點說明以敷衍你
們。IP(Intellectual Property)是一個有趣的東西。它雖然泛指智慧財
產,不過在SOC 領域裡它有明確的特殊的意涵。它指的是IC 設計,
注意,是設計,不是晶片本身。由於SOC 須整合許多不同性質的電
路,因此開發困難度比傳統IC 要高許多。例如幾乎所有的SOC 都會
含有CPU 及各式各樣的記憶體,而任何一個人要同時是CPU 的專家
也是記憶體的專家是非常不容易的(我從來沒遇過)。因此,如果我
們要設計一個SOC,需要使用CPU 及記憶體,那我們可以分別去買
設計優良、價錢合理的CPU 設計與記憶體設計,可是我們不能買CPU
晶片及記憶體晶片,因為我們不能把幾個小晶片塞進我們自己的晶片
就讓它變成一個SOC,而是在設計的過程當中「整合」不同的這些
「IP」成為我們要的SOC,再去生產。因為如此,市場上遂出現不賣
IC 的IC 設計公司,它們只賣IP。例如圖三是我們在清大設計的另一
個晶片的IP 內涵圖,它大約為CP 晶片的兩倍大。它整合了CP 設計,
ARM 公司的CPU 與Bus(匯流排)IP,Artisan 公司的記憶體IP,以
及我們自己設計的其他的小IP(如介面電路、自我測試電路等)而成
為一個單一的晶片。這是一個網路安全處理器晶片,發展過程長達三
– 7 –
年,參與的研究生前後超過百人。我倒不敢稱它為SOC,因為它雖
然符合前兩個條件,卻不符合第三個條件。雖然我們軟硬體都有(有
CPU 一定會有軟體),可是並沒有使用軟硬體共同設計的方法,因為
環境尚未建立(其實軟硬體共同設計到目前為止許多工具都不成熟,
工業界亦徒呼奈何)。
圖三

我因為早已頭昏眼花,CPU 過熱,螢幕閃爍,已經快關機了,
不得已只好虎頭蛇尾。如果你一定要知道什麼是平台式設計,什麼是
軟硬體共同設計,請就近請教貴校電機系或資訊系相關領域的老師吧
(這麼大了不要凡事找媽媽),記得要自行束脩以上。至於IP 之重複
使用,其實生活中實例比比皆是。圖四是我三年前在巴黎奧塞博物館
參觀時,對十九世紀藝術家J.A.D. Ingres 的三張油畫作品驚訝不已(倒
不是出於我天生的藝術氣質,而是對於他IP 重複使用的先進觀念的
佩服),於是遵守館方不使用閃光燈只使用純熟精湛技巧的規定把他
們拍下來的。當然今天的SOC 強調使用最好最適切的IP,而不是使
用自己的IP,不然的話你做的晶片就會像這三張畫一樣,怎麼功能都
差不多呢?
– 8 –
圖四

不過我希望你看到這裡終於可以徹底一頭霧水(本來還以為自己
很懂SOC,是不是?)我是說,終於可以理解到SOC 製造的問題不
會比它解決的問題少,因此草率地對它寄予厚望是很危險的。要命的
SOC!
五、難結之論
你豁然開朗也好,你若有所悟也好,你不為所動也好,你滿頭霧
水也好,你不以為然也好,反正我也撐不下去了,已經設定十分鐘後
關機,並且無法給你冠冕堂皇的結論。
李家同教授可能大嘆所託非人(其實他早找個年輕人不就好
了),本來只叫我寫一下什麼是SOC,沒想到我神智清楚的時間都被
安排去開會了,一旦開完會神智就不清,結論你們自己下吧!
也許明天台灣真的有人可以設計出 SOC!
也許明天開始 SOC 真的可以賺錢!
也許明天的台灣實質國民所得會提高!
明天見!
參考文獻
1. C.-P. Su, C.-H. Wang, K.-L. Cheng, C.-T. Huang, and C.-W. Wu,
“Design and test of a scalable security processor”, in Proc. Asia and
South Pacific Design Automation Conf. (ASP-DAC), Shanghai, Jan.
2005.
2. 吳誠文,高科技盲流,IC 設計月刊,2003/12,76-82 頁。


SoC軟硬體協同設計方法與實例

轉貼自 http://bbs.ecstart.com/thread-25899-1-1.html

SoC (System on Chip) 有著面積小、速度快、耗電低等優點,使其越來越受到矚目。為了加速SoC的設計流程,相關技術包括軟硬體協同設計、IP的可重用性、SoC驗證技術、低功率消耗、嵌入式軟體移植與開發等也隨之興起。 

其中軟硬體協同設計讓軟硬體從設計到驗證的部分都能緊密結合,減少了軟硬體整合所花費的時間。 軟硬體協同設計首先需訂定系統規格,對此作系統分析並把某些功能分別以軟硬體實現。 

至於何種功能需用軟體或硬體實現則必須考慮系統的效率與成本;因為硬體處理速度較快但是成本較高,通常將常用且便宜的部份做成硬體。確定軟硬體分割後即可對軟硬體部分開始實作。就硬體來說可以使用VHDL、Verilog等硬體描述語言撰寫其規格,軟體部分則使用C語言等來驅動這個硬體。 

之後進入軟硬體協同模擬階段,亦即當要從硬體抓取資料時以軟體模擬並確認結果是否正確。如果此一階段沒問題,便可進入軟硬體協同驗證的階段,將這些資料放到模擬板上執行,驗證其正確性。 

我們使用Xilinx Vertex-II Pro ML310這塊模擬版來實作一個加法器連接至OPB上,利用軟體使用此加法器使其產生從1加到10 後之結果,並以軟硬體協同設計的流程配合解釋實作的過程。 

在軟硬體協同設計上可能會遭遇到軟硬體無法互相溝通的情況,常見的原因在於實作硬體時的規格設計有問題,或是沒有依照標準的匯流排協定的格式來設定,導致資料無法正確讀取與寫入等。


關於下對上的衡量

我們要怎麼客觀知道下對上的想法,明顯的做法就是一段時間給一個問卷。大概很少有公司主管能勇敢接受下對上的評比,做完評比後,相信很多主管就不會在自我感覺良好了。

1. 方向的設定

a. 當我有需要時,我的經理會馬上協助快速判斷,沒有不必要的耽擱。10%

b.我的經理在執行前有完整的分析和計畫,並且提供清楚和精確的判斷和方向。10%

2. 指導和溝通

a.我的經理會根據我的表現或當我在工作中陷入困境時,主動即時給予協助和指導。10%

b.我的經理會傳播公司相關資訊(比如公司/團隊完成了哪些成就,在哪些領域成為領航者,或公司政策等等),讓我更加瞭解公司,減少因誤解而對公司的疑惑。我的經理也很願意傾聽我的想法並且有良好的回應。10%

3.授權和賦能

a.我的經理了解我的專長和未來的潛力,並且提供清楚的工作方針,讓我可以清楚和適合的去完成。除此之外,我的經理也提供我足夠的訓練,讓我可以學習並貢獻而可以跟隨公司的成長。10%

b.我的經理會根據我的能力和潛力提供足夠的機會來讓我表現。10%

4.賞罰分明

a.我的經理在績效評估上會給予我公平客觀的評量。10%

b.當我有好表現時,我的經理會即時提供獎勵,反之當我做不好時,我的經理也馬上要求提出改善。10%

5.變革領導

a.我的經理有開放的想法不侷限在過去成功的做事方法而一成不變,可以接受新的建議和做法。10%

b.我的經理總是有新的想法或方法應用在管理或實務上,而那些方法也證明比過去的做法明顯有效果。10%


建立特質的修練之道

[前言]

最大客戶來訪跟女兒鋼琴獨奏發表會衝突,你會怎麼抉擇? 不論結果好壞,你的決定性時刻將決定你的特質。 接者,你真的會致力於實現個人想法或僅是隨口說說而已? 你真的了解自我嗎? 你怎麼塑造、揭露跟考驗自我? 這個複雜的自我追尋過程,在有深度和彈性的成型後可不可以內化成領導,從經理人成為領袖?

前面幾篇在探討區分管理跟領導,並強調領導是一種自我實現帶領變革的過程,定義並建立領導的理想型態。本篇在於領導者怎麼做出智慧的決定,在面對兩難的選擇時,如何做出決定性的影響,這些問題不像一般倫理在對與錯中決定,這類的決定都沒有一定的正確性,多年累積就造就出一個人的特質。

領導者做這類決定時,會重新聚焦在自我認同的核心價值跟原則上,問題是自我的觀念是正確的嗎? 一旦做錯關鍵決定,帶來的可能就是害人害己甚至危害公司的生存。那麼要注意什麼? 如何透過什麼樣的思考模式跟過程來避免做錯決定或降低傷害,甚至完美解決呢?

[本文]

每個人如果往你的前幾年去審視自己過去一連串的決定,相信現在的你一定不會完全認同,越是經常做出很多難以決定的人會越有感覺,所以自己的價值觀跟原則是有很大機會隨著自我經驗成長而越來越有彈性跟深度。

高階經理人在混亂的日常生活表面上,不斷重新聚焦在自我核心價值跟原則,以它們重建工作意志,並做為隨機應變的行動跳板。整個工作生涯就在不斷的重複這些過程,得以用自己對正確事務的了解做為基礎,塑造出強而有力的真正認同,進而不必仰賴別人的認知。藉由這種方式,經理人可以有機會脫胎換骨轉成具有領袖特質的人,也就是經理人想要成為領袖,就必須將個人的價值轉換成可能的行動。

很多決定性時刻都在工作的當下同時進行,而不是在安靜獨處時來進行自我探索,所以到底要如何掌握最無從捉摸、富挑戰和關鍵的工作難題成為領袖?

職場中有三種常見的決定性時刻類型。第一型主要是個人認同的課題,如我究竟是誰? 第二類包括團體和個人,如我們是誰? 第三種涉及界定公司在社會裡的角色,如我的公司是誰? 藉由學習這三種狀況,在難以兼顧的決定中,檢驗價值觀跟自我追尋的過程,來做出成功的導航。

個人的決定性時刻     

 

對個人而言:我是誰?

  1. 什麼感覺和直覺在這個情況下產生衝突?
  2. 有哪些相衝突的責任和價值觀,是最為深植於我的生活以及我所關切的團體中?
  3. 機靈應變與權宜之計要怎麼樣的組合,再結合想像力和勇氣,將幫助我實現個人對正確之道的理解?

 

你的自我認同價值跟公司任務對你的認同價值有衝突嗎? 衝突可以說是一種緊張關係,要消除它可以試問自己什麼感覺和直覺在這個情況產生衝突? 我們的感受和直覺既是一種智慧的形式,也是洞察力的來源。

書中的劉易士是一個極度維護自尊的黑人,他希望靠自己的實力獲得公司的肯定,在一次參與對重要客戶的簡報活動中,他直覺發現團隊裡自己的資格是最年輕的,進而發現自己是因為客戶要求要有黑人專業人士才願意接受案子。劉易士一方面以身為團隊成員為榮,不想讓隊友失望,一方面又不想成為象徵成員,這牽涉到兩個他都深信不疑的理念衝突。

這時候我們就必須追尋自我價值觀的來源。劉易士從大二開始就想要憑著自己的功績在華爾街工作,這是他夢寐以求的工作。另一方面,從小他們家遭受黑人歧視,身為雙親之子,以及美國黑人身分讓他決定不能以象徵性黑人前去開會,比起最近擔負的專業角色,他心中決定自己的種族才是本身道德認同中極其重要的一部分。

劉易士這種內省,很容易就會和現實世界的需求脫離。未經現實主義調節的理想主義,對世界的貢獻往往不多。商場是一個有底線、混亂的競技場,單憑內省是辦不了事的。劉易士要如何結合理想主義與現實主義呢? 他決定有條件的加入團隊,他向主管補充說明自己想要真正參與團隊,爭取自己在團隊中的地位,這當然有風險,因為他的準備時間比起其他早就準備很久的隊員短了很多,所幸他只針對提案的一小部分臨陣磨槍,沒有打算跟其他同僚幾個禮拜的心血相對抗。

最後圓滿成功,總的來說,他主動積極證明了自己不甘為團體的象徵性代表,跟自己對工作的盡心盡力,彷彿是經過公司內的一種認可儀式。

工作團體的決定性時刻

 

對工作團體的經理人而言:我們是誰?

  1. 對於這個情況還有什麼其他強而具說服力的倫理闡釋?
  2. 在闡釋的戰爭中,哪個觀點最有可能獲勝,並影響其他人的想法和行為?
  3. 我是否已精心安排一個能讓本身的詮釋在團體中勝出的過程?

 

經理人除了個人外,必須考慮工作團隊的價值觀,以及對部屬的責任。很多經理人罹患倫理的短視症,自欺欺人相信整個團隊都是和他們一樣觀點看事情。這種思考方式很難使大家通力合作,完成共同目標。經理人不要將自己對於正確的想法,強行加諸於團體上,應該要了解其他成員對當前困境的看法。

書中的例子是一位三十五歲的經理人彼得,他已經結婚育有三名子女,手下有三名副理五十名員工,公司有四名副總裁,其中一名是他的主管,他最近雇用了一位客戶經理凱薩琳,她是位單親媽媽,條件極好又能幹,但因為要花時間照顧兒子,所以老是趕不上工作進度,由於公司一週工作六十小時已經成為常態,凱薩琳和她的主管莎莉也處不來。莎莉是個野心勃勃又拼勁十足的女性,對凱薩琳長期遲到和難以預測的工作進度感到不滿。彼得有一天發現莎莉留了一張紙條說明希望他開除凱薩琳,而且這星期已經是第二次。

身為人父的彼得對凱薩琳的困境深感同情,他認為員工也應該需要時間與家人共處,和自己對部門底線的職責所在正相互對立。彼得決定找兩個人來做下好好談談,事情應該可以迎刃而解。然而就在開會前,莎莉已經越級逕行與公司高層主管討論此事件,高層主管並前往凱薩琳辦公室將她開除。

彼得認為雙方都有理,莎莉卻認為這是是與非的對抗,莎莉認為凱薩琳工作不力、不負責任,以及彼得對這件事缺乏行動。莎莉並相信在嚴重過度負荷的團隊中,有一個人受到特別待遇是不公平的。雖然彼得跟莎莉看到的是同一件事實,彼得卻沒有早一點認清自身的觀點只是眾多解釋中的一種,所以他遭遇的是一種困難的詮釋爭論。

在闡釋的戰爭中,哪個觀點最有可能獲勝,並影響其他人的想法和行為? 脫穎而出的闡釋,包含許多決定性因素,公司文化、團體採行的基準、公司目標和公司政策,以及組織內無可避免的權謀較勁和鬥爭。彼得其實要好好想想這個問題,工作和家庭的平衡一直以來就是一個互相拉動,持續疲憊的要求,對於彼得的公司員工大部分都是沒當父母的年輕人,這些年輕人就不一定會同情此種狀況。

莎莉寫給彼得兩次的紙條,真正用意何在? 是莎莉本身計畫暫時性的宣告,還是在測試彼得的權威? 對彼得未能即時回應,莎莉顯然把他的回應甚至是缺乏反應視為不會阻撓開除凱薩琳,甚至以為彼得也想開除凱薩琳,只是不想自己操刀。

彼得被莎莉在管理高層搶了先機,他沒有好好把握決定性時刻。事件中所有參與者都有許多是處在危急關頭,而且大家多半會以自己的利益為優先。經理人必須捲起衣袖,投入組織的鬥爭,並實現自己的遠景。尤其需要仔細考慮這個問題:我僅僅是在隨眾而行還是為勝利而戰? 莎莉即使現在沒有,在日後也可能會覬覦彼得的職位,而管理高層似乎也欣賞莎莉的行事風格。彼得若是一昧稟持正確行事這種理想主義,絕對會前途黯淡。彼得對凱薩琳當時的用心正當,但需要巧妙的策略運用。反觀莎莉小心謹慎步步為營,找到高層的信任,實現她自己的計畫。彼得必須有所行動來扳回劣勢,首先他暗中了解公司許多員工還是對難以兼顧工作和家庭的困境看法跟他一致。他告訴替莎莉出面的那位副總,自己並不同意開除凱薩琳,強烈反對決策方式,並告知莎莉在下次打考績時,會就此次行為記上一筆。彼得至少亡羊補牢伸張了自己的主張。

高階主管的決定性時刻

 

對公司的高階主管而言:公司是誰?

  1. 我是否已經盡力而為,穩固我的地位和所屬組織的優勢及穩定?
  2. 我是否採取了富創意、大膽而有想像力的方式,思考組織的社會角色,以及公司與股東的關係?
  3. 要如何結合機敏、創意和毅力,以幫助我實現願景?

 

在大型場合明白宣示什麼才是正確的觀念? 如果需要對媒體寫一份報告,做一個決策,這些決策會迫使高階經理人自己、工作團隊及整個公司對一個無可回頭的行動做出承諾。

你可以召開會議,展開協商,聘請顧問和律師,但如果自己不消化,找出必要的步驟和剖析論戰中的有力地位,效果恐怕令人失望。

執行長以個人的視野跨入社會的寬廣舞台前,必須先確認行動不會危及公司的福祉、員工的工作,以及股東的淨收益。也就是,我是否已經盡力而為,穩固我的地位和所屬組織的優勢及穩定?

書中的例子,法國羅素藥廠執行長 艾都德 薩奇茲在決定要不要推出墮胎丸時,就面臨了社會上兩個極端的立場。RU486流產機率可達90-95%,薩奇茲相信這是一個有用的產品,反墮胎團體已經揚言要有大規模杯葛,公司股東也大多持反對立場,但身為股東的政府認為這個藥物可以減少密醫墮胎問題,因此是持贊成立場。

薩奇茲本身是醫生,曾協助醫學研究發展這種藥的化學成分,他覺得這個藥可以幫助成千上萬的婦女,尤其是貧窮國家的婦女。他甚至覺得如果不是他主持,這個藥根本沒有機會上市,所以他首先要先穩固本身的地位。另外一個層面是要保護公司員工的工作跟安全,避免反公司暴力的危險。此外有些員工熱情開發,有些則是因為倫理或恐懼抗議杯葛會傷到母公司及其他產品而持反對態度。

所以要如何才能推出產品,同時保障自己和員工的利益? 如果高調宣告RU486的道德必需性然後往前猛衝,將是危險的做法。不但可能遭到太多反對無法成功,還可能丟掉工作,把公司捲進漫長而痛苦的危險騷動過程。

這裡的難度不但在於朔造、揭露和考驗本身及所屬工作團體,也包括整個公司以及公司在社會上的角色。領袖必須自問:是否採取了富創意、大膽而有想像力的方式,思考組織的社會角色,以及公司與股東的關係? 要在哪些領域領導群倫? 哪些方面希望追隨他人?

薩奇茲心中的羅素藥廠要扮演什麼角色? 他可以退出避孕藥相關藥品市場來取悅大老闆,避開長年的爭議和杯葛(大部分的做法)。從股東利益來看,杯葛可能損失比RU486的收入還多。相反的他想要勇敢的定義藥廠的角色,他認為一些尋求非手術式墮胎的婦女和她們醫生,其實可能是核心股東成員,而公司必須要透過機靈應變的行動主義來支持這種股東結構,並找到絕大多數員工和其他股東的想法,讓藥廠角色清楚。他並觀察到大部份的人是贊成的,只是要如何進行下一步。

為了實現願景,高階經理人必須謹慎評估敵我情勢。我在公司內部和外界有哪些盟友? 哪些派別會抗拒或對抗我的努力? 我是否低估了他們的力量和戰略技巧,或高估他們倫理意識上的投入程度? 我的決定將使我和誰疏離? 哪些團體會報復,會用什麼方法? 要如何結合機敏、創意和毅力,以幫助我實現願景? 我該扮演獅子還是狐狸?

薩奇茲和管理執行委員會在法國政府批准RU486後的一個月,宣告擱置RU486的銷售,原因是在藥廠會議中,長期反對的人士再度提出異議,認為RU486可能引發代價慘痛的杯葛行動,會傷及員工士氣,而管理階層也花費太多時間在爭議上,何況這種藥可能只能在第三世界銷售,永遠不會創造高利潤。薩奇茲當下做了一個決定就是贊成擱置 RU486。

事情結束了嗎? 次日藥廠對外宣告,美國反墮胎組織施予的壓力比法國本身壓力還要大,批評者大加撻伐公司和領導人,不但棄置了一個大有可為的公眾健康工具,也立下了一個懦弱的惡例。更有人說這是一個道德的醜聞。婦女團體、家庭計畫倡導者,以及歐洲與美國醫生都嚴加責難。法國衛生部長甚至表示公司若不肯恢復銷售,政府會把這個藥的專利權轉讓給任何肯生產的公司。這次事件後藥廠宣布翻案,公司最後還是銷售RU486。

薩奇茲達成了目標,但用的是狐狸式的做法。他利用間接和巧妙的仿法,召集盟友站到自己這邊。他運用眾多參與賭局者可預期的反應,精心安排了一系列有助於完成個人目標的事件,卻看起來不像是他在主導。事實上,外表看起來他就只是向外界的壓力屈服。

他完成了三個要素,首先他先保障自己在公司的未來。如果公司任命別的執行長很可能會惹惱支持的法國衛生部。此外,薩奇茲讓法國衛生部參與決策,轉移一些公司所受到的相關爭議,保護員工和底線。最後,藥廠不但在法國,也在國際上躍居技術和社會上的領導地位。

[結論]

經理人如何成為一個具有領袖特質的人? 在不斷的自我追尋的艱難動作中,基於個人對某些情況是非對錯的理解,採取深思熟慮的行動。十九世紀哲學家尼采曾寫道,”我相信正是透過對立的存在以及所肇因的情緒,讓偉人經由在重大緊張下的折衝而得到發展。”決定性時刻把這些對立和感受一同帶進鮮活的焦點中。迫使我們心中的所有一切理想主義,以及工作中一切的混亂現實中找尋平衡。我們會快速成長正是經由這些決定性時刻所啟發的行動。