网站大量收购闲置独家精品文档,联系QQ:2885784924

专题:嵌入式S3C2440中断系统.ppt

  1. 1、本文档共41页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
专题:嵌入式S3C2440中断系统

//中断处理服务函数原型 typedef void (*F_INTERRUPT_ISR)(); //中断处理服务函数表 F_INTERRUPT_ISR afInterruptISR[32] = {0}; ? //IRQ中断分发服务函数 //在产生IRQ中断时调用此函数,并由此函数将中断分发给各个中断服务函数 void IRQ_Dispatch() { if((INTOFFSET = 0) (INTOFFSET = 31) (afInterruptISR[INTOFFSET] != NULL)) { afInterruptISR[INTOFFSET](); //处理中断 rSRCPND |= (1 INTOFFSET); //清除中断标志 rINTPND |= (1 INTOFFSET); } } ? //装载中断服务函数 void IRQ_Install(int nInterruptNo,F_INTERRUPT_ISR fInterruptISR) { if(nInterruptNo = 0 nInterruptNo = 31) { afInterruptISR[nInterruptNo] = fInterruptISR; IRQ_SetMask(nInterruptNo,INT_MSK_ENABLE); //开启中断 } } //卸载中断服务函数 void IRQ_UnInstall(int nInterruptNo) { if(nInterruptNo = 0 nInterruptNo = 31) { afInterruptISR[nInterruptNo] = NULL; IRQ_SetMask(nInterruptNo,INT_MSK_DISABLE); //关闭中断 } } ? //设置中断掩码 void IRQ_SetMask(int nInterruptNo,int nEnable) { //根据参数对相关的中断掩码寄存器的相对应位进行设置, //注意:在开启一级中断时,要先对SRCPND中对应位进行清零,然后再对INTMASK操作。 } 3、Linux 中断服务函数及其驱动程序 1)Linux中断处理程序架构: Linux将中断分为:顶半部(top half)和底半部(bottom half) 顶半部:????? 完成尽可能少的比较紧急的功能,它往往只是简单的读取寄存器中的中断状态并清除中断标志后就进行“登记中断”(也就是将底半部处理程序挂在到设备的底半部执行队列中)的工作 特点:响应速度快 ? 底半部:????? 中断处理的大部分工作都在底半部,它几乎做了中断处理程序的所有事情。 特点:处理相对来说不是非常紧急的事件 小知识:Linux中查看/proc/interrupts文件可以获得系统中断的统计信息。 如下图所示: 第一列是中断号 ? ? ? 第二列是向CPU产生该中断的次数 2)中断服务函数 中断部分的API函数: ??static inlineint gpio_to_irq(unsigned gpio) ????例:gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);//把GPIO0_A0的PIN值转换为相应的IRQ值,并赋值给变量gpioToIrq。 ??gpio_to_irq()返回的中断编号可以传给request_irq()和free_irq()。 ??irq_to_gpio()返回的gpio编号通常用来调用gpio_get_value(),比如在沿触发的中断中获取引脚的状态。有些平台不支持这种映射,应该避免调用映射函数 ???static inline int__must_check request_irq(unsigned int irq, irq_handler_t handler,unsigned long flags, const char *name, void *dev); 范例:irq是要申请的硬件中断号;handler是向系统登记的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev参数将被传递; flags是中断处理的属性,若设置SA_INTERRUPT,标明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序不屏蔽;若设置SA_SHIRQ,则多个设备共享中断,*dev在中断共享时会用到,一般设置为这个设备的device结构本身或者NULL。当flags发生时,触发中断。 Linux 驱动程序 在开始设计程序之前介绍一下与Linux设备中断处理程序相关的知识。首先是申请与释放IRQ的API

文档评论(0)

cumhuatgw + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档