文档库 最新最全的文档下载
当前位置:文档库 › MiniGUI 体系结构

MiniGUI 体系结构

MiniGUI 体系结构
MiniGUI 体系结构

MiniGUI 体系结构之二

1 引言

在任何一个足够复杂的 GUI 系统中,处理窗口之间的互相剪切是其首要解决的问题。因为多窗口系统首先要确保一个窗口中的绘制输出不会影响到另外一个窗口。为此,GUI 系统一般要利用 Z 序来管理窗口之间的互相剪切关系。根据窗口在 Z 序中所处的位置,GUI 系统要计算每个窗口受剪切的区域,即剪切域。通常,窗口的剪切域定义为互不相交的矩形集合。GUI 系统的底层图形引擎在进行输出时,要根据当前输出的剪切域进行输出的剪切操作。从而保证窗口的绘制输出不会互相影响。因为任何一个窗口的创建、销毁、隐藏、显示均有可能影响其他窗口的剪切域,所以首先要有一个高效的剪切域维护算法。本文将详细描述MiniGUI 中的剪切域生成算法。

许多人对控件(或者部件)的概念已经相当熟悉了。控件可以理解为主窗口中的子窗口。这些子窗口的行为和主窗口一样,即能够接收键盘和鼠标等外部输入,

也可以在自己的区域内进行输出?D?D只是它们的所有活动被限制在主窗口

中。MiniGUI 也支持子窗口,并且可以在子窗口中嵌套建立子窗口。我们将MiniGUI 中的所有子窗口均称为控件。

在 Windows 或 X Window 中,系统会预先定义一些控件类,当利用某个控件类创建控件之后,所有属于这个控件类的控件均会具有相同的行为和显示。利用这些技术,可以确保一致的人机操作界面,而对程序员来讲,可以像搭积木一样地组建图形用户界面。MiniGUI 使用了控件类和控件的概念,并且可以方便地对已有控件进行重载,使得其有一些特殊效果。比如,需要建立一个只允许输入数字的编辑框时,就可以通过重载已有编辑框而实现,而不需要重新编写一个新的控件类。

在多语种环境中,输入法是一个必不可少的模块。输入法提供了将标准键盘输入翻译为适当语种的文字的能力。MiniGUI 中也包含有标准的中文简体输入法,包括全拼、五笔和智能拼音等等。本文最后将介绍 MiniGUI 中的输入法模块实现。

回页首

2 窗口 Z 序

Z 序实际定义了窗口之间的层叠顺序。说起“Z 序”这个名称,实际是相对屏幕坐标而言的。一般而言,屏幕上的所有窗口均有一个坐标系,即原点在左上角,X 轴水平向右,Y 轴垂直向下的坐标系。Z 序就是相对于一个假想的 Z 轴而言的,这个 Z 轴从屏幕外指向屏幕内。窗口在这个 Z 轴上的值,就确定了其 Z 序。Z 序值大的窗口,覆盖了 Z 序值小的窗口。

当然,在程序当中,Z 序一般表示为一个链表。越接近于链表头的节点,其 Z 序值就越大。在 MiniGUI 中,我们维护了两个 Z 序。其中一个 Z 序永远位于另一个 Z 序之上。这样,就可以创建始终位于其他窗口之上的窗口,比如输入法窗口。如果在建立窗口时,指定了 WS_EX_TOPMOST 扩展属性,就可以创建这样的主窗口。因为 Z 序的操作实际就是链表的操作,这里就不再赘述。

回页首

3 窗口剪切算法

有了窗口 Z 序,我们就可以计算每个窗口的剪切域。我们把因为窗口 Z 序而产生的剪切域称为“全局剪切域”,这是相对于窗口自身定义的剪切域而言的,我们把后者称为“局部剪切域”。窗口中的所有输出,首先要受到全局剪切域的影响,其次受到局部剪切域的影响。我们在这里重点讲解窗口的全局剪切域的生成和维护。

3.1 全局剪切域的生成和维护

在 MiniGUI 中,剪切域表示为若干互不相交的矩形之并集,这些矩形称为剪切矩形。最初,屏幕上没有任何窗口时,桌面的剪切域由一个矩形组成,即屏幕矩形;当屏幕上只有一个窗口时,该窗口的剪切域由一个矩形组成,该矩形即为窗口在屏幕上的矩形,而桌面的剪切域却可能是由多个矩形组成的。图 1 说明了只有一个窗口时的桌面的剪切域组成。从图中可以看出,此时桌面的剪切域由四个矩形组成,分别是 A、B、C 和 D。如果窗口在桌面的位置变化为图 2 所示,则桌面的剪切域将由两个矩形组成(A和B)。

图 1 由四个矩形组成的桌面剪切域

图 2 由两个矩形组成的桌面剪切域

读者很容易看出,在只有一个窗口的情况下,形成桌面剪切域的矩形最多只能有四个。

此时,如果有一个新的窗口出现,则新的窗口将同时剪切旧的窗口和桌面(图 3。窗口的剪切矩形用空心矩形表示,而桌面的剪切矩形用实心矩形表示)。而这时,桌面和旧窗口的剪切域将多出一些矩形,这些矩形应该是原有剪切域中的每个矩形受到新窗口矩形影响之后生成的剪切矩形。同样,原有剪切域中的每个矩形只能最多只能派生出4个新剪切域,而某些矩形根本不会受到新窗口矩形的影响。

图 3 有新窗口被创建时,桌面和旧窗口的剪切域

这样,我们可以将某个窗口全局剪切域归纳为原有剪切域中排除(Exclude)某个矩形而生成的:

1.窗口的全局剪切域初始化为窗口矩形。

2.当窗口之上有其他窗口覆盖时,则该窗口的全局剪切域为排除新窗口矩形

之后的剪切域。

3.沿 Z 序迭代第 2 步,直到最顶层窗口。

清单 1 中的代码是在显示一个新窗口时,MiniGUI 处理被该窗口所覆盖的其他所有窗口的代码。这段代码调用了剪切域维护接口中的 SubtractClipRect 函数计算新的剪切域。

清单 1 显示新窗口时计算被新窗口覆盖的窗口的全局剪切域

// clip all windows under this window.

static void clip_windows_under_this (ZORDERINFO* zorder, PMAINWIN pWin, RECT* rcWin)

{

PZORDERNODE pNode;

PGCRINFO pGCRInfo;

pNode = zorder->pTopMost;

while (pNode->hWnd != (HWND)pWin)

pNode = pNode->pNext;

pNode = pNode->pNext;

while (pNode)

{

if (((PMAINWIN)(pNode->hWnd))->dwStyle & WS_VISIBLE) {

pGCRInfo = ((PMAINWIN)(pNode->hWnd))->pGCRInfo;

pthread_mutex_lock (&pGCRInfo->lock);

SubtractClipRect (&pGCRInfo->crgn, rcWin);

pGCRInfo->age ++;

pthread_mutex_unlock (&pGCRInfo->lock);

}

pNode = pNode->pNext;

}

}

与排除矩形相反的操作是包含(Include)某个矩形到剪切域中。这个操作用于隐藏或者销毁某个窗口时。当一个窗口被隐藏或销毁时,该窗口之下的所有窗口将受到影响,此时,要将被隐藏或销毁窗口的矩形包含到这些受影响窗口的全局剪切域中。为此,MiniGUI 的剪切域维护接口中有一个函数专用于该类操作(IncludeClipRect)。为确保剪切域中矩形互不相交,该函数首先计算与每个剪切矩形的相交矩形,然后将自己添加到该剪切域中。

但是,在某些情况下,我们必须重新计算所有窗口的全局剪切域,比如在移动某个窗口时。

3.2 剪切矩形的私有堆

显然,在剪切域非常复杂,或者窗口非常多时,需要大量的矩形来表示每个窗口的全局剪切域。而在 C 程序中,如果频繁使用 malloc 和 free 申请和释放每个剪切矩形,将带来许多问题。第一,malloc 和 free 是非常耗时的操作;第二,频繁的 malloc 和 free 将导致 C 程序堆的碎片化,从而可能导致将来的内存分配失败。为了避免频繁使用 malloc 和 free,MiniGUI 在初始化时,建立了一个私有的堆。我们可以直接从这个堆中分配剪切矩形,而不需要从进程的全局堆中分配剪切矩形。这个私有堆实际是由一些空闲待用的剪切矩形组成的。每次分配时返回该链表的头节点,而在释放时放进该链表的尾节点。如果该链表为空,则利用 malloc 从进程的全局堆中分配剪切矩形。清单 2 说明了这个私有堆的初始化和操作。

清单 2 从剪切矩形私有堆中分配和释放剪切矩形

PCLIPRECT GUIAPI ClipRectAlloc(PFREECLIPRECTLIST pList)

{

PCLIPRECT pRect;

#ifndef _LITE_VERSION

pthread_mutex_lock (&pList->lock);

#endif

if (pList->head) {

pRect = pList->head;

pList->head = pRect->next;

}

else {

if (pList->free < pList->size) {

pRect = pList->heap + pList->free;

pRect->fromheap = TRUE;

pList->free ++;

}

else {

pRect = malloc (sizeof(CLIPRECT));

if (pRect == NULL)

fprintf (stderr, "GDI error: alloc clip rect

failure!\n");

else

pRect->fromheap = FALSE;

}

}

#ifndef _LITE_VERSION

pthread_mutex_unlock (&pList->lock);

#endif

return pRect;

}

void GUIAPI FreeClipRect(PFREECLIPRECTLIST pList, CLIPRECT* pRect) {

#ifndef _LITE_VERSION

pthread_mutex_lock (&pList->lock);

#endif

pRect->next = NULL;

if (pList->head) {

pList->tail->next = (PCLIPRECT)pRect;

pList->tail = (PCLIPRECT)pRect;

}

else {

pList->head = pList->tail = (PCLIPRECT)pRect;

}

#ifndef _LITE_VERSION

pthread_mutex_unlock (&pList->lock);

#endif

}

回页首

4 主窗口和控件、控件类

4.1 控件类和控件

如果读者曾经编写过 Windows 应用程序的话,就应该了解窗口类的概念。在Windows 中,程序所建立的每个窗口,都对应着某种窗口类。这一概念和面向对象编程中的类、对象的关系类似。借用面向对象的术语,Windows 中的每个窗口实际都是某个窗口类的一个实例。在 X Window 编程中,也有类似的概念,比如我们建立的每一个 Widget,实际都是某个 Widget 类的实例。

这样,如果程序需要建立一个窗口,就首先要确保选择正确的窗口类,因为每个窗口类决定了对应窗口实例的表象和行为。这里的表象指窗口的外观,比如窗口边框宽度,是否有标题栏等等,行为指窗口对用户输入的响应。每一个 GUI 系统都会预定义一些窗口类,常见的有按钮、列表框、滚动条、编辑框等等。如果程序要建立的窗口很特殊,就需要首先注册一个窗口类,然后建立这个窗口类一个实例。这样就大大提高了代码的可重用性。

在 MiniGUI 中,我们认为主窗口通常是一种比较特殊的窗口。因为主窗口代码的可重用性一般很低,如果按照通常的方式为每个主窗口注册一个窗口类的话,则会导致额外不必要的存储空间,所以我们并没有在主窗口提供窗口类支持。但

主窗口中的所有子窗口,即控件,均支持窗口类(控件类)的概念。MiniGUI 提供了常用的预定义控件类,包括按钮(包括单选钮、复选钮)、静态框、列表框、进度条、滑块、编辑框等等。程序也可以定制自己的控件类,注册后再创建对应的实例。清单 3 中的代码就创建了一个编辑框,一个按钮。

采用控件类和控件实例的结构,不仅可以提高代码的可重用性,而且还可以方便地对已有控件类进行扩展。比如,在需要建立一个只允许输入数字的编辑框时,就可以通过重载已有编辑框控件类而实现,而不需要重新编写一个新的控件类。在 MiniGUI 中,这种技术称为子类化或者窗口派生。子类化的方法有三种:

?一种是对已经建立的控件实例进行子类化,子类化的结果是只影响这一个控件实例;

?一种是对某个控件类进行子类化,将影响其后创建的所有该控件类的控件实例;

?最后一种是在某个控件类的基础上新注册一个子类化的控件类,不会影响原有控件类。在 Windows 中,这种技术又称为超类化。

在 MiniGUI 中,控件的子类化实际是通过替换已有的窗口过程实现的。清单 4 中的代码就通过控件类创建了两个子类化的编辑框,一个只能输入数字,而另一个只能输入字母:

清单 4 控件的子类化

#define IDC_CTRL1 100

#define IDC_CTRL2 110

#define IDC_CTRL3 120

#define IDC_CTRL4 130

#define MY_ES_DIGIT_ONLY 0x0001

#define MY_ES_ALPHA_ONLY 0x0002

static WNDPROC old_edit_proc;

static int RestrictedEditBox (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)

{

if (message == MSG_CHAR) {

DWORD my_style = GetWindowAdditionalData (hwnd);

/* 确定被屏蔽的按键类型 */

if ((my_style & MY_ES_DIGIT_ONLY) && (wParam < '0' || wParam > '9'))

return 0;

else if (my_style & MY_ES_ALPHA_ONLY)

if (!((wParam >= 'A' && wParam <= 'Z') ||

(wParam >= 'a' && wParam <= 'z')))

/* 收到被屏蔽的按键消息,直接返回 */

return 0;

}

/* 由老的窗口过程处理其余消息 */

return (*old_edit_proc) (hwnd, message, wParam, lParam);

}

static int ControlTestWinProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)

{

switch (message) {

case MSG_CREATE:

{

HWND hWnd1, hWnd2, hWnd3;

CreateWindow (CTRL_STATIC, "Digit-only box:", WS_CHILD |

WS_VISIBLE | SS_RIGHT, 0,

10, 10, 180, 24, hWnd, 0);

hWnd1 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_VISIBLE | WS_BORDER, IDC_CTRL1,

200, 10, 180, 24, hWnd, MY_ES_DIGIT_ONLY);

CreateWindow (CTRL_STATIC, "Alpha-only box:", WS_CHILD |

WS_VISIBLE | SS_RIGHT, 0,

10, 40, 180, 24, hWnd, 0);

hWnd2 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_BORDER |

WS_VISIBLE, IDC_CTRL2,

200, 40, 180, 24, hWnd, MY_ES_ALPHA_ONLY);

CreateWindow (CTRL_STATIC, "Normal edit box:", WS_CHILD |

WS_VISIBLE | SS_RIGHT, 0,

10, 70, 180, 24, hWnd, 0);

hWnd3 = CreateWindow (CTRL_EDIT, "", WS_CHILD | WS_BORDER |

WS_VISIBLE, IDC_CTRL2,

200, 70, 180, 24, hWnd, MY_ES_ALPHA_ONLY);

CreateWindow ("button", "Close", WS_CHILD | BS_PUSHBUTTON |

WS_VISIBLE, IDC_CTRL4,

100, 100, 60, 24, hWnd, 0);

/* 用自定义的窗口过程替换编辑框的窗口过程,并保存老的窗口过程。*/

old_edit_proc = SetWindowCallbackProc (hWnd1, RestrictedEditBox);

SetWindowCallbackProc (hWnd2, RestrictedEditBox);

break;

}

...

}

return DefaultMainWinProc (hWnd, message, wParam, lParam);

}

在清单 4 中,程序首先定义了一个窗口处理过程,即 RestrictedEditBox 函数。然后,在利用 CreateWindow 函数建立控件时,将其中两个编辑框的窗口处理过程通过 SetWindowCallbackProc 替换成了自己定义的 RestrictedEditBox 函数,并且将该函数返回的值(即老的控件窗口处理过程地址)保存在了

old_edit_box 变量中。在建立这些编辑框之后,它们的消息将首先由RestrictedEditBox 函数处理,然后在某些情况下才由老的窗口处理过程处理。

限于篇幅,另外两种控件子类化的方法就不在这里讲述。

4.2 MiniGUI 中控件类的实现

MiniGUI 函数库实际维护了一个当前所有控件类的数据结构,其中包含了控件类名称以及对应的控件类信息。该数据结构实际是一个哈希表,哈希表的每个入口包含由一个指针,该指针指向所有名程以某个字母开头(不分大小写)的控件类信息链表。控件类信息结构定义如下:

#define MAXLEN_CLASSNAME 15

typedef struct _CTRLCLASSINFO

{

char name [MAXLEN_CLASSNAME + 1];

// 控件类名程

/*

* common properties of this class

*/

DWORD dwStyle; // 控件类风格

HCURSOR hCursor; // 控件光标

int iBkColor; // 控件的背景颜色

int (*ControlProc)(HWND, int, WPARAM, LPARAM);

// 控件处理过程

DWORD dwAddData; // 附加数据

int nUseCount; // 使用计数,即系统中属于该控件类的控件个数

struct _CTRLCLASSINFO* next;

// 下一个控件类信息结构

} CTRLCLASSINFO;

typedef CTRLCLASSINFO* PCTRLCLASSINFO;

在控件类的数据结构中包含了鼠标、光标、控件类的回调函数地址等等信息。在创建属于该控件类的控件时,这些信息会复制到控件数据结构中。这样,新的控件实例就继承了这种控件类的表象和行为。

该哈希表的哈希函数实际非常简单,它的返回值就是控件类名称首字母的英文字母表顺序值:

static int HashFunc (char* szClassname)

{

/* 判断首字符是否为字母 */

if (!isalpha (szClassName[0])) return ERR_CTRLCLASS_INVNAME;

/* 讲所有字符转换为大写 */

while (szClassName[i]) {

szClassName[i] = toupper(szClassName[i]);

i++;

if (i > MAXLEN_CLASSNAME)

return ERR_CTRLCLASS_INVLEN;

}

/* 获得哈希值 */

return szClassName[0] - 'A';

}

控件类的注册和注销函数非常简单,这里不再赘述。

4.3 MiniGUI 中控件的实现

控件结构相对复杂一些。其中包含了控件在父窗口中的位置信息、控件风格、扩展风格、控件鼠标、图标、控件回调函数地址等等:

typedef struct _CONTROL

{

/*

* 这些成员和 MAINWIN 结构一致.

*/

short DataType; // 内部使用的数据类型

short WinType; // 内部使用的窗口类型

int left, top; // 控件在父窗口中的位置

int right, bottom;

int cl, ct; // 控件客户区在父窗口中的位置

int cr, cb;

DWORD dwStyle; // 控件风格

DWORD dwExStyle; // 控件扩展风格

int iBkColor; // 背景颜色

HMENU hMenu; // 菜单句柄

HACCEL hAccel; // 加速键表句柄

HCURSOR hCursor; // 鼠标光标句柄

HICON hIcon; // 图标句柄

HMENU hSysMenu; // 系统菜单句柄

HDC privCDC; // 私有 DC 句柄

INVRGN InvRgn; // 控件的无效区域

PGCRINFO pGCRInfo; // 控件的全局剪切区域

PZORDERNODE pZOrderNode;

// Z 序节点

// 仅对具有 WS_EX_CTRLASMAINWIN 扩展风格的控件有效

PCARETINFO pCaretInfo; // 插入符消息

DWORD dwAddData; // 控件附加数据

DWORD dwAddData2; // 控件附加数据

int (*ControlProc) (HWND, int, WPARAM, LPARAM); // 控件消息处理过程

char* spCaption; // 控件标题

int id; // 控件标识符,整数

SCROLLBARINFO vscroll; // 垂直滚动条信息

SCROLLBARINFO hscroll; // 水平滚动条信息

PMAINWIN pMainWin; // 包含该控件的主窗口

struct _CONTROL* pParent;// 控件的父窗口

/*

* Child windows.

*/

struct _CONTROL* children;

// 控件的第一个子控件

struct _CONTROL* active;

// 当前活动子控件

struct _CONTROL* old_under_pointer;

// 老的鼠标鼠标所在子控件

/*

* 下面这些成员只对控件有效

*/

struct _CONTROL* next; // 下一个兄弟控件

struct _CONTROL* prev; // 前一个兄弟控件

PCTRLCLASSINFO pcci; // 指向控件所属控件类结构的指针

} CONTROL;

typedef CONTROL* PCONTROL;

很显然,只要将控件的回调函数地址进行替换,就可以非常方便地对控件进行子类化操作。值得一提的是,主窗口的结构定义和控件数据结构定义基本上是相同的,只是在某些成员上有一些小小的差别。

回页首

5 输入法模块的设计

输入法提供了将标准键盘输入翻译为适当语种的文字的能力。MiniGUI 中也包含有标准的中文简体输入法,包括全拼、五笔和智能拼音等等。MiniGUI 的输入法是一个相对独立的模块(称为 IME),它实际是一个特殊的主窗口。该主窗口将在启动之后,首先将自己注册为输入法窗口。这样,MiniGUI 的 desktop 就知道首先要将按键信息发送到这个主窗口之中,而不是当前的活动主窗口。当活动主窗口发生变化时,desktop 会通知输入法窗口当前的活动窗口。这样,当输入法窗口接收到按键消息并且翻译为适当的字符之后,就可以将其发送到当前的活动窗口。

为了实现 desktop 和 IME 窗口之间的交互,MiniGUI 为输入法窗口定义了如下消息,当活动窗口发生变化时,MiniGUI 会向 IME 窗口发送这些消息:

?MSG_IME_SETTARGET:发送该消息设置输入法的目标活动窗口;

?MSG_IME_OPEN:发送该消息告诉输入法窗口,当前活动窗口是具有WS_EX_IMECOMPOSE 扩展风格的窗口,所以应该显示输入法窗口。

?MSG_IME_CLOSE:发送该消息告诉输入法窗口,当前活动窗口不具有WS_EX_IMECOMPOSE 扩展风格,所以应该隐藏输入法窗口。

如果一个窗口要成为输入法窗口,则必须完成如下工作:

1.注册成为当前输入法;

2.处理 MSG_IME_SETTARGE 消息,并记录当前活动目标窗口;

3.翻译按键并将翻译后的结构通过 MSG_CHAR 消息发送到当前活动的目标

窗口;

4.处理 MSG_IME_OPEN 和 MSG_IME_CLOSE 消息,在切换到需要输入法的活

动窗口时自动显示输入法窗口。

回页首

6 小结

本文重点讲述了 MiniGUI 中的窗口剪切处理算法。这是任何一个多窗口系统首先要解决的问题。然后,本文介绍了 MiniGUI 中控件类和控件的实现。最后介绍了 MiniGUI 中输入法窗口的设计思路。

回页首

附:MiniGUI 的最新进展

2001 年元月 03 日,MiniGUI 的 0.9.98 版本发布。该版本包括一个我们专门针对 PDA 等嵌入式系统设计的 MiniGUI 版本,该版本称为 MiniGUI-Lite。下面是对 MiniGUI-Lite 简单介绍,将来我们还要撰文详细介绍 MiniGUI-Lite。

大家都知道,MiniGUI 采用了基于线程的体系结构,并且建立了基于线程的消息传递和窗口管理功能。但是,在许多系统中,这种基于线程的结构并不是很好。这是因为一些众所周知的原因造成的--Linux 线程,尽管可以提供最大程度上的数据共享,但却造成了系统体系结构的脆弱。如果某个线程因为非法的数据访问而终止运行,则整个进程都将受到影响。与线程结构相反的是采用传统的 UNIX IPC 机制建立窗口系统,即类似 X Window 的客户/服务器体系。这种体系结构有它的先天不足,主要是通常的 IPC 机制无法提供高效的数据复制,大量的 CPU 资源用于在各进程之间复制数据。在 PDA 等设备中,这种 CPU 资源的浪费将最终导致系统性能的降低以及设备耗电量的增加。

为了解决 MiniGUI 版本因为线程而引入的一些问题,同时也为了让 MiniGUI更加适合于嵌入式系统,我们决定开发一个 MiniGUI Lite 版本。这个版本的开发目的是:

1. 保持与原先 MiniGUI 版本在源代码级 98% 以上的兼容。

2. 不再使用LinuxThreads。

3. 可以同时运行多个基于 MiniGUI Lite 的应用程序,即多个进程,并且提供前后台进程的切换。

显然,要同时满足上述三个目的,如果采用传统的 C/S 结构对现有 MiniGUI 进行改造,应该不难实现。但前面提到的传统 C/S 结构的缺陷却无法避免。经过对 PDA 等嵌入式系统的分析,我们发现,某些 PDA 产品具有运行多个任务的能力,但同一时刻在屏幕上进行绘制的程序,一般不会超过两个。因此,只要确保将这两个进程的绘制相互隔离,就不需要采用复杂的 C/S 结构处理多个进程窗口之间的互相剪切。也就是说,在这种产品中,如果采用基于传统 C/S 结构的多窗口系统,实际是一种浪费。

有了上述认识,我们对 MiniGUI-Lite 版本进行了如下简化设计:

1. 每个进程维护自己的主窗口 Z 序,同一进程创建的主窗口之间互相剪切。也就是说,除这个进程只有一个线程,只有一个消息循环之外,它与原有的 MiniGUI 版本之间没有任何区别。每个进程在进行屏幕绘制时,不需要考虑其他进程。

2. 建立一个简单的客户/服务器体系,但确保最小化进程间的数据复制功能。因此,在服务器和客户之间传递的数据仅限于输入设备的输入数据,以及客户和服务器之间的某些请求和响应数据。

3. 有一个服务器进程(mginit),它负责初始化一些输入设备,并且通过 UNIX Domain 套接字将输入设备的消息发送到前台的MiniGUI Lite 客户进程。

4. 服务器和客户被分别限定在屏幕的某两个不相交矩形内进行绘制,同一时刻,只能有一个客户及服务器进行屏幕绘制。其他客户可继续运行,但屏幕输入被屏蔽。服务器可以利用 API 接口将某个客户切换到前台。同时,服务器和客户之间采用信号和 System V 信号量进行同步。

5. 服务器还采用 System V IPC 机制提供一些资源的共享,包括位图、图标、鼠标、字体等等,以便减少实际内存的消耗。

现在你可以使用 MiniGUI-Lite 一次运行不止一个 MiniGUI 应用程序。我们可以从一个称为“mginit”的程序中启动其他 MiniGUI 程序。如果因为某种原因客户终止,服务器可以继续运行。在我们的发布版本中,有一个称为

mglite-exec 的软件包, 这个软件包里有一个 mginit 程序, 该程序建立了一个虚拟控制台窗口。我们可以从这个虚拟控制台的命令行启动该软件包中其他的程序,甚至可以通过 gdb 调试这些程序。

我们可以在 MiniGUI-Lite 程序中创建多个窗口,但不能启动新的线程建立窗口。这是 MiniGUI-Lite 区别于 MiniGUI 原有版本的最大不同。除此之外,其他几乎所有的 API 都和 MiniGUI 原有版本是兼容的。因此。从 MiniGUI 原有版本向 MiniGUI-Lite 版本的移植是非常简单的。不信,请看 mglite-exec 包中的程序,其中所有的程序均来自 miniguiexec 包,而每个源文件的改动不超过 5 行。

MiniGui体系结构之一体系结构概览

2009-07-29 11:43

1 引言

到目前为止,MiniGUI 的最新发布版本是 0.9.96。我们将 0.9.xx 系列版本定位为 MiniGUI 1.0 版本的预览版。在 0.9.xx 版本足够稳定时,我们将发布MiniGUI 1.0 版本,同时,目前的代码不会再进行重大调整。在 MiniGUI 1.0 版本发布之后,我们将立即着手开发 MiniGUI 2.0 版本。该版本预期将在体系结构上进行重大调整。为了吸引更多的自由软件程序员加入 MiniGUI 2.0 的开发,也为了更好地帮助 MiniGUI 程序员进行程序开发,我们将撰写一系列的文章介绍 MiniGUI 1.0 版本的体系结构,重点分析其中的一些缺点以及需要在 2.0 版本当中进行优化和改造的地方。介绍体系结构的文章计划如下:

?体系结构概览(本文)。将在整体上对 MiniGUI 1.0 的体系结构进行介绍。重点包括:线程的基本概念;多线程的微客户/服务器体系、多线程通讯的关键数据结构――消息队列;面向对象技术在 MiniGUI 中的应用等等。

?MiniGUI 的多窗口管理。将介绍 MiniGUI 的多窗口机制以及相关的窗口类技术。其中涉及到窗口剪切处理和 Z 序,消息传递,控件类设计和输入法模块设计等等。

?MiniGUI 的图形设备管理。重点介绍 MiniGUI 是如何处理窗口绘制的。其中主要包括图形上下文的概念,坐标映射,图形上下文的局部、全局和有效剪切域的概念等等。

?图形抽象层和输入抽象层。图形抽象层(GAL)和输入抽象层(IAL)大大提高了 MiniGUI 的可移植性,并将底层图形设备和上层接口分离开来。这里将重点

介绍 MiniGUI 的 GAL 和 IAL 接口,并以 EP7211 等嵌入式系统为例,说明如何将 MiniGUI 移植到新的嵌入式平台上。

?多字体和多字符集支持。MiniGUI 采用逻辑字体实现多字体和多字符集处理。这一技术成功应用了面向对象技术,通过单一的逻辑接口,可以实现对各种字符集以及各种字体的支持。

2 POSIX 线程

MiniGUI 是一个基于线程的窗口系统。为了理解 MiniGUI 的体系结构,我们有必要首先对线程作一番了解。

2.1 什么是线程

线程通常被定义为一个进程中代码的不同执行路线。也就是说,一个进程中,可以有多个不同的代码路线在同时执行。例如,常见的字处理程序中,主线程处理用户输入,而其他并行运行的线程在必要时可在后台保存用户的文档。我们也可以说线程是“轻量级进程”。在 Linux 中,每个进程由五个基本的部分组成:代码、数据、栈、文件I/O 和信号表。因此,系统对进程的处理要花费更多的开支,尤其在进行进程调度和任务切换时。从这个意义上,我们可以将一般的进程理解为重量级进程。在重量级进程之间,如果需要共享信息,一般只能采用管道或者共享内存的方式实现。如果重量级进程通过 fork() 派生了子进程,则父子进程之间只有代码是共享的。

而我们这里提到的线程,则通过共享一些基本部分而减轻了部分系统开支。通过共享这些基本组成部分,可以大大提高任务切换效率,同时数据的共享也不再困难――因为几乎所有的东西都可以共享。

从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。

用户线程指不需要内核支持而在用户程序中实现的线程,这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,但却占用了更多的系统开支。

Linux 支持内核级的多线程,同时,也可以从 Internet 上下载一些 Linux 上的用户级的线程库。Linux 的内核线程和其他操作系统的内核实现不同,前者更好一些。大多数操作系统单独定义线程,从而增加了内核和调度程序的复杂性;而 Linux 则将线程定义为“执行上下文”,它实际只是进程的另外一个执行上下文而已。这样,Linux 内核只需区分进程,只需要一个进程/线程数组,而调度程序仍然是进程的调度程序。Linux 的 clone 系统调用可用来建立新的线程。

2.2 POSIX 线程

POSIX 标准定义了线程操作的 C 语言接口。我们可以将 POSIX 线程的接口划分如下:

