VxWorks基于AT91RM9200处理器的中断处理

发布者:Tiger8最新更新时间:2012-03-27 来源: 兰州交通大学学报 关键字:VxWorks  AT91RM9200  中断处理 手机看文章 扫描二维码
随时随地手机看文章

  Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求。

  因此,熟悉其中断的处理过程对于VxWorks操作系统的开发是至关重要的.本文通过编写和调试基于AT91RM9200处理器的VxWorks嵌入式操作系统的BSP,来讨论VxWorks操作系统的中断机制。

1 VxWorks中断处理机制及AIC

  AT91RM9200使用一个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()函数中调用。

  at91rm9200IntDevInit(void)函数中主要是配置系统的钩子函数,然后对中断源向量寄存器和中断模式寄存器进行配置,同时要清除并禁止AIC中所有的中断。

2.3 中断驱动中的回调函数

  在intEnt中,程序很快就进入了特权模式(SVC32),如果是中断可嵌套模式,要设置该模式下的堆栈,并且将中断深度intCnt值加1.然后跳转到intIntRtnPreempt中,在intIntRtnPreempt中为后来调用中断驱动中的函数开辟了32个字节的堆栈空间,并且将程序指针拉到at91rm9200LvlVecChk函数处执行,at91rm9200LvlVecChk函数是在中断驱动中定义的函数,是用来检测当前挂起的中断中,优先级最高的中断源。检测出最高优先级的中断后,首先要禁止该中断,因此要调用at91rm9200LvlDisable函数,该函数也在中断驱动中定义。在禁止中断的过程中,需要通过intLock和intUnLock函数来保护临界代码不被新的中断打断。

  at91rm9200LvlVecChk()函数是通过读AIC_IVR寄存器来获取当前最高优先级的中断,将获得的中断号和中断向量赋给2个变量,并且禁止该中断。

  at91rm9200LvlVecAek()函数是在中断处理结束后,通过写AIC_EIOC寄存器来清除刚刚处理的中断,并将其使能。 at91rm9200LvlEnable(int leve1)和at91rm9200LvlDisable(int level)来允许和禁止中断,从而保护临界代码不被新的中断所打断。

2.4 中断驱动程序实现的流程图

  中断驱动程序实现的流程图如图1所示。


     
图1 中断驱动程序实现的流程图 [page]



3 VxWorks中断模块实现机制

3.1 异常中断向量表的生成及实现

  在usrInit()函数中通过intVecBaseSet((FUNCPTR*)VEC_BASE_ADRS)函数对异常中断向量表的基址进行设置, VEC_BASE_ADRS在configall.h中定义为程序运行空间的起始地址,但是在ARM中并没有中断基址寄存器,由于ARM9有重影射机制,可以将程序运行空间的起始地址影射成0地址,这也符合ARM体系结构通常都是把异常中断向量表放在0地址处的惯例,异常中断向量表可以从反汇编 bootrom_uncmp后的0地址处看到。当有内置的外设中断或外部中断产生时,系统首先跳转到异常中断向量表的0x18处,此处是IRQ中断向量的位置,该内存中放置的是一条跳转指令,因为excVecInit()对中断向量表初始化后,生成了一个exeEnterTbl,在这个表中列出了异常向量和对应入口函数的结构表,exeEnterTbl结构如图2所示。


 
