zoukankan      html  css  js  c++  java
  • ARM7中断的理解

    谈谈对中断的理解?
       中断是计算机中处理异步事件的重要机制
       
       中断触发的方式:
           1)中断源级设置
              按键:(CPU之外的硬件)
                   设置中断的触发方式
              uart控制 (CPU之内的硬件)
                   不用设置触发方式
              
              中断使能     
                        
           2)中断控制器级设置
              优先级 中断使能 ...设置发往哪个核
           3)ARM设置
              cpsr.I =0(使能中断)
        硬件自动做4件事
           1:备份cpsr到spsr_<mode>
      2:设置cpsr(主要是设置准备跳转到那个模式下执行代码)
      3:将pc-4保存到lr_<mode>(以便下次能够跳转返回)
      4;设置pc为某个异常的入口地址
                及pc=VECTOR_BASE+0x00/0x04/0x08/0x0C/0x10/0x18/0x1C
                若为IRQ异常及pc=baseaddr+0x18;
        软件应该做的事
           1:建立异常向量表  (产生中断之前就要准备完成)
           2:跳转到IRQ异常处理函数(产生中断时候跳转)
             IRQ异常处理函数
                  保护现场
                  bl c_irq_handler
                  恢复现场


              c_irq_handler
                  判断哪个硬件触发的
                  调用对应硬件操作函数
                  清空中断源 中断控制器pending       
            注:
                 保护现场:及将被异常打断任务使用的ARM寄存器的数据保存到栈中。
         恢复现场:1)从栈中将之前保存到栈的数据恢复到ARM寄存器中。2)状态恢复:cpsr=spsr_<mode> 。 3)跳转返回:pc=lr_<mode>。     

    linux中附加要求: 中断上下文  栈空间小
        为了解决某些硬件中断处理过长 人为分为顶半部 和底半部
           顶半部
           底半部
        登记底半部的方式
           1)软中断
              不灵活  不好用
           2)tasklet
              基于软中断机制实现的
              其登记的底半部工作于中断上下文
              底半部函数在中断返回之前被执行
       具有中断处理函数的特点。
           3) 工作队列   
              底半部工作于进程上下文,及是基于进程实现的。
              具有进程的特点。
           4)中断线程化
               中断线程化是实时Linux项目开发的一个新特性,目的是降低中断处理对系统实时延迟的影响。

    中断处理函数的特点:
    1:要执行速度足够的快,若执行的很慢的话的将会影响用户进程的执行,应该中断的优先级高于进程,所以只要有中断在执行进程将得不到执行,给人感觉就会觉得用户程序很卡。
    2:中断处理函数不能休眠和阻塞,同时也不能调用可能造成休眠的函数(如copy_to_user(...)/copy_from_user(...)函数可能造成休眠)。若使中断处理函数休眠就会使内核吐核。
      因为当中断休眠后将释放cpu给其他的进程或者中断,由于中断处理函数不参入进程调度,所以在主动释放cpu资源后就不能够再次的得到执行。
    3:中断中不能调用不可重入的函数,因为中断也会别高优先级的中断打断。当低优先级的中断处理函数执行到不可重入的函数被打断时,再次回来的时候会值就不准确。
      printf(....); 和浮点数的运算都是不可重入的。
    4:当执行中断处理函数时使用了独立的栈空间,该栈一般很小 通常为一个物理内存页(4KB)在中断处理函数中不能静态分配大数组。
    5:中断的优先级高于进程优先级。


    进程函数的特点:
    1:进程可以进行休眠和阻塞,因为有进程调度器会再次使其重新得到调用。
    2:进程中可以调用不可重入函数,但需要对共享资源进行加锁保护(互斥锁,信号量 等)
    3:进程也同样有自己的线程栈(栈是以线程为分配单位),该栈一般很小 通常为一个物理内存页(4KB)在中断处理函数中不能静态分配大数组。
    4:进程的执行速度无要求。

    中断线程化是实时Linux项目开发的一个新特性,目的是降低中断处理对系统实时延迟的影响。

    在LInux内核里,中断具有最高优先级,只要有中断发生,内核会暂停手头的工作转向中断处理,等到所有挂起等待的中断和软终端处理完毕后才会执行进程调度,因此这个过程会造成实时任务得不到及时处理。

    #define IRQF_ONESHOT        0x00002000------------------------------一次性触发中断,不允许嵌套。

    关于IRQF_ONESHOT特别解释:必须在硬件中断处理结束之后才能重新使能中断;线程化中断处理过程中保持中断线处于关闭状态,直到该中断线上所有thread_fn执行完毕。

    软中断是预留给系统中对时间要求最为严格最重要的下半部使用的,系统静态定义了若干软中断类型,并且Linux内核开发者不希望用户扩充新的软中断类型。

    enum
    {
        HI_SOFTIRQ=0,------------------------最高优先级的软中断类型
        TIMER_SOFTIRQ,-----------------------Timer定时器软中断
        NET_TX_SOFTIRQ,----------------------发送网络数据包软中断
        NET_RX_SOFTIRQ,----------------------接收网络数据包软中断
        BLOCK_SOFTIRQ,
        BLOCK_IOPOLL_SOFTIRQ,----------------块设备软中断
        TASKLET_SOFTIRQ,---------------------专门为tasklet机制准备的软中断
        SCHED_SOFTIRQ,-----------------------进程调度以及负载均衡软中断
        HRTIMER_SOFTIRQ,---------------------高精度定时器软中断
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */----RCU服务软中断
    
        NR_SOFTIRQS
    };
  • 相关阅读:
    Javascript异步编程的4种方法
    同步编程和异步编程
    关于js 异步回调的一些方法
    array的方法 没记住的
    阮一峰关于reduce 和transduce的博客
    CSS开发小技巧
    提升自己的一个网址
    asm.js 和 Emscripten 入门教程
    Koa -- 基于 Node.js 平台的下一代 web 开发框架
    C#中使用handsonetable的一个例子
  • 原文地址:https://www.cnblogs.com/DXGG-Bond/p/11860961.html
Copyright © 2011-2022 走看看