S3C2410 && WinCE6.0的中断处理分析

简介: S3C2410的内核是ARM920T,所以,这里先介绍一下ARM920T的异常。ARM920T中有一个当前程序状态寄存器(CPSR),其中BIT6和BIT7分别控制FIQ和IRQ的使能与否。大家经常说的开中断和关中断,就是指的设置这两个BIT。
     S3C2410 的内核是ARM920T ,所以,这里先介绍一下ARM920T 的异常。ARM920T 中有一个当前程序状态寄存器(CPSR) ,其中BIT6 BIT7 分别控制FIQ IRQ 的使能与否。大家经常说的开中断和关中断,就是指的设置这两个BIT

       ARM体系的异常中断如下图所示:
          
       
     可以看到,ARM920T中一共有7中异常模式,如果同一时刻有多个异常发生,系统则通过优先级顺序来决定处理其中的哪一个异常。他们之间的优先级顺序从高到低依次是:

1.       Reset复位

2.       Data Abort数据访问中止

3.       FIQ 快速中断请求

4.       IRQ 外部中断请求

5.       指令预取中止

6.       未定义的指令和软件中断

当系统发生异常时,PC指针将跳转到相应的异常中断处理程序处。异常中断和其处理程序之间的对应关系被称为异常向量表,就是通常所说的中断向量表。一般情况下,它存放在低地址(0x0),但在WinCE中,该表存放在高地址(0xffff0000)

S3C2410的中断处理过程如下图所示:
          

可以看到,S3C2410中跟中断密切相关的寄存器主要有以下几个:

SUBSRCPND(二级源待决寄存器):硬件产生中断后,该寄存器的相应位被置1

SUBMASK(二级屏蔽寄存器):若该寄存器的对应位为1,则屏蔽该中断,不再往前提交;

SRCPND(源待决寄存器):如果是二级中断源产生了中断,当SUBSRCPNDSUBMASK满足条件时,该寄存器的相应位被置1,或者由一级中断源直接引起该寄存器的对应位置1

MASK(一级屏蔽寄存器):如果该寄存器的对应位为1,则屏蔽该中断,不再往前提交;

MODE(中断模式寄存器):决定中断是FIQ模式还是IRQ模式,系统中只能有一个FIQ中断。若当前中断为FIQ模式,则产生一个FIQ异常,CPU进入FIQ异常处理程序。

PRIORITY(优先级控制寄存器):控制各中断源的优先级。当有多个中断源同时发出请求时由优先级最高的中断源最终产生IRQ

INTPND(中断待决寄存器):当SRCPND某一位被置1,且没有被屏蔽,则该寄存器的相应位也被置1,同时产生一个IRQ异常,CPU进入IRQ异常处理程序。

IRQ异常处理程序中,需要清除SRCPNDINTPND。清除SRCPNDINTPND的方法比较特殊,并不是往对应的位写0,相反,应该往对应的位写1。一般是将其值读取出来,再写进去,以完成清除SRCPNDINTPND的工作。

除了以上几个寄存器外,2410还有一个INTOFFSET寄存器,用来表明当前是哪一个中断请求处理。WinCEOEMInterruptHandler()函数,就是根据其值来判断当前是哪一个中断发出请求。该寄存器在清除SRCPNDINTPND时,被自动复位。所以,代码中不必对其进行处理。

如果中断源是EINT4-23,则还需处理EXTINTnEINTFLTEINTMASKEINTPEND等几个寄存器。另外,由于2410的中断引脚一般与IO复用,所以在使用特定的外部中断之前,需要设置相应的GPIO,使其工作在中断模式下。

WinCE6.0中的中断处理过程如下图所示:
               
     可以看到,整个处理过程分为四层,分别是硬件、内核、
OAL和驱动。硬件产生一个IRQCPU进入中断服务程序,调用OAL中的OEMInterruptHandler()函数,根据IRQ返回一个SYSINTR,内核根据该SYSINTR,设置一个事件,驱动中捕获到该事件,执行相应的处理程序,完成处理后,调用InterruptDone(),通知CPU中断处理完成。

这里说明一下SYSINTRIRQ的概念。IRQ一般被认为是物理中断号,由硬件决定。SYSINTR是逻辑中断号,一般跟IRQ一一对应。这种对应关系可以在OAL中静态建立,一般通过函数OALIntrStaticTranslate()实现,静态映射的IRQ一般是MCU内部的中断源,如USB Host。为了提高驱动的可移植性,通常采用动态映射的方式,如网卡驱动。不同的硬件平台,可能使用不同的外部中断供网卡使用,通过动态映射的方式,只需修改注册表中的相应键值就能完成驱动的移植,而无须修改代码。驱动中动态映射IRQ的方法是调用函数KernelIoControl(),第一个参数为IOCTL_HAL_REQUEST_SYSINTR,传入物理中断号IRQ,正确返回后,会产生一个SYSINTR,最终完成动态转换的是函数OALIntrRequestSysIntr()IRQSYSINTR的映射关系在文件C:\WINCE600\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c中实现。

