exynos4412中断编程
中断概述
我们知道,ARM核能处理的异常有7种,但仅仅区分异常的种类显然不能够满足需求。拿手机来说,触摸屏幕和按下音量键可能都是irq异常,但是ARM并不能将他们区分开,而事实的情况是针对这两种中断,我们的处理方式显然不同,为此就需要在Soc中集成中断控制器(Generic Interupt Controller),它的核心功能就是进行中断的调度和管理。
SGI VS PPI VS SPI
exynos4412中每种中断都有自己的ID用以标识,exynos4412支持三类中断:Software Generated Interrupt (SGI),Private Peripheral Interrupt (PPI)和Shared Peripheral Interrupt (SPI)。所有的中断可以按照优先级可以划分为0~255级,和大多数芯片一样,数字越小,中断的优先级越高,同时发生的时候优先级更高的中断会被优先处理,当然,Soc对每个中断都有一个默认的优先级。
SGI表示软件生成中断,即上图中CPU和GIC通过一个寄存器进行交互,让GIC给CPU(们)发送一个中断(和ARM汇编中的swi不是一回事!)这个过程并没有真正的外设来触发中断。SGI中断具有边沿触发的属性,在多核Soc中,一个CPU可以通过触发SGI的方式和其他CPU交互。交互的形式有两种:1-N,N-N。前者表示只有一个CPU响应这个SGI,此时需要提供机制来确定到底的哪个CPU接收并响应这个SGI。后者表示所有的CPU都将接收到SGI,当一个CPU收到这个SGI之后,这个SGI在这个CPU的pending状态就被清除了,但是在其他CPU的pending状态还会继续维持。exynos4412支持最多16个SGI
PPI表示该中断只会送给某一个CPU来处理,这是一个外设中断,有边沿触发和平台触发两种触发方式。exynos4412支持最多8个PPI中断
SPI和PPI一样是外设中断,不同的是这个中断可以被GIC调度给任何CPU来处理。exynos4412支持最多128个SPI中断
中断的状态
GIC负责维护每个中断的状态标志,exynos4412的中断有四个状态:inactive,pending,active,active and pending。
Inactive即该中断既不是pending状态也不是active状态。
Pending表示一个从中断源传送到GIC的外设中断或者一个SIG中断正在等待被GIC传送到目标CPU.
Active表示一个中断正在被CPU 响应。
Active and Pending表示CPU正在响应一个中断,而GIC还用一个来自同一个中断源的中断在排队.
编程模型
源码
参考上面的中断响应结构图,为了响应一个中断,首先应该在外设层进行设置,诸如中断触发条件,中断连接管脚等,然后需要在GIC层次进行设置,比如中断的调度方法,最后在CPU层次进行设置,比如哪些中断可以进入CPU,哪些不行。
编程使用的原理图如下,程序的目的是按下一个按键,就有一个相应的LED闪烁一下。需要参考的资料有原理图、exynos4412芯片手册:
#include "exynos_4412.h"
#include "debug.h"
#define LED_ON_TIMER 0xfffff
void delay(unsigned int x){
unsigned int timer=x;
while(timer--);
}
/* 57号中断(即EINT[9],按键K2,参考原理图和芯片手册中断号表)的中断处理*/
void irq57_handler(void){
deprint("irq57\n");
GPX1.CON=GPX1.CON&(~(0xf<<0))|(0x1<<0); //配置LED3的相应管脚(GPX1_1)为输出
GPX1.DAT|=(0x1<<0); //GPX1_1输出高电平
delay(LED_ON_TIMER); //延时
GPX1.DAT&=~(0x1<<0); //GPX1_1输出低电平
}
void irq58_handler(void){
deprint("irq58\n");
GPF3.CON=GPX2.CON&(~(0xf)<<16)|(0x1<<16);
GPF3.DAT|=(0x1<<4);
delay(LED_ON_TIMER);
GPF3.DAT&=~(0x1<<4);
}
void do_irq(void){ //irq入口函数
//ICCIAR的低10位是当前触发的中断号
volatile unsigned int IRQ_ID=CPU0.ICCIAR & 0x3ff;
switch (IRQ_ID){
case 57:
irq57_handler();
//处理完中断应该将相应的中断标志清除,
//否则GIC会认为中断没有响应,继续给CPU发送这个中断
// EXT_INT41_PEND=EXT_INT41_PEND|(0x1<<1);
// BUG!!!,写一置零,如果低位本来是1,会将其一起清零!!!
EXT_INT41_PEND=0x2;
break;
case 58:
irq58_handler();
EXT_INT41_PEND=0x4;
break;
default:
break;
}
deprint("switch over\n");
//将中断号告诉GIC,表示中断处理完毕,可以将下一个pending的中断送入
CPU0.ICCEOIR = CPU0.ICCEOIR & (~(0x3ff))|IRQ_ID;
}
int main()
{
//外设配置
//1. 将GPX1_1 GPX1_2 设置为中断功能GPX1CON
GPX1.CON=GPX1.CON|(0xff<<4);
detobin(GPX1.CON);
//2. 设置GPX1_1 GPX1_2的触发方式为下降沿触发
EXT_INT41_CON=EXT_INT41_CON|(0x22);
detobin(EXT_INT41_CON);
//3. 使能GPX1_1 GPX1_2中断
EXT_INT41_MASK=EXT_INT41_MASK&(~(0x3<<1));
detobin(EXT_INT41_MASK);
//GIC配置
//4. 全局使能GIC使其可以监控外设的中断信号并转发到CPU接口
ICDDCR=1;
detobin(ICDDCR);
//5. 在中断管理器中使能57,58号中断,ICDISER1[25]
ICDISER.ICDISER1=ICDISER.ICDISER1|(0x3<<25);
detobin(ICDISER.ICDISER1);
//6. 给57 58号中断选择一个目标CPU。这里选CPU0 ICDIPTR14[23:16][15:8]
ICDIPTR.ICDIPTR14=ICDIPTR.ICDIPTR14|(0x1<<16)|(0x1<<8);
detobin(ICDIPTR.ICDIPTR14);
//CPU配置
//7. 使能全局中断信号开关,使中断能够通过相应接口到达处理器,这里是CPU0
CPU0.ICCICR=1;
detobin(CPU0.ICCICR);
//8. 优先级低于ICCPMR的中断才能被送入cpu,
//这里使所有的中断都能够经过CPU0接口到达处理器,给255。
CPU0.ICCPMR=0xff;
detobin(CPU0.ICCPMR);
while(1);
return 0;
}
exynos4412中断编程的更多相关文章
- ok6410按键中断编程,linux按键裸机
6410按键中断编程 一.流程分析 外部中断控制寄存器(s3c6410x 359页) 1.EINTxCONy: 外部中断组x的第y个控制器.这个就是设置中断的触发方式.有5种触发方式. 2.EINT ...
- STM32F103外部中断编程
STM32F103外部中断编程 中断,顾名思义就是停下手头的活,去干另外一件急活,干完急活然后回来继续干手头的活. 单片机和人一样,有时候也有更急的程序需要执行,执行完之后再回来执行之前正在执行的 ...
- stm32中断优先级管理与外部中断编程
stm32中断优先级管理与外部中断编程 中断优先级管理 外部中断编程 官方示例程序 exti.h #ifndef __EXTI_H #define __EXIT_H #include "sy ...
- linux中断编程
本文档只介绍中断编程所需的函数及应用,中断完整处理流程应参考文档<linux中断处理流程>,可参考文档<linux内核对中断的处理方式>对中断初步了解. 本文档基于3.14内核 ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- 全志A33 lichee 开发板 Linux中断编程原理说明
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 本节实验目标实现按键触发中断 ...
- 专题2-通过按键玩中断\2440按键中断编程lesson2
1.程序优化 修改Makefile 把main.c里面的mmu代码复制到mmu.c并修改如下 main.c的修改 由于在bootloader当中一般不会使用MMU,所以 main.c 加入led.c文 ...
- 嵌入式外部中断控制编程方法论—比較CC2541(51核)和S5PV210(ARM核)
这是一篇阐述怎样对嵌入式SOC外部中断进行控制编程的方法论文章.希望读者理解本篇文章后.能够具备对市场上全部已经面世和将来面世的嵌入式芯片的外部中断进行控制编程的能力. 笔者原创的技术分享一直都恪守下 ...
- Linux驱动设计—— 中断与时钟
中断和时钟技术可以提升驱动程序的效率 中断 中断在Linux中的实现 通常情况下,一个驱动程序只需要申请中断,并添加中断处理函数就可以了,中断的到达和中断函数的调用都是内核实现框架完成的.所以程序员只 ...
随机推荐
- 创建Github远程仓库
如何创建github远程仓库 首先, 你有先到github网站注册账号https://github.com 然后创建一个项目, Create a new repository 之后在在Reposito ...
- H5+JS+CSS3 综合应用
慕课网新教程H5+JS+CSS3 实现的七夕言情主题效果已经出炉了 从设计到实现到录制与编写用了快1个月的时间,说真的这个案例是慕课定制的,我之前也没有系统的做过这样的一个效果,在实现的时候自己也重新 ...
- mongoose - 让node.js高效操作mongodb
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- <JavaScript语言精粹>-读书笔记(一)
用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链. for(my in obj){ if(obj.hasOwnProperty(my) ...
- C# 给Word文档添加内容控件
C# 给Word文档添加内容控件 在MS Word中,我们可以通过内容控件来向word文档中插入预先定义好的模块,指定模块的内容格式(如图片.日期.列表或格式化的文本等),从而创建一个结构化的word ...
- 读书笔记--SQL必知必会20--管理事务处理
20.1 事务处理 使用事务处理(transaction processing),通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性. 如果没有错误发生,整组语句提交给数据库表 ...
- ORA 各种oraclesql错误
ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出 ...
- 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...
- 【转】async & await 的前世今生
async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...
- 判断IEnumerable<T>集合中是否包含有T对象
比如,有角色集合中,只有用户创建有角色,才出现“分配”铵钮.反之,隐藏. IEnumerable有一个方法,叫Any: