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

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

3天内不再提示

RISC-V指令异常调试实例

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-08 10:50 次阅读

本文转自公众号,欢迎关注关于

RISC-V指令异常调试实例 (qq.com)

前言

本文以一个简单的实例介绍RISC-V指令异常的调试过程,思路都是一样的,遇到其他情况时分析过程也类似。

相关内容参考《riscv-privileged-20211203.pdf》

过程

现象是程序执行后进入了异常中断,可以通过GDB的bt命令看到

#12 0x02002e9c in exception () at src/lib/riscv/src/exception.c:55


#13 0x02002b40 in is_exception ()


Backtrace stopped: frame did not save the PC


(gdb)

既然是进入了异常中断,那么就需要确认到底是什么异常,

这可以通过mcause寄存器查看

(gdb) info reg mcause


mcause 0x2      0x2


(gdb)

可以看到是非法指令异常

那么我们就搜索文档的Illegal instruction可以查看到所有可能导致Illegal instruction的原因。

图片

我们搜到以下信息,即mtval寄存器保存了异常指令,mepc指向了异常指令

图片

图片

可以看到mepc的内容是0,那么猜测应该是函数指针未初始化直接调用导致的

(gdb) info reg mtval


mtval 0x0      0x0


(gdb) info reg mepc


mepc 0x0      0x0


(gdb)

到这里基本就确认了方向了,可以重点看哪些地方有函数指针,或者逐步注释函数,或者逐步断点定位即可。

这里很快就确认了是

是如下代码导致

int xxx_ioctl(unsigned int dev_id, unsigned int cmd, void *data)
{


if (dev_id >= xxx_drv.dev_num)


return -1;


return xxx_drv.ops.ioctl(&(xxx_drv.dev[dev_id]), cmd, data);


}

查看函数指针正好是0

(gdb) p xxx_drv.ops.ioctl


$1 = (int (*)(struct xxx_dev_s *, unsigned int, void *)) 0x0


(gdb)

回溯代码确认了是某个外设没有初始化成功则这个回调函数没有初始化。原因就定位了。

总结

对于异常的调试可以参考手册《riscv-privileged-20211203.pdf》,从异常原因入手,逐渐反推,确认异常触发点然后确定原因。

审核编辑:汤梓红

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

    关注

    1

    文章

    580

    浏览量

    35379
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • 命令
    +关注

    关注

    5

    文章

    638

    浏览量

    21849
  • RISC-V
    +关注

    关注

    41

    文章

    1906

    浏览量

    45056
收藏 人收藏

    评论

    相关推荐

    RISC-V的Store AMO access fault调试实例

    本文以一个实例分享RISC-V的Store AMO access fault异常调试过程。Store AMO access fault主要发生在非法地址访问时(栈溢出,指针
    的头像 发表于 06-08 11:10 2755次阅读
    <b class='flag-5'>RISC-V</b>的Store AMO access fault<b class='flag-5'>调试</b><b class='flag-5'>实例</b>

    RISC-V开放架构设计之道|阅读体验】RISC-V基础整数指令

    第2章 RV32I:RISC-V基础整数指令集 本章重点讲解构成RISC-V基础整数指令集的基本指令
    发表于 01-31 21:10

    科普RISC-V生态架构(认识RISC-V)

    在这浪潮翻滚起来前,一起掀开RISC-V的神秘面纱,提前了解一下RISC-V究竟是什么。什么是RISC-VRISC-V应该泛指RISC-V指令
    发表于 08-02 11:50

    RISC-V你了解多少?

    精简指令集计算机。RISC-V是基于RISC原理建立的免费开放指令集架构(ISA),V是罗马字母,代表第五代
    发表于 08-13 15:13

    RISC-V有哪些特点

      RISC-V的由来  可能有些朋友不太清楚什么是CPU的指令集,其实就是指令的合集,那什么是指令呢?就是你吩咐CPU去做的事情。我在这里给大家打个比方:你有一个佣人,你给他下命令做
    发表于 08-25 11:17

    RISC-V架构简介

    【摘要】 本文首先对RISC-V的架构做了简要的介绍,在此基础上实现了LiteOS在RISC-V架构上的适配过程的具体步骤,希望对你有所帮助。1 RISC-V架构简介RISC-V是一个
    发表于 07-28 07:46

    什么是RISC-VRISC-V指令具有哪些特点应用?

    什么是RISC-VRISC-V指令具有哪些特点应用?自己怎么才能设计出设计一套指令集?
    发表于 10-14 09:05

    如何在RISC-V中使用DSP指令

    如何在RISC-V中使用DSP指令
    发表于 02-16 07:43

    RISC-V-Reader-Chinese-v2p1 RISC-V手册(中文) RISC-V开源指令集的指南

    RISC-V 手册 一本开源指令集的指南 本书是由 RISC-V 设计者 DAVID PATTERSON等亲自写的书。书写的非常精彩,和Risc-V一样非常简洁明了,没有废话,书本身也
    发表于 04-22 18:04

    RISC-V简介

    RISC-V简介  RISC-V 是一个自由和开放的 ISA(开源指令集架构),通过开放的标准协作实现处理器创新的新时代。RISC-V ISA在架构上提供了一个新的自由、可扩展的软件和
    发表于 02-27 19:56

    我了解的RISC-V

    RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。 与大多数指令集相比,
    发表于 03-19 10:52

    risc-v是什么意思

      risc-v是什么意思  RISC-V是一种指令集  RISC-V,一般被念做:risk five。V,即罗马数字5。该
    发表于 03-30 16:40

    RISC-V架构

      RISC-V架构  RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。  与大
    发表于 04-03 15:29

    RISC-V 发展

    不完善的地方,有传言未来可能会形成x86、ARM、RISC-V三足鼎立的天下,但能够形成这个局面,还需要大家的共同努力。RISC-V指令RISC-V
    发表于 04-14 10:18

    RISC-V未对齐访问导致问题案例

    转自公众号,欢迎关注 参考https://mp.weixin.qq.com/s/8wfRFg1XcBsXw5gMq-cKaQ前言 本文以一个实例,讲解RISC-V未对齐访问导致的问题.未对齐导致
    发表于 05-06 19:14