freeRTOS异常处理函数分析(以RISC-V架构进行分析)

news2024/11/26 9:36:21

1、异常处理函数的注册

在这里插入图片描述

对RISC-V架构中断不熟悉,可参考博客:《RISC-V架构——中断处理和中断控制器介绍》;

2、异常处理函数分析

2.1、数调用关系

freertos_risc_v_trap_handler //异常处理函数入口
	portcontextSAVE_CONTEXT_INTERNAL //保存任务切换上下文
	
	asynchronous_interrupt //异步异常:时钟中断
		handle_interrupt //异步异常:时钟中断
			portUPDATE_MTIMER_COMPARE_REGISTER//更新产生时钟中断的时间
			xTaskIncrementTick//决定是否切换任务
			processed_source//中断返回,恢复中断现场
			vTaskSwitchContext//切换上下文
			processed_source//中断返回,恢复任务上下文
		
	synchronous_exception //同步异常:ecall调用
		handle_exception
			vTaskSwitchContext//切换任务
			processed_source//中断返回,恢恢复任务上下文

2.2、源码

.section .text.freertos_risc_v_trap_handler
.align 8
freertos_risc_v_trap_handler: //异常处理入口函数
    portcontextSAVE_CONTEXT_INTERNAL //保存任务上下文

    csrr a0, mcause //读取mcause寄存
    csrr a1, mepc	//读取发生异常时候的地址

	//注意这里把mcause中读出来的数当做符号数,高位1表示负数
	//异常异常时,mcause寄存器的高位是1(负数);同步异常,mcause寄存的高位是0
    bge a0, x0, synchronous_exception	

//异步异常:时钟中断
asynchronous_interrupt:
    store_x a1, 0( sp )  //保存发生异常返回的地址        
    load_x sp, xISRStackTop //切换到中断特有的栈空间,  xISRStackTop记录的栈顶
    j handle_interrupt

//同步异常:ecall调用
synchronous_exception:
    addi a1, a1, 4   //mepc的值+4,这里只处理ecall调用,所以默认+4。并不是所有的同步异常都要+4
    store_x a1, 0( sp )   //保存发生异常返回的地址
    load_x sp, xISRStackTop  //切换到中断特有的栈空间,  xISRStackTop记录的栈顶
    j handle_exception

handle_interrupt:
#if( portasmHAS_MTIME != 0 )

    test_if_mtimer:                     /* If there is a CLINT then the mtimer is used to generate the tick interrupt. */
        addi t0, x0, 1
        slli t0, t0, __riscv_xlen - 1   /* LSB is already set, shift into MSB.  Shift 31 on 32-bit or 63 on 64-bit cores. */
        addi t1, t0, 7                  /* 0x8000[]0007 == machine timer interrupt. */
        bne a0, t1, application_interrupt_handler

        portUPDATE_MTIMER_COMPARE_REGISTER //更新产生时钟中断的时间
        call xTaskIncrementTick	//决定是否切换任务
        beqz a0, processed_source       /* Don't switch context if incrementing tick didn't unblock a task. */
        call vTaskSwitchContext //切换上下文
        j processed_source

#endif /* portasmHAS_MTIME */

application_interrupt_handler:
    call freertos_risc_v_application_interrupt_handler
    j processed_source

//任务主动切换,调用ecall进入中断
handle_exception:
    /* a0 contains mcause. */
    li t0, 11                                   /* 11表示是M模式的系统调用 */
    bne a0, t0, application_exception_handler   /* 不是ecall调用,则执行application_exception_handler */
    call vTaskSwitchContext //切换任务
    j processed_source

application_exception_handler:
    call freertos_risc_v_application_exception_handler //死循环
    j processed_source                  /* No other exceptions handled yet. */

processed_source:
    portcontextRESTORE_CONTEXT //中断返回,恢复任务上下文

FreeRTOSv202212.01\FreeRTOS\Source\portable\GCC\RISC-V\portASM.S

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1267461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字符串函数精讲1

又是好几天没有更新了,最近有些忙,但这并不是理由,还是怪我自己玩的时间多了!但还是有在每天敲代码的!话不多说,开始这一期的学习: strlen的使用和模拟实现 • 字符串以 \0 作为结束标志&#…

Python实现学生信息管理系统(详解版)

Python实现学生信息管理系统-详解版 个人简介实验名称:学生信息管理系统系统功能实验步骤详讲添加入住学生信息删除学生的住宿信息修改学生的住宿信息查询学生的住宿信息显示所有学生住宿信息显示所有请假学生的信息 运行截图展示1.主界面2.添加新的入住学生信息3.显…

Java LeetCode篇-深入了解关于单链表的经典解法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 移除链表元素 1.1 使用双指针方法 2.0 反转链表 2.1 递归法 2.2 头插法 3.0 链表中倒数第 k 个节点 3.1 递归法 3.2 快慢指针 4.0 合并两个有序链表 4.1 递归法 …

java科学计数法表示数值

Background 大多数计算器及计算机程序用科学记数法显示非常大和非常小的结果;但很多时候,我们需要做一个统一,要么全部以科学计数法输出,要么就全部显示为普通计数。注意:这里对大于等于1的数据做了特殊处理&#xff0…

RocketMQ源码剖析之createUniqID方法

目录 版本信息: 写在前面: 源码剖析: 总计: 版本信息: RocketMQ-5.1.3 源码地址:https://github.com/apache/rocketmq 写在前面: 首先,笔者先吐槽一下RocketMQ的官方&#xff0…

用代码评论代替代码注释

在一个软件项目中,某些逻辑部分可能非常复杂,容易让人困惑。为了确保其他开发人员能够理解这些代码,同时也为了自己回顾时能够快速上手,我们通常会编写相关文档或添加大量注释来对这些复杂的逻辑进行解释。这样做的好处是能够提高…

1.自动化运维工具Ansible的安装

1.物料准备 四台服务器,其中一个是主控机,三个为host 2.安装 在主控机上安装ansible 2.1 设置EPEL仓库 Ansible仓库默认不在yum仓库中,因此我们需要使用下面的命令启用epel仓库。 yum install epel-release -y2.2 执行安装命令 yum i…

香港人均gdp世界排名,和内地相比怎么样?

香港人均gdp世界排名,和内地相比怎么样? 香港作为世界贸易港口,也是中国最发达的城市之一。其经济相比于北上广深而言,都要发达。香港人均收入世界排名第18,人均收入为4.2万美元,在世界各国人均收入排名中处…

八个优秀开源内网穿透工具

内网穿透(NAT穿透)是一种将本地网络服务暴露给互联网的一种技术。这种技术可以很好地解决许多局域网内的资源共享。采用路由的方式将一台计算机变成一个“路由器”,将公共的网络地址转为内部网络地址,从而实现通过英特网可以访问局…

dbeaver连接amabri-hbase

目录 尝试过程 解决之道 总结 尝试过程 注意此章节为记录试错过程,无需跟随操作,仅作试错记录。真正操作方法请看“解决之道”章节 环境ambari安装的hbase2.1.6 使用apche phoenix默认驱动配置 备注:Apache Phoenix 是一个开源的、基于…

软件设计师——法律法规(一)

📑前言 本文主要是【法律法规】——软件设计师法律法规的题目,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日…

7 种 JVM 垃圾收集器详解

一、概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商、版本的虚拟机所提供的垃圾收集器都可能会有很大差别,并且一般都会提供参数供用…

国内外四款SAST工具约登指数

开放Web应用程序安全项目(OWASP),是一个非营利性基金会,致力于提高软件的安全性。OWASP Benchmark是一个免费和开放的测试套件。主要是通过Java语言基准测试案例对SAST工具进行评价。通过Yonden Index(约登指数)进行计算。约登指数…

量子力学应用:探索科技前沿的奇幻之旅

量子力学应用:探索科技前沿的奇幻之旅 引言 量子力学,这门探讨微观世界规律的学科,自其诞生以来就充满了神秘与奇幻。随着科学技术的不断进步,量子力学已经从纯理论研究走向了实际应用领域,为我们打开了一个全新的科技世界。在本文中,我们将深入探讨量子力学的应用方面,…

从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升

作者:观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下,越来越多的企业开始将业务迁移到云端,传统的监控和故障排查方法已经无法满足企业的需求。在可观测理念逐渐深入人心的当下,人们越来越意识到通过多层次、…

深入了解HMAC加密技术:原理、应用与实践

一、引言 在网络安全领域,消息认证码(MAC)是一种重要的技术手段。Hash-based Message Authentication Code(HMAC)作为其中的一种,凭借其简单、高效、安全的特性,广泛应用于各种网络通信场景。本…

数据结构与算法--特殊的完全二叉树--堆,堆排序,利用堆解决topk的问题

目录 前言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树: 2.3 特殊的二叉树: 2.4 二叉树的性质 …

网络篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、如何实现跨域?二、TCP 为什么要三次握手,两次不行吗?为什么?三、说一下 TCP 粘包是怎么产生的?怎么解决粘包问题的?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…

解码 SQL:深入探索 Antlr4 语法解析器背后的奥秘

探寻SQL的背后机制 前言 在数据领域,SQL(Structured Query Language)是一门广泛使用的语言,用于查询和处理数据。你可能已经使用过诸如MySQL、Hive、ClickHouse、Doris、Spark和Flink等工具来编写SQL查询。 每一种框架都提供了…

ASEM工控机维修工业电脑控制器维修PB3400

ASEM工控机维修asem工业电脑维修常见型号:PB3400;PB2000;PB3200;PB3600;BM2200等。 ASEM工控机维修常见故障有:开不了机、黑屏、不能启动、电路板故障、主板、开机没反应、显示器没反应、主板故障、蓝屏、卡机、显示器信号灯一直闪、系统不能…