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

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_exceptionvTaskSwitchContext//切换任务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寄存的高位是0bge 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。并不是所有的同步异常都要+4store_x a1, 0( sp )   //保存发生异常返回的地址load_x sp, xISRStackTop  //切换到中断特有的栈空间,  xISRStackTop记录的栈顶j handle_exceptionhandle_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, 1slli 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_handlerportUPDATE_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_handlerj 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_sourceapplication_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.mzph.cn/news/182123.shtml

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

相关文章

Python-pip配置国内镜像源,快速下载包

文章目录 国内镜像源临时使用永久配置添加环境变量Path测试关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 国内…

零代码连接钉钉宜搭与用友U8,让业财数据管理简单高效

零代码连接钉钉宜搭与用友U8,让业财数据管理简单高效 如果把企业内部的业务系统比作一条条河流,那么它们的交汇点就像江河湖海。在这些交汇点上,数据的汇集、分析和共享离不开系统之间的集成。 钉钉宜搭和用友U8是两个在企业中非常重要的系统…

实现电商平台与营销系统无缝集成:雅座的无代码开发与API连接

无代码开发:营销的新引擎 在数字化转型的浪潮中,无代码开发已成为企业提升效率、减少成本的新引擎。这种开发方式允许非技术人员通过图形界面构建应用程序,无需编写代码即可实现复杂功能。这对于营销、广告推广以及用户运营等业务尤为重要&a…

wvp 视频监控平台抓包分析

抓包时机 下面的抓包时机是抓包文件最新,但是最有用的包 选择网卡开始抓包 如果之前已经选择网卡,直接开始抓包 停止抓包 重新抓包 sip播放过程分析 过滤条件 tcp.port 5060 and sip 可以看到有这些包 选择任何一个 ,戍边右键--追踪流--…

JDK21下载+安装+环境配置教程(Windows系统)

前言:甲骨文公司与2023.9发布JDK21,JDK21将是一个长期支持(LTS)版本,JDK20目前可以从官网下载使用。 1,搜索Oracle官网找到JDK21 Java Downloads | Oracle 2,切换Windows系统,然后点击下载&am…

Mysql 不执行索引问题与优化

难以查找的隐藏问题 及 解决办法: 问题总结:

项目demo —— GPT 聊天机器人

本文介绍我的开源项目 TelegramChatBot,这是一个基于 OpenAI GPT API 开发的 telegram 机器人,具有多模态交互能力,求 star!感谢大家!在 telegram jokerController_bot 立即体验!欢迎对 GPT 应用开发或对 t…

【分布式系统学习】CAP原理详解

CAP原理详解 前言CAP一张图 一、概念1.1 关键词解读1.2 关于CAP(拆分解读)1.3 CAP原理精髓 二、CAP模拟场景举例理解三、CAP原理证明为什么不能同时满足(下面举例说明)3.1 必须满足分区容错性P下的处理方式3.2 不是必须满足分区容…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境,从而使创建图表的过程更简单、更直…

Golang中rune和Byte,字符和字符串有什么不一样

Rune和Byte,字符和字符串有什么不一样 String Go语言中, string 就是只读的采用 utf8 编码的字节切片(slice) 因此用 len 函数获取到的长度并不是字符个数,而是字节个数。 for循环遍历输出的也是各个字节。 Rune rune 是 int32 …

[数据结构]-map和set

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

centos系列:【 全网最详细的安装配置Nginx,亲测可用,解决各种报错】

全网最详细的安装配置Nginx,亲测可用,解决各种报错 全网最详细的安装配置Nginx1、 安装环境依赖2、 下载Nginx包3、编译Nginx4、安装Nginx5、启动Nginx6、配置Nginx7、了解Nginx服务的主配置文件 nginx.conf8、基于授权的访问控制9、基于IP和端口的访问控…

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

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

《opencv实用探索·四》Mat图像数据类型转换和归一化显示

一种数据类型转为另一种数据类型,不改变图像大小,但每个像素值可能会变 src.convertTo(dst, type, scale, shift);Scale和shitf默认为0(这两个参数也相当于对比度和亮度) 现在有个8位图像,把8位转成32位 可以看到像素…

SparkRDD及算子-python版

RDD相关知识 RDD介绍 RDD 是Spark的核心抽象,即 弹性分布式数据集(residenta distributed dataset)。代表一个不可变,可分区,里面元素可并行计算的集合。其具有数据流模型的特点:自动容错,位置…

【目标跟踪】光流跟踪(python、c++代码)

文章目录 前言一、代码流程与思路二、python 代码2.1 代码详解2.2 完整代码 三、c 代码四、结果展示 前言 光流利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。…

ModBus电表与RS485电表有哪些区别?

在能源计量领域,ModBus电表和RS485电表是两种常见的设备,它们都具有监测和记录电能数据的功能。然而,它们之间存在一些区别,比如通信协议、连接方式、数据格式等等参数的区别有哪些? ModBus电表和RS485电表都是用于电能…

FreeSWITCH学习笔记:EventSocket

Event Socket命令最后需带有两个换行符。 api 执行API命令。阻塞。 1api API [ARG [ ...]] auth 内连模式下身份验证。需要第一个发送。 1auth PASSWORD bgapi 后台执行API命令。不阻塞。 1bgapi API [ARG [ ...]]2[Job-UUID: UUID] 返回带有Job-UUID。当API命令执行完成…

GPT-4惨遭削弱,偷懒摸鱼绝不多写一行代码,OpenAI已介入调查

GPT-4再次遭网友“群攻”,原因是“懒”得离谱! 有网友想在Android系统开发一个能够与OpenAI API实时交互的应用。 于是把方法示例链接发给GPT-4,让它参考用Kotlin语言编写代码: 没成想,和GPT-4一来二去沟通半天,GPT-4死活给不出…

数字孪生智慧园区:企业与政府合作的共赢之选

随着科技的快速发展和数字化转型的推动,数字孪生技术正逐渐成为智慧城市和园区建设的重要方向。数字孪生智慧园区,以数字孪生技术为驱动,通过对园区实体和虚拟环境的全面感知和深度理解,为园区管理者和入驻企业提供智能化决策支持…