linux-2.6.26内核中ARM中断实现详解(1)

发布者:Turquoise最新更新时间:2021-03-30 来源: eefocus关键字:linux-2  6  内核  ARM中断 手机看文章 扫描二维码
随时随地手机看文章

看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。


一、中断注册方法


在linux内核中用于申请中断的函数是requeST_IRq(),函数原型在Kernel/irq/manage.c中定义:


int request_irq(unsigned int irq, irq_handler_t handler,


unsigned lONg irqflags, const char *devname, void *dev_id)


irq是要申请的硬件中断号。


handler是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。


irqflags是中断处理的属性,若设置了IRQF_DISABLED (老版本中的SA_INteRRUPT,本版zhon已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的)


dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。


devname设置中断名称,在cat /proc/interrupts中可以看到此名称。


request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。


关于中断注册的例子,大家可在内核中搜索下request_irq。


在编写驱动的过程中,比较容易产生疑惑的地方是:


1、中断向量表在什么位置?是如何建立的?


2、从中断开始,系统是怎样执行到我自己注册的函数的?


3、中断号是如何确定的?对于硬件上有子中断的中断号如何确定?


4、中断共享是怎么回事,dev_id的作用是?


本文以2.6.26内核和S3C2410处理器为例,为大家讲解这几个问题。


二、异常向量表的建立


在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的对应关系如下:


V=0 ~ 0x00000000~0x0000001C


V=1 ~ 0xffff0000~0xffff001C


arch/arm/mm/proc-arm920.S中


.section ".text.init", #alloc, #execinstr


__arm920_setup:


…… orr r0, r0, #0x2100 @ ..1. ...1 ..11 ...1


//bit13=1 中断向量表基址为0xFFFF0000。R0的值将被付给CP15的C1.


在linux中,向量表建立的函数为:


init/main.c->start_kernel()->trap_init()


void __init trap_init(void)


{


unsigned long vectors = CONFIG_VECTORS_BASE;


……


memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start);


memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start);


....


}


在2.6.26内核中CONFIG_VECTORS_BASE最初是在各个平台的配置文件中设定的,如:


arch/arm/configs/s3c2410_defconfig中


CONFIG_VECTORS_BASE=0xffff0000


__vectors_end 至 __vectors_start之间为异常向量表。


位于arch/arm/kernel/entry-armv.S


.globl __vectors_start


__vectors_start:


swi SYS_ERROR0:


b vector_und + stubs_offset //复位异常:


ldr pc, .LCvswi + stubs_offset //未定义指令异常:


b vector_pa^ + stubs_offset //软件中断异常:


b vector_da^ + stubs_offset //数据异常:


b vector_addrexcptn + stubs_offset //保留:


b vector_irq + stubs_offset //普通中断异常:


b vector_fiq + stubs_offset //快速中断异常:


.globl __vectors_end:


__vectors_end:


__stubs_end 至 __stubs_start之间是异常处理的位置。也位于文件arch/arm/kernel/entry-armv.S中。vector_und、vector_pa^、vector_irq、vector_fiq都在它们中间。


stubs_offset值如下:


.equ stubs_offset, __vectors_start + 0x200 - __stubs_start


stubs_offset是如何确定的呢?(引用网络上的一段比较详细的解释)


当汇编器看到B指令后会把要跳转的标签转化为相对于当前PC的偏移量(±32M)写入指令码。从上面的代码可以看到中断向量表和stubs都发生了代码搬移,所以如果中断向量表中仍然写成b vector_irq,那么实际执行的时候就无法跳转到搬移后的vector_irq处,因为指令码里写的是原来的偏移量,所以需要把指令码中的偏移量写成搬移后的。我们把搬移前的中断向量表中的irq入口地址记irq_PC,它在中断向量表的偏移量就是irq_PC-vectors_start, vector_irq在stubs中的偏移量是vector_irq-stubs_start,这两个偏移量在搬移前后是不变的。搬移后 vectors_start在0xffff0000处,而stubs_start在0xffff0200处,所以搬移后的vector_irq相对于中断 向量中的中断入口地址的偏移量就是,200+vector_irq在stubs中的偏移量再减去中断入口在向量表中的偏移量,即200+ vector_irq-stubs_start-irq_PC+vectors_start = (vector_irq-irq_PC) + vectors_start+200-stubs_start,对于括号内的值实际上就是中断向量表中写的vector_irq,减去irq_PC是由汇编器完成的,而后面的 vectors_start+200-stubs_start就应该是stubs_offset,实际上在entry-armv.S中也是这样定义的。


关键字:linux-2  6  内核  ARM中断 引用地址:linux-2.6.26内核中ARM中断实现详解(1)

上一篇:ARM基础篇—什么是嵌入式系统?
下一篇:基于WINCE的多串口扩展系统的设计

推荐阅读最新更新时间:2024-11-12 12:17

cc2530裸机编程系列笔记6--外中断程序
在做实验之前我们先来了解一下cc2530的51内核的外部中断的基本信息,同样我们去datasheet里面找找这些中断的说明文字: Interrupts The CPU has 18 interrupt sources. Each source has its own request flag located in a set of interrupt flag SFR registers. Each interrupt requested by the corresponding flag can be individually enabled or disabled. The def
[单片机]
cc2530裸机编程系列笔记<font color='red'>6</font>--外<font color='red'>中断</font>程序
德宏股份子公司签订不低于6亿元储能产品销售框架协议
  为推进浙江德宏汽车电子电器股份有限公司(以下简称“公司”)控股子公司浙江镇能科技有限公司(以下简称“镇能科技”)储能业务发展,保障镇能科技后续主要原材料的长期稳定供应,公司近日与兰钧新能源科技有限公司(以下简称“兰钧新能源”)签订了采购框架协议。根据协议,公司承诺在产品测试合格后,自2023年3月1日起至2023年12月31日期间,拟向兰钧新能源采购不低于500MWh的磷酸铁锂电芯,并保留追加订货的权利,兰钧新能源应确保对公司的供货。具体价格及付款方式以实际PO为准,具体交付时间双方另行确定。   镇能科技近日与浙江全维度能源科技有限公司(以下简称“全维度”)签订了销售框架协议。根据协议,自2023年2月1日起(含
[新能源]
美参议院通过修正版FISA,同意情搜外国企业合法再延长6
该条款将让美国情报机构不需法院令命即可向Google、微软、Facebook或电信业者调阅国外用户的通讯纪录,且禁止厂商通知受影响的用户 美国众议院于上周通过修正版的外国情报监视法案(Foreign Intelligence Surveillance Act,FISA),美国参议院亦于本周四(1/18)以65比34的票数通过此一法案, 只待川普签名后,就能将美国政府搜集海外通讯内容的权力延长6年。 FISA中的702条款允许美国政府在未取得任何授权的情况下,藉由美国企业搜集居住在国外的非美国人通讯数据,自2008年生效,原本会在今年1月到期,但修正后的FISA则将702条款延长到2024年。 该条款将让美国情报机构不需法院令命即可
[手机便携]
测量 XW-HLR26-24G 微波雷达模块的性能测试
  对于 XW-HLR26-24G毫米波测距测速雷达传感器模块移动侦测传感器可调距离TTL输出 中的微波雷达进行功能测试。 1.1 接口定义   SW-HLR26的接口如下图所示。这是对应的2mm间距的PIN4接口。 ▲ 图1.1 XW-HLR26-24G微波雷达模块 1.2 测试电路板   利用 ESP32-S模块转接板设计与实现 中的ESP32的UART的UART1对 XW-HLR26-24G进行测试。 ▲ 图1.2.1 ESP32-S 转接板的接口定义 1.2.1 ESP32串口测试 from machine import UART,Pin import utime led = Pin(5, P
[测试测量]
测量 XW-HLR<font color='red'>26</font>-24G 微波雷达模块的性能测试
中环公布7月单晶硅片报价 M6硅片下跌0.18元
集微网消息7月17日,天津中环股份发布中环半导体单晶硅片价格。 与6月29日公布的价格相比,中环M6型各尺寸硅片最新报价全部下跌,其中M6 170μm报价4.54元/片,下跌0.18元/片;M6 165μm报价4.49元/片,下跌0.18元/片;M6 160μm报价4.44元/片,下跌0.18元/片。 来源:中环股份 公开信息显示,天津中环半导体股份有限公司成立于1999年,前身是天津市第三半导体器件厂,主营业务包括高压器件、功率集成电路与器件、单晶硅和抛光片。
[手机便携]
中环公布7月单晶硅片报价 M<font color='red'>6</font>硅片下跌0.18元
STM8L052C6硬件I2C调试:PCF8563/BM856时钟芯片
网上基本都提倡用软件模拟I2C,之前读温湿度传感器也是用模拟的。这次有时间和机会再次用上I2C,固决定用硬件I2C调试下,目前看来没有问题,读写设备都正常。 一、注意事项 1、I2C硬件上需要外部上拉,单纯软件上拉不行。 2、如连续读个字节如8563的second~years数据共7 bytes,中间需要delay。否则只能成功读取前两个byte, clock会断掉。具体delay时间没有确切的验证,用如下实例代码测试OK。 3、查看是否有time定时中断,读写过程最好先关中断。 二、工程下载 https://download.csdn.net/download/xqw19891201/11267260
[单片机]
传郭台铭在美国设6代面板厂 导入夏普IGZO技术
郭台铭与美国总统川普见面,谈的是投资美国的话题,郭台铭只透露「签了一个约」,市场传言,郭台铭是投资6代线面板厂,也就是笔电和平板产品,预计第3季至第4季就会动土。 根据《苹果日报》指出,市场传出鸿海将在美国设置6代面板生产线,除了先前传出将落脚宾州之外,另外还有2个地方供郭董选择,一旦鸿海决定落何处,新厂将在今年底前动土,符合先前鸿海副总裁戴正吴所说「3年后启用」的说法。 报导引述专家分析说,新厂技术将以夏普引以为傲的IGZO为主,此技术生产的面板以省电著称,除适合在平板与笔电使用外,也可以用来生产电视面板。 除了面板厂投资,鸿海也可能会在美国做电视组装,因为北美市场的电视销售是全球数一数二,但碍于夏普品牌在北美销售权已授权给海信
[手机便携]
ARM Cortex-A12定位中端市场 要整死其他MCU内核
近日,ARM推出新的内核Cortex-A12,定位为中端市场,终端价格在200美元左右。宣称在相同功耗下,比原来同样定位的A9性能提升40%,尺寸上减小了30%。 ARM让英特尔大为不安,其实受影响的又何止是英特尔一家呢,对于很多的MCU厂商来说,不管口头上多么兴奋而自豪的说自己产品采用ARM架构,将自己的产品拉的跟时髦的ARM很近,内心都在痛苦的抉择,自己苦心开发和经营的MCU架构却要束之高阁或者拉低到低端市场。比如,飞思卡尔、ATMEL、东芝、富士通等,即使一开始抵制ARM的瑞萨也在去年底的时候不得不开始布局ARM架构,据悉目前排名在前几位的MCU厂商,只剩下Microchip没有走入ARM阵营,虽然Microchip声称
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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