• [笔记].Nios II 9.1的sys/alt_irq.h与之前版本的区别


    引子

    以前版本的sys/alt_irq.h,我在这里就不多说了;此处仅浅析9.1版本的增强版的sys/alt_irq.h。

    浅析

    1 增强版的API

    表1 增强版的HAL中断的API

    表1 增强版的HAL中断的API

    2 先前的HAL中断API
    • alt_irq_register()
    • alt_irq_disable()
    • alt_irq_enable()
    • alt_irq_disable_all()
    • alt_irq_enable_all()
    • alt_irq_interruptible()
    • alt_irq_non_interruptible()
    • alt_irq_enabled()
    3 写ISR
    (1)使用增强版中断API注册ISR
    int alt_ic_isr_register(alt_u32 ic_id, 
                            alt_u32 irq, 
                            alt_isr_func isr,
                            void *isr_context,
                            void* flags)
    • ic_id为中断控制器标号,定义于system.h之中。在使用菊花链的EIC中,ic_id使用菊花链标识EIC;在IIC中,ic_id则不重要。
    • irq为设备的硬件中断号,定义于system.h之中。
      • 对于IIC来讲,irq就是IRQ号。中断的优先级与IRQ的编号成相反顺序。故IRQ_0代表最高优先级的中断,IRQ_31则是最低优先级的。
      • 对于EIC来讲,irq就是中断端口的ID。
    • isr_context指向与设备驱动实例相关的数据结构体。isr_context传递输入参数给中断服务程序的函数。用于传递特定上下文的信息给ISR,也可指向任何特定ISR的信息。该上下文的值对于HAL是不透明的;it is provided entirely for the benefit of the user-defined ISR。
    • isr指向相应的IRQ号的irq调用的ISR函数的指针。ISR函数原型如下:
    void handle_button_interrupts(void* isr_context);

          给该函数提供的输入参数就是isr_context。

          注: 给isr注册空指针,将会导致中断失去使能;handle_button_interrupts为isr服务函数名称,不固定。

    • flags保留未用。
    (2)使能或者去使能中断

    增强版的中断API提供如下函数:alt_ic_irq_disable(),alt_ic_irq_enable(),alt_ic_irq_enabled(),alt_irq_disable_all(),alt_irq_enable_all()。

    • alt_irq_enable()允许编程以使某些部分的代码禁用硬件中断,或此后重新使能它们。
    • alt_ic_irq_disable()和alt_ic_irq_enable()允许使能或去使能单独的中断。
    • alt_irq_disable_all()去使能所有中断,并返回一上下文值。
    • 欲重新使能硬件中断,可调用alt_irq_enable_all(),并传递上下文参数。中断在返回状态的优先级之前调用alt_irq_disable_all()。
    • 若可屏蔽的异常被使能,则alt_irq_enabled()返回非零值。
    • alt_ic_irq_enabled()则决定那个被指定的中断被使能。
    (3)升级至增强版的HAL中断

    表2 升级HAL中断的API

     表2 升级HAL中断的API

    (4)支持多种HAL中断的API

    在软件编译工具中选择中断API,使用system.h中的如下符号来定义其中之一,来标识哪种中断API可用:

    • ALT_ENHANCED_INTERRUPT_PRESENT——定义使用增强版的API实现
    • ALT_LEGACY_INERRUPT_API_PRESENT——定义使用先前的API实现

    在用户的驱动代码中,使用这些符号来决定哪种API被调用。

    (5)使用HAL注册按键中断的C范例
    #include "system.h"
    #include "sys/alt_irq.h"
    #include "altera_avalon_pio_regs.h"
    
    // 定义全局变量以储存边沿捕获值
    volatile int edge_capture; 
    
    //  初始化button_pio
    static void init_button_pio() 
    { 
      // 改写edge_capture指针以匹配alt_irq_register()函数原型  
      void* edge_capture_ptr = (void*) &edge_capture; 
    
      // 使能所有4个按钮中断
      IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf); 
    
      // 清边沿捕获寄存器
      IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0); 
    
      // 注册ISR
      // Nios II 9.1
      #ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
      alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID, 
                          BUTTON_PIO_IRQ, 
                          handle_button_interrupts, 
                          edge_capture_ptr, 0x0); 
      // Nios II 9.1之前版本
      #else 
      alt_irq_register(BUTTON_PIO_IRQ, 
                       edge_capture_ptr, 
                       handle_button_interrupts); 
      #endif 
    } 

    此处的BUTTON_PIO_IRQ为按钮中断的中断号;handle_button_interrupts为按钮中断的中断服务子程序,未列出。

    4 完整的ISR使用范例

    [笔记].如何使用Nios II的中断:PIO中断与定时器中断

    附录

    1 Nios II HAL 源代码路径

    X:\Altera\91\nios2eds\components\altera_nios2\HAL

    参考

    1 finalspeed的空间.quartus9.1中断的写法

    2 Altera. Exception Handling.Interrupt Service Routines

    3 Altera.HAL API Reference

  • 相关阅读:
    Vue中的混入对象mixins
    iView组件样式修改
    理解Vue.use
    webpack中的require.context
    Vue对象中的混入对象mixins
    nodejs获取客户端ip地址
    Typescript 实战 --- (3)接口
    Typescript 实战 --- (2)枚举
    进击JavaScript核心 --- (3)面向对象
    在windows中使用 nvm 实现node多版本管理
  • 原文地址:https://www.cnblogs.com/yuphone/p/1734712.html
Copyright © 2020-2023  润新知