这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于VxWorks下的中断和异常(老站转)

共1条 1/1 1 跳转至

关于VxWorks下的中断和异常(老站转)

菜鸟
2002-05-31 18:01:57     打赏
关于VxWorks下的中断和异常(转) 嵌入开发网 工程师 来自: 发表总数:41   查看   短消息   电子邮件 -------------------------------------------------------------------------------- 关于VxWorks下的中断和异常 <--- 〖回复该帖子〗 个人的一些理解,不妥之处请见谅,指出! 1.概念 对于CPU来说,中断是异步的,是由外设通过中断控制器向CPU的中断脚上 输入一个电信号引起的;而异常是同步的,是CPU在特定上下文执行特定指令 时,CPU自己产生的;比如CPU执行了一个断点指令,或者除法错误,或者 访问非法地址,等等。 CPU对于中断和异常的响应是基本一样的,就是根据中断/异常的号码或类型, 跳到特定地址处执行。跳转是根据一张表,称为异常向量表,进行的。 一般还有个中断向量表:X86 CPU的中断向量表是异常向量表的一部分(0x20-0xff), 而PowerPC 860的中断向量表由中断控制器驱动程序创建。 中断一般是可屏蔽的,而异常一般是不可屏蔽的(一个例外:单步跟踪。 在使能时,CPU每执行一条指令,就产生一个单步跟踪异常)。 对于中断,VxWorks区分3个概念:int level, int number, 和int vector。 int level - 和中断控制器有关,表明来自于哪个脚,往往还和优先级有关; int number - 是中断向量表对应表项的索引; int vector - 是中断向量表对应表项的地址。 2.中断使用: intConnect - 连接ISR; INUM_TO_IVEC, IVEC_TO_INUM - int number到int vector映射; intEnable, intDisable - 使能/禁止一个中断; intLock, intUnlock - 关闭/开启CPU的中断,可以用intLockLevelSet()设置int level; ISR:可以完全用C语言写,保存/恢复被中断现场的工作由操作系统完成。对ISR 能调用的函数有很多限制,例如不能调用printf和malloc等,详见VxWorks编程 指南2.5节。如果某一函数调用了这样的系统函数,那么这个函数也不能被ISR 调用。主要原因是中断不是任务,它不能阻塞(pend)。如果在中断里产生 异常,系统将重启(因为系统不能保证安全返回)。 3.异常使用 可以调用excConnect()连接异常处理函数。然而一般很少这样做,而是让操作 系统完成异常处理。OS会把异常映射成某种信号(signal),发给出异常的任务。 也就是说,下一次该任务运行时,将会运行它的信号处理函数。对这种信号,信号 处理函数返回后,该任务就会被系统挂起(suspended)。所以不要返回!可以执 行exit()结束任务,或tastRestart()重启任务,或longjmp()执行函数间跳转。 signal又叫软中断。可以使用signal()等函数安装信号处理函数捕获特定信号。 虽然信号处理函数在所属任务的上下文中执行,然而由于signal的异步性,为安全 起见,VxWorks手册建议在信号处理函数里,很多系统函数不要调用(类似ISR)。 除了硬件的原因外,操作系统和其它任务也可以向一个任务发送信号。 不同的signal对任务的影响是不同的。有些被忽略,有些导致任务挂起(suspended)。 详细情况请参考(R.Stevens)。 VxWorks中的signal也有自己的特点,例如: - 执行select()的任务在收到信号时不会返回EINVAL; - taskDelay()收到信号时,设置errno为EINTR,返回ERROR; - 可以捕获SIGKILL; - 没有SIGCHLD,SIGPIPE,SIGURG。 4.PCI和VME总线中断 PCI设备一般有4个中断线INTA,INTB,INTC,INTD,连接到对应的PCI线上,再经过 PCI控制器或桥设备连接到中断控制器(PIC)上。设备的中断线到PIC引脚的映射和 硬件、BSP/BIOS都有关系。在PC机上,BIOS初始化时会给每个PCI设备分配一个 中断号,存储在该设备配置空间的某寄存器中。 可以使用pciIntConnect(), sysIntEnablePIC()来连接PCI中断。 PCI的中断线是共享的,多个PCI设备可以连接到同一个中断线上。pciIntConnect() 使用一个链表管理多个ISR。发生中断时,先被调用的是pciInt()。pciInt()遍历链表, 依次调用各个ISR。所以每个ISR被调用时,应该首先查询是否为自己的设备产生的中断, 不是则应立即返回。另一方面,如果你能确认某PCI设备独占一个中断,也可以使用 intConnect来连接ISR。 VME总线有7个中断IRQ1-IRQ7,通过总线控制器连接到PIC上。 vxfree@sina.com ※ 作 者: vxfree 02-1-22 下午 03:24:06 ※ -------------------------------------------------------------------------------- 编辑 发表於:2002-01-22 - 16:09:37 IP: 211.97.*.* moonlight 工程师 来自: 发表总数:18 查看   短消息   电子邮件 -------------------------------------------------------------------------------- 大侠讲的很好,我还要继续问一句:能否具体描述一下当VxWorks收到外部中断信号时是怎么调用中断服务程序的?据说是在MUX层实现的,正确否? -------------------------------------------------------------------------------- 编辑 发表於:2002-01-22 - 16:53:40 IP: 210.75.*.* lb 助理工程师 来自: 发表总数:9 查看   短消息   电子邮件   OICQ -------------------------------------------------------------------------------- 大侠: 请问一下,我写了一个中断处理函数,用了intConnect连接到了外部中断/IRQ1上面去 了,对于/IRQ1产生的中断我是用一个开关对地产生一个低电平脉冲模拟的。但是发现我只 要在运行程序之后,按下按钮就会使得目标板的Target-server链接失败。你能不能举个例 子介绍一个链接外部中断的处理函数的操作方式。 谢谢!



关键词: 关于     VxWorks     中断     异常     老站转    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]