异步方式winAPI串口通信

异步方式winAPI串口通信
异步方式winAPI串口通信

使用winAPI串口通信(二)

分类:Windows转载2009-09-23 16:51 263人阅读评论(0) 收藏举报

采用同步方式的查询方式读取串口数据时,若由于串口操作耗费较长的时间,则程序会被挂起.为解决这种问题,可以在读取数据时采用重叠I/O操作.此时,读写数据的操作在单独的线程中进行,发出读写要求的主线程可以继续运行.当读写数据成功后,读写数据线程可以通过某种方式通知主线程.两个线程协调工作 ,可以明显提高程序的效率.

为了实现重叠I/O操作,主要有如下几个编程步骤: 定义全局变量、创建串口、发出读写操作、读写线程函数的建立、关闭串口等.

1. 定义全局变量

HANDLE hCom; //串口句柄

DWORD ThreadProcWrite(LPVOID pParam); //写线程函数

DWORD ThreadProcRead(LPVOID pParam); //读线程函数

OVERLAPPED Wol = { 0 }; //写操作OVERLAPPED结构变量

OVERLAPPED Rol = { 0 }; //读操作OVERLAPPED结构变量

HANDLE hThreadWrite; //写线程句柄

HANDLE hThreadRead; //读线程句柄

HWND hWnd; //窗口句柄

2. 创建串口

hCom = CreateFile ( "COM2",

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//使用重叠方式

NULL );

if( hCom != INVALID_HANDLE_VALUE)

{

SetupComm(hCom,1024,512);

DCB myDCB;

GetCommState( hCom,&myDCB);

myDCB.BaudRate=CBR_19200;

myDCB.fBinary=TRUE;

myDCB.fParity=TRUE;

myDCB.ByteSize=8;

myDCB.Parity=ODDPARITY;

myDCB.StopBits=ONESTOPBIT;

SetCommState(hCom,&myDCB);

}

else

{

AfxMessageBox("创建串口失败!");

}

hWnd = GetSafeHwnd(); //获取当前窗口的句柄

3. 发出读写操作

(1) 读操作

在读操作中,只是启动读线程.实际的读操作在读线程函数中完成.

DWORD dwThreadID;

DWORD dwParam;

hThreadRead = CreateThread ( NULL,

0,

(LPTHREAD_START_ROUTINE)ThreadProcRead,

&dwParam,

0, //创建线程后,立即执行该线程

&dwThreadID);

if(hThreadRead==NULL)

{

AfxMessageBox("读线程创建失败!");

}

CreateThread()函数用于创建一个线程.

HANDLE CreateThread (

//线程安全属性,NULL表示该线程不能被继承

LPSECURITY_ATTRIBUTES lpThreadAttributes,

//初始化栈大小.0表示默认值或按调用栈线程配置

DWORD dwStackSize,

//执行函数名称

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter, //向新线程传递的参数

DWORD dwCreationFlags, //创建标志.0表示创建后立即执行

LPDWORD lpThreadId

);

(2) 写操作

在写操作中,同样只是启动写线程.实际的写操作在写线程函数中完成.

DWORD dwThreadID;

DWORD dwParam;

hThreadWrite = CreateThread( NULL,

0,

(LPTHREAD_START_ROUTINE)ThreadProcWrite,

&dwParam,

0,

&dwThreadID);

if(hThreadWrite==NULL)

{

AfxMessageBox("写线程创建失败!");

}

4.读写线程函数的建立

读写的实际操作在读写线程函数中执行. 这两个函数都是全局函数.

(1) 读线程函数

在读线程函数中,首先应初始化重叠结构Rol的成员hEvent,将其设置为无信号状态.当读操作完成或出现通信错误时,该变量会被自动设置为有信号状态.接下来就可以使用ReadFile()函数发出读命令.若该读函数返回TRUE,说明读操作已经完成,可以处理读取的数据.若该读函数返回FALSE,说明读操作未完成.此时使用WaitForSingleObject()函数等待读操作的结构。根据返回结果的不同,采取相应的处理代码即可.

DWORD ThreadProcRead(LPVOID pParam)

