ATL 服务程序

ATL 服务程序
ATL 服务程序

1. 新建项目。

1-1. 启动Visual Studio 2008。选择File -> New -> Project...。

1-2. 在New Project 对话框中,选择Visual C++ 中的ATL Project 模板,写入项目名称:ShowjiSvc,点OK。

1-3. 在打开的ATL Project Wizard - ShowjiSvc 中,点Application Settings,选择Server type 为

Service(EXE),点Finish。

2. 安装、卸载服务。

2-1. 编译项目。

2-2. 打开命令提示符,切换到编译后的目录,执行以下命令安装服务:

ShowjiSvc /Service

2-3. 打开服务管理,能找到一个名为ShowjiSvc 的服务,启动类型是Manual。可以启动服务、停止服务。2-4. 停止服务,然后用以下命令卸载服务:

ShowjiSvc /UnRegServer

3. 修改服务的配置。

3-1. 修改服务名称:

在Resource View 中打开String Table,修改IDS_SERVICENAME 的Caption 为服务的名称:Showji Mobile Service。

3-2. 修改服务的描述:

打开ShowjiSvc.cpp 文件,在CShowjiSvcModule 的声明中增加以下函数声明:

HRESULT RegisterAppId(bool bService);

再增加此函数的定义:

HRESULT CShowjiSvcModule::RegisterAppId(bool bService = false) throw()

{

HRESULT hr = S_OK;

BOOL res = __super::RegisterAppId(bService);

if (bService)

{

if (IsInstalled())

{

SC_HANDLE hSCM = ::OpenSCManagerW(NULL, NULL, SERVICE_CHANGE_CONFIG);

SC_HANDLE hService = NULL;

if (hSCM == NULL)

hr = AtlHresultFromLastError();

else

{

hService = ::OpenService(hSCM, m_szServiceName, SERVICE_CHANGE_CONFIG);

if (hService != NULL)

{

::ChangeServiceConfig(hService, SERVICE_NO_CHANGE,

SERVICE_AUTO_START,// 修改服务为自动启动

NULL, NULL, NULL, NULL, NULL, NULL, NULL,

m_szServiceName); // 通过修改资源IDS_SERVICENAME 修改服务的显示名字

SERVICE_DESCRIPTION Description;

TCHAR szDescription[1024];

ZeroMemory(szDescription, 1024);

ZeroMemory(&Description, sizeof(SERVICE_DESCRIPTION));

lstrcpy(szDescription, _T("https://www.360docs.net/doc/401097326.html,示例服务,by yangwei@https://www.360docs.net/doc/401097326.html,"));

Description.lpDescription = szDescription;

::ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION,

&Description);

::CloseServiceHandle(hService);

}

else

hr = AtlHresultFromLastError();

::CloseServiceHandle(hSCM);

}

}

}

return hr;

}

3-3. 测试修改后的服务。

重新注册服务,在服务管理器中可以看到服务的新名称和描述,并且启动状态已经修改为Automatic。

测试成功后,注销服务。

4. 修改服务的进程安全设置。

打开ShowjiSvc.cpp,在CShowjiSvcModule 的声明中,找到InitializeSecurity 函数,修改如下:HRESULT InitializeSecurity() throw()

{

return CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,

RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL );

}

要根据自己的情况,做相关的安全性设置。如果没有什么特殊的安全性要求,就按照上面的格式写就行了。如果没有设置进程安全性的代码,那么VC 客户端创建对象的时候,会返回E_ACCESSDENIED 的错误。VB 客户端的错误提示如下:

实时错误'70': 拒绝的权限(Run-time error '70': Permission denied)。

5. 增加服务的初始化和释放操作。

打开ShowjiSvc.cpp,在CShowjiSvcModule 的声明中,增加以下声明:HRESULT PreMessageLoop(int nShowCmd);

HRESULT PostMessageLoop();

增加以上声明的相关定义:

HRESULT CShowjiSvcModule::PreMessageLoop(int nShowCmd) throw() {

HRESULT hr = __super::PreMessageLoop(nShowCmd);

if (SUCCEEDED(hr))

{

// Add any custom code to initialize your service

}

return hr;

}

HRESULT CShowjiSvcModule::PostMessageLoop() throw()

{

HRESULT hr = __super::PostMessageLoop();

if (SUCCEEDED(hr))

{

// Add any custom code to uninitialize your service

}

return hr;

}

在相关的描述位置增加自己的代码即可。

6. 为服务增加一个叫做MyMath 的示例组件。

6-1. 选中ShowjiSvc 项目,点菜单Project -> Add Class...,选择ATL 中的ATL Simple Object,点Add。6-2. 在打开的ATL Simple Object Wizard - ShowjiSvc 对话框的Short name 中写入组件名称:MyMath。其它名称会自动填好(当然您也可以修改)。

6-3. 在Option 中可以看到许多选项。如果您搞不懂这些,就保留默认值吧(建议看一下COM 的相关书籍)。

6-4. 打开MyMath.rgs,为组件增加服务程序的ID(代码中的红色粗体部分):

HKCR

{

ShowjiSvc.MyMath.1 = s 'M yMath Class'

{

CLSID = s '{37F47E87-7D33-43CD-B591-DA01023F90BC}'

}

ShowjiSvc.MyMath = s 'M yMath Class'

{

CLSID = s '{37F47E87-7D33-43CD-B591-DA01023F90BC}'

CurVer = s 'ShowjiSvc.MyMath.1'

}

NoRemove CLSID

{

ForceRemove {37F47E87-7D33-43CD-B591-DA01023F90BC} = s 'M yMath Class'

{

ProgID = s 'ShowjiSvc.MyMath.1'

VersionIndependentProgID = s 'ShowjiSvc.MyMath'

ForceRemove 'Programmable'

LocalServer32 = s '%MODULE%'

val AppID = s '%APPID%'

'TypeLib' = s '{55E58774-E86F-4482-A521-38AE8C85FD1D}'

}

}

}

AppID 必须设置,否则客户端创建对象的时候会超时并报错误:80080005 server execution failed。

