惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
V
V2EX
雷峰网
雷峰网
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
F
Full Disclosure
Y
Y Combinator Blog
V
V2EX - 技术
Attack and Defense Labs
Attack and Defense Labs
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
SecWiki News
SecWiki News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
量子位
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
D
Darknet – Hacking Tools, Hacker News & Cyber Security
AWS News Blog
AWS News Blog
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
K
Kaspersky official blog
B
Blog
A
Arctic Wolf
Hacker News: Ask HN
Hacker News: Ask HN
L
LangChain Blog
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
Recent Announcements
Recent Announcements
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
D
Docker
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
The Last Watchdog
The Last Watchdog
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog

博客园 - safeking

移动互联网,我来了 CPU内实现指令的方式 ARP(AddressResolutionProtocol)地址解析协议 满足网络处理应用的LA-1接口标准概述 下一代NSE架构 常用的电平标准总结 DDR技术与HSTL电平(ZZ) vxworks与linux内核比较 不同CPU的区别 VxWorks中断处理程序 ISR特性 去掉副作用的最小宏定义方式(linux kernel定义) 关于C语言中函数调用和参数传递机制的探讨(ZZ) ubuntu7.1下nvidia gfore4驱动安装(转,遇到终端空白,请参考本站相关的随笔) nbnutu7.1安装nvidia gf4驱动后,终端空白显示问题解决办法 风河公司用“硬实时”为Linux注入新活力 c的预处理 内联函数与宏 宏使用方法要点 浅谈嵌入式 Linux 的移植(转)
vxworks中断服务程序
safeking · 2008-03-21 · via 博客园 - safeking

中断服务程序用来处理来自硬件的中断,是设备驱动程序的重要组成部分。为及时响应外部中断,防止中断丢失.中断服务程序应该尽量的小,只把最必要的任务放 在中断服务程序里面执行。一般在系统启动,硬件设备成功初始化之后将ISR与中断向量挂上:也可以在系统启动后的任何时刻挂中断向量。调试中经常采用后一 种方式。在VxWorks中有两个不同的函数可提供挂中断:intConnect和pciIntConnect。两者的区别是intConnect使用的 中断向量是独占的,pcilntConnect则可在各个不同的ISR之间共享中断向量。实际上pcilntConnect内部调用了 intConnect函数,在内部使用一个链表来管理多个不同的ISR。pcilntConnect要求每次进入ISR都要检查硬件的寄存器,证实中断的 确是由ISR服务的硬件产生。如果硬件的寄存器表明该硬件并未产生中断,则ISR立即退出,以让挂在同一个中断向量上的其它ISR有机会检查是否有中断产 生。pcilntLib.c中的代码清楚的说明了这个问题:
void pciInt (int irq ){
PCLlNT RTN *pRtn;
for (pRm = (PCI_INT_RTN*)DLL_FIRST(&pcilntList[irq]);
pRtn!=NULL;
pRtn =(PCI_INT_RTN*)DLL_NEXT(&pRtn->node))
(*pRtn->routine)(pRtn->parameter);
}
   当PCI总线上有中断发生时,系统调用void pcilnt(int irq)函数,再由pciInt使用内部的链表来依次调用挂在该中断上的ISR。如果某个ISR不能正常退出,就会影响到其它ISR的运行。在调试时为了 检查中断向量是否已经和ISR可靠的连接上,可以在命令行上或程序中直接调用pciInt来查看ISR是否被触发。在硬件确定的情况下,可以小心设计保证 各个硬件使用不同的中断,这样对PCI上的设备也可直接使用intConnect来挂中断。
        需要说明的是ISR挂上中断向量的过程不是简单的在向量表中设置中断向量值。VxWorks除了设置中断向量值以外,还在与中断向量相连的ISR加上了一 层薄薄的包装,包括IsR执行前保存寄存器值.设置堆栈以及IsR执行后恢复寄存器和堆栈。在中断频繁的场合,系统中中断堆栈有可能被耗尽而溢出。为了避 免上述情况发生,必须修改系统的中断堆栈大小,即在config.h中加入以下代码:
#define INCLUDE_KERNEL
#define ISR_STACK_SIZE 0xl000 //表示系统中中断堆栈的大小为4k
由 于中断处理程序的特殊性,中断处理程序中不能使用可能导致阻塞的函数,如printf,semTake等,具体不可使用的函数列表可以在<< VxWoks Programmer Guide>>中查到。有时候为了调试方便,希望在ISR中打印一些信息,系统提供了一个与prinf等价的函数sysLog,该函数可接受 7个参数。它是非阻塞的。比较而言,prinf函数要在打印任务完成后才返回,sysLog只把打印任务放到系统的打印队列中就返回。在ISR中虽然不可 以使用semTake,但可以使用semGive(互斥类型的除外)。一般使用semTake和semGive在ISR和普通程序间通信:当一个中断产 生,ISR 完成必要的任务后,调用semGive通知另外一个使用semTake等待ISR信号的任务,该任务收到semGive释放的信号后,继续完成ISR中不 便处理的任务。