23 VxWorks中断驱动实验
Vxworks下PCI设备驱动程序的设计与实现
Vxworks下PCI设备驱动程序的设计与实现摘要:VxWorks在嵌入式军工产品中的应用越来越广泛。
本文详细描述了在VxWorks操作系统下PCI总线驱动程序的设计与实现过程。
关键词:VxWorks PCI驱动中断1.引言VxWorks是一种运行在嵌入式设备上的高性能、可裁减性的嵌入式实时操作系统,是专门为实时嵌入式系统设计开发的操作系统,其良好的可靠性和卓越的实时性被广泛地应用在军事、航空、航天等高精尖技术及实时性要求极高的领域中。
本文详细讨论了工程实践中在VxWorks操作系统下,对基于PCI 总线设备驱动程序的设计与开发过程,具有较强的通用性。
2.系统概要本系统主要包括三种模块的驱动:开关量板驱动,A/D板驱动以及串口板驱动,其结构框图如图2-1所示:图2-1 系统结构框图系统通过这三种模块的驱动程序来完成对系统相应功能的实现。
3.程序设计开发驱动程序的首要任务就是确定访问设备的地址。
VxWorks 系统上电后POST软件会依次扫描系统中所有的PCI设备,并为它们分配相映的地址。
所以针对PC1总线结构设备的驱动程序主要开发步骤即:确定设备的PCI配置信息、确定设备的内部存储器、寄存器基地址及中断号、设备初始化、中断服务程序以及对设备的具体读写操作等。
每个PCI设备具有三种物理空间:存储器空间、1/O空间和配置空间。
配置空间是长度为256字节的一段连续的空间,其中前64字节为Header(头标),其余192字节为设备相关信息,在64字节的Header中,前16字节的定义是确定的,后48字节的具体含义因设备而异。
驱动程序首先要找到所有驱动的板卡,确定对它的访问方式是内存映射还是I/O映射,这样驱动程序就可以直接使用这些地址进行操作。
4.驱动实现VxWorks下PCI设备驱动程序实现的过程可以概括为:调用系统函数查找到相应的设备,然后查询硬件设备上的资源信息,包括内存空间基地址、I/O空间基地址、中断向量等资源,如果有中断需要挂接中断服务程序,最后实现读写操作。
中断实验报告实验步骤
一、实验目的1. 了解中断的基本概念和作用。
2. 掌握中断处理程序的设计方法。
3. 熟悉中断控制器的工作原理。
4. 通过实验验证中断系统的功能。
二、实验原理中断是一种处理程序,当系统需要处理某个事件时,暂时中断当前程序的执行,转而执行中断处理程序。
中断处理程序执行完毕后,返回到被中断程序的原点继续执行。
中断系统由中断控制器、中断处理程序和中断请求源组成。
三、实验设备1. PC机一台2. 开发板一块3. 示波器一台4. 编译器一套四、实验步骤1. 实验环境搭建(1)将开发板插入PC机的USB接口。
(2)打开编译器,新建一个C语言项目。
(3)编写实验代码。
2. 编写中断处理程序(1)定义中断服务例程(ISR)函数。
(2)编写ISR函数,实现中断处理功能。
(3)在主函数中调用ISR函数。
3. 编写主函数(1)初始化中断控制器。
(2)设置中断向量表。
(3)启动中断控制器。
4. 编译与调试(1)将编写好的代码编译成可执行文件。
(2)将可执行文件烧写到开发板中。
(3)打开示波器,观察中断信号。
5. 实验验证(1)通过按键、串口或其他方式触发中断。
(2)观察示波器上的中断信号,验证中断处理程序是否正确执行。
五、实验结果与分析1. 实验结果通过实验,成功实现了中断系统的功能。
在触发中断后,示波器上出现了中断信号,表明中断处理程序已正确执行。
2. 实验分析(1)中断控制器初始化正确,中断向量表设置正确。
(2)ISR函数编写正确,能够正确处理中断事件。
(3)主函数调用ISR函数,实现了中断处理。
六、实验总结通过本次实验,掌握了中断的基本概念和作用,熟悉了中断处理程序的设计方法,了解了中断控制器的工作原理。
实验结果表明,中断系统能够正常工作,达到了实验目的。
七、实验改进与展望1. 在实验中,可以尝试使用不同类型的中断源,如定时器中断、串口中断等,以进一步验证中断系统的功能。
2. 可以研究中断嵌套处理,实现更复杂的中断处理流程。
中断程序实验报告
一、实验目的1. 理解中断程序的基本概念和作用。
2. 掌握中断程序的编写方法。
3. 通过实验加深对中断程序在实际应用中的理解。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 芯片:Intel Core i5三、实验内容1. 编写一个简单的中断程序,实现按下键盘任意键后,屏幕显示“中断发生”。
2. 编写一个中断程序,实现定时中断,每秒显示一次当前时间。
四、实验步骤1. 编写中断程序首先,我们需要编写一个中断程序,用于实现按下键盘任意键后,屏幕显示“中断发生”。
```c#include <stdio.h>#include <conio.h>#include <dos.h>void interrupt_handler() {printf("中断发生\n");while(1); // 无限循环,防止中断程序执行完毕后退出}int main() {int intr_no = 1; // 中断号int flag = interrupt(intr_no, interrupt_handler); // 注册中断if (flag != 0) {printf("注册中断失败\n");return 1;}printf("等待按键...\n");while(1) {if (kbhit()) { // 判断是否有按键按下break;}}printf("程序结束\n");return 0;}```在上述代码中,我们首先包含了必要的头文件,并定义了一个中断处理函数`interrupt_handler`,该函数负责打印“中断发生”信息。
然后,我们使用`interrupt`函数注册了中断,中断号为1,即键盘中断。
在主函数中,我们等待用户按下任意键,当按键按下后,中断处理函数会被调用。
vxworks操作系统中中断的应用
VxW orks操作系统中中断的应用Ξ籍林峰,曹 伟ΞΞ(南京船舶雷达研究所,江苏南京,210003)摘 要:主要介绍了VxW orks操作系统中中断的重要性以及具体应用,其中涉及了信号量的概念并对其进行了简单描述。
关键词:嵌入式实时操作系统;中断服务程序;信号量中图分类号:TP3 文献标识码:A 文章编号:100920401(2004)0320067203Application of interruption in the operating system of VxW orksJI Lin2feng,C AO Wei(Nanjing Marine Radar Institute,Nanjing210003,China)Abstract:The im portance and concrete application of interruption in the operating system of VxW orks is in2 troduced in this paper,in which the concept of the semaphore is inv olved and is sim ply described.K ey w ords:embedded real2time operating system;interruption of service program;semaphore1 引 言对系统的响应时间有严格要求的系统,我们通常称之为实时系统。
近半个世纪以来,随着计算机技术的发展,实时系统在各高精尖技术领域得到迅猛发展,具有实时操作系统的计算机系统在实时系统中也得到了广泛的应用。
实时操作系统是嵌入式应用软件的基础和开发平台,它不同于分时操作系统,它的主要任务是对事件进行实时的处理。
虽然时间可能在无法预知的时刻到达,但是软件必须在事件发生时在严格的时限内作出响应。
VxW orks就是一个由Wind River Sys2 tem公司推出的嵌入式实时操作系统,具有多任务、可裁减、可靠性好、实时性高等特点,其在航天领域的出色表现而使之备受广大电子行业的青睐。
VxWorks中的中断应用设计要点
VxWorks中的中断应⽤设计要点硬件中断处理是实时系统设计中的关键性问题,设计⼈员有必要对其作深⼊研究,以更好地满⾜开发⼯作需要。
⽂中以VxWorks操作系统为软件平台,讨论了在实时系统中进⾏中断应⽤设计时要注意的⼀些问题。
由于软硬件的相关性,选⽤⼴泛应⽤的X86架构的嵌⼊式汁算机为硬件平台,对PenriumCPU和计算机主板对硬件中断的管理机制也做了详细介绍所得出的研究结论在具体的开发项⽬中均得以验证,可供相关技术⼈员参考。
硬件中断处理是实时系统设计中最重要、最关键的问题。
⽂中综合软硬件,从⼯程应⽤的⾓度对此问题加以讨论。
⽂中所述内容针对的软件平台是VxWorks实时操作系统,硬件平台选⽤⼴泛使⽤的X86架构的嵌⼊式计算机,全⽂按照CPU、主板、操作系统⾃下⽽上的顺序展开。
1 Pentium CPU的中断类型有两类事件可引起Pentium挂起当前的指令流,即中断和异常。
中断是由外部事件引发的,在程序执⾏的任何时刻都可能出现;异常也称异常中断,是由内部事件引发的。
中断和异常各有两类触发源:(1)中断。
可屏蔽中断:CPU的INTR引脚收到有效信号,如果Pentium标志寄存器IF位为1,则允许中断,否则信号在CPU内被屏蔽。
⾮屏蔽中断:CPU的NMI引脚收到有效信号⽽引发的中断,这类中断不能被阻⽌。
(2)异常。
执⾏异常:CPU试图执⾏⼀条指令的过程中出现错误、故障等不正常条件⽽引发的异常中断。
执⾏软件中断指令:Pentium指令系统中包括⼀些如INTO,INT n这类软件中断指令,执⾏时产⽣异常中断。
详细分类的话,Pentium可以识别256种中断和异常。
每种中断给予⼀个编号,即0~255,称为中断向量号(interrupt vector number)。
其中NMI、异常以及系统保留占⽤中断向量号0~31,⽽32~255为⽤户中断向量号,可供INTR和⾃定义软件中断(如汇编中的INT指令)使⽤。
VxWorks任务调度与中断学步园
VxWorks任务调度与中断学步园最近在看有关任务调度和中断的文章,主要的话题或者讨论点可以归为如下几个递进的问题:(1)引发任务调度的情况、原因(2)何为抢占调度?抢占调度是否就指中断引发的调度?(3)关中断是否禁止任务调度?针对上述问题,本文简单说一下个人的理解,有不妥之处还请大家多指点。
下面就以VxWorks操作系统为例,讨论任务调度和中断的关系。
问题(1)引发任务调度的情况、原因首先,看一下VxWorks任务调度时机的两种情况:1) 同步任务切换引起的原因是当前运行的任务可能执行了如下下列操作:①进行阻塞、延迟、挂起的调用如,调用 taskDelay、taskSuspend、semTake等。
②使更高优先级任务就绪而发生优先级抢占如,通过semGive释放信号量,导致更高优先级的任务就绪。
③降低自身优先级或者退出如,任务可通过taskPrioritySet改变自身优先级;通过exit终止自身执行等。
2) 异步任务切换通常由中断服务使高优先级任务就绪引起(如)由上面的描述可知,中断是导致任务可能发生调度的一种情况,而且一般被归为异步任务切换。
而除了同步任务切换和异步任务切换之外,可能还有提及到抢占调度和非抢占调度,进而又联系到中断。
问题(2)何为抢占调度?抢占调度是否就指中断引发的调度?个人认为,VxWorks的抢占调度就是指,由于有高优先级的任务处于就绪状态,而导致系统需要进行任务切换。
另外,我们知道VxWorks系统(wind内核)采用的调度策略为:默认采用基于优先级的抢占式调度;同时,还使用轮转调度。
从这点也能说明,所谓抢占式调度主要是基于任务优先级而言的,而不是针对中断(或者异步任务切换)。
如果非要额外再给抢占式调度下个定义或者归类的话(虽然个人觉得没必要,理解即可),应该包括:1)异步任务切换(中断引发)2)同步任务切换中的第②类,即由于当前运行任务的某种操作,使更高优先级任务就绪而发生优先级抢占除了上述两种情况之外的其他任务切换,都可以认为是当前运行的任务主动放弃CPU使用权,而非被抢占。
vxworksprintf与logMsg及中断相关内容(转载加总结)
vxworksprintf与logMsg及中断相关内容(转载加总结)1. printf需要调用输入/输出设备资源,若在intr中使用printf,可能会由于标准输入/输出设备在被使用中(一般会semtake一下),这导致intr被阻塞,这在vxworks在是不被允许的,可能就导致系统响应速度极其慢或者忽快忽慢(因为通常情况下intr的第一步操作是自私的关闭所有中断,此时资源等到in/out设备可以使用才会继续往下执行)。
logMsg里面的实现是将消息发送给sysLog这个任务,查看一下vxworks发现,这个任务的优先级为0(不知道是不是我们的比较特别)。
这带来一个规则:若在intr中,sysLog不会进行抢占操作将logMsg中的信息输出出来(毕竟interrupt的优先级是最高的),但是intr一执行完,它立刻抢占,将信息输出。
若在普通的任务(优先级 > 0)中调用logMsg,它会毫不留情的抢占,将信息输出。
2. 相关解释printf( ) - write a formatted string to the standard output stream (ANSI).logMsg( ) does not actually perform the output directly to the logging streams, but instead queues the message to the logging task, logMsg( ) can be called from interrupt service routines.printf()是将信息输出到标准输出设备(STDIN/STDOUT)中,如果此时设备正在工作,那么就会发生阻塞.logMsg()是使用消息队列的方式,它将信息地址发送到队列,由专门的任务将信息打印出来.关于LogMsg的工作机理。
LogMsg利用消息队列将用户所发的消息传送给LogTask,然后由LogTask将其显示在屏幕或者其他输出设备上。
VxWorks中的中断应用设计要点
VxWorks中的中断应用设计要点
耿锐;王闵
【期刊名称】《计算机技术与发展》
【年(卷),期】2005(015)005
【摘要】硬件中断处理是实时系统设计中的关键性问题,设计人员有必要对其作深入研究,以更好地满足开发工作需要.文中以VxWorks操作系统为软件平台,讨论了在实时系统中进行中断应用设计时要注意的一些问题.由于软硬件的相关性,选用广泛应用的X86架构的嵌入式计算机为硬件平台,对PentiumCPU和计算机主板对硬件中断的管理机制也做了详细介绍.所得出的研究结论在具体的开发项目中均得以验证,可供相关技术人员参考.
【总页数】4页(P122-124,127)
【作者】耿锐;王闵
【作者单位】西安电子科技大学,计算机学院,陕西,西安,710071;西安电子科技大学,计算机学院,陕西,西安,710071
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于 T1040的 VxWorks中断亲和力研究 [J], 李世锐;温永强;高海峰;齐亚磊
2.VxWorks实时操作系统中的中断处理机制分析 [J], 王运盛;王坚
3.VxWorks操作系统中中断的应用 [J], 籍林峰;曹伟
4.VxWorks下MPC860的中断处理机制及其应用 [J], 王明飞; 张效义; 李鸥; 邢明
5.VxWorks下龙芯3A中断控制技术的研究 [J], 徐骞
因版权原因,仅展示原文概要,查看原文内容请购买。
中断的应用实验报告
中断的应用实验报告
《中断的应用实验报告》
近年来,随着科技的发展,中断技术在各个领域得到了广泛的应用。
中断技术可以让一个任务在执行过程中暂停,转而去执行另一个任务,这种技术的应用可以大大提高系统的效率和响应速度。
在我们的实验中,我们针对中断技术进行了一系列的应用实验,以探究其在不同领域的应用效果。
我们首先在嵌入式系统中进行了中断技术的应用实验,通过在嵌入式系统中设置中断,可以让系统在处理外部事件时立即做出响应,从而提高系统的实时性和稳定性。
其次,我们在计算机网络领域进行了中断技术的应用实验。
通过在网络通信过程中引入中断技术,可以让系统在接收到重要数据包时立即中断当前任务,转而处理重要数据包,从而提高网络传输的效率和可靠性。
另外,我们还在自动化控制系统中进行了中断技术的应用实验。
通过在自动化控制系统中设置中断,可以让系统在出现异常情况时立即中断当前任务,转而采取相应的控制措施,从而提高系统的安全性和稳定性。
通过这些实验,我们发现中断技术在不同领域的应用效果都非常显著,可以大大提高系统的效率和可靠性。
我们相信随着中断技术的不断发展和完善,它将在更多的领域得到应用,为人们的生活和工作带来更多的便利和效益。
希望我们的实验报告可以为中断技术的进一步研究和应用提供一定的参考价值。
23 VxWorks中断驱动实验
函数名称:intConnect ( )
函数说明:设置指定中断的服务函数。
STATUS intConnect
(
VOIDFUNCPTR * vector, /* 中断向量 */
VOIDFUNCPTR routine, /* 中断服务函数 */
iБайду номын сангаасt
parameter /* 参数 */
)
函数名称:sysGpioIntConnect ( )
#include "cacheLib.h"
#include "lstLib.h"
/* Needed to maintain protocol list. */
#include "iv.h"
#include "stdlib.h" #include "sysLib.h" #include "intLib.h" #include "taskLib.h"
(
FUNCPTR * vector,
/* 中断向量的偏移*/
FUNCPTR function
/* 向量中的地址 */
)
函数名称:intVecGet ( )
函数说明:获取中断向量。
FUNCPTR intVecGet
(
FUNCPTR * vector
/* 中断向量的偏移 */
)
所有的中断服务函数都会使用同一个堆栈,这个堆栈是在系统启动时建立的,所以中断
五 实验报告书编写要点
1. 编写 interrupt 工程,并编写相应的程序实现对外部中断 2 的响应; 2. 下载 VxWorks 内核; 3. 启动目标服务器; 4. 下载并运行 interrupt 工程; 5. 观察结果。
VxWorks实时操作系统中的中断处理机制分析
公司 的 S H等 , 目前 已经被 广泛 的应用 在 航 空航 天 、 军事 、 工业 控制 、 网络 管理等 领域 。 嵌入 式 系 统通 过 中断 与外 界 进行 交 互 , 操作 系
统通过 中断处理 响应 外 部事 件 , 中断 处 理 的正 常 运 行是系统 正常运 行 的先 决条件 。 中断处理 也是 影 响
和 P w rC、 P 、 R Itl 司 的 i6 、 i c i oe P MIS A M、ne 公 90 Ht h a
1 V Wok x rs系统 中 的 中 断处 理
通 常处 理 器 的 中断分 为两 级 , 内部 中断 和外 即 部 中断 。V Wok 为它们 提供 了安全 、 x rs 快捷 、 活 的 灵 处 理机制 。
V Wok 实时操作 系统中的中断处理机制分析 x rs
王运盛 王 , 坚2
(. 1 中国西南电子技术研究所 , 成都 6 0 3 ; . 10 6 2 总参陆航部驻成 都地 区军事代表室 , 成都 6 03 ) 10 6
摘 要: 针对实时系统中的 中断处理的至关重要性 , 说明 了微处理器的 内部异常和外部 中断的工作 机理, 阐述 了实时操作 系统 V Wo s x r 中的异常处理的过程, k 重点分析 了在 V W rs x o 中外部 中断处理 k
W NG Y n—se g ,W NG Ja A u h n A in
(.otw s C i stt o l t n eh o g , hnd 106C i ; . it yD l a o IS u et h aI tu f e r i T cnl y C egu603 ,hn 2 M l r e gt n h n ni e E c o c o a i ei a O iefr hnd ei , r yA i o pr et f e e l t , hnd 106 C i ) fc eguR g n Am va nD a m n nr a C eg u603 ,h a oC o i t e t oG aS f n
vxworks中断服务程序
vxworks中断服务程序中断服务程序用来处理来自硬件的中断,是设备驱动程序的重要组成部分。
为及时响应外部中断,防止中断丢失.中断服务程序应该尽量的小,只把最必要的任务放在中断服务程序里面执行。
一般在系统启动,硬件设备成功初始化之后将ISR与中断向量挂上:也可以在系统启动后的任何时刻挂中断向量。
调试中经常采用后一种方式。
在VxWorks中有两个不同的函数可提供挂中断:intCon nect和pciIntConnect。
两者的区别是intConnect使用的中断向量是独占的,pc ilntConnect则可在各个不同的ISR之间共享中断向量。
实际上pcilntConnect内部调用了intConnect函数,在内部使用一个链表来管理多个不同的ISR。
pcil ntConnect要求每次进入ISR都要检查硬件的寄存器,证实中断的确是由ISR服务的硬件产生。
如果硬件的寄存器表明该硬件并未产生中断,则ISR立即退出,以让挂在同一个中断向量上的其它ISR有机会检查是否有中断产生。
pcilnt Lib.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)函数,再由pciI nt使用内部的链表来依次调用挂在该中断上的ISR。
如果某个ISR不能正常退出,就会影响到其它ISR的运行。
在调试时为了检查中断向量是否已经和ISR 可靠的连接上,可以在命令行上或程序中直接调用pciInt来查看ISR是否被触发。
vxworks入门实验课
实验九中断处理程序1实验目的1.了解VxWorks的中断机制2.学习编写中断处理程序2实验内容建立基于pentium目标机的project,编写一段简单的键盘中断处理程序,编译成功后,将其加载到VmWare上运行并观察运行结果。
3实验设备及工具1.硬件:a)PC机2.软件:a)PC机操作系统Windows2000或windowsXPb)Tornado2.2c)Vmware5.54实验原理中断处理程序是实时系统的重要组成部分。
系统通过中断机制了解外部事件,并对外部事件做出响应。
实时系统的反映速度取决于系统的中断响应速度和中断处理程序的处理速度。
在VxWorks中编写中断处理程序需要写一个中断服务例程(ISR),并利用VxWorks提供的intConnect调用将它与某个中断相连接。
当中断发生时,Wind 内核将转到ISR中执行。
从中断产生到ISR执行之间的时间延迟,就是所谓的中断响应时间。
由于在很短的时间内,可能产生多个中断,并且高优先级的中断将阻塞低优先级的中断,因此,要尽量使ISR的执行时间最短。
与VxWorks中断管理相关的头文件是intLib.h,这是中断库的头文件。
ISR 不像一般的任务那样运行在普通的任务上下文中,它没有任务控制块,所有的ISR共享一个堆栈。
由于存在上述不同,能在ISR中调用的程序不能发生阻塞。
例如,printf()可能会发生阻塞,因此在ISR中不能调用printf()而应该调用logMsg()或其他由logLib库提供的函数调用。
ISRs也不能使用浮点数指令,因为浮点数指令寄存器在进入中断处理程序时没有保存。
如果一定窑使用浮点数指令,必须首先调用fppALib库中提供的调用保存浮点寄存器。
然而,浮点数操作比较费时,应该尽量避免在ISRs中使用。
常见的情况是一个ISR仅仅调用semGive系统调用,发起一个任务来完成必要的处理。
在下面的例子中简单的处理键盘中断:5实验步骤1.建立基于Pentium目标机的project2.编程(假设编写的源文件为s9_intr1.c)3.将s9_intr1.c添加到project中4.编译(如果有错误,则改正)5.下载到VmWare上运行,观察输出。
中断的应用实验报告
一、实验目的1. 理解中断的概念和作用。
2. 掌握中断的编程方法。
3. 熟悉中断的嵌套和优先级处理。
4. 培养实际操作能力,提高编程水平。
二、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 芯片:Intel Core i5-8265U4. 内存:8GB DDR45. 外设:显示器、键盘、鼠标三、实验原理中断是计算机系统中一种重要的处理机制,它允许CPU在执行程序的过程中,暂时中止当前程序的执行,转而执行中断服务程序(ISR)。
中断广泛应用于操作系统、设备驱动程序、实时系统等领域。
四、实验内容1. 中断的基本应用2. 中断的嵌套3. 中断的优先级处理五、实验步骤1. 中断的基本应用(1)创建一个简单的中断服务程序(ISR):```cvoid isr_handler() {// 中断服务程序代码printf("中断发生,执行中断服务程序。
\n"); }void main() {// 设置中断向量表set_interrupt_vector(0x21, isr_handler); // 主循环while (1) {// 执行其他任务}}```(2)编写中断触发程序:```cvoid interrupt_trigger() {// 触发中断__asm__("int 0x21");}```(3)在主函数中调用中断触发程序:```cint main() {interrupt_trigger();return 0;}```2. 中断的嵌套(1)设置多个中断向量,并编写对应的中断服务程序:```cvoid isr_handler1() {// 中断服务程序1代码printf("中断1发生,执行中断服务程序1。
\n"); }void isr_handler2() {// 中断服务程序2代码printf("中断2发生,执行中断服务程序2。
vxworks Arm 架构下的中断
vxworks Arm 架构下的中断中断的处理分为三个部分:1、中断检测:arm 架构下,中断监测部分的代码是需要用户自己开发的,可以参考ambaIntrCtl.c,需要实现函数xxxIntLvlVecChk、xxxIntLvlVecAck、xxxIntLvlChg、xxxIntLvlEnable、xxxIntL vlDisable 和xxxIntDevInit,在函数xxxIntDevInit 中把其他几个函数分别挂载在sysIntLvlVecChkRtn、sysIntLvlVecAckRtn、sysIntLvlChgRtn、sysIntLvlEnableRt n 和sysIntLvlDisableRtn 这几个钩子函数上。
xxxIntDevInit 在sysLib.c 中的sysHwInit2 中调用,以初始化中断。
2、中断管理:中断管理部分,BSP 中需要调用两个函数,一个是intLibInit,另一个是xxxIntDevInit。
后者的作用就是前面讲的挂接中断处理钩子函数。
前者intLibInit 是个比较关键的函数,三个参数设置了中断的个数和中断模式。
内部处理中,根据中断的个数申请intVecTable数组,用户使用intConnect 代码挂接的中断就是根据中断向量到表中查找位置然后赋以中断处理函数。
中断模式分可抢占和不可抢占两种,分别对应INT_PREEMPT_MODEL 和INT_NON_PREEMPT_MODEL。
3、中断处理:根据vxWorks 的实现代码,在excArchLib.c 中有一张表:LOCAL EXC_TBL excEnterTbl[NUM_EXC_VECS] = {/* no entry for branch through zero */{ EXC_OFF_UNDEF, excEnterUndef},/* undefined instr */{ EXC_OFF_SWI,excEnterSwi},/* software interrupt */{ EXC_OFF_PREFETCH,excEnterPrefetchAbort}, /* prefetch abort */{ EXC_OFF_DATA,excEnterDataAbort}, /* data abort *//* no entry for old address exception */{ EXC_OFF_IRQ,intEnt},/* interrupt request *//* no entry for FIQ */ };其中EXC_OFF_IRQ 对应的即外部中断,缺省情况下,调用的是intEnt,但是正常运行的时候,BSP 代码在intLibInit 中会使用intIntRtnPreempt 或者。
VxWorks信号中断和定时
wdStart()可以在超时时运行看门狗程序,要想周期性执行 (zhíxíng),看门狗程序必须调用wdStart()自己重新启动
共二十二页
使用(shǐyòng)看门狗定时器
使用看门狗定时器可以使一段程序周期性地执行
wdId= wdCreate();
– wdStart( wdId, DELAY_PERIOD, myWdIsr, 0); – void myWdIsr(param) – {doit(param);
调试 中断 (diào shì)
中断处理程序可以调用logMsg()向系统输出(shūchū) 诊断信息
– logMsg(“foo= %d\n”,foo,2,3,4,5,6) – 向tLogTask发送请求为我们实现printf()的功能
和printf()相似,但必须注意 –参数必须为4字节 –函数有6个入口参数 使用具有系统级调试的机制进行调试 –WDB Agent –emulator
{
routineRestore …
registerRET
}
共二十二页
设置(shèzhì)中断处理程序
VxWorks提供函数intConnect(), 它允许(yǔnxǔ)将指定的C函数与 任意中断相联系
STATUS intConnect()
{
VOIDFUNCPTR *vector;/*要联系的中断向量*/ VOIDFUNCPTR *routine; /*中断发生时要调用的函数*/ intparameter;/*传递给中断处理函数的参数*/
共二十二页
中断(zhōngduàn)和优先级
共二十二页
ISR的使用(shǐyòng)限制
实验报告中断系统实验
一、实验目的1. 理解中断系统的基本概念和工作原理。
2. 掌握中断请求、中断响应、中断处理和中断返回的过程。
3. 学习使用中断系统实现实时处理功能。
二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio 2019三、实验内容1. 实验一:中断请求和中断响应2. 实验二:中断处理和中断返回3. 实验三:使用中断系统实现实时处理功能四、实验步骤(一)实验一:中断请求和中断响应1. 创建一个简单的C/C++程序,实现以下功能:- 定义一个全局变量,用于模拟中断请求。
- 实现一个中断服务例程(ISR),当全局变量被修改时,触发中断请求。
- 在主函数中,设置中断向量表,使CPU能够识别并响应中断请求。
2. 编写代码如下:```c#include <stdio.h>// 全局变量,用于模拟中断请求volatile int interrupt_flag = 0;// 中断服务例程void interrupt_service_routine() {printf("中断服务例程执行\n");interrupt_flag = 0; // 清除中断请求标志}// 主函数int main() {// 设置中断向量表// ...// 启动中断请求interrupt_flag = 1;while (1) {// 执行其他任务// ...}return 0;}```(二)实验二:中断处理和中断返回1. 在中断服务例程中,添加更多的处理逻辑,如: - 获取中断请求的来源。
- 执行相应的中断处理任务。
- 中断返回,恢复中断前的状态。
2. 修改中断服务例程如下:```cvoid interrupt_service_routine() { // 获取中断请求的来源int interrupt_source = ...;// 执行相应的中断处理任务switch (interrupt_source) {case ...:// ...break;case ...:// ...break;default:// ...break;}// 中断返回__asm {popairet}}```(三)实验三:使用中断系统实现实时处理功能1. 使用中断系统实现一个实时时钟(RTC)功能,要求:- 定时触发中断,更新RTC的值。
vxWorks中断处理
Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求,因此,熟悉其中断的处理过程对于VxWorks操作系统的开发是至关重要的.本文通过编写和调试基于AT91RM9200处理器的VxWorks嵌入式操作系统的BSP,来讨论VxWorks操作系统的中断机制。
1 VxWorks中断处理机制及AICAT91RM9200使用一个8优先级,可单独屏蔽中断的中断向量控制器AIC。
在ARM体系结构中,有7种异常中断,对应有一个异常中断向量表。
ARM体系结构要求这个异常中断向量表从0地址处开始,对于外部中断请求IRQ,系统又增加了一块由中断控制器控制的中断向量表。
2 AT91RM9200 BSP的中断驱动的实现2.1 中断驱动中定义的函数STATUS at91rm9200LvlVecChk (int*,int*);STATUS at91rm9200LvlVecAck(int,int);STATUS at91rm9200LvlEnable(int);STATUS at91rm9200LvlDisable(int);2.2 高级中断控制器AIC的初始化在usrInit()中excVecInit()函数对异常中断向量进行初始化.整个中断库,以及中断控制器的初始化都是在syslib.c中的sysHwInit2()函数中完成的.该函数在sysClkConnect()中被调用,因为系统时钟中断要在内核开放中断后就要使能,因此内核在初始化为一个多任务环境后,就产生一个usrRoot()的任务,在该任务中要建立系统时钟中断,因此调用了sysClkConnect()函数,中断库以及中断控制器的初始化也就完成了。
高级中断控制器必须进行初始化,其初始化是在板级支持包BSP的中断驱动程序中。
具体的实现函数是void at91rm9200IntDevInit(void)。
该函数在文件syslib.c的sysHwInit2()函数中调用。
VxWorks实验分解
实验一测量程序的执行时间1实验目的1.1学习使用Tornado开发环境;1.2测量程序的执行时间2实验内容在Tornado开发环境中,建立一个Downloadable的project。
编写一段小程序,并根据需要选择timex()或timexN()测量这段程序的执行时间。
3实验设备及工具3.1硬件:a)PC机3.2软件:a) PC机操作系统Windows2000或windowsXPb) Tornado2.24实验原理实时系统应用程序必须优化执行的时间,编程者应当清楚知道自己编写的每段代码的执行时间。
VxWorks提供了一组调用:timex()和timexN()可以测量应用程序的执行时间。
对于执行时间非常短的程序,timexN()可以通过重复执行该程序来完成计时。
timex()测量一个程序的单次执行时间,允许向该程序传递最多8个参数。
当执行完成时,timex()显示程序的执行时间和测量误差。
如果被测试程序执行太快,比系统时钟速率还快,测量误差大于50%,测量就没有意义,这时会显示一个警告信息。
对于这种情况,应该使用timexN()测试该程序多次执行的时间。
timex()的原型为:下面的例子中包含两个子程序。
第一个子程序s1_time()调用timex()测量第二个子程序printit()的执行时间。
printit()重复显示其任务id号和变量i的值,重复次数由宏ITERATIONS指定。
5实验步骤5.1创建project。
5.2编程(假设编写的源文件为s1_time.c)。
5.3将s1_time.c添加到project中。
5.4编译(如果有错误,则改正)。
5.5下载到VxSim模拟器上运行。
5.6改变ITERATIONS的值为300,400,500,600,700,观察程序执行时间的变化。
5.7减少ITERATIONS的值为180,160,140,120,100,观察程序执行时间和输出信息的变化。
5.8继续减少ITERATIONS的值为80,60,40,20,10,观察程序执行时间和输出信息的变化,将timex()改成timexN(),观察程序执行时间和输出信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数说明:为指定的 GPIO 设置中断服务函数。调用 intConnect 完成。
STATUS sysGpioIntConnect
(
int
gpioIntLevel, /* 中断号 */
VOIDFUNCPTR pIntHandler, /* 中断服务函数 */
int
arg
/* 参数 */
)
函数名称:sysGpioIntEnable ( )
函数说明:关闭中断。
int intLock (void)
函数名称:intUnLock ( )
函数说明:开启中断。
void intUnlock
(
int lockKey
/* 解除中断(由 intLock 关闭) */
)
函数名称:intVecSet ( )
函数说明:设置中断向量。
void intVecSet
五 实验报告书编写要点
1. 编写 interrupt 工程,并编写相应的程序实现对外部中断 2 的响应; 2. 下载 VxWorks 内核; 3. 启动目标服务器; 4. 下载并运行 interrupt 工程; 5. 观察结果。
六 编程指导内容
1. 编写程序实验对 EXINT3 中断的处理。
函数说明:打开指定的 GPIO 中断。
STATUS sysGpioIntEnable
(
int
gpioIntLevel, /* 中断号 */
int
edge
/* 上升沿或者下降沿触发,1 为上升沿,2 为下降沿 */
)
函数名称:intContext ( )
函数说明:检查当前是否处于中断服务程序的运行级别。
实验 23 VxWorks 中断驱动实验
一 实验原理
硬件的中断处理是实时操作系统中的一个重要问题。因为在这些系统中往往都是通过事
件来驱动的,一旦发生某个事件,要求系统能够尽可能及时地作出响应;VxWorks 采取了一
种特殊的方法来实现这一要求,即让中断处理程序运行在单独的任务上下文中,从而缩短中
断的识别和处理时间。在系统库 intLib 和 intArchLib 提供了一系列中断相关的函数:
函数名称:intConnect ( )
函数说明:设置指定中断的服务函数。
STATUS intConnect
(
VOIDFUNCPTR * vector, /* 中断向量 */
VOIDFUNCPTR routine, /* 中断服务函数 */
int
parameter /* 参数 */
)
函数名称:sysGpioIntConnect ( )
STATUS result;
printf("Interrupt test, Please pressed the 'INT' button\n"); result = intConnect ((VOIDFUNCPTR *)INUM_TO_IVEC (2), eint_isr, 0 ); intEnable (2);
在该文件中输入如下程序:
程序清单 中断测试实验代码(interrupt.c)
#include "vxWorks.h"
#include "endLib.h"
/* Common END structures. */
#include "etherMultiLib.h"
#include "netLib.h"
int eint_trig_count = 0; void eint_isr(void) { /* 显示触发次数,只能显示到 99 */ eint_trig_count ++;
printf("Interrupt is trigged %d!\n", eint_trig_count); }
void testInt(void) {
BOOL intContext (void)
函数名称:intCount ( )
函数说明:获取当前中断的嵌套数。
int intCount (void)
函数名称:intLevelSet ( )
函数说明:设置中断屏蔽码。
int intLevelSet
(
int level
/* 中断掩码 */
)
函数名称:ock ( )
● 信号量:ISR 中能够释放信号量,但不能等待信号量;
● 消息队列:ISR 中能够发送消息,如果消息队列已满,则该消息会被丢弃,但不能
接收消息;
● 管道:ISR 中能够向管道写数据,如果管道满,则该数据会被丢弃,但不能读取管
道;
● 信号:ISR 中能够向任务发送信号。
CVT-2410 教学实验系统的 EXINT2 和 EXINT3 按钮是作为中断测试用的,通过按下该 按钮将触发外部中断 2 和外部中断 3。本实验介绍如何在 VxWorks 中处理中断。
for (;;) {
taskDelay(100); } }
3. 编译 interrupt 工程 4. 参照实验 3 将实验 2 编译的 Bootable 工程通过 uboot 下载到目标机,并运行,打
开超级终端,其提示如下图所示:
5. 参照实验 5 配置和启动目标服务器 6. 参照实验 15 将 interrupt 工程下载到目标板 打开 WindSh(参照 5.4.4 节),并在其控制台中进行如下操作,如下图所示。
(
FUNCPTR * vector,
/* 中断向量的偏移*/
FUNCPTR function
/* 向量中的地址 */
)
函数名称:intVecGet ( )
函数说明:获取中断向量。
FUNCPTR intVecGet
(
FUNCPTR * vector
/* 中断向量的偏移 */
)
所有的中断服务函数都会使用同一个堆栈,这个堆栈是在系统启动时建立的,所以中断
#include "cacheLib.h"
#include "lstLib.h"
/* Needed to maintain protocol list. */
#include "iv.h"
#include "stdlib.h" #include "sysLib.h" #include "intLib.h" #include "taskLib.h"
-> sp testInt task spawned: id = a2aba59c, name = s1u5 value = -1565809252 = 0xa2aba59c 7. 按下实验箱的 EXINT2 按钮,每按下一次在 DNW 中将显示相应信息,如下图所示:
四 思考题
1. VxWorks 的中断处理是怎样实现的,找出相应的中断处理代码?
程序的堆栈必须设置为足够大,以防止出现最坏情况下发生堆栈溢出。实际应用的过程中,
可使用前面提到的 checkStack( )来检查堆栈使用情况。
中断服务程序通常都需与具体任务进行通信,VxWorks 为中断服务程序提供的通信手段
很丰富,常见的有以下几种:
● 共享内存和缓冲:ISR 能够与任务共享变量、缓冲等;
二 实验目标
1. 学习如何在 VxWorks 中处理中断。
三 实验步骤
1. 新建一个 downloadable 工程 interrupt,建立过程请参考实验 15,下面为该过程 的截图:
2. 新建一个文件 interrupt.c 点击 File->New 并按照下图提示创建一个文件 interrupt.c。