并且,系统日志中会出现一个错误:The server {uuid} did not register with DCOM within the required timeout. VB 客户端的错误提示如下:

实时错误'429': ActiveX 部件不能创建对象(Run-time error '429': ActiveX component can't create object)。

7. 为MyMath 组件增加一个方法。

7-1. 在Class View 中,右击IMyMath,选择Add -> Add Method...。

7-2. 在打开的Add Method Wizard - ShowjiSvc 对话框中,输入Method name: Sum;

Parameter type 选择LONG,Parameter name 写a,Parameter attributes 选择in,点一下Add;Parameter type 选择LONG,Parameter name 写b,Parameter attributes 选择in,点一下Add;Parameter type 选择LONG*,Parameter name 写s,Parameter attributes 选择retval,点一下Add;

点Finish 添加这个方法。

7-3. 打开MyMath.cpp 文件,找到Sum 方法,修改如下:

STDMETHODIMP CMyMath::Sum(LONG a, LONG b, LONG* s)

{

*s = a + b;

return S_OK;

}

8. 编译、注册、启动服务。

8-1. 编译代码。

8-2. 注册服务,执行以下命令行代码:

ShowjiSvc /Service

8-3. 启动服务,执行以下命令行代码:

net start "Showji Mobile Service"

当然,也可以在服务管理器中启动服务。

相对应的停止服务的命令是:

net stop "Showji Mobile Service"

9. 客户端访问测试(用VB6 举例)。

9-1. 打开Visual Basic 6.0。

9-2. 新建“标准EXE”工程。

9-3. 点菜单:工程-> 引用...,找到ShowjiSvc 1.0 Type Library 并勾选,点确定。

9-4. 双击Form1 窗体,进入代码模式,输入以下代码:

Private Sub Form_Load()

Dim math As ShowjiSvcLib.MyMath

Set math = New ShowjiSvcLib.MyMath

MsgBox math.Sum(10, 19)

Set math = Nothing

End Sub

执行后可以看到,VB 正常初始化了系统服务中的COM 对象,并调用了其中的方法。

10. 部署。

要将项目部署到其它电脑,需要安装Microsoft Visual C++ 2008 Redistributable Package,否则会提示错误:系统无法执行指定的程序(The system cannot execute the specified program.)。

安装“-service”的,卸载用“-UnRegServer”

下面介绍使用VC++开发Windows服务程序。

首先运行VC++6,选择新建工程,在出现的下面窗口中选择”A TL COM AppWizard“,并选择工程放置位置和相应的工程名,然后选择确定按钮。

此时出现如下图窗口界面,在此界面中选择”服务(EXE)“,然后选择完成按钮。

在接下来的窗口中选择确定按钮。

则VC完成向导并生成相应代码(效果如下)。

程序的进入点是全局函数_tWinMain, 仔细看一下这个函数,我们会发现当我们运行程序时,可以加上参数,例如: winsvr /RegServer 或者winsvr -RegServer,这个是用来本地服务器注册(Register as Local S Register as Service erver)。

其中winsvr / Service 或者winsvr -Service,这个是服务的注册(Register as Service);winsvr /UnRegServer 或者winsvr -UnRegServer ,这个是服务的删除。

所以,当我们写好了服务程序,只要运行的时候加上参数Service ,这个时候在SCM中就会看到我们的服务了。

每次编码后测试都要在命令行中加参数运行服务才可以在SCM中列出来这样很麻烦,因此可以采用如下方式来处理:选择VC IDE的菜单工程-> 设置, 再选择自定义组建面板(如下图所示)

在"$(TargetPath)" /RegServer的下面加上:"$(TargetPath)" /Service,这样当我们每次编码后编译程序,就不用再在命令行中去加参数执行我们的服务程序完成服务的注册了。

同时通过界面我们也看到,向导为我们建立了一个类:CServiceModule,全局变量_Module就是这个类的实例。

Init():这个函数用于完成一些初始化工作;

Run():这个函数就是服务开始运行后的内容,我们接下来要修改的内容也就是从这里入手。

Install():有如下一段代码

SC_HANDLE hService = ::CreateService(

hSCM, m_szServiceName, m_szServiceName,

SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,

SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,

szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL);

注意:如果服务中启动的程序具有窗口(即具有交互功能则要求使用如下代码)

SC_HANDLE hService = ::CreateService(

hSCM, m_szServiceName, m_szServiceName,

SERVICE_ALL_ACCESS, SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS,

SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,

szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL);

这个CreateService函数原先如下:

SC_HANDLE CreateService(

SC_HANDLE hSCManager, // handle to SCM database

LPCTSTR lpServiceName, // name of service to start

LPCTSTR lpDisplayName, // display name

DWORD dwDesiredAccess, // type of access to service

DWORD dwServiceType, // type of service

DWORD dwStartType, // when to start service

DWORD dwErrorControl, // severity of service failure

LPCTSTR lpBinaryPathName, // name of binary file

LPCTSTR lpLoadOrderGroup, // name of load ordering group

LPDWORD lpdwTagId, // tag identifier

LPCTSTR lpDependencies, // array of dependency names

LPCTSTR lpServiceStartName, // account name

LPCTSTR lpPassword // account password

);

第六个参数是服务的启动类型。

SERVICE_DEMAND_START是手动启动,SERVICE_AUTO_START是自动启动。

第十一个参数是服务的依存关系,比如说服务的启动想要依存SQL Server的启动,那我们可以把这个参数写成:

_T("MSSQLSERVER\0");

如果我们写的服务不依存于其他的任何服务,那我们就将此参数设置为NULL就可以了。

接下来我们实现我们需要实现的业务。

首先,我们在类CServiceModule中找到Run函数,并在Run函数中找到以下代码:MSG msg;

while (GetMessage(&msg, 0, 0, 0))

DispatchMessage(&msg);

并在此代码前加入自己的代码,我这里加入的代码:CustomFunc1()。

这里对应不同应用有不同写法:

1、如果要启动一个窗口进行交互,则代码如下:

定义两个成员函数CustomFunc1和CustomFunc2

void CServiceModule::CustomFunc1()

{

TCHAR szFilePath[MAX_PA TH + 1];

GetModuleFileName(NULL, szFilePath, MAX_PA TH);

(_tcsrchr(szFilePath, _T('\\')))[1] = 0; //删除文件名,只获得路径

CString str_url = szFilePath;

str_url=str_url+"B.exe";

LogEvent("运行程序:"+str_url);

UINT rtn=WinExec(str_url,SW_SHOW );

//UINT rtn=WinExec("c:\\windows\\system32\\cmd.exe",SW_SHOWNORMAL);

if(rtn>31){

LogEvent("调用成功");

}

else{

if(rtn==0){

LogEvent("内存不足");

}

else{

if(rtn==ERROR_BAD_FORMA T){ //ERROR_BAD_FORMA T = 11

LogEvent("EXE 文件无效");

}

else{

if(rtn==ERROR_FILE_NOT_FOUND){ //ERROR_FILE_NOT_FOUND = 2 LogEvent("文件名错误");

}

else{

if(rtn==ERROR_PATH_NOT_FOUND){ //ERROR_PA TH_NOT_FOUND = 3 LogEvent("路径名错误");

}

else{

LogEvent("发生其它错误");

}

}

}

}

}

}

BOOL CServiceModule::CustomFunc2()

{

HDESK hdeskCurrent;

HDESK hdesk;

HWINSTA hwinstaCurrent;

HWINSTA hwinsta;

hwinstaCurrent = GetProcessWindowStation();

if (hwinstaCurrent == NULL){

LogEvent(_T("get window station err"));

return FALSE;

}

hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());

if (hdeskCurrent == NULL){

LogEvent(_T("get window desktop err"));

return FALSE;

}

//打开winsta0

hwinsta = OpenWindowStation("winsta0", FALSE,

WINSTA_ACCESSCLIPBOARD |

WINSTA_ACCESSGLOBALA TOMS |

WINSTA_CREA TEDESKTOP |

WINSTA_ENUMDESKTOPS |

WINSTA_ENUMERA TE |

WINSTA_EXITWINDOWS |

WINSTA_READA TTRIBUTES |

WINSTA_READSCREEN |

WINSTA_WRITEATTRIBUTES);

if (hwinsta == NULL){

LogEvent(_T("open window station err"));

return FALSE;

}

if (!SetProcessWindowStation(hwinsta)){

LogEvent(_T("Set window station err"));

return FALSE;

}

//打开desktop

hdesk = OpenDesktop("default", 0, FALSE,

DESKTOP_CREATEMENU |

DESKTOP_CREATEWINDOW |

DESKTOP_ENUMERA TE |

DESKTOP_HOOKCONTROL |

DESKTOP_JOURNALPLAYBACK |

DESKTOP_JOURNALRECORD |

DESKTOP_READOBJECTS |

DESKTOP_SWITCHDESKTOP |

DESKTOP_WRITEOBJECTS);

if (hdesk == NULL){

LogEvent(_T("Open desktop err"));

return FALSE;

}

SetThreadDesktop(hdesk);

CustomFunc1();

if (!SetProcessWindowStation(hwinstaCurrent)) return FALSE;

if (!SetThreadDesktop(hdeskCurrent))

return FALSE;

if (!CloseWindowStation(hwinsta))

return FALSE;

if (!CloseDesktop(hdesk))

return FALSE;

return TRUE;

}

2、无交互窗口,则代码如下:

void CServiceModule::CustomFunc1(){

LogEvent(_T("Custorm Function Invoked")); //这里可以改成任何你需要的代码,当然不能有显示窗口之内的代码,要显示窗口之内代码请采用上面方法1。

}

现在可以编译并执行程序了。

此时会编译时会报告一个错误:'CString' : undeclared identifier。

这时需要查看工程的一些设置:

菜单工程->设置,常规面板,默认的设置是:使用MFC作为静态连接库。如果是这个设置则做如下工作:然后我们打开StdAfx.h文件,并找到#include 位置,并在它之前加入#include 。重新编译可以了。

如果需要修改出现在scm中的服务名,可以在工程中找到资源文件中的IDS_SERVICENAME项的内容就可以了。

注意:编译好了的程序需要在控制台中输入如下指令

1、注册服务

winsvr /regserver

winsvr /service //此条指令十分重要,如果不执行则在scm中是看不到此服务的

2、注销服务

winsvr /unregserver

简单的客户服务流程规范

第一章服务体系 良好的客服形象良好的技术 良好的客户关系良好的品牌 一、“5S4E”服务 “5S4E”的宗旨是“客户永远是第一位”,从客户的实际需求出发,为客户提供真正有价值的服务,帮助客户更好地使用产品。体现了“良好的客服形象、良好的技术、良好的客户关系、良好的品牌”的核心服务理念,要求以最专业性的服务队伍,及时和全方位地关注客户的每一个服务需求,并通过提供广泛、全面和快捷的服务,使客户体验到无处不在的满意和可信赖的贴心感受。 通过建立一个完善的服务体系和服务质量监督体系,从而能为用户提供“亲切、快捷、专业”的体验。 通过建立一个良好的内部激励机制,培养一支充满活力的、能兢兢业业为客户服务的“友好、高效、专业”的客户服务队伍。 二、“5S4E”服务体系简介

“5S4E服务”提出了坚持服务质量和服务满意度的5个标准及客户服务将要达到的4个核心目的,即要以smiling(微笑)和sincere(诚挚)的服务态度,客户的服务需求在第一时间得到响应,得到充分的重视;要以speciality(专业)和speedy(快速)的服务水准,建构我们规范和专业的服务体系,第一时间解决客户应用中的问题,为客户提供量身定做的专业性服务;通过长期不懈、坚持永续的服务,持续提升客户服务价值,达到客户satisfied(满意)的服务效果。最终为客户提供快捷而不失其细心,专业而不失其亲切,持续而不失其稳定的高质量服务,提供品牌的认知度。也就是我们的核心“excellent customer service visualization(良好的客服形象)、excellent technology(良好的技术)、excellent customer relationship(良好的客户关系)及excellent brand(良好的品牌)” 客户服务部:是“5S4E”服务体系的最高管理机构,负责制定“5S4E”整体发展规划、客户服务规范与管理程序、XXXX各维修及销售类产品线服务政策、对各地维修站提供支持与监督工作。同时负责处理用户投诉及800免费技术咨询热线、互联网网上技术支持的日常运作。 各地维修站及技术工程部:是XX在全国各地的服务机构,负责为所在区域的XX 客户提供全方位的技术服务,并对相关产品维护人员提供适当培训。目前XX已在全国各地建立40个维修中心,覆盖面正逐步扩大。 三、“5S4E”特色 从客户的实际需求出发,努力探寻对客户真正有价值的新的服务内容与服务方式,形成有别于业界其他厂家的服务特色,是“5S4E”的不懈追求。

单片机_C语言函数_中断函数(中断服务程序)

单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题。 (1)中断源:中断请求信号的来源。(8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1(这两个低电平有效,上面的那个横杠不知道怎么加上去))(2)中断响应与返回:CPU采集到中断请求信号,怎样转向特定的中断服务子程序,并在执行完之后返回被中断程序继续执行。期间涉及到CPU响应中断的条件,现场保护,现场恢复。 (3)优先级控制:中断优先级的控制就形成了中断嵌套(8051允许有两级的中断嵌套,优先权顺序为INT0,T0,INT1,T1,串行口),同一个优先级的中断,还存在优先权的高低。优先级是可以编程的,而优先权是固定的。 80C51的原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行的中断不能被同一级的中断请求或低优先级的中断请求中断。 80C51的中断系统涉及到的中断控制有中断请求,中断允许,中断优先级控制 (1)3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 (2)中断控制寄存器:定时和外中断控制寄存器TCON(包括T0、T1,INT0、INT1),串行控制寄存器SCON,中断允许寄存器IE,中断优先级寄存器IP 具体的是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲。 在这里我们讲下注意的事项 (1)CPU响应中断后,TF0(T0中断标志位)和TF1由硬件自动清0。 (2)CPU响应中断后,在边沿触发方式下,IE0(外部中断INT0请求标志位)和IE1由硬件自动清零;在电平触发方式下,不能自动清楚IE0和IE1。所以在中断返回前必须撤出INT0和INT1引脚的低电平,否则就会出现一次中断被CPU多次响应。 (3)串口中断中,CPU响应中断后,TI(串行口发送中断请求标志位)和RI(接收中断请求标志位)必须由软件清零。 (4)单片机复位后,TCON,SCON给位清零。 C51语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序的格式: void 函数名() interrupt m [using n] {} 关键字 interrupt m [using n] 表示这是一个中断函数 m为中断源的编号,有五个中断源,取值为0,1,2,3,4,中断编号会告诉编译器中断程序的入口地址,执行该程序时,这个地址会传个程序计数器PC,于是CPU开始从这里一条一条的执行程序指令。 n为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为0,1,2,3 中断号中断源 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1中断 4 串行口中断 (在上一篇文章中讲到的ROM前43个存储单元就是他们,这5个中断源的中断入口地址为: 这40个地址用来存放中断处理程序的地址单元,每一个类中断的存储单元只有8B,显然不

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

导游服务程序

导游服务程序 (总分:97.00,做题时间:90分钟) 一、{{B}}填空题{{/B}}(总题数:3,分数:6.00) 1.旅游车离开机场(车站),北京地陪的首次导游正式开始。这是地陪展示知识、技能的好机会。精彩的导游词,不仅满足了旅游者的 1和 2,也有助于旅游者对地陪产生 3,从而帮助地陪树立良好的形象。P61 (分数: 2.00) 填空项1:__________________ (正确答案:好奇心) 填空项1:__________________ (正确答案:求知欲) 填空项1:__________________ (正确答案:信任感) 解析: 2.全陪应协助 1办理旅游团的住店手续,请 2分配住房,记住 3及 4的住房号,最好掌握全团住房分配名单;全陪拿到自己的住房钥匙后应告知 5。P75 (分数:2.00) 填空项1:__________________ (正确答案:领队) 填空项1:__________________ (正确答案:领队) 填空项1:__________________ (正确答案:领队) 填空项1:__________________ (正确答案:重要人员) 填空项1:__________________ (正确答案:全团) 解析: 3.用餐后,地陪应严格按照 1、 2、 3,填写 4或用现金与餐厅结账。P66 (分数:2.00) 填空项1:__________________ (正确答案:实际用餐人数) 填空项1:__________________ (正确答案:标准) 填空项1:__________________ (正确答案:饮用酒水数量) 填空项1:__________________ (正确答案:《餐饮费结算单》) 解析: 二、{{B}}判断题{{/B}}(总题数:15,分数:15.00) 4.地陪的导游服务程序是指地陪从接受接待社下达的旅游团接待任务起,到旅游团离开本地并做完结束工作为止的工作程序。( )P57 (分数:1.00) A.正确√ B.错误 解析: 5.日程安排是旅游产品的一个重要部分,旅游者有权审核该团的活动计划和具体安排,也有权提出修改意见,地陪应主动与旅游团核定日程安排。( )P62 (分数:1.00) A.正确√ B.错误 解析: 6.如果领队、全陪(国内团)提出的要求涉及接待规格、可能影响旅游活动顺利进行时,地陪不能当场拒绝的,应请示接待社有关部门,按其决定妥善处理。( )P63 (分数:1.00) A.正确√ B.错误 解析:

导游服务程序与标准

导游服务程序与标准 第一节旅游团队导游服务集体 一、旅游团队导游服务集体的组成 旅游团队就是通过旅行社或旅游服务中介机构,采取支付综合包价或部分包价的方式,有组织地按预定行程计划进行旅游消费活动的游客群体。 关键词:包价预定行程计划游客群体 旅游团导游服务集体通常就是由全陪导游人员、地陪导游人员与领队组成。 二、全陪、地陪与领队的相互关系 (一)分工明确,各有侧重 1.全陪工作重点:实施旅游接待计划 2.地陪工作重点:当地旅游活动安排及接待+导游讲解 3.领队工作重点:组织与团结工作 (二)密切配合,相互协作 共同点: 1.共同的工作对象 2.共同的工作任务 3.共同的工作目标 4.共同的利益(全陪与地陪) (三)求同存异,相互谅解

第二节地陪规范服务流程 《导游服务质量标准》要求“地陪应按时做好旅游团(者)的迎送工作;严格按照接待计划,做好旅游团(者)的参观游览活动中的导游讲解工作与计划内的食宿、购物、文娱等活动的安排;妥善处理各方面的关系与出现的问题。” 一、准备工作 地陪的准备工作应在接到旅行社分配的任务、领取了盖有旅行社印章的接待计划后立即开始。 (一)熟悉接待计划 接待计划就是组团旅行社委托各地方接待社组织落实旅游团活动的契约性文件,就是导游人员了解该团基本情况与安排活动日程的主要依据。地陪须在上团前三天领取接待计划。通过阅读分析,熟悉并掌握旅游团的以下情况: 1.旅游团的基本信息 2.旅游团成员的基本情况 3.全程旅游路线,海外旅游团的入出境地点 4.所乘交通工具情况 5.掌握交通票据的情况 (1)OK票,即已订妥日期、航班与机座的机票。持OK票的旅客若在该联程或回程程站停留72小时以上,国内机票需在联程或回程航班起飞前两天中午12小时以前,国际机票需在72小时前办理座位再证实手续,否则原座位不予保留。 (2)OPEN票,就是不定期机票,旅客乘机前需持机票与有效证件(护照、身份证等)去航空公司办理订座手续。订妥座位后才能乘机,此种客票无优先权、无折扣优惠。 6.掌握特殊要求与注意事项 (二)落实接待事宜

计算机组成原理中断实验报告

北京建筑大学 2015/2016 学年第二学期 课程设计 课程名称计算机组成原理综合实验 设计题目微程序控制器设计与实现 系别电信学院计算机系 班级计141 学生姓名艾尼瓦尔·阿布力米提 学号 完成日期二〇一六年七月八日星期五 成绩 指导教师 (签名) 计算机组成综合实验任务书

指令执行流程图; ?5、利用上端软件,把所编写的微程序控制器内容写入实验台中控制器中。 ?6、利用单拍测试控制器与编程的要求是否一致。如果有错误重新修改后再写入控制器中。 7、编写一段测试程序,测试控制器运行是否正确。 实验目的 1.融合贯通计算机组成原理课程,加深对计算机系统各模块的工作原理及相互联系(寄存器堆、运算器、存储器、控制台、微程序控制器)。 2.理解并掌握微程序控制器的设计方法和实现原理,具备初步的独立设计能力;3.掌握较复杂微程序控制器的设计、调试等基本技能;提高综合运用所学理论知识独立分析和解决问题的能力。 实验电路 1. 微指令格式与微程序控制器电路 2.微程序控制器组成 仍然使用前面的CPU组成与机器指令执行实验的电路图,但本次实验加入中断系统。这是一个简单的中断系统模型,只支持单级中断、单个中断请求,有中断屏蔽功能,旨在说明最基本的原理。

中断屏蔽控制逻辑分别集成在2片GAL22V10(TIMER1 和TIMER2)中。其ABEL语言表达式如下: INTR1 := INTR; INTR1.CLK = CLK1; IE := CLR & INTS # CLR & IE & !INTC; IE.CLK= MF; INTQ = IE & INTR1; 其中,CLK1是TIMER1产生的时钟信号,它主要是作为W1—W4的时钟脉冲,这里作为INTR1的时钟信号,INTE的时钟信号是晶振产生的MF。INTS微指令位是INTS机器指令执行过程中从控制存储器读出的,INTC微指令位是INTC机器指令执行过程中从控制存储器读出的。INTE是中断允许标志,控制台有一个指示灯IE显示其状态,它为1时,允许中断,为0 时,禁止中断。当INTS = 1时,在下一个MF的上升沿IE变1,当INTC = 1时,在下一个MF的上升沿IE变0。CLR信号实际是控制台产生的复位信号CLR#。当CLR = 0时,在下一个CLK1的上升沿IE变0。当 CLR=1 且INTS = 0 且 INTC = 0时,IE保持不变。 INTR是外部中断源,接控制台按钮INTR。按一次INTR按钮,产生一个中断请求正脉冲INTR。INTR1是INTR经时钟CLK1同步后产生的,目的是保持INTR1与实验台的时序信号同步。INTR脉冲信号的上升沿代表有外部中断请求到达中断控制器。INTQ是中断屏蔽控制逻辑传递给CPU的中断信号,接到微程序控制器上。当收到INTR脉冲信号时,若中断允许位INTE=0,则中断被屏蔽,INTQ仍然为0;若INTE =1,则INTQ =1。

51单片机串行口中断服务程序

51单片机串行口中断服务程序 ---------------------------------------------------------------------------- //串口中断服务程序,仅需做简单调用即可完成串口输入输出的处理 //编程:聂小猛。该资料来自“51单片机世界”https://www.360docs.net/doc/401097326.html,/~dz2000,欢迎访问。 //出入均设有缓冲区,大小可任意设置。 //可供使用的函数名: //char getbyte(void);从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。 //getline(char idata *line, unsigned char n); 获取一行数据回车结束,已处理backspce和delete,必须定义最大输入字符数 //putinbuf(uchar c);模拟接收到一个数据 //putbyte(char c);放入一个字节到发送缓冲区 //putbytes(unsigned char *outplace,j);放一串数据到发送缓冲区,自定义长度 //putstring(unsigned char code *puts);发送一个字符串到串口 //puthex(unsigned char c);发送一个字节的hex码,分成两个字节发。 //putchar(uchar c,uchar j);发送一个字节数据的asc码表达方式,需要定义小数点的位置 //putint(uint ui,uchar j);发送一个整型数据的asc码表达方式,需要定义小数点的位置 //CR;发送一个回车换行 //************************************************************************* #include //该头文件包括了51,52,80320的特殊寄存器,用在51,52上也可 #define uchar unsigned char #define uint unsigned int #define OLEN 64 /* size of serial transmission buffer */ idata unsigned char outbuf[OLEN]; /* storage for transmission buffer */ unsigned char idata *outlast=outbuf; //最后由中断传输出去的字节位置 unsigned char idata *putlast=outbuf; //最后放入发送缓冲区的字节位置 #define ILEN 2 /* size of serial receiving buffer */ idata unsigned char inbuf[ILEN]; unsigned char idata *inlast=inbuf; //最后由中断进入接收缓冲区的字节位置 unsigned char idata *getlast=inbuf; //最后取走的字节位置 bit outbufsign; //输出缓冲区非空标志有=1 bit inbufsign; //接收缓冲区非空标志有=1 bit inbufful; //输入缓冲区满标志满=1 #define CR putstring("\r\n") //CR=回车换行 //***************************** //放入一个字节到发送缓冲区 putbyte(char c) {uchar i,j; ES=0; /*暂停串行中断,以免数据比较时出错? */ if (outlast==putlast ) { i=(0-TH1); do{i--;j=36; do {j--;}while(j!=0);

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

定时中断T0服务程序参考框图

软件程序: ORG 0000H LJMP MAIN ORG 000BH LJMP PIT0 ORG 001BH LJMP PIT1 ORG 0100H MAIN: MOV SP,#FH ;设堆栈指针 MOV SCON,#00H ;设置串行口为方式0 MOV TMOD,#11H ;T0和T1初始化为方式1 MOV TH0, #3CH ;置时间常数,T0和T1定时100ms MOV TL0, #OB0H MOV TH1, #3CH MOV TL1, #0B0H MOV 50H, #96H ;T0中断次数计数单元 MOV 51H,#14H ;T1中断次数计数单元 MOV R1, #00H MOV R2, #00H MOV R0, #40H ;显示缓冲单元起始地址 DISP0:MOV @R0, #00H ;显示缓冲单元清零 INC R0 CJNE R0, #4CH,DISP0 MOV 44H,#01H ;设置通道号的显示缓冲单元 MOV 48H,#02H MOV R7,#40H ;置当前通道显示缓冲单元首址 MOV 53H,#40H SETB ETO ;开中断 SETB ET1 SETB EA SETB TR0 ;启动定时器 SETB TR1 LP: MOV R7, 53H ;调显示子程序 ACALL DISP AJMP JP 定时器TO中断服务程序 PIT0: MOV TH0, #3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 50H,#96H PUSH ACC PUSH 03H ACALL WDXJ ;调温度巡检子程序 POP 03H POP ACC

DH0: RET1 定时器T1中断服务程序 PIT1: MOV TH1,#3CH ;重置时间常数 MOV TL0, #OBOH DJNZ 51H,DH1 ;计数20次即定时2S MOV 51H,#14H INC R2 CJNE R2,#03H,CNL0 ;根据R2中的内容确定显示缓冲区首址 MOV R2,#00H CNL0: CJNE R2,#00H,CNL1 MOV 53H,#40H SJMP DH1 CNL1: CJNE R2,#01H,CNL2 MOV 53H,#40H SJMP DH1 CNL2: MOV 53H,#48H DH1: RETI 显示子程序 DISP: CLR P3.7 ;输出锁存 MOV R3,#01H ;置显示字位码 MOV DPTR,#TAB DISP1:MOV A,R3 MOV SBUF,A ;字位码送串行口 JNB T1,$ ;等待串行转送结束 CLR T1 ;清串行中断标志 MOV A,R7 MOV R0,A MOV A,@RO ;取代显示的数据 MOVC A,@R0 ;查表求字段码 MOV SBUF, A ;字段码送串行口, JNB T1,$ ;等待串行中断标志 SETB P3.7 ;允许输出显示 ACALL DEL ;调延时子程序 MOV A,R3 JB ACC.3,DISP2 ;4位显示完否 RL A MOV R3,A INC R7 CLR P3.7 ;输出锁存 AJNP DISP1 DISP2:RET TAB : DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DEL: PUSH 07H ;延时子程序

2011导游服务程序

2011导游服务程序 (总分:95.00,做题时间:90分钟) 一、{{B}}判断题{{/B}}(总题数:16,分数:16.00) 1.地陪的导游服务程序是指地陪从接受接待社下达的旅游团接待任务起,到旅游团离开本地并做完结束工作为止的工作程序。( ) (分数:1.00) A.正确√ B.错误 解析: 2.日程安排是旅游产品的一个重要部分,旅游者有权审核该团的活动计划和具体安排,也有权提出修改意见,地陪应主动与旅游团核定日程安排。( ) (分数:1.00) A.正确√ B.错误 解析: 3.如果领队、全陪(国内团)提出的要求涉及接待规格、可能影响旅游活动顺利进行时,地陪不能当场拒绝的,应请示接待社有关部门,按其决定妥善处理。( ) (分数:1.00) A.正确√ B.错误 解析: 4.用餐时,地陪领旅游者进餐厅就座,简单介绍餐馆及菜肴特色后方可离开。( ) (分数:1.00) A.正确 B.错误√ 解析: 5.旅游团计划内的文娱演出,导游人员应陪同前往,引导旅游者入座;自费的文娱活动,地陪要协助购票,安排车辆,费用由旅游者自理。( ) (分数:1.00) A.正确√ B.错误 解析: 6.用餐过程中地陪应去旅游者用餐餐厅一两次,了解情况,并解答旅游者问题,如发现有用餐质量问题,必要时可报告接待社。( ) (分数:1.00) A.正确√ B.错误 解析: 7.如果领队提出与原日程不符或涉及接待规格的要求时,全陪要及时报告接待社。( ) (分数:1.00) A.正确 B.错误√ 解析: 8.导游人员应提前30分钟到达机场、车站迎接外地来京散客和小包价旅游团,散客若乘火车来京,导游应在车站出口明显位置举牌等候。( ) (分数:1.00) A.正确

第5章 中断服务程序设计

第5章中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0级)还高的“任务”。 5.1中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: ●紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 ●关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 ●频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 ●快捷性:ISR处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2不受操作系统管理的中断服务程序 正常情况下,ISR应受操作系统的管理,因很多任务是靠ISR触发的。 但在两种情况下ISR不受操作系统管理:①没有必要;②操作系统没有对该ISR进行管理。 实时操作系统uC/OS-Ⅱ移植到ARM7体系的CPU上时,没有对FIQ进行处理,即FIQ 是不受操作系统管理的。 选用FIQ来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ专有的8个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s中,已经把汇编代码部分处理好,用户只需要用C 语言编写快速中断服务函数FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序:Startup.s中队FIQ的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0

第二章 导游服务工作程序练习一

第二章导游服务工作程序练习一 姓名成绩 一、判断题(判断对的请选A,判断错的请选B,并将你所选的答案写在序列号左边的位置上。共40题,每小题0.5分,共20分。) 1.地陪的服务程序共有八大步骤。 2.散客旅游产品的特点是既可“组合”,又可“拆零”,便于旅游者按各自得需求进行购买。 3.地陪的业务准备主要是做好计划准备、活动日程设计和住店的落实工作。 4.女性导游员在工作过程中要注重礼仪,一般而言,白天化淡妆,晚上可化浓妆。 5.首次与司机约定接头地点和出发时间,宜提前45分钟为妥。 6.导游人员自身的形象是个人行为。 7.导游人员应讲究,且要把讲究穿戴和追求工作质量结合起来。 8.夏天接团时,女性导游员不可以光脚穿鞋,穿袜子时一定不要让人看见袜口。 9.在步出迎接地点时,导游人员应主动为游客拎拿行李、外套、提包等。 10.游客上车时,导游人员应先登车,以便协助旅游者就座和放置物品。 11.年长者对年轻者或身份高者对身份低者握手时,应双手握住对方的手。 12.旅游者上、下车时,导游人员应恭候在车门旁,热情地搀扶和协助每一位旅游者。 13.旅游团抵达接站地点后,地陪首先应向全陪和领队核实人数。 14.在游客上车时,对待美国老年人,导游员未必要伸手搀扶。 15.首次沿途导游时,导游人员不宜进行内容过多的讲解,应该让旅游者有时间休息。 16.接团时,如遇使用的车辆系小型客车,地陪应坐在中间位置,以方便与客人交流。 17.对于一般观光旅游团,核对、商定日程的时间可以在首次沿途导游过程中,也可以在旅 游团抵达饭店后进行。 18.观光、游览活动是导游服务工作的中心环节。 19.旅游团当天出发游览前,地陪应提前10分钟到达集合地点。 20.只要是重大的新闻和热情的话题,导游人员就应该尽快向旅游者介绍。 21.地陪在景点导游讲解时,要做到心中有数,先讲什么、后讲什么,中间穿插什么典故和 趣闻故事都要预先设计。 22.旅游团第一餐安排在旅游者进房前还是进房后,要根据旅游者的需求而定。 23.旅游团系火车或汽车离开当地,地陪应等交通工具启动后方可返回。 24.旅游团乘坐交通工具离开当地前,地陪应将交通票据和行李托运单交给全陪或领队。 25.地陪送走旅游团后,意味着全陪接待工作已经结束。 26.全陪的欢迎词尽量简洁,没有必要简述全程旅游行程和提醒注意相关事项。 27.全陪可以单独前往旅游团相应的入境口岸迎接入境旅游团。 28.全陪在途中服务过程中,要做好机位和铺位的分配工作,并保管好交通票据和行李托运 单。 29.旅游团在向异地城市移动过程中,全陪主要的任务是提醒旅游者注意人身和财物的安全。 30.散客旅游产品的类型主要包括单项委托服务、旅游咨询服务和选择性旅游服务。 31.旅游咨询服务形式可以分为电话、信函、人员和网络咨询服务。 32.目前,旅行社(公司)散客中心的信函咨询服务主要是利用传真或电子邮件回复。 33.网络销售是旅行社(公司)销售选择性旅游产品的主要渠道。 34.门市招揽是组织选择性旅游的主要途径。 35.选择性旅游产品的价格应为“拼装式”,即每一个产品的构成部分均有各自的价格,包 括产品的成本和旅行社(公司)的利润。 36.导游人员接待散客,应提前30分钟抵达接站地点。

uCOSii中断处理过程详解

一. UCOSII的中断过程简介 系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。 由于UCOS II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。 二.UCOSII的中断过程的示意图 三.具体中断过程 1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。 2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。

3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接 加1。 4.If(OSIntNesting==1){OSTCBCur->OSTCBStrPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中 5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵 6.执行用户ISR 7.中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间. 8.恢复所有CPU寄存器的值. 9.执行中断返回指令.

四.相关代码 与编译器相关的数据类型: typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef unsigned int OS_STK; //堆栈入口宽度为16 位(一) void OSIntEnter (void)的理解 uCOS_II.H中定义:

中断处理程序设计

课程实验报告 课程名称:汇编语言程序设计 实验名称:实验四 实验时间: 2015-6-16,14:30-17:30 实验地点:南一楼804室 指导教师:李专 专业班级:学号: 姓名: 同组学生: 报告日期: 成绩: 计算机科学与技术学院

一、原创性声明 本人郑重声明:本报告的内容由本人独立完成,有关观点、方法、数据和文献等的引用已经在文中指出。除文中已经注明引用的内容外,本报告不包含任何其他个人或集体已经公开发表的作品或成果,不存在剽窃、抄袭行为。 特此声明! 学生签字: 日期: 二、评语与成绩评定 1.指导老师评语 2.实验成绩评定 实验完成质量得分(70分)(实验步骤清晰详细深入,实验记录真实完整等)报告撰写质量得分(30分) (报告规范、完整、通顺、 详实等) 总成绩(100分) 指导教师签字: 日期:

目录 1.实验目的 (1) 2.实验内容 (1) 2.1任务一 (1) 2.2任务二 (1) 2.3任务三 (2) 2.4任务四 (2) 3实验过程 (2) 3.1任务一 (2) 3.1.1实验要求 (2) 3.1.2实验结果 (2) 3.2任务二 (4) 3.2.1设计思想及存储分配 (4) 3.2.2程序框图 (5) 3.2.3源程序代码 (6) 3.2.4实验结果 (7) 3.3任务三 (7) 3.3.1源程序代码 (7) 3.3.2实验结果 (11) 3.4任务四 (12) 3.4.1源程序代码 (12) 3.4.2实验结果 (16) 4.实验体会 (16)

1.实验目的 (1) 掌握中断矢量表的概念 (2)掌握中断处理程序设计的技巧 (3)掌握简化段定义、函数调用伪指令 (4)了解Win32程序的编程方法及编译、链接方法 2.实验内容 2.1任务一 用三种方式获取中断类型码10H对应的中断处理程序的入口地址。 要求:(1) 直接运行调试工具(TD.EXE),观察中断矢量表中的信息; (2) 编写程序,用 DOS功能调用方式获取,观察相应的出口参数与(1) 中看到的结果是否相同(使用TD观看即可) (3) 编写程序,直接读取相应内存单元,观察读到的数据与(1)看到的结 果是否相同(使用TD观看即可)。 2.2任务二 编写一个中断服务程序并驻留内存,要求在程序返回DOS操作系统后,键盘的按键A变成了按键B、按键B变成了按键A。 提示:(1) 对于任何DOS程序,不管其采用什么方法获取按键,最后都是通过执行16H号软中断的0号和10H号功能调用来实现的。所以,你只需接 管16H号软中断的0号和10号功能调用并进行相应的处理; (2) 获得一个按键扫描码的方法:在TD中执行16H中断的0号和10H号 功能调用,按相应的键,观察AH中的内容。 资料:16H中断的0号和10H号功能 功能描述:从键盘读入字符 入口参数:AH = 00H——读键盘 = 10H——读扩展键盘 出口参数:AH =键盘的扫描码 AL =字符的ASCII码

中断概述和中断处理过程

第23课中断概述可屏蔽中断处理过程 教学目的:了解中断的相关概念,掌握可屏蔽中断的处理过程。 教学重点:中断响应过程、中断向量和中断服务过程。 教学难点:中断向量。 授课内容: 一、中断概念 1.中断源 2.中断响应 3.中断向量表 4.中断优先级 5.中断屏蔽 二、中断分类 8086/8088有一个强有力的中断系统,可以处理256种不同的中断,256种中断可以分为两大类:外部中断和内部中断。 1.外部中断 也称为硬件中断,是由外部的硬件产生的。分成不可屏蔽中断请求和可屏蔽中断请求。 2.内部中断 又称为软件中断。通常有三种情况引起:由中断指令INT引起的中断;由CPU 的某些运算错误引起的中断;由调试程序debug设置的中断。 三、CPU响应中断过程 可屏蔽中断处理的过程一般分成几步:中断请求;中断响应;保护现场;转入执行中断服务子程序;恢复现场和中断返回。 CPU响应中断要有三个条件: 外设提出中断申请 本中断位未被屏蔽 中断允许 CPU在响应外部中断,并转入相应中断服务子程序的过程中,自动依次做以

下工作: (1)从数据总线上读取中断类型号,将其存入内部暂存器。 (2)将标志寄存器PSW的值入栈。 (3)将PSW中的中断允许标志IF和单步标志TF清0,以屏蔽外部其它中断请求,及避免CPU以单步方式执行中断处理子程序。 (4)保护断点。 (5)根据中断类型号到中断向量表中找到中断向量,转入相应中断服务子程序。 (6)中断处理程序结束以后,从堆栈中依次弹出IP、CS和PSW,然后返回主程序断点处,继续执行原来的程序。 四、中断向量表 寻找中断源可以用查询中断及矢量中断两种方法。 1.中断向量表 又称中断服务程序入口地址表。8086允许处理256种类型中断,对应类型号为0~FFH。 2.中断向量的设置 供用户使用的中断类型号,它可由用户定义为软中断,由INT n指令引用;也可通过1NTR端直接接入,或通过中断控制器8259A引入可屏蔽硬件中断。有两种方法可将中断服务程序的入口地址置入中断类型号n所对应的中断向量表中。一种方法用指令来设置,另一种方法利用DOS功能调用来设置。 设置中断向量:预置AL=中断类型号 DS:DX=中断服务程序入口地址 AH=25H 执行: INT 21H 取中断向量:预置AL=中断类型号 AH=35H 执行: INT 21H 返回: ES:BX=中断服务程序人口地址 3.中断类型号的获取

单片机流程图

单片机总流程图

主函数程序 #include #include #define uchar unsigned char #define uint unsigned int #define OSC_FREQ 12000000 #define __10ms (65536 - OSC_FREQ/(12000000/9970)) #define COM8255 XBYTE[0XFFF3] #define PA8255 XBYTE[0XFFF0] #define PB8255 XBYTE[0XFFF1] #define PC8255 XBYTE[0XFFF2] uchar code tab[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; uchar code dis_HELLO[]={0x89,0x86,0xc7,0xc7}; uchar code dis_op51[]={0xc0,0x8c,0x92,0xf9}; uchar code dis_code[]={0xcf,0xa4,0xcf,0xa4}; uchar ucCnt_10ms=99; uchar i=0; uchar J=0; uchar n=0; uchar led1; uchar led2; sbit P2_4=P2^4; sbit P3_7=P3^7; sbit P1_0=P1^0; sbit P1_1=P1^1; sbit P1_2=P1^2; void Disp_op51 (); void Disp_HELLO(); void Set_Init_Xint(); void Set_Init_Timer(); void Disp_t(); void DelayX1ms(uint count); void Disp_8255(); void main() { for(;;) { Set_Init_Xint(); Set_Init_Timer(); Disp_8255(); //ucCnt_10ms =99; //ucLed1 = 6;

相关文档
最新文档