共1条
1/1 1 跳转至页
关于VxWorks下的中断和异常(转自老站)
关于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 ※
关键词: 关于 VxWorks 中断 异常 转自 老站
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |