沁恒CH32V307以及CH32VF103中断只能进一次的解决方法

2023-11-09

文章背景

​ 笔者最近使用沁恒CH32V307处理器进行应用开发,基于RT Thread实时操作系统和LWIP做TCP和CAN的透传。因为官方BSP并没有适配RT Thread的CAN驱动,暂时将RT Thread作为普通实时系统使用,先不对CAN外设进行系统抽象。但写完调试程序后发现中断只能进入一次,遂开始研究解决,将解决过程撰文记录,供后来人参考。

解决方法

​ 先不过多的说废话,直接贴上解决方案,由于CH32V307使用的是RSICV内核,并自己添加了一些新特性。由于笔者之前大都使用ARM以及PowerPC内核的MCU,切到RSICV后,写中断服务函数时想当然的认为只要函数名与中断向量表中的符号定义一致即可。而事实上,沁恒的RSICV内核处理器在编译时,需要通过特殊的关键字标识函数为中断服务函数。否则,编译器会将其作为普通函数进行处理,执行完后直接执行后面的内容。编译器这样的误解使得中断服务函数执行前没有保存现场操作,从而回到中断执行前的上下文,若中断服务函数之后的地址无有效指令,将出现程序跑飞,解决方法也很简单,在中断服务函数的声明和定义中加入以下关键字即可:

  1. void XXXX_IRQHandler(void) attribute((interrupt(“WCH-Interrupt-fast”)));

  2. void XXXX_IRQHandler(void) attribute((interrupt()));

    ​ 以上两个关键字都可以解决沁恒CH32V307,CH32V103等RISCV处理器中断只能进一次的问题,二者区别在于:第一种写法编译出的中断服务函数是沁恒RISCV的快速中断,该写法同时也出现在沁恒的DEMO程序中,为沁恒所特有;第二种写法是GCC For RISCV的通用写法,沁恒的RISCV处理器自然也支持,但这样写无法享受沁恒的快速中断特性,但更具通用性,该写法出现在CH32V307的RT Thread Bsp驱动中。

    ​ 下面贴一张图对该问题作直观的展示:

在这里插入图片描述

​ 该图来源于沁恒官方论坛中技术支持对该问题的解释,链接如下:

http://www.wch.cn/bbs/thread-84071-1.html

​ 另外还有一点,RISCV指令集由于其开源开放特性,目前生态逐渐呈碎片化趋势发展。例如沁恒,由于添加了新特性,其编译器在GCC For RISCV工具链的基础上进行了修改,使其编程时需要使用自家编译器。当然,根据沁恒官方说法,它也能使用公版的GCC For RISCV进行编译,但这将使得编译出的代码无法充分享受沁恒所添加的那些新特性,孰好孰坏,难以言说,就让市场来做判断吧。

中断响应机制解读

​ 此处将从汇编层面解读带与不带关键字所生成的代码的区别,从而理解添加关键字编译的必要性,此外,还将结合ARM的汇编代码和RISCV进行对比,研究下为何ARM处理器使用GCC编译中断服务函数时不需要添加该关键字。

​ 挖坑待填…

GCC中的interrupt()关键字

​ 说来惭愧,笔者之前写程序,从未关注过GCC中的这个关键字,因此,刚好趁此机会对interrupt做些了解并记录。

​ 挖坑待填…

interrupt做些了解并记录。

​ 挖坑待填…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

沁恒CH32V307以及CH32VF103中断只能进一次的解决方法 的相关文章

  • 阿里三面 失败告终

    update 2015 04 16 在一个tomcat下 用classloader加载了某个类之后会将该类信息放入方法区 永久代 当这个类创建了某个线程 比如周期显示当前时间 那么会导致这个类信息一直存在于永久区中 即使这个类的主要工作已经

随机推荐

  • mysql集群+复制

    详解MySQL集群下的复制 replicate 原理 1 集群下的复制 1 1 简述 从MySQL 5 1 开始 就支持集群 复制了 这对于想要构建一个高可用方案的用户来说 无疑是个惊喜 在这种模式下 既有主从的实时备份 又有基于集群的负载
  • 《算法导论》常见算法总结

    前言 本篇文章总结中用到很多其他博客内容 本来想附上原作链接 但很久了未找到 这里关于原创性均来源于原作者 分治法 分治策略的思想 顾名思义 分治是将一个原始问题分解成多个子问题 而子问题的形式和原问题一样 只是规模更小而已 通过子问题的求
  • 大数定理与中心极限定理

    大数定律 定义 理解 可以用样本均值估计总体分布的均值 频率趋近于概率 举例 抛N次硬币 当N趋近于无穷大时 正面出现的频率等于正面出现的概率 中心极限定理 定义 林德贝格 勒维中心极限定理 理解 1 样本的平均值约等于总体的平均值 2 不
  • 解决php中redis client进行subscribe操作出现timeout的问题

    出现该问题的原因是poll设置接收超时所致 这个超时默认设置60s 设置Redis OPT READ TIMEOUT配置项 解决方法如下
  • python串口模块_使用python pyserial模块串口通信

    最近调试通信模块时 需要用UART串口输入AT命令控制模块 手动输入不便于自动化 所以就学习了下使用python进行串口控制 serial模块安装 pip install pyserial 常用的方法函数 导入串口模块import seri
  • SpringBoot过滤器Filter的使用-基础篇

    1 过滤器 Filter 简介 1 1 过滤器 Filter 介绍 Filter 是 JavaEE 中 Servlet 规范的一个组件 位于包javax servlet 中 它可以在 HTTP 请求到达 Servlet 之前 被一个或多个F
  • 目的:VSCode Remote-SSH连接远程失败timeout

    目的 VSCode Remote SSH连接远程失败timeout 环境 系统 win10 环境 VSCode 1 51 1 问题分析 正常使用VSCode的情况下 突然发现 解决步骤 判断可能是ssh问题 cmd打开控制台或者进入wind
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 网络工程专业毕业设计选题汇总

    文章目录 0 简介 1 如何选题 2 最新网络工程选题 2 1 Java web SSM 系统 2 2 大数据方向 2 3 人工智能方向 2 4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题 难度适中 适合作为毕
  • 详解c++---set的介绍

    目录标题 set容器的介绍 set的构造函数 insert函数的介绍 find函数 erase函数 count函数 lower bound upper bound multiset set容器的介绍 set容器可以看成我们上一篇文章学习的K
  • 会做产品分析的产品经理,能力都不会太差!这份分析框架,建议收藏!

    产品经理要提升产品能力 有几种方式 1 做项目 从调研到设计 从研发到运营 遇到各种问题 并解决 最终达成业务目标 2 看书 学习其他人分享的知识 将知识应用在项目中 提升决策能力 3 向大佬请教 向产品前辈请教 打开自己的知识盲区 提升自
  • Vuecli3 axios开发环境代理和线上代理设置

    文章目录 1 概述 前后端分离的情况下肯定会跨域 这篇文章主要讲axios跨域的设置 2 本地开发环境配置 2 线上环境配置 用nginx作反向代理 不用本地代理了 1 概述 前后端分离的情况下肯定会跨域 这篇文章主要讲axios跨域的设置
  • 学c语言的第一步,编译器的使用

    学习c语言在不同的平台 有不同的编译器 其中windows平台有visual studio的IDE codeblocks eclipsec c 和QT编译器 而在Linux平台有vi vim codeblocks eclipsec c 和Q
  • python dfs算法_2020蓝桥杯python组备战方法

    在蓝桥杯的程序设计比赛里新增加了python组 这是一个全新的组别 目前蓝桥杯官网已经开通了python的练习平台 链接http dasai lanqiao cn 如何准备2020年蓝桥杯python程序设计呢 我分为四个部分讲解 了解这四
  • python 深度学习 解决遇到的报错问题4

    目录 一 DLL load failed while importing imaging 找不到指定的模块 二 Cartopy安装失败 三 simplejson errors JSONDecodeError Expecting value
  • 三星gearvr控制器及手柄全部输入

    OVRInput Unified Input API OVRInput exposes a unified input API for multiple controller types It may be used to query vi
  • MySQL学习:50道经典题目(含参考答案)(更新中)

    50道经典MySQL练习题 参考博客 SQL经典50题练习 sql习题 不高冷面包人的博客 CSDN博客c 1 创建数据表 学生表 CREATE TABLE IF NOT EXISTS student student id INT 10 N
  • vant引入组件报错_在Vue中elementui组件库的基本使用

    今天我们来聊聊elemen ui组件库 Element 一套为开发者 设计师和产品经理准备的基于 Vue 2 0 的桌面端组件库 最近我做的项目几乎都是管理系统 所以 为了节省时间 开始使用 element ui 一个简单的管理系统来说 这
  • 将字符串和日期互相转换

    将字符串转换为日期 import datetime datestr 1993 01 01 print type datastr date datetime datetime strptime datestr Y m d print date
  • 沁恒CH32V307以及CH32VF103中断只能进一次的解决方法

    文章背景 笔者最近使用沁恒CH32V307处理器进行应用开发 基于RT Thread实时操作系统和LWIP做TCP和CAN的透传 因为官方BSP并没有适配RT Thread的CAN驱动 暂时将RT Thread作为普通实时系统使用 先不对C