驱动中使用中断的典型过程如下:

1.       初始化GPIO,以及相应中断寄存器,配置中断的工作模式。

2.       建立一个SYSINTRIRQ对应,调用函数KernelIoControl()

3.       创建一个事件与SYSINTR关联,调用函数CreateEvent()

4.       创建一个线程,在线程中等待创建的事件,调用函数WaitForSingleObject()

5.       完成处理后,通知内核本次中断处理结束,调用函数InterruptDone()

OAL层跟中断相关的有如下几个函数:

OALIntrInit():初始化中断寄存器及相应的GPIO,可建立静态的IRQSYSINTR的映射关系。

OALIntrRequestIrqs():获取设备的IRQ号,如通过IO Address获取该设备对应的IRQ

OALIntrEnableIrqs():使能中断源,主要完成清除中断屏蔽寄存器和中断待决寄存器。

OALIntrDisableIrqs():关闭中断源,通过设置中断屏蔽寄存器的相应位以屏蔽中断源。

OALIntrDoneIrqs():清除中断屏蔽寄存器和中断待决寄存器使MCU能处理下一次中断。

OEMInterruptHandler():将IRQ号转换为SYSINTR,内核的中断服务程序将根据此值设定特定的事件。

内核中跟中断相关的工作主要有以下几个部分:

1.         定义异常处理函数,其实现文件为C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\armtrap.s

2.         创建中断向量表,其实现文件为C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\exvector.s

3.         中断向量的初始化,其实现在文件C:\WINCE600\PRIVATE\WINCEOS\COREOS\NK\KERNEL\ARM\mdarm.c中,其中的代码表明WinCE的中断向量表在高端(0xffff0000)

目录
相关文章
|
存储 Java Android开发
Android系统升级的机制概要
Android系统升级的机制概要
350 0
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型强崩溃!Meta新作:合成数据有剧毒,1%即成LLM杀手
在人工智能领域,大型语言模型(LLMs)的快速发展令人瞩目,但递归生成数据可能导致“模型崩溃”。Meta的研究揭示,模型在训练过程中会逐渐遗忘低概率事件,导致数据分布偏差。即使少量合成数据(如1%)也会显著影响模型性能,最终导致崩溃。研究强调保留原始数据的重要性,并提出社区合作和技术手段来区分合成数据和真实数据。论文地址:https://www.nature.com/articles/s41586-024-07566-y
313 2
|
4月前
|
弹性计算 网络协议 Java
Netty基础—2.网络编程基础二
本文介绍了网络编程的基本概念和三种主要模式:BIO(阻塞IO)、AIO(异步IO)和NIO(非阻塞IO)。BIO模型通过为每个客户端连接创建一个线程来处理请求,适合客户端较少的情况,但在高并发下性能较差。AIO模型通过异步IO操作,允许操作系统处理IO,适合高并发场景,但编码复杂且Linux支持有限。NIO模型通过Selector实现多路复用,适合高并发且性能要求高的场景。文章还详细介绍了NIO中的Buffer、Selector、Channel等核心组件,并提供了NIO的实战开发流程和代码示例。
|
7月前
|
存储 自然语言处理 监控
基于DeepSeek的智能客服系统安全与隐私保护:构建可信赖的服务
在前四篇文章中,我们完成了智能客服系统的开发、部署、优化和扩展。本文聚焦于安全与隐私保护,探讨如何构建安全可靠的智能客服系统。内容涵盖数据安全(加密、脱敏、备份)、系统安全(输入验证、身份认证、日志监控)和隐私保护(隐私政策、数据最小化、访问控制),确保用户数据安全及系统稳定运行。通过这些措施,我们可以打造一个可信赖的智能客服系统,为用户提供更好的服务体验。
|
11月前
|
JSON 数据格式
Cesium实现贴地线
这篇文章介绍了在Cesium中实现地面贴合线的效果及其相关技术要点。
236 5
Cesium实现贴地线
|
安全 网络安全 API
|
存储 Prometheus 监控
Prometheus 的扩展与集成
【8月更文第29天】Prometheus 是一款非常强大的监控系统,它不仅能够采集和存储时间序列数据,还提供了丰富的生态系统来扩展其功能。本文将介绍如何通过自定义 Exporters 和集成中间件(如 Thanos)来扩展 Prometheus 的能力。
351 1
|
JSON Java fastjson
简单实现_实体类与Json字符串互相转换
简单实现_实体类与Json字符串互相转换
282 1
|
Android开发
不写一行代码(二):实现安卓基于PWM的LED设备驱动
本文介绍了在Android系统中不编写任何代码,通过设备树配置和内核支持的通用PWM LED驱动来实现基于PWM的LED设备驱动,并通过测试命令调整LED亮度级别。
302 0
不写一行代码(二):实现安卓基于PWM的LED设备驱动
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势

热门文章

最新文章