NIOS2随笔——中断控制

简介:

1. 概述

NIOS2 支持32个内部硬件中断,且有32级别的中断请求(irq0-irq31)。

软件通过ienable控制寄存器使能和取消中断源,还可以通过status控制寄存器的PIE位全局的开使能和取消所有中断。

硬件中断产生的条件:

  • status寄存器的PIE位为1

  • 一个中断请求输入申请irq<n>

  • 在ienable寄存器中对应的位置1


2. HAL接口API

1
2
3
4
5
6
7
<sys/alt_irq.h>
int  alt_ic_isr_register (alt_u32 ic_id, alt_u32 irq, alt_isr_func isr,  void * isr_context,  void * flags)
int  alt_ic_irq_enable (alt_u32 ic_id, alt_u32 irq)
int  alt_ic_irq_disable (alt_u32 ic_id, alt_u32 irq)
void  alt_irq_init ( void * base) 
//定义ISR中断处理函数:
typedef  void  (*alt_isr_func) ( void * isr_context);


3. 按键中断

1) 在QSYS中添加PIO组件

设置PIO位宽为1,输入模式,勾选同步边沿capture,上升沿方式,使能IRQ生成,EDGE方式。

wKiom1hbPb7wYeQhAACyyFtUEVA288.jpg

2)编写代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
 
alt_u8 key_flag =0;
 
void  ISR_handle_button( void * context ){
     key_flag =~key_flag;
     printf ( "button interrupt!\n" );
     IOWR_ALTERA_AVALON_PIO_EDGE_CAP( PIO_0_BASE,0x0); // clear the interrupt
}
 
void  init_button_pio( void ){
     IOWR_ALTERA_AVALON_PIO_IRQ_MASK( PIO_0_BASE,0x1); // 使能按钮中断
     IOWR_ALTERA_AVALON_PIO_EDGE_CAP( PIO_0_BASE,0x0); // 清边沿捕获寄存器
     alt_ic_isr_register(PIO_0_IRQ_INTERRUPT_CONTROLLER_ID, PIO_0_IRQ, ISR_handle_button,NULL,0x0);
}
 
int  main(){
     init_button_pio();
     while (1);
     return  0;
}


4. 自定义组件中断

在定义自己的Qsys组件时,可以添加自己的中断。

wKiom1hbQWnhpxytAADEKk-dtPo546.jpg

软件编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include "system.h"
#include "alt_types.h"
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
 
void  ISR_handle_FUNC( void * context){
     ...
     //清除中断
}
 
int  main(){
     volatile  int  i=0;
     
     alt_irq_init(ALT_IRQ_BASE);
     if (!alt_ic_isr_register(ALT_IRQ_INTERRUPT_CONTROLLER_ID, ALT_IRQ, ISR_handle_FUNC,NULL,0x0))
         printf ( "The IRQ is set\n" );
         
     while (1);
     return  0;
}


5. 总结

  • NIOS2中断系统中,中断号越小中断优先级越高。

  • 尽量不要在中断处理函数中使用不可重入的函数,否则可能死锁,比如printf函数。

  • 使用全局变量时,使用volatile,确保每次都能从内存中获得变量值。



本文转自 shugenyin 51CTO博客,原文链接:http://blog.51cto.com/shugenyin/1884986


相关文章
|
Android开发 异构计算
nios ii FIFO读取FPGA数据交互实验1
nios ii FIFO读取FPGA数据交互实验1
613 0
nios ii FIFO读取FPGA数据交互实验1
|
Android开发 C++ 芯片
nios ii小实验——第一个demo指导书
nios ii小实验——第一个demo指导书
637 0
nios ii小实验——第一个demo指导书
|
异构计算
nios ii小实验——SDRAM读写
nios ii小实验——SDRAM读写
568 0
nios ii小实验——SDRAM读写
|
6月前
|
IDE Java 编译器
【全网最详细】JDK8下载安装图文教程 | Java8环境变量配置指南
JDK8是2014年发布的经典Java版本,至今仍广泛应用于老项目维护与基础学习。它引入Lambda表达式、Stream API和全新日期时间API等关键特性,大幅提升代码简洁性与功能性。本教程详解官方下载、Windows安装步骤、环境变量配置及基础验证方法,助你快速上手。(239字)
|
6月前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
5145 29
|
7月前
|
人工智能 算法 测试技术
从工具到搭档:深度拆解 Claude Code 的五大核心机制与实战心法
用了一段时间 Claude Code 之后,我越来越觉得它和传统的 AI 编程助手不是一个物种。大多数 AI 编程工具本质上是"补全器"——你写半行代码,它帮你续写后半行。而 Claude Code 更像是一个能理解整个项目的"系统级协作者",它拥有超过 200K token 的上下文窗口,意味着它可以一次性"阅读"你项目中成百上千个文件,真正理解代码之间的依赖关系。 这篇文章不是官方文档的翻译,而是我在实际使用过程中对其核心架构和最佳实践的理解与总结。
5251 1
|
7月前
|
存储 人工智能 自然语言处理
零门槛玩转 OpenClaw Skill 保姆级教学:阿里云/本地部署 OpenClaw Skill 从安装到跑通流程+报错解决
很多技术小白想上手OpenClaw Skill,却卡在安装环节——报错、配置复杂、不知道如何触发技能,最终半途而废。但实际上,OpenClaw Skill的使用核心在于“敢尝试+善用AI自我纠错”,哪怕全程看不懂报错,一路确认让AI自主修复,也能成功跑通。
4252 3