computer_knowledge_notes/Hardware/RISC-V/k210/clint.md

2.7 KiB
Raw Blame History

简介

管理核间中断。

寄存器

地址 寄存器名 描述
0x02000000~
0x02003FFF
msip[4095] 4094个核的msip寄存器(机器级软件中断待处理寄存器)每个msip寄存器只有第一位(MSIP位)是有效的,用于记录是否发生了机器级软件中断
0x02004000~
0x0200BFF0
mtimecmp[4095] 4094个核的mtimecmp寄存器。当mtime中的值大于等于某个核的mtimecmp中的值时那个核上就会发生计时器中断。计时器中断会影响对应核mip寄存器的MTIP位。
0x0200BFF8 mtime mtime寄存器。是一个64位寄存器记录了记数器的实时值。

操作

初始化clint计时器

clint_timer_init

  • clear_csr(mie, MIP_MTIP),禁止机器级计时器中断
从clint计时器获取时间

clint_get_time

  • 返回寄存器mtime的值
clint计时器的开启或关闭

clint_timer_start

  • 设置计时器的时间间隔,以及是否单发射
  • 设置当前核的mtimecmp的值即mtime的值加上一个cycles
  • 在mstatus寄存器里使能机器级中断
  • 在mie寄存器里使能计时器中断

clint_timer_stop

  • clear_csr(mie, MIP_MTIP),禁止机器级计时器中断
计时器间隔的获取与设置

clint_timer_get_interval

  • 直接返回当前核下时间间隔的值

clint_timer_set_interval

  • 直接设置当前核下时间间隔的值
  • 通过时间间隔计算出cycles的值
计时器单发射的获取与设置

clint_timer_get_single_shot

  • 直接获取当前核single_shot的值

clint_timer_set_single_shot

  • 直接设置当前核single_shot的值
计时器超时的时候用户回调函数的注册与取消注册

clint_timer_register

  • 直接把函数指针赋值给结构体clint_timer_instance

clint_timer_unregister

  • 直接把空指针赋值给clint_timer_register
核间中间的初始化、使能、取消使能

clint_ipi_init

  • 取消机器级软件中断

clint_ipi_enable

  • 在mstatus寄存器里使能机器级中断
  • 在mie寄存器里使能机器级软中断

clint_ipi_disable

  • 在mie寄存器里关闭机器级软中断
核间中断的发送与清除

clint_ipi_send

  • 将对应核的msip寄存器的MSIP位置1

clint_ipi_clear

  • 将对应核的msip寄存器的MSIP位置0
核间中断回调函数的注册与取消注册

clint_ipi_register

  • 直接把函数指针赋值给结构体clint_ipi_instance

clint_ipi_unregister

  • 直接把空指针赋值给clint_ipi_register