0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

U54内核中断进入和退出

麦辣鸡腿堡 来源:嵌入式Linux充电站 作者:Vincent 2023-10-08 09:47 次阅读

陷阱trap

术语陷阱描述了软件应用程序中的控制转移,其中陷阱处理通常在更特权的环境中执行。例如,一个特定的 hart包含三种权限模式:机器、管理员和用户。每种特权模式都有自己的软件执行环境,包括专用的堆栈区域。此外,每种特权模式都包含用于陷阱处理的单独控制和状态寄存器CSR)。在用户模式下操作时,需要上下文切换来处理主管模式下的事件。软件为上下文切换设置系统,然后执行 ECALL 指令,将控制同步切换到Environment call-from-User 模式异常处理程序。

复位后的默认模式是机器模式。软件以最高权限级别开始执行,这允许在任何权限级别更改之前初始化所有 CSR和系统资源。下面的步骤描述了将特权模式从机器模式更改为用户模式所需的步骤,在特定设计上也包括管理员模式。

应首先通过将 mstatus.MIE 写入 0(默认复位值)来全局禁用中断。

将机器模式异常处理程序的基地址写入 mtvec CSR。这是任何引导流程中的必需步骤。

将 mstatus.MPP 写入 0 以将之前的模式设置为 User,这允许我们返回到该模式。

设置物理内存保护 (PMP) 区域以将所需区域授予用户和主管模式,并可选择从机器模式撤消权限。

用主管模式异常处理程序的基地址写入 stvec CSR。

编写 medeleg 寄存器,将异常委托给主管模式。考虑 ECALL 和页面错误异常。

编写 mstatus.FS 以启用浮点(如果支持)。

将机器模式用户寄存器存储到堆栈或应用程序特定的帧指针。

用用户态软件的入口点编写mepc

执行mret指令进入用户模式。

Note:只有一组用户寄存器 (x1 - x31) 用于所有权限级别,因此应用软件负责在进入和退出不同级别时保存和恢复状态。

本地中断

软件中断(中断 ID #3):通过写入特定 hart 的内存映射中断挂起寄存器 msip 来触发。

定时器中断:当寄存器 mtime 大于或等于寄存器 mtimecmp 并且两个寄存器都是 CLINT 内存映射的一部分时,会触发定时器中断(中断 ID#7)。mtime 和 mtimecmp 寄存器通常仅在机器模式下可用,除非 PMP 授予用户或管理员模式访问它们所在的内存映射区域的权限。

图片

全局中断通常首先路由到 PLIC,然后使用外部中断进入 hart(中断 ID #11)

中断操作

在特权模式 m 内,如果相关的全局中断使能 {ie} 清零,则在该特权模式下不会产生任何中断,但更高特权模式下的待决启用中断将抢占当前执行。如果设置了{ie},则在相同特权模式下处于更高中断级别的挂起启用中断将抢占当前执行并运行更高中断级别的中断处理程序。

当发生中断或同步异常时,会修改特权模式以反映新的特权模式。处理程序特权模式的全局中断使能位被清除

中断进入和退出

当中断发生时:

• mstatus.MIE 的值被复制到mcause.MPIE 中,然后mstatus.MIE 被清除,有效地禁用了中断。

• 中断前的特权模式在mstatus.MPP 中编码。

• 当前 pc 被复制到 mepc 寄存器中,然后将 pc 设置为 mtvec 指定的值

此时,控制权移交给中断处理程序中的软件,并禁用中断。执行 mret 指令时,会发生以下情况:

• 特权模式设置为在 mstatus.MPP 中编码的值。

• 全局中断使能 mstatus.MIE 设置为 mcause.MPIE 的值。

• pc 设置为mepc 的值。

此时,控制权交给软件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5042

    浏览量

    117799
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39864
  • 控制
    +关注

    关注

    4

    文章

    997

    浏览量

    122158
  • RISC
    +关注

    关注

    6

    文章

    431

    浏览量

    83261
  • sifive
    +关注

    关注

    0

    文章

    34

    浏览量

    9426
收藏 人收藏

    评论

    相关推荐

    串口中断程序里发送数据如何进入中断

    发送中断,是在执行了MOV SBUF,A ,发送完毕后,TI置1,然后才能进入中断,可是我看到书上一个例子,在中断里发送多个字节数据,发送一字节后退
    发表于 12-20 09:25

    TMS320C54x系列DSP的中断机制

      1 C54x中的中断机制   中断信号实质上是由硬件或者是软件驱动的信号,它能使DSP暂停正在执行的程序并进入中断服务程序(ISR)。
    发表于 09-01 17:07 5416次阅读
    TMS320C<b class='flag-5'>54</b>x系列DSP的<b class='flag-5'>中断</b>机制

    STM32进入退出睡眠模式

    后,会产生RTC报警中断自动将系统唤醒。一旦退出停机模式,系统时钟被配置成先前的状态(在停机模式下,外部高速振荡器HSE和PLL是不可用的)。经过一段延时之后,系统将再次进入停机状态,并可按上述操作无限重复。
    发表于 04-03 11:43 1.1w次阅读

    Cortex-M4和Cortex-M3内核的systick不进中断的软件延时

    Cortex-M4和Cortex-M3内核的systick不进中断的软件延时Cortex-M3/4自带的systick系统定时器在用作延时功能时常常会以中断的形式退出延时。但是单片机在
    发表于 12-01 11:51 1次下载
    Cortex-M4和Cortex-M3<b class='flag-5'>内核</b>的systick不进<b class='flag-5'>中断</b>的软件延时

    FreeRTOS系列第13篇---FreeRTOS内核控制

    内核控制的一些功能需要移植层提供,为了方便移植,这些API函数用宏来实现,比如上下文切换、进入退出临界区、禁止和使能可屏蔽中断。...
    发表于 01-26 17:52 1次下载
    FreeRTOS系列第13篇---FreeRTOS<b class='flag-5'>内核</b>控制

    Linux内核外部中断解析(下)

    上篇文章我们从内核工程师的角度剖析了内核的外部中断,这节我们从BSP工程师的角度剖析一下外部中断
    发表于 06-23 15:19 278次阅读
    Linux<b class='flag-5'>内核</b>外部<b class='flag-5'>中断</b>解析(下)

    PLIC平台级中断控制器介绍

    的。 U54内核的平台级中断控制器 (PLIC) 最多可支持 132 个具有 7 个优先级的外部中断源。 Memory Map U54
    的头像 发表于 10-07 17:53 691次阅读
    PLIC平台级<b class='flag-5'>中断</b>控制器介绍

    LIC内核中断挂起位和中断使能

    中断挂起位 PLIC 内核中断源挂起位的当前状态可以从挂起数组中读取,组织为 32 位的 5 个字。中断 ID 的挂起位存储在字的位中。 因此,U
    的头像 发表于 10-07 17:57 398次阅读
    LIC<b class='flag-5'>内核</b><b class='flag-5'>中断</b>挂起位和<b class='flag-5'>中断</b>使能

    U54内核PLIC中断处理例子

    Interrupt Claim Process U54 内核 hart 可以通过读取 claim_complete 寄存器(表 115)执行中断请求,该寄存器返回最高优先级挂起中断
    的头像 发表于 10-07 18:01 537次阅读
    <b class='flag-5'>U54</b><b class='flag-5'>内核</b>PLIC<b class='flag-5'>中断</b>处理例子

    U54内核上CLINT的内存映射

    ) {// handler code} 此属性将保存和恢复处理程序中使用的寄存器,并在处理程序的末尾插入一条 mret 指令。 CLINT内存映射 下图是U54 内核上 CLINT 的内存映射: 注意
    的头像 发表于 10-08 09:34 286次阅读
    <b class='flag-5'>U54</b><b class='flag-5'>内核</b>上CLINT的内存映射

    RISC-V SiFive U54内核中断介绍

    中断 U54内核支持M模式和S模式中断。默认情况下,所有中断都在M模式下处理。对于支持S模式的 hart,可以有选择地将
    的头像 发表于 10-08 09:39 296次阅读
    RISC-V SiFive <b class='flag-5'>U54</b><b class='flag-5'>内核</b>的<b class='flag-5'>中断</b>介绍

    U54内核中断控制和状态寄存器

    向量的基地址,以及设置 U54内核处理中断的模式。对于 Direct 和 Vectored模式,中断处理模式在 mtvec 寄存器的 MODE 字段中定义。mtvec 寄存器在表 86
    的头像 发表于 10-08 09:54 356次阅读
    <b class='flag-5'>U54</b><b class='flag-5'>内核</b><b class='flag-5'>中断</b>控制和状态寄存器

    U54内核特权模式中断介绍

    特权模式中断 U54内核支持有选择地将中断和异常定向到S模式。 该功能由中断和异常委托CSR处理:mideleg和medeleg。S模式
    的头像 发表于 10-08 09:59 465次阅读
    <b class='flag-5'>U54</b><b class='flag-5'>内核</b>特权模式<b class='flag-5'>中断</b>介绍

    U54内核不可屏蔽中断信号

    不可屏蔽中断 rnmi(可恢复不可屏蔽中断中断信号是 hart 的电平敏感输入。不可屏蔽中断比 hart上的任何其他中断或异常具有更高的优
    的头像 发表于 10-08 10:05 482次阅读
    <b class='flag-5'>U54</b><b class='flag-5'>内核</b>不可屏蔽<b class='flag-5'>中断</b>信号

    ARM中的异常中断是如何实现进入中断程序的?如何进入呢?

    ARM中的异常中断是如何实现进入中断程序的?如何进入呢? 在计算机系统中,异常和中断是两个常见的概念。 在ARM中,异常和
    的头像 发表于 10-19 16:36 570次阅读