You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否从命令行增加中断号并通过devmem触发ARM GIC中断?

问题解答

1. 能否通过devmem操作GIC寄存器触发中断?

可以,但需先确认GIC的物理基地址,再按步骤操作相关寄存器,注意操作需root权限。

前提:获取GIC基地址

在Petalinux中执行cat /proc/iomem,查找类似如下的GIC地址段(示例地址仅供参考,以实际输出为准):

f9000000-f90fffff : arm,gic

其中f9000000为GIC基地址,分发器(Distributor)从该地址起始,CPU接口(CPU Interface)通常偏移0x10000(GICv2版本标准偏移)。

操作核心寄存器(针对GICv2,你的输出显示为GIC 0,大概率为该版本)

你列出的寄存器中,以下是触发中断的关键操作对象:

  • ICDDCR(分发器控制寄存器):先启用分发器,写入0x1:
    devmem 0xf9000000 32 0x1
    
  • ICDISER(中断使能寄存器):41号中断对应第1组ICDISER(每组控制32个中断,41=32+9),偏移地址为0x100 + 4*1 = 0x104,置位对应位:
    devmem 0xf9000104 32 $(devmem 0xf9000104 32 | awk '{print "0x" toupper(sprintf("%x", $1 | (1<<9)))}')
    
    若操作42号中断,对应位为1<<10,寄存器偏移相同。
  • ICDIPTR(中断目标CPU寄存器):指定中断发送到CPU0,41号中断对应偏移0x800 + 4*41 = 0x8A4,写入0x01:
    devmem 0xf90008A4 32 0x01
    
  • ICCICR(CPU接口控制寄存器):启用CPU接口,地址为GIC基地址+0x10000:
    devmem 0xf9010000 32 0x3
    
  • ICCPMR(优先级掩码寄存器):允许所有优先级中断,写入0xff:
    devmem 0xf9010004 32 0xff
    

模拟中断触发注意事项

你的中断标记为level(电平触发),仅操作GIC寄存器无法直接触发,需通过操作DMA设备的寄存器(比如触发DMA传输完成事件)来产生电平中断信号。若为边沿触发,可尝试使用GIC的ICDSGIR软件触发寄存器,但该寄存器仅适用于软件中断,无法直接触发外设DMA中断。

2. 能否从命令行增加中断号?

不行。中断号由内核根据设备树配置、驱动注册逻辑静态分配,用户空间无权限直接新增中断号。若需新增中断,需:

  • 修改设备树,添加新的中断节点;
  • 编写或修改内核驱动以注册该中断;
  • 重新编译Petalinux内核与设备树,重新部署至开发板。

内容的提问来源于stack exchange,提问作者Creator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:33:18