图2 excEnterTbl的结构

  由于ARM9用了重影射机制,因此重影射之后,系统将LOCAL_MEM_LOCAL_ADRS影射成0地址,中断向量表从0地址处开始。从 excVecInit()的反汇编代码可以看出,系统把指令ldr pc,[pc,#244]的反汇编代码放在了从0x00000004开始的每个异常中断向量地址处,也就是将excEnterTbl中每个异常处理函数的入口地址都放在了(0xF4+0x8+0x4+所对应异常相对于未定义指令异常(0x00000004)的偏移)的内存中,这样就将异常向量和异常处理入口函数关联起来了。

3.2 中断向量表的结构及生成

  那么当系统产生中断后,VxWorks是如何设置中断向量表,并且将中断向量和中断处理入口程序关联起来的呢?和异常向量表有点类似,但是中断向量表是VxWorks操作系统动态分配的一段连续的内存空间,这个空间的结构如图3所示。


 
图3 VxWorks中断向量表的结构

  因为是动态分配,所以在这段内存空间中,操作系统只给当前中断分配了中断号、中断处理函数的入口和被传递的参数。每个中断源按照中断号顺序排列,在为每个中断源分配的内存空间中头4个字节是中断向量表的初始化函数的入口,该函数对于每个中断源来说是通用的,然后顺序放置的是中断号、中断处理函数入口和被传递的参数.通过intconnect()函数可以将中断向量和中断处理函数关联起来,因此在系统获知了发生中断的中断号时,就可以找到相应的中断处理函数去处理该中断。当发生IRQ异常时,系统强制把程序指针拉到0x18处,在0x18处是这样一条指令ldrpc,[pc,#244],IRQ异常相对于未定义指令异常的偏移是0x14,所以相当于把0x114地址处的内容赋给pc,而0x114处的内容正是IRQ异常向量处理的入口函数intEnt的地址,因此程序跳转到intent处去执行。

4 中断处理跟踪调试的部分反汇编代码

  通过使用ARM Developer Site仿真器,在0x18处设置断点后单步执行来分析中断处理的过程。中断处理函数的入口处代码如下:


  2070b174[0xe59fb410] ldr r11,0x2070b58c; /*=#0x207a40c8,0x207a40c8是中断向量表的位置*/
  2070b178[0xe59dc018] ldr r12,[r13,#0x18] /*将0x207b1ce8中的内容给r12应该是中断号!!!*/
  2070b17c[0xe59bb000] ldr r11,[r11,#0] /*0x207a40c8处的内容是0x21ffbef8*/
  2070b180[0xe08b318c] add r3,r11,r12,lsl #3 /*将0x21ffbef8(内存地址)给r3,0x21ffbef8的内容是向量0x207064b0,这是debug口中断处理函数的入口*/
  2070b184[0xe79ba18c] ldr r10,[r11,r12,lsl#3]
  2070b188[0xe5930004] ldr r0,[r3,#4] /*相应的参数传递给r0*/
  2070b18c[0xe1a0e00f] mov r14,pc
  2070b190[0xe1a0f00a] mov pc,r10 /* r10=0x207064b0,跳转到debug口中断处理函数处执行*/
  0x21ffbef8(中断向量表基址)处的情况是:
  21ffbef8[0x2070b434] dcd 0x2070b434 4.p
  21ffbefc[0x00000000] dcd 0x00000000....
  21ffbf00[0x207064b0] dcd 0x207064b0.dp
  21ffbf04[0x207a9990] dcd 0x207a9990..z
  21ffbf08[0x2070b434] dcd 0x2070b434 4.p
  21ffbf0c[0x00000002] dcd 0x00000002....
  21ffbf10[0x2070b434] dcd 0x2070b434 4.P
  21ffbf14[0x00000003] dcd 0x00000003....
  21ffbf18[0x2070b434] dcd 0x2070b434 4.P
  21ffbf1c[0x00000004] dcd 0x00000004....

5 结语

  Vxworks操作系统首先调用excVecInit()生成一个异常中断向量表excEnterTbl,当有IRQ中断发生时,根据 excEnterTbl中0x00000018处的指令ldr pc,[pc,#244]跳转到0x00000114处,即IRQ异常中断的入口处intEnt执行,随后通过读AIC_IVR寄存器得到当前优先级最高的中断,返回这个中断号,并跳转到intConnect()函数给该中断号关联的中断处理程序入口去执行。在这个过程中,中断向量表的生成是 Vxworks动态分配的,在AT91RM9200中,为0到31号中断源在中断向量表中都分配了空间,该空间的格式固定。中断处理结束后,通过往 AIC_EIOC寄存器中写任意值,从中断中返回。

关键字:VxWorks  AT91RM9200  中断处理 引用地址:VxWorks基于AT91RM9200处理器的中断处理

上一篇:LPC2292的μC/OS-II硬件抽象层构建
下一篇:由AT91M55800A构成的简易数据采集方案

推荐阅读最新更新时间:2024-03-16 12:56

风河推出新版VxWorks 6.7实时操作系统
设备软件优化厂商风河系统公司(Wind River)日前宣布,即日起推出显著增强的VxWorks 6.7,让设备制造商充分发挥最新的多核处理器的能力,解决其关键性业务中的问题。 VxWorks 6.7提供给系统设计人员最佳的多核设计配置,包括非对称多处理(Asymmetirc Multiprocessing, AMP)和对称多处理 (Symmetic Multiprocessing),在推出更高性能的下一代设备时,产品的电力消耗可以保持不变甚至更低。VxWorks 6.7为了帮助设备制造商降低设备物料成本、提高系统部件集成度、增加现有部件重复利用率以及降低运行费用而进行了专门设计,同时以丰富的功能为高质量的设备缩短上
[嵌入式]
VxWorks几种常用的延时方法
  嵌入式系统中,一个任务往往需要在特定的延时之后执行一个指定的动作,比如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。这就需要利用定时器机制来计量特定长度的时间段。VnWorks作为实时嵌入式系统,提供多样的定时接口函数。下面列举一些常用的定时方式,并说明其注意事项。    1 taskDelav    taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期)。该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用于任务调度(将CPU交给同一优先级的其他任务)外,任务延时也常用于等待某一外部事件,作为一种定时/延时机制。在没有中断触发时,taskDelay能很方便地实现,且
[安防电子]
ATmega32 复位与中断处理
AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位I 也置位时,中断可以发生。根据程序计数器PC 的不同,在引导锁定位BLB02 或BLB12 被编程的情况下,中断可能被自动禁止。这个特性提高了软件的安全性。详见 P240“ 存储器编程” 的描述。 程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P42 “中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高 的优先级,第二个为 INT0 – 外部中断请求 0。通过置位通用中断控制寄存器 (GICR) 的 IVSEL,中断向量可以移至
[单片机]
基于VxWorks的油井数据采集远程终端的设计
    引 言   目前,采油厂多以抽油机采油生产为主要任务,抽油机的分布点多面广,工作在条件恶劣的环境中,容易损坏和遭外力破坏,需要经常巡测,人员工作强度大。目前油井工作状态参数监控由于缺乏远程手段,对油井的生产状况均处于事后处理状态,油井出现异常或被盗破坏时不能及时处理,造成大量不明损失。基于CD-MA通迅信道的远程终端(Remote Terminal Unit,RTU)充分利用现有的计算机网络,通过对现场的监测和数据采集、传输,可以满足油井远程监控的需求。该远程终端可以对油井运行时的负荷、位移、油管回压、温度、冲次、工作电流、电压等参数进行实时全自动在线抄收;当现场有异常情况发生时,监控中心能自动发出相关报警信息,调度室可根
[单片机]
基于<font color='red'>VxWorks</font>的油井数据采集远程终端的设计
实时操作系统VxWorks在跟踪雷达系统中的应用
摘要:实现跟踪雷达系统中各子系统之间的实时通讯,重点是信号处理子系统中信号处理板和网络间的实时通讯。在实时操作系统VxWorks平台下,编写PCI设备的驱动程序和网络通讯程序,以完成通讯功能。VxWorks的高可靠性和强实时性在应用中得到了充分的验证,在VxWorks平台的支持下,信号处理子系统完成了信号处理和网络之间的实时通讯。 关键词:VxWorks 跟踪雷达 PCI 网络通讯 跟踪雷达在跟踪高速目标时,需要有足够快的反应速度,这不仅对它自身的硬件系统的实时性要求较高,而且对相应软件系统的实时性要求也较高。用实时操作系统VxWorks作为跟踪雷达系统中的操作系统,可以满足软件对实时性需求。 本系统中,跟踪雷达各分机设备
[嵌入式]
基于ARM处理器中断处理的编程实现
  ARM编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解ARM内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。   ARM处理器异常中断处理概述   当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。ARM体系
[单片机]
基于ARM处理器<font color='red'>中断处理</font>的编程实现
VxWorks操作系统的CompactPCI测试仿真系统
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),该系统以其良好的可靠性和卓越的实时性被广泛地应用在通讯、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上以及1997年4月在火星表面登陆的火星探测器上都使用到了VxWorks。 VxWorks系统在各方面的性能表现卓越,主要表现在以下几方面: (1)良好的实时性和稳定性 · 优先级抢占调度和时间片轮转调度 · 强大市场占有率、国防军事的多种应用 (2)高效的任务管理 · 多任务,0~255的256个优先级 ·
[电源管理]
<font color='red'>VxWorks</font>操作系统的CompactPCI测试仿真系统
基于VxWorks的产品映象设计
摘 要: 本文分析了VxWorks的映象特点,设计了几种VxWorks下产品映象的构造方案,并指出了这些构造设计的应用场合。 关键词: VxWorks;映象;启动代码 VxWorks是目前占垄断地位的实时操作系统,在许多领域获得广泛应用,但其产品映象设计却一直是令设计工程师头疼的问题。本文在实践验证的基础上,讨论了基于VxWorks操作系统上的产品映象设计技术,具有很强的实用性。 VxWorks的映象分析 VxWorks映象内容包括:代码段(Text segment)、数据段(Data Segment)和符号起始块段(BSS Segment)。其中,代码段指可执行的指令集合;数据段指已经初始化的全局和静态变量
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved