S3C2440中断解析和基于WINCE操作系统的中断分析(整理于网络,用于按键中断使用)

在调试CAN总线的时候,遇到了操作系统的中断,为了彻底的弄清楚中断是怎么回事?我先从底层的中断开始研究,在这里我们只讨论外部中断,下面就结合S3C2440TEST测试程序来分析一下中断是怎么执行的:我们研究的是IRQ中断,分析中断过程如下,

在2440init.s中有这样的定义

HandlerIRQ  ;handler for IRQinterrupt 这个标号HandlerIRQ 就是IRQ中断发生十跳转的地址,

然后有这个定义

HandlerIRQ     HANDLER HandleIRQ  这是一个宏定义

 

我们知道HandlerIRQ 是一个标号,IRQ异常向量就是跳到这里执行的,根据上面的宏定义我又找到一个标号HandleIRQ这个标号是真正的处理函数,然后我们找到这个定义

AREA RamData, DATA, READWRITE

  _ISR_STARTADDRESS  ;_ISR_STARTADDRESS=0x33FF_FF00
HandleReset   4       //启动程序中,如下地址是依次加4
HandleUndef   4
HandleSWI   4
HandlePabort     4
HandleDabort     4
HandleReserved   4
HandleIRQ   4
HandleFIQ   4

在这里我们找到了HandleIRQ标号的入口地址:

接着往下看

HandleEINT0   4
HandleEINT1   4
HandleEINT2   4
HandleEINT3   4
HandleEINT4_7  4
HandleEINT8_23  4

HandleEINT0是IRQ异常的向量存放的地方了,是所有IRQ中断向量表的入口。

下面看2440的中断按键程序,在2440addr.h里找到了这样的定义(中断、IO、LCD等地址分配)

#definepISR_EINT0  (*(unsigned*)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1  (*(unsigned*)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2  (*(unsigned*)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT3  (*(unsigned*)(_ISR_STARTADDRESS+0x2c))
#define pISR_EINT4_7 (*(unsigned*)(_ISR_STARTADDRESS+0x30))
#define pISR_EINT8_23 (*(unsigned*)(_ISR_STARTADDRESS+0x34))

通过地址对照,我们明白了pISR_EINT0  pISR_EINT1  pISR_EINT2  pISR_EINT3  pISR_EINT4_7 pISR_EINT8_23 就是上面的

HandleEINT0  HandleEINT1  HandleEINT2  HandleEINT3  HandleEINT4_7 HandleEINT8_23 

我们知道ARM9的外部中断有5条中断信号线,当外部的中断发生时,就会触发相应的中断信号线,其中pISR_EINT4_7 pISR_EINT8_23 两条复用的中断信号线,当外部中断,4-7,8-23都会触发pISR_EINT4_7 pISR_EINT8_23 这两条中断信号线,然后再根据EINTPEND外部中断悬挂寄存器来判断是哪个外部中断源。

因此我们知道pISR_EINT0 pISR_EINT2 pISR_EINT8_23 (U32)Key_ISR;

就是将中断服务程序Key_ISR的地址传送到pISR_EINT0,pISR_EINT2, pISR_EINT8_23 所对应的HandleEINT0   HandleEINT2    HandleEINT8_23 里。从而当中断发生的时候,就可以执行相应的外部中断服务程序。

/

下面介绍基于WINCE操作系统的外部中断,我现在说一下,WINCE中断的具体过程,

首先我们要把我设置外部中断函数在我们BSP包里必须定义对应的逻辑中断号,在头文件OALINTR.H

// These are the 'standard' interrupts
#defineSYSINTR_KEYBOARD    (SYSINTR_FIRMWARE+0)
#defineSYSINTR_TOUCH     (SYSINTR_FIRMWARE+1)
#defineSYSINTR_ADC      (SYSINTR_FIRMWARE+2)
#defineSYSINTR_SERIAL     (SYSINTR_FIRMWARE+3)
#defineSYSINTR_AUDIO     (SYSINTR_FIRMWARE+4)
#defineSYSINTR_PCMCIA_STATE   (SYSINTR_FIRMWARE+5)
#defineSYSINTR_PCMCIA_EDGE    (SYSINTR_FIRMWARE+6)
#defineSYSINTR_PCMCIA_LEVEL   (SYSINTR_FIRMWARE+7)

…………// 具体查看D:\WINCE500\PLATFORM\SMDK2410\INC\oalintr.h

MapIrq2SysIntr(DWORD_Irq)这个函数我自己理解当我们的中断发生的时候,调用相应的逻辑中断号时,它就返回逻辑中断号的值。_Irq就是(SYSINTR_FIRMWARE+_Irq)中的。_Irq。只要有了这个逻辑中断号我们就可以用这个函数进行关联中断了,InterruptInitialize(SYSINTR_ETHER,g_hInterrupt, 0,0)他的作用就是,把SYSINTR_ETHER逻辑中断号和创建的事件g_hInterrupt关联起来,当有中断发生的时候,这个函数就会使g_hInterrupt这个事件生效,然后我们用这个函数WaitForSingleObject(g_hInterrupt,INFINITE);
这个函数是一个等待函数,当事件g_hInterrupt生效时,就会向下面的程序执行,否则一直在这里等待事件生效。这就是静态中断的过程,动态我还没有研究出来,可能和我们的BSP包有关系,在下面的学习中我会把它研究出来。

注:在EVC编写调用上面的函数时需要包含头文件:ceddk.h(此处用于实验室面板按键用)。

其实添加完对应的逻辑中断号之后我们还的在这几个文件中添加相应的语句才能真正的触发中断,CFW.C中(参考现有中断添加需要的中断如EINT0等)

2 OAL层中断程序汇总

关于WinCE的中断处理,OAL主要是实现了ISR部分,一般IST会在设备驱动中实现。架构如图:硬件中断产生以后,会导致内核ISR的运行,然后由OAL中的ISR来处理相应的中断,最后导致相对应的IST运行完成真正的中断处理。所以在WinCE中,中断处理由ISRIST共同完成。ISR主要完成中断源的确定,屏蔽该中断并返回给内核相对应的系统中断号,ISR应该尽量短小。IST则是完成真正的中断处理,比如数据的传输和解析等。当然不是所有的中断处理都需要ISRIST,看需要,比如WinCE的系统Timer中断就只需要ISR完成。

2.1 在OAL中支持中断,需要实现以下几个中断处理函数

a. BOOL OEMInterruptEnable(DWORD sysIntr, VOID* pData, DWORD dataSize)

sysIntr:要被使能的系统中断号

pData:传入的数据指针,该数据由InterruptInitialize函数传入

dataSize:传入数据的大小

该函数用于使能某一个硬件中断。在设备驱动调用InterruptInitialize来初始化一个中断的时候,内核就会调用该函数来使能相应的硬件中断。

b. VOID OEMInterruptDisable(DWORD sysIntr)

sysIntr:要被屏蔽的系统中断号

该函数用于屏蔽一个硬件中断。如果设备驱动调用InterruptDisable函数,则该函数会被调用。

c. VOID OEMInterruptDone(DWORD sysIntr)

sysIntr:要被重新使能的系统中断号

该函数标志着一个中断处理过程的完成。当设备驱动调用InterruptDone函数的时候,该函数会被调用,重新使能相应的硬件中断。

d. ULONG OEMInterruptHandler(ULONG ra)

ra:指令计数,在实际应用中,没有太大意义

当硬件中断产生的时候,该函数就会被调用完成ISR部分的中断处理。一般会在该函数中读取系统的中断标记位,确定中断源并返回相应的系统中断号。

e. void OEMInterruptHandlerFIQ(void)

针对于ARM处理器,该函数用于处理快速中断。

上面5个函数完成了中断的相关处理。这里要提到两个概念:IRQSYSINTRIRQ是指物理中断或者叫硬件中断,而SYSINTR指的是系统中断,也有的地方称为虚拟中断或者逻辑中断,我个人觉得还是叫系统中断比较好。每一个IRQ会和一个系统中断SYSINTR相对应,当硬件中断产生时,ISR实际上是处理IRQ中断,然后返回相应的系统中断SYSINTR给内核,内核会根据相应的SYSINTR触发相应的IST来完成中断处理。

IRQSYSINTR之间的对应关系称为映射,分为静态映射和动态映射。静态映射是指在系统编译IRQ已经和SYSINTR相对应,一般通过OALIntrStaticTranslate函数来实现。而动态映射是指WinCE系统启动后,动态关联IRQSYSINTR,一般通过KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR)来实现。

SYSINTR的类型在nkintr.h中定义,OEMInterruptHandler函数在处理完中断以后,会返回不同类型的SYSINTR给内核,内核会根据返回值进行下一步操作,分为以下几种类型:

SYSINTR_NOP:表示不需要进行任何处理

SYSINTR_RESCHED:表示要进行一次系统调度

SYSINTR_CHAIN:表示不是该中断源产生,在中断链中寻找下一个中断

SYSINTR_RTC_ALARM:表示RTC报警产生

SYSINTR_TIMING:用于ILTiming测试

SYSINTR_PROFILE:用于系统的profile

SYSINTR_FIRMWARE:用于用户自定义系统中断号,所有自定义的系统中断号都应该基于该值进行累加加1,这些自定义的系统中断号用于和IRQ一一对应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

修改 MrBayes 3.2 源码解决不能恢复断点的问题

当数据量较大时,用MrBayes进行计算通常是旷日持久的事情,几天甚至几个月。中间如果断电死机什么的发生就很令人发狂了。于是 MrBayes 3.2 svn 版增加了一个断点保存的功能,死机后可以从保存的断点处继续计算。只要在mcmc命令中加入checkfreqn…

【转】ubuntu下为APT设置代理

转自:https://blog.csdn.net/lwbeyond/article/details/8431927 Ubuntu下为APT设置代理一.最简单的方法 图形界面方法:新立得软件包管理器-->设置-->首选项-->网络。 进行设置代理就可以了。二.编辑命令 方法1:验证通过 如果您 希望…

wince6.0 s5pv210 中断

1. 在smdkv210\src\oal\oallib\ksarm.h头文件里可以看到wince的中断定义。 设备中断的起始编号即wince预定义的设备中断ID的基值 SYSINTR_DEVICES EQU 8 一共支持64个设备中断 SYSINTR_MAX_DEVICES EQU 64 可用的设备…

Regular Expression

Reference: 正则表达式三十分钟入门: http://deerchao.net/tutorials/regex/regex.htm 在线测试工具: regexlib(http://regexlib.com/default.aspx) 吐血推荐,比较狠的一个工具: Expresso &…

【转】vsftp配置实例-虚拟用户锁定目录

转自: vsftp配置实例-虚拟用户锁定目录_jasonyang69的博客-CSDN博客_vsftpd锁定用户目录 快速解决 vsftpd nologin 虚拟用户 拒绝访问 无法登录_小飞飞飞鱼的博客-CSDN博客_vsftpd 拒绝访问 一、实验步骤 0、启用 nologin shell #vim /etc/shells /bin/sh /bi…

顺丰快递,果然不一般!

2010-06-03 18:27:03快件到达北京集散点 2010-06-03 19:15:41快件离开北京集散点 发往北京集散中心 2010-06-03 21:05:34快件到达北京集散中心 2010-06-03 21:06:12快件离开北京集散中心 发往深圳集散中心 2010-06-04 02:56:29快件到达深圳集散中心 2010-06-04 02:57:04快件离开…

windowsCE异常和中断服务程序初探(-)

1。中断/异常相量的装入和执行方式。 中断和异常都是异步发生的事件,当该事件发生,系统将停止目前正在执行的代码转而执行事件响应的服务程序。而事件服务程序的入口点就是中断/异常向量所在的位置。arm的中断向量可以是0x0开始的低地址向…

windowsCE异常和中断服务程序初探(=)

继续上次的内容,在上次的分析中我们已经对SWI,FIQ,IRQ的流程有了一个大概的认识,下面继续对DataAbort和PrefetchAbort以及公共分发程序CommonHandler进行一下认识,完整异常处理的流程。 2-4 DataAbort服务程序 由数据异常触发&…

【转】Linux中tty、pty和pts概念及区别

转自:Linux中tty、pty和pts概念及区别 - 知乎 基本概念 ①tty(终端设备的统称): tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是一种通过串行线连接键盘和打印机进行发送、阅读信息的设备,后来…

Microsoft Jet SQL 参考在线手册

http://www.weste.net/book/sql/转载于:https://www.cnblogs.com/cwfsoft/archive/2010/06/19/1760961.html

Windows CE下驱动程序开发基础

我想即使读者看过微软的关于驱动开发的培训教材和CE帮助文档中的驱动部分,头脑中仍然一片茫然。要想真正了解驱动程序必须结合一些驱动程序源码,在此我以串口驱动程序(COM16550)中初始化过程为线索简单讲一讲驱动开发的基础知识。…

【转】高端球管使用了哪些高科技?

转自:高端球管使用了哪些高科技? 本文来源:第三方维修平台 本文作者:RepairCT 随着人类发现X射线,这项技术不断应用到医学领域,比如X光机、DR、CT、乳腺钼靶等医疗设备,它们的主要核心均是利用…

关于代码组织的一些看法(上)

今天看了一个篇关于架构的文章,略有所感,记录一下。 软件的架构基本是从一个原始需求出发,逐步构建可维护、更灵活的开发框架的过程,在这个构建过程中可能会逐渐的增加代码的复杂度来满足灵活性的要求,从这个层面来讲&…

CE下基于Zylonite硬件平台的SD卡驱动开发

摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于INTEL Zylonite硬件平台的BSP为基础&…

【转】svn详解

转自:svn status详解 - 世界,太精彩 - 博客园 svn 是在提交前查看本地文本和版本库里面的文件的区别。返回值有许多种具体含义如下: L abc.c # svn已经在.svn目录锁定了abc.c M bar.c # bar.c的内…

outofmemory异常如何解决?

一年多来打交道最多的就是WinForm,界面设计确实比MFC容易多了,但是问题出的也更隐晦,要想完全解决还是离不开框架底层的知识。 现在又遇到了一个麻烦的问题:切换界面时,有时GroupBox(里面嵌有ListView&…

pthread-win32在VC2005下的使用

pthread-win32是一个在Win32环境下的Unix POSIX线程库的移植. 有了它, 可以比较方便的移植Unix/Linux多线程程序到Windows下. 在VC2005下使用也很简单: 下载, 地址是 http://sourceware.org/pthreads-win32 里面include目录中是头文件, lib目录中是.lib和.dll文件. 在VC项目的属…

【转】apt命令

转自:apt命令详解 - 简书 apt命令可以说是Ubuntu系统下最为重要的命令,安装、更新、卸载软件,升级系统内核都离不开apt命令。 一、apt的简介 apt的全称是Advanced Packaging Tool是Linux系统下的一款安装包管理工具。 最初的时候&#xff…

asp.net 之高速缓存

一、输出高速缓存 页面顶部插入&#xff1a; <% OutputCache Duration"60" VaryByParam"None" %> <% OutputCache Duration"60" VaryByParam"id;page" %> 二、部分页面高速缓存 (UserControl) <% OutputCache Durati…

【转】在 Bash 中使用 -exec 选项和 find 命令搜索文件

转自&#xff1a;https://www.delftstack.com/zh/howto/linux/linux-find-exec/ 我们可以使用带有 -exec 选项的 find 命令来查找包含我们要搜索的文本的文件。 主要概念是使用 find 命令获取工作目录中的每个文件&#xff0c;并执行 grep 命令查找每个文件中的文本。 例子&…