?线程的建立和销毁。用来创建线程,取消线程,制造线程取消点等等。?互斥量操作接口。提供基本的共享对象互斥访问机制。?信号量操作接口。提供基本的基于信号量的同步机制。不能与 System V IPC 机制的信号量相混淆。?条件量操作接口。提供基本的基于条件量的同步机制。尽管信号量和条件量均可以划分为同步机制,但条件量比信号量更为灵活一些,比如可以进行广播,设置等待超时等等。但条件量的操作比较复杂。?信号操作接口。处理线程间的信号发送和线程信号掩码。?其他。包括线程局部存储、一次性函数等等。

目前,Linux 上兼容 POSIX 的线程库称为 LinuxThreads,它已经作为 glibc 的一部分而发布。这些函数的名称均以 pthread_ 开头(信号量操作函数以 sem_ 开头)。

为了对线程有一些感性认识,我们在这里举两个例子。

第一个例子在进入 main () 函数之后,调用 pthread_create 函数建立了另一个线程。pthread_create 的参数主要有两个,一个是新线程的入口函数(thread_entry),另一个是传递给入口函数的参数(data),而新线程的标识符通过引用参数返回(new_thread)。见清单 1。

清单 1 新线程的创建

void* thread_entry (void* data)

{

... // do something.

return NULL;

}

int main (void)

{

pthread_t new_thread;

int data = 2;

pthread_create (&new_thread, NULL, thread_entry, &data);

pthread_join (new_thread, NULL);

}

main () 函数在建立了新线程之后,调用 pthread_join 函数等待新线程执行结束。pthread_join 类似进程级的 wait 系统调用。当所等待的线程执行结束之后,该函数返回。利用 pthread_join 可用来实现一些简单的线程同步。注意在上面的例子中,我们忽略了函数调用返回值的错误检查。

第二个例子是利用信号量进行同步的两个线程。这里所使用的例子利用信号量解决了经典的“生产者/消费者”问题(清单 2)。我们首先解释信号量的基本概念。

信号量的概念由 E. W. Dijkstra 于 1965 年首次提出。信号量实际是一个整数,进程(也可以是线程)在信号量上的操作分两种,一种称为 DOWN,而另外一种称为 UP。DOWN 操作的结果是让信号量的值减 1,UP 操作的结果是让信号量的值加 1。在进行实际的操作之前,进程首先检查信号量的当前值,如果当前值大于 0,则可以执行 DOWN 操作,否则进程休眠,等待其他进程在该信号量上的 UP 操作,因为其他进程的 UP 操作将让信号量的值增加,从而它的 DOWN 操作可以成功完成。某信号量在经过某个进程的成功操作之后,其他休眠在该信号量上的进程就有可能成功完成自己的操作,这时,系统负责检查休眠进程是否可以完成自己的操作。

为了理解信号量,我们想象某机票定购系统。最初旅客在定票时,一般有足够的票数可以满足定票量。当剩余的机票数为 1,而某个旅客现在需要定两张票时,就无法满足该顾客的需求,这时售票小姐让这个旅客留下他的电话号码,如果其他人退票,就可以优先让这个旅客定票。如果最终有人退票,则售票小姐打电话通知上述要定两张票的旅客,这时,该旅客就能够定到自己的票。

我们可以将旅客看成是进程,而定票可看成是信号量上的 DOWN 操作,退票可看成是信号量上的 UP 操作,而信号量的初始值为机票总数,售票小姐则相当于操作系统的信号量管理器,由她(操作系统)决定旅客(进程)能不能完成操作,并且在新的条件成熟时,负责通知(唤醒)登记的(休眠的)旅客(进程)。

在操作系统中,信号量的最简单形式是一个整数,多个进程可检查并设置信号量的值。这种检查并设置操作是不可被中断的,也称为“原子”操作。检查并设置操作的结果是信号量的当前值和设置值相加的结果,该设置值可以是正值,也可以是负值。根据检查和设置操作的结果,进行操作的进程可能会进入休眠状态,而当其他进程完成自己的检查并设置操作后,由系统检查前一个休眠进程是否可以在新信号量值的条件下完成相应的检查和设置操作。这样,通过信号量,就可以协调多个进程的操作。

信号量可用来实现所谓的“关键段”。关键段指同一时刻只能有一个进程执行其中代码的代码段。也可用信号量解决经典的“生产者/消费者”问题,“生产者/消费者”问题和上述的定票问题类似。这一问题可以描述如下:

两个进程共享一个公共的、固定大小的缓冲区。其中的一个进程,即生产者,向缓冲区放入信息,另外一个进程,即消费者,从缓冲区中取走信息(该问题也可以一般化为 m 个生产者和 n 个消费者)。当生产者向缓冲区放入信息时,如果缓冲区是满的,则生产者进入休眠,而当消费者从缓冲区中拿走信息后,可唤醒生产者;当消费者从缓冲区中取信息时,如果缓冲区为空,则消费者进入休眠,而当生产者向缓冲区写入信息后,可唤醒消费者。

清单 2 中的例子实际是“生产者/消费者”问题的线程版本。

清单 2 利用信号量解决“生产者/消费者”问题

/* The classic producer-consumer example, implemented with semaphores. All integers between 0 and 9999 should be printed exactly twice, once to the right of the arrow and once to the left. */

#include

#include

#include

#define BUFFER_SIZE 16

/* Circular buffer of integers. */

struct prodcons {

int buffer[BUFFER_SIZE]; /* 实际数据 */

int readpos, writepos; /* 读取和写入的位置 */

sem_t sem_read; /* 可读取的元素个数 */

sem_t sem_write; /* 可写入的空位个数 */

};

/* 初始化缓冲区 */

void init(struct prodcons * b)

{

sem_init(&b->sem_write, 0, BUFFER_SIZE - 1);

sem_init(&b->sem_read, 0, 0);

b->readpos = 0;

b->writepos = 0;

}

/* 在缓冲区中保存一个整数 */

void put(struct prodcons * b, int data)

{

/* Wait until buffer is not full */

sem_wait(&b->sem_write);

/* Write the data and advance write pointer */

b->buffer[b->writepos] = data;

b->writepos++;

if (b->writepos >= BUFFER_SIZE) b->writepos = 0;

/* Signal that the buffer contains one more element for reading */ sem_post(&b->sem_read);

}

/* 从缓冲区读取并删除数据 */

int get(struct prodcons * b)

{

int data;

/* Wait until buffer is not empty */

sem_wait(&b->sem_read);

/* Read the data and advance read pointer */

data = b->buffer[b->readpos];

b->readpos++;

if (b->readpos >= BUFFER_SIZE) b->readpos = 0;

/* Signal that the buffer has now one more location for writing */ sem_post(&b->sem_write);

return data;

}

/* 测试程序: 一个线程插入 1 到 10000 的整数,另一个线程读取并打印。*/ #define OVER (-1)

struct prodcons buffer;

void * producer(void * data)

{

int n;

for (n = 0; n < 10000; n++) {

printf("%d --->\n", n);

put(&buffer, n);

}

put(&buffer, OVER);

return NULL;

}

void * consumer(void * data)

{

int d;

while (1) {

d = get(&buffer);

if (d == OVER) break;

printf("---> %d\n", d);

}

return NULL;

}

int main(void)

pthread_t th_a, th_b;

void * retval;

init(&buffer);

/* 建立生产者和消费者线程。*/

pthread_create(&th_a, NULL, producer, 0);

pthread_create(&th_b, NULL, consumer, 0);

/* 等待生产者和消费者结束。 */

pthread_join(th_a, &retval);

pthread_join(th_b, &retval);

return 0;

}

在清单 2 中,程序首先建立了两个线程分别扮演生产者和消费者的角色。生产者负责将 1 到 1000 的整数写入缓冲区,而消费者负责从同一个缓冲区中读取并删除由生产者写入的整数。因为生产者和消费者是两个同时运行的线程,并且要使用同一个缓冲区进行数据交换,因此必须利用一种机制进行同步。清单 2 中的程序就利用信号量实现了同步。

起初程序初始化了两个信号量(init()函数),分别表示可读取的元素数目(sem_read)和可写入的空位个数(sem_write),并分别初始化为 0 和缓冲区大小减1。在生产者调用 put() 函数写入时,它首先对 sem_write 进行DOWN 操作(即 sem_wait 调用),看是否能够写入,如果此时 sem_write 信号量的值大于零,则 sem_wait 可以立即返回,否则生产者将在该 sem_write 信号量上等待。生产者在将数据写入之后,在 sem_read 信号量上进行 UP 操作(即sem_post调用)。此时如果有消费者等待在 sem_read 信号量上,则可以被系统唤醒而继续运行。消费者线程的操作恰恰相反,该线程调用 get() 函数时,首先在 sem_read 上进行 DOWN 操作,当读取数据并删除之后,在 sem_write 信号量上进行 UP 操作。

通过上面的两个例子,读者可以对线程之间的互操作有一个大概了解。如果读者对 System V IPC 机制比较熟悉的话,也可以作一番比较。可以看到,多线程的最大好处是,除堆栈之外,几乎所有的数据均是共享的,因此线程间的通讯效率最高;但最大坏处是,因为共享所有数据,从而非常容易导致线程之间互相破坏数据。

2.3 MiniGUI 和多线程

MiniGUI 1.0 版本采用了多线程机制,也就是说,MiniGUI 以及运行在 MiniGUI 之上的所有应用程序均运行在同一个地址空间之内。比起其他基于进程的 GUI 系统来说,虽然缺少了地址保护,但运行效率却是最高的。

973标书_基于生物信息的药靶高通量筛选及功能研究

项目摘要 项目名称:基于生物信息的药靶高通量筛选及功能研究 主要建议人姓名: 院士 院士 教授 教授 研究员 建议首席科学家姓名、年龄、单位: 40岁 37岁 经费预算金额:2800万元 摘要正文: 疾病对人类的健康和生存构成重大威胁,是世界各国面临的最重要的社会问题之一。当前和今后相当长的时期内药物将是疾病治疗的最主要手段,但由于历史、经济及观念等原因,与发达国家相比我国在药学相关基础研究,特别是创新药物的的基础研究和开发领域比较落后,导致医药产业基础较差,药品来源长期依赖于仿制和进口,每年进口药品达40亿美元以上。在中国加入WTO以后,一方面,由于知识产权保护的限制,药品仿制不可能再成为我国医药产业的中长期目标;另一方面,由于成员国之间的低关税,国外药品将会更多地进入中国市场。这不仅严重影响到我国人民的用药和健康问题,同时也将威胁我国医药产业的生存和发展,进而影响我国医药产业对国民经济的贡献度。因而,建立和发展我国自主的创新药物基础研究和开发体系成为当务之急,缺乏疾病特异性药靶是当前新药研究和开发的瓶颈。同时,对现有药物与机体相互作用机理认识的局限性是造成药物毒副作用的主要原因。因此,药靶的研究是新药研究和开发及临床合理用药中急需解决的重大科学问题。 当前比较成熟的药靶仅500个左右,远不能满足新药研究和开发的需求。估计人类基因中应该有3000-5000个可以作为药物的靶标。由此看来,药物靶标的研究不仅是必须的,而且有很大的探索空间。充分利用有效的靶标发现和功能验证技术,从现有大量的基因组学等信息资源中寻找重大疾病治疗药物的关键靶分子并分析其多态性对药物疗效和毒副作用的影响,为新药研究和开发提供靶标,并为临床安全用药提供理论依据是完全可能的。药靶的研究不仅具有重大的社会

minigui1.33在uclinux移植过程

Minigui V1.3.3在uClinux中的移植经验总结 [转] 经过一个星期的努力,终于将Minigui移植到我的ARM7开发板上了,在这个过程中我遇到了很多困难和问题网络,通过以前很多前辈在网络上分享的经验,终于取得成功,也让我更加体会到只有大家都互相帮助,才能使大家都受益。所以基于这一点,我将我的移植过程分享给大家,并且写得尽量详细点,希望给大家后来者少走一些弯路。有不对的地方,欢迎大家板砖! 首先说明一下我的开发平台,我用的是Samsung S3C44B0X芯片的开发板,已经移植好的uClinux操作系FrameBuffer驱动。我的uClinux安装在"/s3c44b0fu/uClinux-dist"目录下,交叉编译工具安装在"/usr/local/a 下。 具体步骤: 一. 从网站下载 libminigui-1.3.3.tar.gz, mde-1.3.0.tar.gz, mg-samples-1.3.0.tar.gz和minigui-res-1.3.3.tar.g 件,并将这四个文件保存到交叉编译环境的目录下,因为我的arm-elf-gcc交叉编译工具安装在"/usr/local/arm-以将minigui的四个压缩包同样拷贝到"/usr/local/arm-elf"目录下. 二. 在终端中输入"cd /usr/local/arm-elf",进入minigui的四个压缩文件所在目录,然后分别执行"tar zxvf xxxx 四个压缩包解压缩.解压后生成libminigui-1.3.3, mde-1.3.0, mg-samples-1.3.0和minigui-res-1.3.3四个文件 三. 1) 进入minigui-res-1.3.3文件夹内,修改config.linux,在prefix = $(TOPDIR)/usr/local/后添加我们的交叉arm-elf,即prefix = $(TOPDIR)/usr/local/arm-elf. 2) cd minigui-res-1.3.3 3) make install 四. cd mde-1.3.0 ./configure make cd mg-samples-1.3.0 ./configure make 五. 1) 编写交叉编译minigui函数库的配置脚本domain.sh. domain.sh的具体内容为: #!/bin/sh rm config.cache config.status -f CC=arm-elf-gcc \ CFLAGS="-I/s3c44b0fu/uClinux-dist/uClibc/include -Dlinux -D__linux__ -D__uClinux__ -Dunix " \ LDFLAGS="-Wl,-elf2flt -static -Wl,-move-rodata -Wl,-L/s3c44b0fu/uClinux-dist/lib/uClibc/lib -Wl,-L/s3c44b dist/linux-2.4.x/lib -Wl,-lc -Wl,-lm" \ ./configure --prefix=/usr/local/arm-elf \ --build=i686-pc-linux-gnu \ --host=arm-elf-linux \

Minigui在ARM开发板上的移植过程

Minigui在ARM开发板上的移植过程 一、题外话: 为了感谢国人在开源世界颇具影响力的为数不多Minigui的开发者们的辛勤劳动(希望为数不多这个这个词若干年后我们不再提^_^),也为答谢飞漫公司和魏永明先生对开源项目在中国的运作模式的有意义的探索, 也为自己在感慨、敬佩之余尽一点微波之力,就将借工作之便并参考众多网友的体会,将一点移植心得整理出来,希望公司不介意。考虑到每个人接触linux的起点不同,所以下文档按步就班说得比较详细(说得不好听点是罗嗦,^_^,如果您熟悉相关部分,请略过,希望不要当面说俺写的罗嗦,呵). 二、特别声明: 本文的移植过程主要以minigui1.2.3为基础。 本文中提到的注意可能是您容易忽视,而又要引起您注意的地方或者由于理解上的差异而容易造成交叉编译失败的地方。 本文中需要修改的地方以红色字体标注,而添加或者修改的地方以蓝色标注,需要您执行命令的地方以粉红标注(html格式颜色不显,我又懒蛋得写HTML标签,建议您下载附件中的PDF文档)。 另外,本文中提到的脚本编写和修改都请在linux环境下手工编写,不要在windows下或者直接从下面拷贝,免得出现错误。 三、硬件平台: CSB226-PXA250,Cogent ep7312,此文档以CSB226-PXA250参考开发板的移植过程为主来说明. LCD屏幕特性:640x480,支持8bpp. 支持标准PC键盘、鼠标 四、软件环境: 主机:Redhat7.2 目标板:采用umon作为boot loader, 开发环境和运行的内核是Montavista Profession Edition 2.1. 目标板(以下称为target)采用NFS的方式将根文件系统挂接到开发主机(以下称为host)上,其路径为:/opt/hardhat/devkit/arm/xscale_le/target,目标板上以控制台下的framebuffer 方式运行。 host和target都以root身份登陆。 将minigui库文件原代码libminigui1.2.3.tar.gz,资源文件minigui-fonts.1.2.0.tar.gz, minigui-imetabs-1.1.0.tar.gz, minigui-res-1.2.0.tar.gz放在主机任意目录下,而考虑到演示程序编译后没有相应的安装脚本,将源代码包mde-1.2.3..tar.gz放在了 /opt/hardhat/devkit/arm/xscale_le/target/root下面。首先用类似tar zxf liminigui1.2.3.tar.gz命令将所有的压缩包解开。 五、libminigui1.2.3及资源文件的移植: 1、libminigui1.2.3文件的移植: 它移植主要定义交叉编译器已经编译后的目标库和头文件的存放路径,参考给出的交叉编译例子编写了交叉编译脚本build-pxa250 #!/bin/sh

论武器装备体系的配套建设

2007年6月军事运筹与系统工程Jun.2007 第21卷第2期M ilitary Operati ons Research and Syste m s Engineering Vol.21No.2 论武器装备体系的配套建设 袁良斌,孙琰,张卓 (军械工程学院,河北石家庄050003) 摘 要:科学优化武器装备体系,加强装备配套建设,是适应一体化联合作战要求的重要举措,是军事斗争准备的重要内容,是打赢信息化战争的重要前提。武器装备的体系配套建设,是一项涉及武器装备需求论证、体系优化、研制生产以及装备调配、管理、训练、人才培养等多方面、多层次的系统工程。 关键词:武器装备;体系优化;配套建设 中图分类号:E917文献标识码:A文章编号:1672-8211(2007)02-0074-04 20世纪80年代后期,针对高技术局部战争的特点,许多武器装备论证专家强调用大系统的观点和方法研究武器装备建设问题,提出了武器装备体系的概念。在现代高技术条件下,作战一方要想获胜,不但要有“杀手锏”武器,更要有体系配套的武器装备作支撑,科学配套的武器装备体系可以使武器效能倍增。装备体系配套是指装备体系结构合理、组织健全、系统完整、功能完备、层次均衡、协调紧密,涉及到装备技术层、武器系统层、装备体系层、作战能力层和保障能力层,关系着部队战斗力的形成、保持和提高,关系着军队现代化建设水平和国防资源利用效率,是一项涉及武器装备需求论证、体系优化、研制生产以及装备调配、管理、训练、人才培养等多方面、多层次的系统工程。在战争由机械化向信息化转型的关键时期,适应打赢未来信息化战争的需要,探索信息化战争条件下武器装备作战需求,开发适用于信息化战争的高新技术,加速武器装备体系配套建设,逐步实现武器装备信息化,是我军武器装备发展的主要方向。 1 加强武器装备体系配套建设的必要性 1.1 加强装备体系配套建设是信息化建设的必由之路 军队信息化建设是世界新军事变革的关键。目前我军武器装备现代化水平虽然有了明显提高,但总体水平与世界发达国家军队武器装备水平还有较大差距,加速信息化建设已成为我军的当务之急。武器装备机械化阶段的体系健全、配套完善恰是军队信息化建设的发展基础。众所周知,军队信息化建设的目标是建设以C4I SR系统为核心、以信息化、智能化和一体化为基本特征的信息化武器装备体系。而信息化武器装备体系建设需要对现有的武器系统进行全面改造或改进,使其具备通用性、联动性、组合性,从而提高所有武器装备和作战系统的整体效能。武器装备的配套建设是解决装备体系结构优化建设的必由之路,也是利用信息技术对整个军事系统进行改造的必由之路。 1.2 加强装备体系配套建设是信息战体系对抗的必然要求 根据美军信息化建设的经验分析,装备体系配套建设是一项长期战略任务,也是武器装备形成整体作战能力的关键所在。为了使军队实现整体作战能力,美军在以军事理论创新为先导,以军事需求为依据,改革武器装备的研发体制,从论证到生产,充分考虑武器装备适应信息化作战的体系化特征,大力加强体 收稿日期:2007-01-22 作者简介:袁良斌(1965-),男,博士研究生,主要研究方向为军事装备学.

973标书 黄芪对腹膜透析效能及腹膜间皮细胞与腹腔免

登记序号:计划类别: 分类代码:项目编号: 科技项目计划设计任务书 项目名称:黄芪对腹膜透析效能及腹膜间皮细胞与腹腔免疫功能的影响 承担单位: 单位地址:邮编: 项目负责人:电话: 职务职称: 主管部门:南京市卫生局 填报日期:2002年04月26日 江苏省科学技术厅 二OO一年制

一、立项依据: 1、国内外研究现状、发展趋势及理论实践依据: 随着腹膜透析(Peritoneal Dialysis,PD)技术的不断提高和透析理论的日趋完善,尤其是1976年Popovich提出的连续非卧床腹膜透析(Continuous Ambulatory Peritoneal Dialysis,CAPD)治疗方法带来了腹膜透析的空前繁荣。近年来的流行病学资料表明接受腹膜透析治疗的终末期肾功能不全(End-Stage Renal Disease,ESRD)患者正以每年7.5%的比例迅速增长,目前全球已有超过120000的患者在接受腹膜透析治疗。腹膜透析因其相对于血液透析更高的生活质量、显著的残余肾功能保护、优于或等于血液透析的生存率以及较少的资金花费,故有作者提出,腹膜透析应该是肾脏替代疗法的首选[1,2]。 然而,随着腹膜透析患者寿命的延长,腹膜透析的远期并发症腹膜功能衰竭已成为ESRD患者透析技术性失败的最重要的原因[3],并成为制约腹膜透析发展的“瓶颈”。资料显示约1/3的腹膜透析患者6年后因腹膜功能衰竭而退出透析治疗。腹膜功能衰竭与长期腹膜透析后腹膜结构和功能破坏进而导致腹膜超滤失败以及溶质转运功能障碍密切相关[4]。腹膜透析液的生物不相容性是导致腹膜功能衰竭的首要原因,腹膜间皮细胞作为腹膜组成部分在这一过程中扮演着重要角色。近年来随着人腹膜间皮细胞标准培养方法和腹膜透析动物模型的确立,腹膜功能衰竭的机理得以初步阐明。腹膜间皮细胞在长期非生理性透析液刺激下,转移生长因子β(TGF-β)mRNA过度表达,TGF-β作为细胞增殖与细胞外基质合成的重要调节因子,导致细胞外基质合成增加和腹膜纤维化[5],最终导致腹膜超滤失败和溶质转运功能障碍。同时TGF-β也是调节细胞凋亡的重要细胞因子,组织病理学证实腹膜功能衰竭的重要特征表现为腹膜间皮细胞的丧失,过多的TGF-β表达将增加间皮细胞的凋亡,导致间皮细胞的完整性受到破坏,研究表明完整的间皮细胞层可以显著延缓腹膜纤维化的进程。其次,腹膜透析的主要并发症腹膜感染也是导致腹膜功能衰竭的重要原因,反复的炎症刺激使腹膜局部高水平TGF-β持续存在致使腹膜发生纤维化和硬化[6]。目前公认长期腹膜透析时腹腔细胞免疫功能抑制是导致腹膜反复感染的主要原因,尤其是被认为是腹腔细胞免疫功能最重要组成部分和腹膜抵抗细菌感染第一道屏障的巨噬细胞功能的明显抑制。研究表明,腹膜在长期非生理性透析液的刺激下,巨噬细胞功能受到抑制,当腹膜发生感染时透析患者腹腔巨噬细胞功能指标包括吞噬指数、白细胞介素1(IL-1)和肿瘤坏死因子α(TNF-α)水平显著降低,如果改用更符合生理条件的透析液则可以使腹腔巨噬细胞功能得到明显增强,从而增强腹膜对感染的抵抗能力,减少腹膜炎的发生[7]。最近,腹膜血管在腹膜功能衰竭中的作用也得到重视,充足的血流除了能有效增强腹膜的抵抗力减少腹膜炎的发生外[8],也是维持长期腹膜透析患者腹膜转运功能的重要因素。腹膜血管血流量减少时腹膜溶质转运和腹膜超滤率均显著下降[9],研究显示长期腹膜透析患者腹膜血管内皮细胞依赖的血管舒张因子显著减少,从而影响腹膜透析的效能,而如在腹膜透析液中添加扩血管物质硝普纳则能有效提高腹膜透析患者的透析效果。

[医学]973标书-确有疗效的有毒中药科学应用关键问题的基础研究-叶祖光

[医学]973标书-确有疗效的有毒中药科学应用关键问题的 基础研究-叶祖光 项目名称: 确有疗效的有毒中药科学应用关键问题 的基础研究 首席科学家: 叶祖光北京中研同仁堂医药研发有限 公司 起止年限: 2009.1至2013.8 依托部门: 国家中医药管理局 一、研究内容 (一)(总体设想 “有毒中药的毒性具有一些固有的特点~中药毒性及其评价与功效、证候密切相关~其毒性可以被认知、控制和驾驭~并可以被安全、有效地在临床中正确使用”。“是药三分毒”~因此~中药毒性是其作为“药物”的一种客观表现。中药的毒性及其安全性评价既有和化药雷同之处~同时也有中药毒性特有规律和评价方法学。中药的毒性与功效和证密切相关~因此~中药毒性应当放在功效,适应症,和中医的”证候”中间进行综合评价和认知~不能孤立地“就毒性论毒性”。由于中药成分的复杂性、有效成分的模糊性、配伍的整体性~增加了对中药毒性的研究和认知的难度~然而只要:一方面认真研究和抓住有毒中药的中医药特点~另一方面~在中药安全性评价中积极引进毒理学先进技术和手段~并建立符合中医药特点的中药毒性评价的新思路、新方法。只有这样~有毒中药的毒性是可以被认知、可以被控制和驾驭的,在上述基础上~有毒中药在临床实践中可以更加安全、更加合理、更具疗效的应用。 (二)(拟解决的关键科学问题

1 有毒中药的毒性表现特点、规律、物质基础、体内过程、作用机理。 2有毒中药的“毒性—功效—证候”的关联特性。 3有毒中药的科学控毒方法学研究。 4基于中医特点的中药肝、肾毒性评价的新技术新方法研究和中药毒性预警体系建设。 (三)(研究内容 ,一,、有毒中药毒性特点与毒性规律研究: 1、有毒中药毒性发生学研究 研究制备能代表有毒中药质量的标准化全成分提取物、临床常用的煎剂以及组分、部位和成分等不同样品~在不同剂量水平进行毒性的连续,10天、20天、1月、2月、3月……,监测观察研究~以发现肝、肾等毒性发生的“时-效、量-效”关系和中毒靶器官~及不同提取物的毒性表现~并同时进行生化与组织学的机理研究~辅以代谢组学研究~阐明其毒性发生过程~探讨毒性机制及敏感“预警”指标。 2、有毒中药毒性物质基础的化学表征研究 通过与药效和毒理学相配合的研究~采用毒性、药效为导向的化学成分的分离~确定毒效部位、组分或成分~为深入研究及药材、饮片的安全质控标准的制订提供依据。 1 3、有毒中药毒性发生影响因素研究 1,采收与不同加工方式对毒性的影响:选取GAP种植基地样品~研究采收时间、生药加工、干燥方式等对效-毒的影响。 2,炮制对毒性的影响:不同临床常用饮片和剂型的毒性作用比较。

973标书 2009CB941300-抑郁症和阿尔茨海默病的神经发育基础研究

973标书 2009CB941300-抑郁症和阿尔茨海默病的神经发育基础研究

项目名称:抑郁症和阿尔茨海默病的神经发育基础 研究 首席科学家: 起止年限: 依托部门:

一、研究内容 拟解决的关键科学问题: 基因组蓝图和外界环境因素共同决定着神经网络的结构和功能及其可塑性修饰,最终通过神经网络中高度协调的神经活动实现脑高级功能,如记忆、情绪等。这一复杂而精细的过程,经过突触联结的形成、可塑性修饰、衰老等环节,在一生中持续发育演化。早期发育的异常可能与抑郁症的发生有关,而晚期持续发育的异常则可能导致AD。神经发育的这些环节的关键分子细胞机理及其在神经网络和整体行为层次的表现,是本项目要研究的关键科学问题。在此基础上,我们将探索记忆、情绪等脑高级功能的神经发育机制以及抑郁症和AD的神经发育基础和可能的小分子调控途径。 主要研究内容: (1) 利用几千种果蝇突变体,筛选与神经发育和衰老密切相关的基因和验证学习记忆的损伤模型。 (2) 结合遗传学、电生理、行为学等方法研究神经发育和衰老的细胞分子机制,重点研究胰岛素信号通路在Aβ诱导的AD病理进程中的细胞分子和行为药理规律。 (3) 建立多种果蝇模型,进行小分子化合物作用靶点的分析。并进一步研究相关基因在哺乳动物模型中的作用和小分子化合物调控途径。 (4)利用人类原代培养神经元为实验模型,研究雌激素和雄激素对Hsp70的调节方式,并进一步探讨Hsp70对胞内Aβ毒性抑制作用的分子机制及通路。

此研究的结果有利于对Hsp70细胞保护机制的探索,并为寻找早期AD的发病机制及可能的预防措施提供新的依据。 (5) 建立神经网络的结构和功能动态发育的离体实验系统,利用分子生物学、电生理、光学影像等方法,研究神经网络回响活动的动态性质,并分析其形成与演化中可塑性修饰及其稳态调控的细胞分子机制。 (6) 利用电生理、药理学、行为学方法,研究CXZ-123、镁离子等小分子化合物对突触传导、可塑性修饰以及网络功能的影响。 (7) 建立神经网络和行为学模型,检测若干小分子化合物对突触联结形成、神经网络动态演化的影响,从而分析其对抗抑郁症或AD的作用机理。 (8) 利用分子生物学、电生理、光学影像等方法,研究神经发育可塑性关键期,阐明其细胞分子机制,并研究“再年轻化”干预对神经发育关键期的影响及相关调控途径。 (9) 利用电生理、光学影像、理论分析等方法,研究镁离子等“再年轻化”因子对突触密度和可塑性的调节机制,并探索突触密度调节的对神经网络功能和计算特性的影响,为神经网络的再年轻化调节提供理论基础。

linux下minigui移植与软键盘

课程设计成果说明书 题目:Linux下基于minigui的软键盘程序调试 学生姓名:苏腾云/王润志/蒋强/游寺豪/沈龙/陈阳狮学号:0800403220/0800403222/081311128 081311101/081311136/0800403109 学院:机电工程学院 班级:AC08电信 指导教师:赵秋亮老师 浙江海洋学院教务处 2011年07月01日

浙江海洋学院课程设计成绩评定表 2009 —2010学年第2 学期 学院机电工程班级 AC08电信专业电子信息工程 学生姓名(学号) 苏腾云/王润志 游世豪/蒋强 沈龙/陈阳狮 课程设计 名称嵌入式系统课程设计 题目MiniGUI移植 指导教师评语 指导教师签名: 年月日 答辩评语及成绩 答辩小组教师签名: 年月日

附2: 浙江海洋学院课程设计任务书 2010 —2011学年第2 学期 学院机电工程班级 AC08电信专业电子信息工程 学生姓名(学号) 苏腾云/王润志 游世豪/蒋强 沈龙/陈阳狮 课程 名称 嵌入式系统课程设计 设计 题目 Linux下基于minigui的软键盘程序调试 完成 期限 自 2011 年 6 月 20 日至 2011 年 7 月 1 日共 2 周 设计依据本次设计所需知识 1.S3C2410的基本知识 2.Linux系统常用命令 3.linux编辑器VI的使用方法 4.MiniGUI的基本知识 5.MiniGUI的移植方法 设计要求及主要内容1.熟悉linux系统的常用操作命令 2.熟悉VI(或GVIM)的操作方法 3.完成虚拟机VM的安装 4.完成虚拟机VM下的Linux(RedHat9.0)的安装 5.完成交叉编译环境的建立 6.完成PC机环境下minigui的安装与配置,QVFB的安装 7.完成minniGUI在S3C2410A上的移植 8.利用示例程序包中程序验证移植结果,结果能在LCD与QVFB上正常显示 9.调试基于minigui的软键盘程序,并能在QVFB和LCD上显示。10.录制设计结果演示和解说视频 11.完成课程设计说明书的撰写。撰写格式要求按照《机电工程学院毕业设计文本规范》。 参考资料[1]. ARM9嵌入式系统设计――基于S3C2410与Linux.徐英德等.北京航空航天大学出版社.2007年. [2]. 嵌入式系统实验指导书.自编. [3]. 实验指导书-EL-ARM-830型教学实验系统(ARM9).北京精仪达盛科技有限公司. [4]. Minigui实验指导书(for S3C2410).北京精仪达盛科技有限公司. [5]. Minigui编程指南.飞漫公司. [6]. FTP资源:172.16.51.6 用户名:dx 密码:1234. 在/ARM目录下。 指导教 师签字 日期

恶性肿瘤发生、发展的细胞表观遗传机制--2010--尚永丰--973项目标书

项目名称:恶性肿瘤发生、发展的细胞表观遗传机 制 首席科学家:尚永丰北京大学 起止年限:2011.1至2015.8 依托部门:教育部

二、预期目标 总体目标: 本项目瞄准表观遗传学研究的前沿,整合国内优秀研究人员,系统深入地开展恶性肿瘤发生发展及侵袭转移的表观遗传学研究。本项目的总体目标如下:阐明表观遗传关键机制即DNA甲基化、组蛋白修饰和非编码RNA对基因表达调控的影响;明确表观遗传调控在乳腺癌、肺癌发生发展及侵袭转移中的作用;揭示EMT过程中的表观遗传学变化及细胞重编程机制;阐明细胞微环境在肿瘤转移中的作用及机制;整合各种信息数据,描绘乳腺癌、肺癌发生发展及侵袭转移的分子调控网络。通过本项目的实施,建立和完善表观遗传学研究的新的技术体系,实现我国在生命科学及医学研究领域的理论创新,为恶性肿瘤预警、诊断、治疗和药物筛选提供新思路、新途径和新靶标,发现几个潜在的可以用于乳腺癌、肺癌诊断的分子标志物及药物治疗的分子靶标,并在本项目的实施过程中建立一支具有国际竞争力的研究团队。 五年预期目标: 1、发现一批新的组蛋白修饰因子,探明组蛋白修饰与DNA甲基化之间相互作 用的分子机制,筛选一批肿瘤相关ncRNA,鉴定一批具有潜在临床应用价值的肿瘤诊断及治疗的新的ncRNA分子靶标;鉴定一批新的EMT关键调控因子;发现针对转移型乳腺癌、肺癌的新的有效治疗靶点。 2、建立一整套适应于恶性肿瘤表观遗传学研究的技术平台和技术体系。 3、培养一批中青年学术带头人和学术骨干;培养研究生(含硕、博)50名以上、 博士后12名以上。 4、在国际一流杂志(IF>10)发表论文8篇以上,在有影响力的杂志(IF>5)上 发表论文25篇以上。

MiniGUI及其移植与应用

MiniGUI及其移植与应用 权宁一 (东北电力大学信息工程学院吉林吉林132012) 【摘要】:本文介绍了MiniGUI系统在嵌入式开发中的移植与应用。对MiniGUI图形软件的特点、体系结构、工作模式做了叙述,描述了MiniGUI在uc_osⅡ环境中的移植方法,MiniGUI应用软件的开发思想和流程,并对其应用领域做了介绍。 【关键词】:MiniGUI,移植,控件,消息循环 1、MiniGUI概述 随着嵌入式系统在工业控制、信息家电、智能手持终端、办公自动化等领域中的广泛应用,人们对产品的图形用户接口(GUI)的需求越来越强烈。图形美观、界面友好的GUI已广泛应用在3G手机、PDA、智能传感器、工控终端等嵌入式设备上,其中比较成熟的GUI产品有:MiniGUI、MicroWindows、OpenGUI、TinyXWindow、QT/Embedded。 MiniGUI最初是清华大学为数控机床研发计算机控制系统时根据需要独立开发的图形用户接口,它具有代码小巧、实时性好、高效稳定、易于裁减的特点,非常适合应用于嵌入式实时控制系统。MiniGUI可以运行在任何一种具有线程支持的POSIX兼容系统上,同时也是国内出现的最早的遵循LGPL条约的自由软件之一。MiniGUI有三种运行模式:⑴MiniGUI-Threads:运行在MiniGUI-Threads的程序可在不同的线程中建立多个窗口,但所有的窗口在一个进程中运行,可以配合的操作系统有ucosii、vxworks、linux。⑵MiniGUI-lite:每个程序是单独的进程,每个进程可建立多个窗口,只有具备完整unix特性的操作系统才可运行这一模式。⑶MiniGUI-standalone,可以以独立进程方式运行而不需要其它任何支持,这种方式几乎可以支持所有操作系统。MiniGUI具有以下特点:⑴小巧可订制,包含全部功能的库文件只有300k。⑵高稳定性,可移植性好。⑶界面皮肤支持,用户可通过皮肤支持获得华丽外观界面。⑷提供了完备的多窗口机制及消息传递机制。⑸丰富的控件资源,包括菜单、进度条、列表框、按钮、工具栏等。(6)多种键盘布局支持,多字符集及多字体支持,常见的图像文件支持。⑺多种汉字输入法支持,windows资源文件支持。 2、MiniGUI的结构特点与移植方式 2.1MiniGUI的体系结构 图1MiniGUI结构体系 MiniGUI采用了分层结构设计思想,共分为GAL、IAL、Pthread层,MiniGUI核心层,用户接口层三层结构。GAL为图形抽象层,提供了底层操作系统的图形接口,配置MiniGUI选用GAL引擎,就可使用framebuffer作为MiniGUI图形发生引擎;IAL为输入抽象层,它提供了输入设备如键盘鼠标等的驱动,可将输入设备的输入事件最终映射为GUI系统API层的消息事件。有了GAL、IAL可以把底层硬件及操作系统进行完全屏蔽,方便MiniGUI的移植。同时,用户可在XWindow系统中调试运行自己的产品,通过重新编译就可使软件运行在特定的硬件平台上。Pthread(POSIXthread)是提供内核级线程支持的c库函数。MiniGUI核心层为中间层,包含了窗口系统所需要的各个功能模块,详见图1。用户接口层API对于不同的平台是一致统一的,底层系统已被完全屏蔽,用户不必考虑输入设备及绘图细节,只需使用标准C语言进行类似win32库函数调用即可。2.2MiniGUI工作模式 MiniGUI采用微客户/服务器机制,通过消息队列和多线程之间的同步机制来实现。在多线程环境中各线程之间有信息交互的需要,依据"先来先服务"的原则,依次处理每个线程的请求。一个线程首先在desktop微服务器的消息队列中放置一条消息,要求建立窗口,然后进入等待状态。当desktop处于空闲状态时可以立即处理这一请求。最后,desktop返回处理结果,唤醒等待的线程。 MiniGUI启动3个重要的微服务器,它们分别为desktop、parser、timer。其中desktop用于管理MiniGUI窗口中的所有主窗口;parser线程用于采集键盘鼠标事件并转换成API层消息;timer线程用来触发定时器事件。 2.3MiniGUI的移植 嵌入式系统的结构框架从底层到上层依次为:硬件平台、嵌入式操作系统、MiniGUI、用户程序,其中uclinux与uc/OS-II为常用的操作系统,下面以uc/OS-II为例介绍MiniGUI的移植。uc/OS-II具有实时性强、代码简单的特点,在教学及工业实时控制领域得到了广泛应用。MiniGUIforuc/OS-II的配置及编译可在windows环境中的ADS开发平台中进行,编译完成之后生成一个静态库MiniGUI_lib,最终生成包括uc/OS-II、MiniGUI、应用程序在内的可执行映像文件,将映像文件固化写入硬件平台即完成MiniGUI的移植。在编译之前需要进行以下工作:设置MiniGUI配置头文件、确定头文件路径、选定编译规则。MiniGUI配置头文件中参数_AUTO_IAL是模拟键盘鼠标选项;_COM-MM_IAL是uc/OS-II通用输入引擎;_GB_SUPPORT是字符集支持;_USE_OWN_MALLOC为内存管理函数支持;_USE_OWN_STDIO为函数支持。编译规则设置中_MiniGU-I_LIB_声明编译MiniGUI_LIB库;_uc/OS-II_声明目标操作系统;-EC允许隐性类型转换;_NOLINUX_表示非linux系统。3、基于MiniGUI的软件设计开发思想 3.1MiniGUI开发流程 uc/OS-II初始化后创建任务main_task,在该任务中创建POSIX协议线程main_thread,main_thread中调用函数mg_main_task,进入MiniGUI入口MiniGUI_entry,进而调用应用程序入口函数MiniGUIMain,执行用户软件及窗口过程函数。MiniGUI应用程序必须包括的头文件有:common.h--定义了宏及数据类型;minigui.h--定义了接口函数及杂项函数;window.h--定义了窗口的宏及数据类型;control.h--定义了系统内部控件。 MiniGUIMain()是程序的入口点函数,一般用户程序先创建一个主窗口或非模式对话框,在主窗口内建立若干控件,然后建立消息队列,进入窗口消息循环,响应各类消息。通过调用Cre-ateMainWindow()函数创建主窗口,函数返回窗口句柄。函数调用时需给MAINWINCREATE结构体指针赋值,确定主窗口的各项属性值。调用ShowWindow()函数将主窗口进行显(下转第71页 )

MiniGUI3.0+tslib1.4移植过程

硬件平台:ASM9260开发板 Linux内核:linux-2.6 作者:孙怀亚 qq:413983254 交叉编译器:arm-none-linux-gnueabi-gcc MiniGUI交叉编译过程--------------------------------------------------------- 在开始之前,先准备好交叉编译过程中所需要的几个库文件: 1.jpegsrc.v6b.tar.gz 2.libpng-1.2.18.tar.bz2 3.tslib-1. 4.tar.gz 4.libminigui-gpl-3.0.12.tar.gz 5.minigui-res-be-3.0.12.tar.gz 6.zlib-1.2.3.tar.gz 7.freetype-1.3.1.tar.Gz 8.mg-samples-3.0.12.tar.gz 如果下面配置或命令有错,一般是由于拷贝制作word文档时,软件自动首字母变成大写或自动加空格的原因,切记要改回来!!!!! 第一步:首先建立新目录 [root@localhost /]# mkdir -p /root/cross 将开头所述的文件全部拷贝至 /root/cross目录下 第二步:安装 zlib 库,这个是后面的库的编译基础。 [root@localhost cross]# tar zxvf zlib-1.2.3.tar.gz 由于 zlib 库的configure 脚本不支持交叉编译选项,只好自己手动临时把 gcc 修改成指向我们的交叉编译器arm-none-linux-gnueabi-gcc [root@localhost cross]# cd /usr/bin/ [root@localhost bin]# mv gcc gcc_back [root@localhost bin]# ln -s /usr/local/arm/arm-2008q3-linux/bin/arm-none-linux-gnueabi-gcc ./gcc [root@localhost bin]# mv ld ld_back [root@localhost bin]# ln -s /usr/local/arm/arm-2008q3-linux/bin/arm-none-linux-gnueabi-ld ./ld 修改完成后回到 /root/cross/zlib-1.2.3 目录下: [root@localhost bin]# cd /root/cross/zlib-1.2.3 [root@localhost zlib-1.2.3]# ./configure --prefix= /usr/local/arm/arm-2008q3-linux/arm-none-linux-gnueabi --shared

973标书-工业生物技术的过程科学基础研究2007CB714300

973项目标书工业生物技术的过程科学基础研究 年度:2007-2011 首席科学家:谭天伟 【研究内容】 ·学术思路 过程工程科学问题是我国生物技术产业化的关键。本项目将以可再生生物质为原料进行大规模生物转化合成大宗化学品为主线,研究从细胞 群出发放大到工业化生产的工业生物过程基础科学。 工业生物过程与传统化工过程的根本区别,在于工业微生物细胞具有生理活性及代谢的多样性。因此工业生物反应过程面向的是复杂、多相的生物转化体系,工业生物分离过程面向的是组份多、结构类似物多的生物分离与纯化体系。为此,本项目将从细胞群体、单元过程和系统优化三个层次进行工业生物过程的深入研究,如图9所示。第一层次主要关注细胞群的群体效应现象、多相复杂生物体系的生化、生理特性分析及物质和能量传递规律,以及过程放大的基本原理和策略研究,着重进行新现象、新规律和新机理的发现和认识;第二层次主要进行基于细胞群体效应的直接放大、生物/化学方法耦联的系统优化以及多产物联产目标的全局调控研究,着重进行反应器直接放大、生物/化学方法耦联、多目标联产以及反应/分离单元耦合等新技术和新方法的创新研究;最终通过生物发酵过程和生物分离过程的集成优化,实现整个工业生物过程的系统集成与全局优化。 ·技术路线 本项目所涉及的技术途径下图所示。以工业生物过程从微观到宏观的放大为主线,由实验分析手段结合分子模拟计算,完成工业生物过程从小到大、从细胞群培养到大规模工业化生产中所涉及的关键科学问题的认识与研究。 利用化学信号分析与分子鉴定技术,研究工业生物放大过程的细胞群体效应现象;利用流场测试与物性分析技术,进行生物体系的传递与模型化研究;

【自然基金 标书 实例】脂类代谢素乱导致脂肪肝-973项目

项目名称:脂代谢紊乱导致脂肪肝及高脂血症发生 的机制 首席科学家: 起止年限:2012.1-2016.8 依托部门:教育部

一、关键科学问题及研究内容 根据我国高脂血症和 NAFLD 的特点,我们围绕高脂血症和 NAFLD 的诱因、重要发病环节以及生物标记物的发现这几个方面,凝炼出 6 个有特色、有创新性的科学问题: ●NAFLD 和高脂血症发生、发展及转归的易感基因和表观遗传特征? ●我国居民膳食营养和生活方式(运动)与NAFLD 和高脂血症发生、发展的 关系? ●代谢性炎症在NAFLD 和血脂紊乱发生、发展中的作用? ●肝脏营养感应调控及脂代谢稳态失衡与NAFLD 发生和发展的关系? ●外周脂质向肝脏异位以及肝细胞内脂肪重分布在NAFLD 发生、发展中的作 用? ●NAFLD 和高脂血症不同疾病阶段及转归的生物标记物是什么? 主要研究内容包括: 1.脂肪肝和高脂血症的遗传学研究:易感基因及表观遗传 利用我们项目组人群队列及病人活检样本资源、部分中国人群的SNPs数据和国内外脂代谢通路相关基因的研究成果,重点研究:1)NAFLD和高脂血症的易感基因以及表观遗传因素:利用代谢基因数据库(WIT)和本项目组研究获得的SNPs数据,通过外显子深度测序筛查进一步确定中国汉族人群NAFLD和高脂血症的易感基因位点,并在长期大样本人群队列研究和肝组织活检标本的基础上验证其与不同阶段NAFLD(SS和NASH)以及不同预后转归(肝硬化、糖尿病、心脑血管疾病、恶性肿瘤)的相关性;在NAFLD动物模型的不同阶段进行全基因组启动子甲基化位点扫描、microRNA表达谱分析;并利用上述平台进行高脂血症和/或NAFLD患者肝组织活检样本检测,从而识别并明确与高脂血症和NAFLD相关的表观遗传学因素;我们也将特别关注两个极端人群,即“吃水也胖”和高脂饮食而不发生脂肪肝和高脂血症人群,并通过上述手段研究其易感/保护

一个973标书范本

项目名称:代谢生理活动与病理过程中信号转导网 络的系统生物学研究 首席科学家:**** 起止年限:2011.1至2015.8 依托部门:中国科学院上海市科委

二、预期目标 总体目标: 建立面向重要代谢生理活动与病理过程中相关信号转导网络识别、重构与分析的高通量定量数据获取的技术平台,在蛋白质作用网络,翻译后修饰、基因表达调控、表观遗传研究等规模化数据方面发展出原创和集成的理论计算方法、新算法。在信号转导网络的结构与功能研究方面取得重要突破;揭示信号转导网络在机体代谢平衡、代谢性疾病发生发展的分子细胞作用机制;构建干细胞定向为白色前脂肪细胞和棕色前脂肪细胞过程中的信号转导调控网络;在白色脂肪与棕色脂肪的起源、相互转换研究方面取得突破;明确白色脂肪与棕色脂肪细胞定向分化中的信号网络的异同,并揭示其与代谢系统疾病发生和发展之间的关系,深入阐述BMP信号转导网络介导的脂肪细胞生长与分化机制及其在代谢生理活动与病理过程中的功能;揭示出GPCR信号转导途径与其它代谢相关的信号途径的新的相互作用关系,及其在正常生理与病理条件下的作用机制,为抗击代谢性疾病提供新方法和潜在药靶。 五年预期目标: 1、构建干细胞定向为白色前脂肪细胞和棕色前脂肪细胞过程中的信号分子调控网络,明确白色脂肪与棕色脂肪细胞定向分化中的信号网络的异同;在白色脂肪与棕色脂肪的起源研究和相互转换研究方面取得突破;揭示白色脂肪与棕色脂肪与代谢系统疾病发生和发展之间的关系;深入阐述BMP信号转导网络介导的脂肪细胞生长与分化机制及其在代谢生理活动与病理过程中的功能。 2、揭示出GPCR信号转导途径与其它代谢相关的信号途径的新的相互作用关系,发现与鉴定新的交互作用,发现这些新的交互作用在正常生理与病理条件下的作用及其机制;为抗击代谢性疾病提供新方法和潜在药靶。 3、建立重要代谢生理活动与病理过程中相关信号转导网络识别、重构与分析的高通量定量数据整合与挖掘方法;在蛋白质作用网络,翻译后修饰、基因表达调控、表观遗传研究等规模化数据方面发展出原创和集成的理论计算方法、新算法。

MiniGUI arm移植

2.MiniGUI在嵌入式ARM系统中的移植 MiniGUI在嵌入式ARM系统中的移植方法和本书6.1节中介绍的在上位Linux机器上的移植方法基本相同。 (1)确保系统硬件平台的底层FrameBuffer驱动已经安装好。 (2)在编译嵌入式Linux的内核时,必须要把FrameBuffer的支持加入: 在该选项下面的参数中进行选择,如在Linux Kernel v2.4.21-rmk1-omap1的内核配置中: (3)安装资源文件的方法。 (4)编译库文件的方法。 编译库文件的方法和在主机Linux上的编译有所不同,这里可以写一个shell来做。一个在arm-linux-gcc(2.95.3)编译器上配置的例子如例程6-1所示。 例程6 1 Buildlib-omap例子

--prefix=/usr/src/arm-linux/minigui/minigui-arm \ --build=i686-linux \ --host=arm-linux \ --target=arm-inux \ --disable-shared \ --disable-lite \ --disable-standalone \ --with-style=phone \ --enable-incoreres \ --enable-rbfgb12 \ --enable-rbf16 \ --enable-fonthelv \ --enable-newgal \ --enable-videofbcon \ --disable-videoqvfb \ --disable-qvfbial \ --disable-videodummy \ --disable-videocommlcd \ --disable-nativegal \ --disable-nativegalqvfb \ --disable-micemoveable \ --enable-cursor \ --disable-fblin1l \ --disable-fblin16 \ --disable-fblin32 \ --disable-textmode \ --disable-palm2ial \ --disable-dummyial \ --disable-nativeial \ --enable-hh2440ial \ --disable-qpfsupport \ --disable-ttfsupport \ --disable-type1support \ --disable-latin9support \ --enable-gbsupport \ --disable-gbksupport \ --disable-big5support \ --disable-unicodesupport \ --disable-savebitmap \ --enable-imegb2312 \ --enable-imegb2312py \ --disable-aboutdlg \ --disable-savescreen \

相关文档