[RISC-V MCU 应用开发] RISC-V CLINT 中断处理与中断嵌套

[复制链接]
 楼主| XIVN1987 发表于 2024-4-15 09:48 | 显示全部楼层 |阅读模式
本帖最后由 XIVN1987 于 2024-4-15 12:43 编辑
  1. volatile int timer_n = 0;


  2. void timer_handler (void) {
  3.     timer_n++;
  4. }

  5. timer_handler:
  6.     lui     a0, %hi(timer_n)
  7.     lw      a1, %lo(timer_n)(a0)
  8.     addi    a1, a1, 1
  9.     sw      a1, %lo(timer_n)(a0)
  10.     ret


  11. __attribute__((interrupt))
  12. void timer_handler (void) {
  13.     timer_n++;
  14. }

  15. timer_handler:
  16.     addi    sp, sp, -16
  17.     sw      a0, 12(sp)                      # 4-byte Folded Spill
  18.     sw      a1, 8(sp)                       # 4-byte Folded Spill
  19.     lui     a0, %hi(timer_n)
  20.     lw      a1, %lo(timer_n)(a0)
  21.     addi    a1, a1, 1
  22.     sw      a1, %lo(timer_n)(a0)
  23.     lw      a0, 12(sp)                      # 4-byte Folded Reload
  24.     lw      a1, 8(sp)                       # 4-byte Folded Reload
  25.     addi    sp, sp, 16
  26.     mret
对比发现,添加 __attribute__((interrupt)) 修饰后,编译器给用到的寄存器添加保存、恢复代码,并将 ret 替换为 mret.

既然 ISR 对自己使用的寄存器都会提前保存、返回时恢复,,那么发生中断嵌套就不会破坏 ISR 的上下文环境,,可以允许中断嵌套的发生

但是在中断返回时 CPU 需要 mepc 和 mstatus 中的信息确定返回地址和返回特权级,,这些寄存器编译器没有给我们保存、恢复,,因此还需要手动添加代码处理
  1. __attribute__((interrupt))
  2. void timer_handler (void) {
  3.     int mepc, mstatus;

  4.     asm("csrr %0, mepc\n\t"
  5.         "csrr %1, mstatus\n\t"
  6.         "csrsi mstatus, 8"      // mstatus.MIE = 1, interrupt enable
  7.         : "=r" (mepc), "=r" (mstatus));

  8.     // ISR code

  9.     asm("csrci mstatus, 8\n\t"  // mstatus.MIE = 0, interrupt disable
  10.         "csrw mepc, %0\n\t"
  11.         "csrw mstatus, %1"
  12.         : : "r" (mepc), "r" (mstatus));
  13. }
实现中断嵌套的关键是在重新使能中断之前保存 mepc、mstatus,并在执行 mret 之前恢复它们

但在 CLINT 下实现中断嵌套没有意义,因为 CLINT 下没有中断优先级,中断嵌套只有配合可配置的中断优先级才有意义。所以一般 MCU 厂商会使用更高级的中断控制器替代 CLINT,而不会直接使用官方简陋的 CLINT,,比如沁恒 MCU 使用了自己设计的 PFIC 中断控制器,,添加了中断优先级等功能。。

评论

看看,谢谢  发表于 2024-4-17 09:06
小夏天的大西瓜 发表于 2024-4-15 16:21 | 显示全部楼层
沁恒 MCU 使用了自己设计的 PFIC 中断控制器,,添加了中断优先级等功能,沁恒的MCU看来还是非常不错的
Dick Hou 发表于 2024-4-15 18:02 | 显示全部楼层
芯来、平头哥、Andes等等,都有另外扩展的中断控制器,实现了中断优先级以及嵌套。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

342

帖子

20

粉丝
快速回复 在线客服 返回列表 返回顶部

49

主题

342

帖子

20

粉丝
快速回复 在线客服 返回列表 返回顶部