{

BYTE myByte[20];

CString myStr;

DWORD dwRes;

DWORD dwRead;

BOOL fRes;

char myChar[10];

Rol.hEvent = CreateEvent ( NULL, //创建Rol的hEvent成员为无信号状态

TRUE;

FALSE;

NULL);

if (Rol.hEvent == NULL)

{

AfxMessageBox ("hEvent 空");

return -1;

}

if (ReadFile (hCom, //串口句柄

&myByte, //存放读取数据

3, //要读取的字节数

NULL,

&Rol) ) //指向创建hCom时的Rol的指针

{

//AfxMessageBox("成功读出!");

//在这里加入处理读取数据代码,数据存放在myByte数组中

}

else

{

dwRes = WaitForSingleObject ( Rol.Event , 5000 ); //5秒超时

switch(dwRes)

{

case WAIT_OBJECT_0:

if (!GetOverlappedResult (hCom,

&Rol,

&dwRead, //实际读出的字节数

TRUE) ) //TRUE表示直到操作完成函数才返回

{

//操作失败,可以使用GetLastError()获取错误信息 }

else

{

//操作成功完成,数据读取存入myByte中

//这里加入处理数据的代码

}

break;

case WAIT_TIMEOUT:

//读操作失败,原因是超时

break;

default:

//这里加入默认处理代码

break;

}

}

closeHandle(Rol.hEvent);

return 0;

}

CreateEvent() 函数用来创建一个事件句柄,并设置其信号状态.

HANDLE CreateEvent (

//事件安全属性,NULL表示该事件句柄不能用于继承

LPSECURITY_ATTRIBUTES lpEventAttributes,

BOOL bManualReset, //TRUE表示该事件需人工复位

BOOL bInitialState, //事件对象的初始状态,TRUE表示有信号,反之无信号

LPCTSTR lpName //指向事件对象的名称,NULL表示创建一个无名事件对象

);

ReadFile()函数是读缓冲区命令,若该命令执行后返回TRUE,说明已经读成功. 若该命令返回FALSE,说明该命令返回时,读操作尚未完成,读操作继续在后台中进行.此时使用waitForSingleObject()函数来获取后台读命令的操作结果.

DWORD WaitForSingleObject (

HANDLE hHandle, //指向等待对象的句柄

DWORD dwMilliseconds, //超时时间

);

GetOverlappedResult()函数其实与WaitForSingleObject()函数功能类似,都可以返回某操作的操作结果. 之所以使用GetOverlappedResult()函数,是因为它可以返回读操作实际读出的字节数量.

BOOL GetOverlappedResult (

HANDLE hFile, //指向串口句柄

LPOVERLAPPED lpOverlapped, //执行读函数中使用的OVERLAPPED结构变量

LPDWORD lpNumberOfBytesTransferred, //存放实际读出字节数量变量的地址

BOOL bWait //设为TRUE表示读操作完成该函数才返回,若为FALSE表示如果操作未完成时函数将返回FALSE.

);

(2) 写线程函数

写线程函数所作操作与读线程函数的操作相似.首先初始化Wol的hEvent事件成员,然后发出写命令WriteFile().若该写命令返回TRUE,说明写操作成功完成.若写命令返回FALSE,说明写操作没有完成.使用WaitForSingleObject()函数等待写操作的结果,根据返回结果的不同,采取相应的处理代码.

DWORD ThreadProcWrite(LPVOID pParam)

{

BYTE myByte[9];

CString myStr;

DWORD dwRes;

DWORD dwWrite;

BOOL fRes;

char myChar[10];

for (i=0;i<=9;i++)

{

myByte[i] = i; //发送数据写入myByte中

}

Wol.Internal = 0; //设置OVERLAPPED结构Wol

Wol.InternalHigh = 0;

Wol.Offset = 0;

Wol.OffsetHigh = 0;

Wol.hEvent = CreateEvent ( NULL, //创建Wol的hEvent成员为无信号状态 TRUE;

FALSE;

NULL);

if (Wol.hEvent == NULL)

{

AfxMessageBox ("hEvent 空");

return -1;

}

if (WriteFile (hCom, //串口句柄

&myByte, //存放待发送数据

3, //欲发送的字节数

NULL,

&Wol) ) //指向创建hCom时的Wol的指针

{

//AfxMessageBox("发送成功!");

//在这里加入处理读取数据代码,数据存放在myByte数组中

}

else

{

dwRes = WaitForSingleObject ( Wol.Event , 500 ); //5ms超时

switch(dwRes)

{

case WAIT_OBJECT_0:

if (!GetOverlappedResult (hCom,

&Wol,

&dwWrite,

TRUE) ) //TRUE表示直到操作完成函数才返回

{

//操作失败,可以使用GetLastError()获取错误信息 }

else

{

//发送数据成功

//这里加入发送成功的处理代码

}

break;

case WAIT_TIMEOUT:

//读操作失败,原因是超时

break;

default:

//这里加入默认处理代码

break;

}

}

closeHandle(Wol.hEvent);

return 0;

}

5. 关闭串口

使用CloseHandle()函数关闭串口句柄.

CloseHandle(hCom);

异步串行通信的工作方式

异步串行通信的工作方式,然后给出了VB MSComm控件下异步串行通信在电子衡器中的应用实例,包括硬件接口及软件设计。关键词:RS-232 异步串行通信Visual Basic 电子衡器控件计算机一般提供了2个25针或9针的RS-232标准串行口,简称为COM1和COM2。在某些应用中,我们还可以通过插通信卡来获得额外的RS-232标准串行口。利用这些串行口可以与其它数字设备进行一般的数据通信,计算机的串行接口主要用于远程通信和低速输入输出设备。由于串行数据通信传输线条数最少,而且有许多较便宜的专用芯片可实现它,发送和接受器也简单,因而对数据传输速度要求不高的计算机和数字设备间的近程通信,多采用串行通信实现。而目前各个厂家生产的电子衡器的称重仪表多配有与上位机通信的RS—232C串行接口,因而计算机与称重仪表之间的数据通信用串口很容易实现,只需要制作一条2芯或3芯的数据线编写相应的接口程序即可实现,不需要增加其他硬件设备。采用这种方式组成的微机电子衡器有许多优点:称重仪表经过多年的发展,在数据采集、抗干扰、可靠性等方面技术成熟,质量稳定;而计算机在存储容量、数据处理、查询、统计报表等数据管理方面有明显优势。正是两者的完美结合,才使计算机与称重仪表组成的在线式称重管理系统得到了广泛的应用。1串行通信的工作方式串行通信,可分为同步和异步两种方式。异步方式是指在约定的波特率下,传送和接受的数据不需要严格的保持同步,允许有相对的延迟,虽然速度较慢,但经济实用,所以异步串行通信现大量应用于计算机接口技术中。计算机与称重仪表就采用异步通信的方式传送数据。1.1异步串行通信的数据格式在这种通信方式中,一般以一个字符为一帧。一帧最少由三部分组成:起始位、数据位、停止位,开始是一位起始位以发送一个逻辑“0”表示,接着是表示这个数据的数据位,数据位可以是5位、6位、7位或8位,再加一位奇偶校验位,然后是一个、一个半或二个停止位,停止位以逻辑“1”表示。1.2波特率串行通信每秒传送的位数,传送时先低位后高位。常用的波特率有600、1200、2400、4800、9600等。1.3端口在计算机中,一般都配有两个标准串行口,用COM1和COM2表示。(通常采用2个9针D型阳性插头。)1.4信号线RS—232C标准规定有25根连线,使用21个信号线。在我们讨论的微机电子衡器中仅用到3根信号线,它们是:发送数据线TXD(输出信号),接受数据线RXD(输入信号线),信号地GND。其余信号线定义可参考相关书籍。2串行通信在电子衡器中的应用实例串行通信接口设计,包括硬件、软件设计两部分。在WINDOWS操作系统下,可选用VC++、VB等可视化开发工具。下面将以上海耀华称重系统公司的XK3190—A1+为例,以VB6.0编程语言,说明串行通信的软、硬件设计过程。 2.1称重仪表仪表选用上海耀华XK3190-A1+仪表,其串口通信格式如下:2.1.1连续方式发送:所传送的数据为仪表显示的当前称量(毛重或净重),每帧数据由12组数据组成。 第X组 内容及注释 1 02(XON)开始 2 +或- 符号位 3 称量数据高位 : 称量数据: : 称量数据: 8 称量数据低位 9

三种集体决策方法

共同点: 1、有效激发个人的创造力和想象力; 2、鼓励每个人独立思考,广开思路可以提供了一个自我创造自我发挥的平台; 3、群策群力,众人拾柴火焰高,有效利用集体力量。 不同点: 1、头脑风暴法——不怕做不到,就怕想不到,注重点子的数量而不是质量各自自由发表方法,没有思维界限,方法不做现场点评建议; 2、名义小组技术——个人独立思路被放在首位,适合在领导高层决议分歧严重、僵持不下时使用,以小组各自独立思考并互相投票选择推导方案。 3、德尔菲技术——当局者迷、旁观者清,主要使用专家权威拟定方案;由管理者与分别专家商讨为主;以专家组最后的代表方案为目的,往往能取得意想不到的功效。 需要注意的问题: 1、头脑风暴法: (1)时间成本和现场不好控制,可能会产生面子问题而不敢任意发表自己的想法; (2)考验会议主持人的领导力与执行力; (3)主题容易偏离目标; (4)由于中国的“文化”(圈子、面子、关系)复杂,需考虑是否适用于本土企业。 2、名义小组技术: (1)参与决策的人的能力与岗位是否相称; (2)参与决策的人的权利与责任是否相称 (3)小组容易产生互相推脱责任; (4)任何议题最后都由管理者拍板决定,如果管理者习惯“一言堂”,小组讨论则形同虚设。(5)民主决议产生的决策并不直接等于好的决策。 3.德尔菲技术: (1)聘请专家参与决策的费用与决策效果是否成正比,投入成本相对较高,容易产生投入与效果差异大。 (2)公司管理者与专家分歧严重时应该如何协调,应掌握管理者与专家意见分歧大时的处理方法; (3)专家参与决策容易削弱高层权力而导致管理层产生不满 德尔菲技术:;;三种集体决策方法的异同如下: (1)相同之处 ●在操作上,三者都尽量不免决策成员的直接冲突:头脑风暴法要求开始时不评论别人的 建议;名义小组采用投票而不是口头的方式选择方案;德菲尔技术中专家根本没有见面的机会。 ●在效率上,三种决策方法都需要经过比较长的时间,特别是德尔菲法.所以决策的效率 相对于个人决策来讲比较低。 ●在效果上,三者都发挥全体群体决策质量高的优点,都能最大限度的获得群体成员的意 见,集思广益。 (2)不同之处 ●成员数量有差别。头脑风暴以5~6人为宜,例如如果成员数量过多,主持人可能没有 办法控制会场情况,也并不是所有参加成员都有机会表达自己的观点。而德菲尔法和名义小组法并没有限定人数。 ●决策时间长短有差别。头脑风暴法几个小时能作出决策,二德尔菲法和名义小组法可能 要几天甚至更长时间

Windows进程间各种通信方式浅谈

Windows进程间各种通信方式浅谈 1、Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指不同进程间进行数据共享和数据交换。 正因为使用Win32 API进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题, 下面本文将对Win32中进程通信的几种方法加以分析和比较。 2、进程通信方法 2.1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。 Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象。 (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。 (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。 (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、

异步串行接口电路及通信系统设计设计报告

异步串行接口电路及通信系统设计 设计报告 2009级可编程逻辑课程名称: 实验题目:学生姓名: YC 开课学院: Bio开课时间: 2011课程设计可编程逻辑设计异步串行接口电路及通信系统设计、SXL、ZY、YLJ、WJ 学院至2012学年第二学期重庆大学本科学生课程设计指导教师评定成绩表学院年级学生姓名课程设计题目be学院2009级指导教师专业Zxm. Wxp. BME YC、SXL、ZY、YLJ、WJ 异步串行接口电路及通信系统设计指导教师评语课程设计成绩指导教师签名:年月日重庆大学本科学生课程设计任务书课程设计题目学院BE学院异步串行接口电路及通信系统设计专业BME 年级、班09 BME 01、02班

设计要求:设计一个能进行异步全双工串行通信的模块,该模块以固定的串行数据传送格式收发数据。1)每帧数据供10 位,其中1位启动位,8位数据位,1位停止位。2)波特率为:9600。3)收发误码率摘要摘要通用串口是远程通信接口,在数字系统使用很普遍,是一个很重要的部件。本论文使用VHDL语言描述硬件功能,并适当借助Verilog HDL 语言,利用在FPGA 芯片上的综合描述,采用模块化设计方法设计UART的各个模块。其中包括波特率发生器,程序控制器,UART数据接收器和UART数据发送器,采用的外部时钟为50MHZ,波特率为9600。在QuartusII 环境下进行设计、编译和仿真。最后的程序编译仿真结果及硬件测试结果表明系统设计完全正确。关键字:VHDL; Verilog HDL;UART; 帧格式; FPGA;异步通信I 摘要Abstract In this paper, the use of

进程间通信的四种方式

一、剪贴板 1、基础知识 剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该内存区域中取出数据。 2、函数说明: (1)、BOOL OpenClipboard( ) CWnd类的OpenClipboard函数用于打开剪贴板。若打开剪贴板成功,则返回非0值。若其他程序或当前窗口已经打开了剪贴板,则该函数返回0值,表示打开失败。若某个程序已经打开了剪贴板,则其他应用程序将不能修改剪贴板,直到前者调用了CloseClipboard函数。 (2)、BOOL EmptyClipboard(void) EmptyClipboard函数将清空剪贴板,并释放剪贴板中数据的句柄,然后将剪贴板的所有权分配给当前打开剪贴板的窗口。 (3)、HANDLE SetClipboardData(UINT uFormat, HANDLE hMem) SetClipboardData函数是以指定的剪贴板格式向剪贴板上放置数据。uFormat指定剪贴板格式,这个格式可以是已注册的格式,或是任一种标准的剪贴板格式。CF_TEXT表示文本格式,表示每行数据以回车换行(0x0a0x0d)终止,空字符作为数据的结尾。hMem指定具有指定格式的数据的句柄。hMem参数可以是NULL,指示采用延迟提交技术,则该程序必须处理WM_RENDERFORMA T和WM_RENDERALLFORMATS消息。应用程序在调用SetClipboardData函数之后,就拥有了hMem参数所标识的数据对象,该应用程序可以读取该数据对象,但在应用程序调用CloseClipboard函数之前,它不能释放该对象的句柄,或者锁定这个句柄。若hMem标识了一个内存对象,那么这个对象必须是利用GMEM_MOVEABLE标志调用GlobalAlloc函数为其分配内存。 注意:调用SetClipboardData函数的程序必须是剪贴板的拥有者,且在这之前已经打开了剪贴板。 延迟提交技术:当一个提供数据的进程创建了剪贴板数据之后,直到其他进程获取剪贴板数据之前,这些数据都要占据内存空间。若在剪贴板上放置的数据过大,就会浪费内存空间,降低对资源的利用率。为了避免这种浪费,就可以采用延迟提交计数,也就是由数据提供进程先提供一个指定格式的空剪贴板数据块,即把SetClipboardData函数的hMem参数设置为NULL。当需要获取数据的进程想要从剪贴板上得到数据时,操作系统会向数据提供进程发送WM_RENDERFORMA T消息,而数据提供进程可以响应这个消息,并在此消息的响应函数中,再一次调用SetClipboardData函数,将实际的数据放到剪贴板上。当再次调用SetClipboardData函数时,就不再需要调用OpenClipboard函数,也不再需要调用EmptyClipboard函数。也就是说,为了提高资源利用率,避免浪费内存空间,可以采用延迟提交技术。第一次调用SetClipboardData函数时,将其hMem参数设置为NULL,在剪贴板上以指定的剪贴板格式放置一个空剪贴板数据块。然后直到有其他进程需要数据或自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据。 (4)、HGLOBAL GlobalAlloc( UINT uFlags,SIZE_T dwBytes); GlobalAlloc函数从堆上分配指定数目的字节。uFlags是一个标记,用来指定分配内存的方式,uFlags为0,则该标记就是默认的GMEM_FIXED。dwBytes指定分配的字节数。

德鲁克:如何做有效的决策

德鲁克:如何做有效的决策 【导读】决策是一种判断,是若干项方案中的选择。所谓选择,最多只是“大概是对的”与“也许是错的”之间的选择。 忘掉那些复杂而繁琐的决策程序吧,采用不同层面衡量方法就能让你看清问题的每一面。 针对如何做有效的决策,德鲁克指出,决策是一种判断,是若干项方案中的选择。所谓选择,通常不是“是”与“非”间的选择,最多只是“大概是对的”与“也许是错的”之间的选择。而绝大多数的选择,都是任何一项方案均不一定优于其他方案时的选择。 遗憾的是,不少人会认为决策的第一步是“先搜集事实”,但是能做有效决策的管理者,都能了解他们决策时,并非先从搜集事实着手,而是先从其本人的见解着手。所谓见解,是“尚待证实的假设”,因此唯一严谨的方法,唯一可以印证某一见解是否符合实际的方法,应该以明确承认“见解为先”做为基础——这是必要的做法。有了这样的认识,我们才能知道决策的正确程序。 以下是决策者需要的主要的方法: ·鼓励大家提出见解 鼓励的同时,也要让大家深思其见解,认清其见解经过实证后的结果。因此,有效的管理者会问:“要验证某一假设是否为真,我们该知道些什么?”以及,“要验证某一见解,应该有些怎么样的事实?” 但最关键的问题应该是:“相关的标准是什么?”由于这一问题,很自然就会转到关于衡量的话题:问题本身的衡量和决策的衡量。只要分析一下一项真正有效的决策是如何达成的,一项真正适当的决策是如何达成的,我们就能发现我们为决定衡量方法所消耗的时间和精力极多。 · 先假定传统的衡量方法并非适当的衡量方法 自从朝鲜战争以来,美国军用物资的采购一直不理想。军方也曾拿出解决方案,但无济于事。直到麦克纳马拉出任国防部长,才改变这一局面。过去军需物资的采购一直以物资项目的总项数和总金额为衡量的基础。麦克纳马拉一反此项传统,他主张将最重要物资、一般重要物资以及不太重要的物资分开管理,严加

DSP与计算机的异步串行通信

1 绪论 1.1 设计背景 在DSP芯片出现之前,数字信号处理只能依靠通用微处理器来完成,由于微处理器芯片速度较低,难以满足高速实时处理的要求。1965年库利和图基发表了著名的快速傅立叶变换FFT,极大地降低了傅立叶变换的计算量,从而为数字信号的实时处理奠定了算法的基础。与此同时,伴随集成电路技术的发展,各大集成电路厂商为生产通用DSP芯片做了大量的工作。1978年AMI公司生产第一片DSP芯片S2811。1979年美国Intel公司发布了商用可编程DSP器件Intel2920,由于内部没有单周期的硬件乘法器,使芯片的运算速度,数据处理能力和运算精度受到了很大的限制。运算速度大哟为单指令周期200~250ns,应用范围仅局限于军事或航空领域。 随着时间的推移,许多国际上著名集成电路厂家都相继推出自己的DSP产品。这个时期的DSP器件在硬件结构上更适合数字信号处理的要求,能进行硬件乘法,硬件FFT变换和单指令滤波处理,其单指令周期为80~100ns,20实际80年代后期,以TI公司的TMS320C30为代表的第三代DSP芯片问世,伴随着运算速度的进一步提高,其应用范围逐步扩大到通信,计算机领域。 在2000年以后,DSP制造商不仅信号处理能力更加完善,而且是系统开发更加方便,程序编辑更加灵活,功耗进一步降低,成本不断下降。尤其是各种通用外设集成到片上,大大地提高了数字信号处理能力。这一时期的DSP运算速度可达到单指令周期10ms左右,可在Windows环境下直接应用C语言编程,使用方便灵活,使DSP芯片不仅在通信,计算机领域得到了广泛的应用,而且逐步渗透到了人们的日常消费领域。 目前DSP芯片的发展非常迅速。硬件结构方面主要是向多处理器的并行处理结构,便于外部数据交换的串行总线传输,大容量片上RAM和ROM,程序加密,增加IO驱动能力,外围电路内装化,低功耗等方面发展。软件方面主要是综合平台的完善,使DSP的应用开发更加灵活方便。

进程间通信方式比较

进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 2.信号(signal): 信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致得。 3.消息队列(message queue): 消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。 消息缓冲通信技术是由Hansen首先提出的,其基本思想是:根据”生产者-消费者”原理,利用内存中公用消息缓冲区实现进程之间的信息交换. 内存中开辟了若干消息缓冲区,用以存放消息.每当一个进程向另一个进程发送消息时,便申请一个消息缓冲区,并把已准备好的消息送到缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程收到发送里程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出所需的信息,然后把消息缓冲区不定期给系统.系统负责管理公用消息缓冲区以及消息的传递. 一个进程可以给若干个进程发送消息,反之,一个进程可以接收不同进程发来的消息.显然,进程中关于消息队列的操作是临界区.当发送进程正往接收进程的消息队列中添加一条消息时,接收进程不能同时从该消息队列中到出消息:反之也一样. 消息缓冲区通信机制包含以下列内容:

(1) 消息缓冲区,这是一个由以下几项组成的数据结构: 1、消息长度 2、消息正文 3、发送者 4、消息队列指针 (2)消息队列首指针m-q,一般保存在PCB中。 (1)互斥信号量m-mutex,初值为1,用于互斥访问消息队列,在PCB中设置。 (2)同步信号量m-syn,初值为0,用于消息计数,在PCB中设置。(3)发送消息原语send (4)接收消息原语receive(a) 4.共享内存(shared memory): 可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。 这种通信模式需要解决两个问题:第一个问题是怎样提供共享内存;第二个是公共内存的互斥关系则是程序开发人员的责任。 5.信号量(semaphore): 主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。 6.套接字(socket); 这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 https://www.360docs.net/doc/8212146958.html,/eroswang/archive/2007/09/04/1772350.aspx linux下的进程间通信-详解

有效的决策

有效的决策 决策就是判断.就是在一些不同的可行方案中作出一种 选择。我们所说的选择,在一般情况下,并不是指“是”与 “非”之间的选择,这充其量也只是“大概是对的”与“也 许是错的”之间的选择。而通常经常遇到的却往往只是两种 不同行为方案之间的选择。在这两者之间,很难说哪个比哪 个更正确。 绝大多数关于决策的书都这么说:“首先要弄清真相。”不过.卓有成效的决策者都知道,决策的过程往往不是从真相开始的,而是从想法开始的。这些想法由于没有经过实际的检验,常常只是一些假设,因此,还谈不上有什么价值。要想判断什么是真相,那就首先要确定相关的标准,特别是要确定合适的衡量标准。这可以说是有效决策的纲,也是通常最容易引起争论的地方。 最后,有效的决策并不像许多教科书里所说的那样来自于对真相的—致的看法。恰恰相反,正确决策的意识正是在不同意见的冲突与矛盾之中产生的,是认真考虑对立各方行动方案的一个结果。 先要弄清真相是很难做到的。因为没有相关的标准,就不可能找到什么真相。事件本身并非就是真相。 在物理学中,知道物质的滋味并不就是了解了事物的真相。直到最近,知道某物体的颜色,也并不就等于了解真相。就烹调而言,滋味是个绝对重要的真相;而说到绘画,颜色才是头等重要的真相。物理学,“烹调和绘画都从各自的需要出发考虑有关的事情,因此就会将不同的事物认作真相”。 卓有成效的管理者还懂得,人们干事情并不是从寻找事物真相开始的,而是先从想法开始的,这样做并没有什么不对。人们经历过某个事件,就必然会有些想法。如果在某个领域里体验了好长一段时间的生活而不产生想法的话,那说明此人没有敏锐的观察力,头脑迟钝。 所以,人们已是先有想法,然后再采取行动的。硬要他们先寻找真相,然后再采取行动是不可取的。那会使他们像其他人一样,寻找所谓的真相来凑合自己已有的结论。既然已有了结论,要找些所谓的事实来加以说明不会有什么困难。擅长统计的人员都知道这个道理,因此,他们对统计数字往往不太信任。 唯一缜密的方法,唯一有利于我们用实践来检验想法的办法,就是“先有想法,后有行动”,这也是我们考虑决策时所应该采取的办法。只有这样,别人才能看出,我们的决策是从没有经过测试的假设开始的,而这恰恰就是决策或科学研究的唯—起点。我们知道应该如何对待假设,我们不会为假设而争论不休,我们要做的就是对它们进行测试。通过测试,可以发现哪些假设可以成立,因此值得我们认真地加以考虑;哪些假设站不住脚,必须被弃置。

串行通信技术-模拟信号转换接口

微机原理与应用实验报告6 实验9串行通信技术 实验10A模拟信号转换接口 实验报告

实验九串行通信技术 一、实验目的 1. 了解异步串行通信原理; 2. 掌握MSP430异步串行通信模块及其编程方法; 二、实验任务 1. 了解MSP430G2553实验板USB转串口的通信功能,掌握串口助手的使用 (1)利用PC机的串口助手程序控制串口,实现串口的自发自收功能 为实现PC串口的自发自收功能,须现将实验板上的扩展板去下,并将单片机板上的BRXD和BTXD用杜邦线进行短接,连接图如下所示: 由此可以实现PC串口的自收自发功能。 (2)思考题:异步串行通信接口的收/发双方是怎么建立起通信的 首先在异步通信中,要求接收方和发送方具有相同的通信参数,即起始位、停止位、波特率等等。在满足上面条件的情况下,发送方对于每一帧数据按照起始位数据位停止位的顺序进行发送,而接收方则一直处于接受状态,当检测到起始位低电平时,看是采集接下来发送方发送过来的数据,这样一帧数据(即一个字符)传送完毕,然后进行下一帧数据的接受。这样两者之间就建立起了通信。 2. 查询方式控制单片机通过板载USB转串口与PC机实现串行通信 (1)硬件连接图

(2)C语言程序 采用SMCLK=1.0MHz时,程序如下:

其中SMCLK=1MHz,波特率采用的是9600,采用低频波特方式,则N=1000000/9600=104.1666…,故UCA0BR1=0,UCA0BR0=104,UCBRS=1; 当采用外部晶振时,时钟采用默认设置即可,程序如下:

也是采用了低频波特率方式,所以关于波特率设置的相关计算和上面是一样的。 (3)思考:如果在两个单片机之间进行串行通信,应该如何设计连线和编程? 由于在上面的连线中将单片机上的P1.2和BRXD相连,P1.1和BTXD相连,所以若要在两个单片机之间进行通信,首先应该将两个单片机的P1.2和P1.1交叉相连,并根据上面的程序进行相同的关于端口和波特率相关的设置即可实现两个单片机之间的通信。 3. (提高)利用PC机RS232通信接口与单片机之间完成串行通信 (1)硬件连接图 在实验时,采用了将PC机的串口com1直接连接至MSP430F149的孔型D9连接器上,G2553单片机的输出引脚P1.1和P1.2分别与F149单片机上的URXD1和UTXD1相连接,连接图如下所示:

北邮设计一:异步串行通信控制器

设计一:异步串行通信控制器 一、目的: ●掌握状态机的原理与设计方法; ●了解异步通信的原理和特点; ●掌握异步通信接口的设计方法。 二、异步通信原理简介: 我们主要以接收端为例来说明异步通信的工作原理,发送端可依此类推。异步通信的特点是数据在线路上的传输是不连续的,线路上数据是以一个字符为单位来传输的。异步传输时,各个字符可以是连续传输,也可以是间隔传输,这完全由发送方根据需要来决定。另外,在异步传输时,同步时钟信号并不传送到接收端,即收发双方各用自己的时钟来控制发送和接收。 由于字符的发送是随机进行的,因此,对于接收端来说就有一个判断何时有字符来,何时是新的一个字符开始的问题。因此,在异步通信时,对字符必须规定统一的格式。 异步信息传输格式 一个字符通常由四部分组成:起始位、数据位、奇偶校验位和停止位。一个字符由起始位开始,停止位结束。奇偶校验位只占一位,为了简化分析我们暂且规定不用奇偶校验位。 起始位为0信号,占用一位,来通知接收端一个新的字符开始来到。线路上不传输字符时,应保持为1。接收端不断检测线路的状态,若连续为1以后又开始测到一个0,就知道是发来一个新字符,马上应准备接收。字符的起始位还被用来同步接收端的时钟,以保证以后的接收能正确进行。接收时钟信号RXC的频率是数据率的N倍,一般N=8,16,32,64等。由于异步通信双方各用自己的时钟源,若是时钟频率等于波特率,则频率稍有偏差便会产生接收误差,因此,采用较高频率的时钟,就能保证正确地捕获到信号。 起始位后面紧接着的是数据位,它可以是5位、6位、7位和8位。我们这里规定采用8位的数据位。注意在发送时,总是低位先发送(最低位LSB,最

linux进程间通讯的几种方式的特点和优缺点

1. # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 # 消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 # 信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存( shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 管道的主要局限性正体现在它的特点上: 只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等; 2. 用于进程间通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix和system v消息队列) 2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯) 3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区) 4. 过程调用(Solaris门,Sun RPC) 消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区

有效决策的六大步骤

有效决策的六大步骤 决策管理的六大步骤: 决策过程中最重要的工作是确定企业中不同部门、不同层级所制定的决策必须彼此相容,都能与企业整体目标相响应。 一是界定问题。(找到正确的问题、设定目标以及确立规则) 此阶段,要避免以下两种错误做法。一是只注意找出正确的答案,而不注重提出正确的问题;二是为错误的问题寻找正确的答案。 在现实生活中,没有任何问题呈现出的面貌可以让我们直接据以做出决定。许多问题,我们乍看之下,以为找到了关键因素,实际上这些因素却多半既不重要,也不相干,充其量只是症状而已。而且,最显而易见的症状往往透露不出任何重要线索。 在界定问题的过程中,我们必须假定症状可能会说谎,不同的问题可能会呈现出相同的症状,而同样的问题也可能会呈现出各种不同的症状。因此,管理者必须分析问题,而不是诊断问题。 要明确界定问题,管理者必须首先找到“关键因素”,即在做出任何改变或采取任何措施前必须率先改变的因素。 在界定问题时,要决定解决问题需要什么条件,同时彻底想清楚解决方案的目标为何。 解决方案的目标必须反映企业目标,聚焦于经营绩效和经营成果上,在短期的未来和长期的未来之间取得平衡,并且将企业整体以及经营企业所需要的活动一起纳入考虑。 同时,必须深思熟虑限制解决方案的各种规定。解决问题时,必须遵循哪些原则、政策和行为准则?公司可能规定,好的管理者培养计划的必要条件是不能有内定的当然人选。清楚说明这些规定是非常必要的,因为在许多情况下,必须改变既有政策或做法,才能做正确的决定。除非管理者彻底想清楚他想改变什么,以及为什么要改变,否则,他可能陷入既试图改变同时又维护既有做法的危险之中。 事实上,这类规定代表了所依循的价值体系。这个价值体系不会决定应该采取什么行动,只会决定不应该采取哪些行动。 二是分析问题。 找到正确的问题、设定目标及确立规则等步骤,构成了决策的第一个阶段。问题界定清楚之后,下一个阶段是分析问题:将问题分类,并寻找事实。 分析问题首先需要对问题进行分类,以确定谁是必须做出决策的人以及应该把决策内容传达给哪些人。如果没有预先将问题分类,将严重危害最后的决策品质,因为问题分类后将能说明如果要将决策转化为有效行动,应该由什么人做什么事情。 问题分类原则必须预先经过充分讨论,必须遵循以下四个原则:决策的未来性(企业采取行动所承诺的时间长短,以及决策会多快改变)、决策对于其他领域和其他部门的影响、决策品质的考虑、决策的独特性或周期性。这样的分类能确保决策对于企业整体产生实质贡献,

异步串行通信接口实验

计算机系统的通信实验 一.目的:了解计算机间的数据通信的基本技术; 了解RS─232C的结构及使用方法。RS----232C 9芯连接器插针定义如下: 二.使用设备:带有RS─232C通信接口的微型计算器及一根多芯电缆。 三.8250异步串行接口: IBM PC系统可选的串行异步通信接口板上用的UART是一片INS8250,以它为核心,附加一些辅助电路,如I / O地址译码电路电平变换电路等,组成了RS232C接口,所以,对RS232C编程实际上是对8250的编程。8250的逻辑框图如下:

(一)8250的编程模型 8250异步串行接口是用于IBM PC串行通讯的接口芯片,8250内含比特率分频器,无须外接,所以用它构成接口非常简单。有两个串口,每个串口上有10个寄存器,IBM PC系统只为这10个寄存器分配了连续的7个端口地址,其端口地址分配如下: 分配的端口地址输入还是输出相应寄存器 3F8H/2F8H*输出发送数据寄存器 3F8H/2F8H*输入接收数据寄存器 3F8H/2F8H+输出波特率分频器L(数据传输速度)3F9H/2F9H+输出波特率分频器H 3F9H/2F9H*输出中断允许寄存器 3FAH/2FAH 输入中断标识寄存器 3FBH/2FBH 输出线控制寄存器 3FCH/2FCH 输出Modem控制寄存器 3FDH/2FDH 输入线狀态寄存器 3FEH/2FEH 输入Modem狀态寄存器 注:标有*寄存器地址是线控制存器7位为0时的寄存器地址,标有+寄存器地址是线控制存器7位为1时的寄存器地址。 从功能上分,这10个寄存器可分为两组:一组用于工作方式,通信参数的控置和设置。如数据格式有关参数的设置,是否允许中断方式的设置以及是否使用RTS,DTR等联络控制信号等,属于这一组的有5个寄存器:波特率分频器L(低位)和H(高位) 线控制寄存器,Moden控制寄存器,中断允许寄存器。这5个寄存器都是在8250初始化时用OUT指令向其中置入初值的。另一组寄存器用于实现通信传输,有5个寄存器, 它包括:输入和输出的缓冲寄存器——接收数据寄存器和发送保持寄存器, 记忆当前状态的寄存器——线状态寄存器, Moden状态寄存器和中断标识寄存器。 (二)8250的初始化: 1.波特率的设置:(波特率分频器L和H)是用OUT指令向地址为3F8H和3F9H的两个波特率分频器置入合适的值实现的。 在初始化时,将线控寄存器最高为置1,然后写3F8H,3F9H便可对串行传送速率进行初始化。波特率分频器确定串行传送的速率(每秒传送的位数)如下: 波特率分频器H 分频器L 50 09H 00H 75 06H 00H 110 04H 17H 134.5 03H 59H 150 03H 00H 300 01H 80H 600 00H C0H 1200 00H 60H 1800 00H 40H 2000 00H 3AH 2400 00H 30H 3600 00H 20H

第3章 进程同步与通信 练习题答案

第3章进程同步与通信练习题 (一)单项选择题 1.临界区是指( )。 A.并发进程中用于实现进程互斥的程序段 B.并发进程中用于实现进程同步的程序段 C.并发进程中用户实现进程通信的程序段 D.并发进程中与共享变量有关的程序段 2.相关临界区是指( )。 A.一个独占资源 B.并发进程中与共享变量有关的程序段 c.一个共享资源 D.并发进程中涉及相同变量的那些程序段 3.管理若干进程共享某一资源的相关临界区应满足三个要求,其中( )不考虑。 A一个进程可以抢占己分配给另一进程的资源 B.任何进程不应该无限地逗留在它的临界区中c.一次最多让一个进程在临界区执行 D.不能强迫一个进程无限地等待进入它的临界区4、( )是只能由P和v操作所改变的整型变量。 A共享变量 B.锁 c整型信号量 D.记录型信号量 5.对于整型信号量,在执行一次P操作时,信号量的值应( )。 A.不变 B.加1 C减1 D.减指定数值 6.在执行v操作时,当信号量的值( )时,应释放一个等待该信号量的进程。 A>0 B.<0 c.>=0 D.<=0 7.Pv操作必须在屏蔽中断下执行,这种不可变中断的过程称为( )。 A初始化程序 B.原语 c.子程序 D控制模块 8.进程间的互斥与同步分别表示了各进程间的( )。 A.竞争与协作 B.相互独立与相互制约 c.不同状态 D.动态性与并发性 9并发进程在访问共享资源时的基本关系为( )。 A.相互独立与有交往的 B.互斥与同步 c并行执行与资源共享 D信息传递与信息缓冲 10.在进程通信中,( )常用信件交换信息。 A.低级通信 B.高级通信 c.消息通信 D.管道通信 11.在间接通信时,用send(N,M)原语发送信件,其中N表示( )。 A.发送信件的进程名 B.接收信件的进程名 C信箱名 D.信件内容 12.下列对线程的描述中,( )是错误的。 A不同的线程可执行相同的程序 B.线程是资源分配单位 c.线程是调度和执行单位 D.同一 进程中的线程可共享该进程的主存空间 13.实现进程互斥时,用( )对应,对同一个信号量调用Pv操作实现互斥。 A.一个信号量与一个临界区 B.一个信号量与—个相关临界区 c.一个信号量与一组相关临界 区 D一个信号量与一个消息 14.实现进程同步时,每一个消息与一个信号量对应,进程( )可把不同的消息发送出去。 A.在同一信号量上调用P操作 B在不同信号量上调用P操作 c.在同一信号量上调用v操作D.在不同信号量上调用v操作 (二)填空题 1.目前使用的计算机的基本特点是处理器______执行指令。 2.进程的______是指进程在顺序处理器上的执行是按顺序进行的。 3.当一个进程独占处理器顺序执行时,具有______和______两个特性。 4.进程的封闭性是指进程的执行结果只取决于______,不受外界影响。 5 进程的可再现性是指当进程再次重复执行时,必定获得______的结果。 6.一个进程的工作在没有全部完成之前,另一个进程就可以开始工作,则称这些进程为______.

Linux下的进程间通信-详解

Linux下的进程间通信-详解 详细的讲述进程间通信在这里绝对是不可能的事情,而且笔者很难有信心说自己对这一部分内容的认识达到了什么样的地步,所以在这一节的开头首先向大家推荐著 名作者Richard Stevens的著名作品:《Advanced Programming in the UNIX Environment》,它的中文译本《UNIX环境高级编程》已有机械工业出版社出版,原文精彩,译文同样地道,如果你的确对在Linux下编程有浓 厚的兴趣,那么赶紧将这本书摆到你的书桌上或计算机旁边来。说这么多实在是难抑心中的景仰之情,言归正传,在这一节里,我们将介绍进程间通信最最初步和最 最简单的一些知识和概念。 首先,进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信 方法:管道、消息队列、共享内存、信号量、套接口等等。下面我们将逐一介绍。 2.3.1 管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。 无名管道由pipe()函数创建: #include int pipe(int filedis[2]); 参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入。下面的例子示范了如何在父进程和子进程间实现通信。 #define INPUT 0 #define OUTPUT 1 void main() { int file_descriptors[2]; /*定义子进程号 */ pid_t pid; char buf[256]; int returned_count; /*创建无名管道*/ pipe(file_descriptors); /*创建子进程*/ if((pid = fork()) == -1) { printf("Error in fork\n"); exit(1); } /*执行子进程*/ if(pid == 0) { printf("in the spawned (child) process...\n"); /*子进程向父进程写数据,关闭管道的读端*/ close(file_descriptors[INPUT]); write(file_descriptors[OUTPUT], "test data", strlen("test data"));

有效决策的三种方式

有效决策的三种方式 亨利?明茨伯格 应该怎样制定决策?这个问题简单,我们很久以前就搞清楚了。首先提出问题,然后分析问题,再设计多项解决方案,最后确定最佳方案。当然,接下来还有方案的实施。 但是,所有的决策都是这样制定出来的吗?我们建议,这种推理的,或者称为“首先分 (seeing first) “首先构想” 析”(thinking first)的决策方式应该辅之以另外两种非常不同的方法: 的模式和“首先实践”(doing first)模式。管理人员综合使用这三种方式,可以提高决策的质量。健康的组织,和健康的人一样,这三种决策方式都是缺一不可的。 想想实际工作和生活中我们是怎样做出决定的,这里以一个生活中的故事为例。故事是由贝蒂姑妈的一个电话引起的。 “嗨,孩子,我想给你的新房子买件礼物,你们新家的主色调是什么?” “主色调?姑妈,我怎么知道这种事,我得问丽萨。喂,丽萨,贝蒂姑妈想知道我们新房子的主色调。” “黑色。”女儿丽萨回答。 “黑色?丽萨,你让我怎么住在里面?!” “黑色”,她重复道。 几天后,父女二人来到家具店买家具。他们试了所有的桌子椅子,没一件合适。两人变得无精打采。突然丽萨的目光落到一只黑色凳子上:“这只黑色凳子配白色餐台肯定很棒”!然后事情就好办了。一个小时之内,他们挑好了所有的家具,颜色是黑、白和青灰色。 这个寻常故事的不寻常之处在于:用我们传统的决策理论解释不了故事中决定的来龙去脉。我们甚至说不清楚哪个是最后的决定:买黑色凳子;布置新房子;用黑白色调布置房子;还是创造一种新的生活方式?决策制定的过程会令人感到难以捉摸。 “首先分析”模式的局限 推理的决策制定有一个步骤清晰的流程:定义—分析—设计—决定。但是事实证明,这种决策方式的实际运用并不普遍。 多年前本文的其中一位作者对若干决策的制定过程进行了研究,解析了这些决策做出的步骤,并用线性图画出整个过程。其中,建立一家新工厂的决策过程非常具有代表性。图形不停地回旋,新事件的出现使其中断,机遇使之改变方向,不停地迂回曲折,直到最终找到

进程间的通信

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 # 消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 # 信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) :套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 windows进程通信的几种方式(转) 2008-10-13 16:47 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。 Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象。 (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。 (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。 (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。 文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。 2 共享内存 Win32 API中共享内存(Shared Memory)实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射

相关文档
最新文档