10 risc-v移植rtthread,程序莫名跳转到异常Exception

发布于 2020-09-24 16:10:35

360截图20200924161430513.jpg

移植rtthread到risc-v上,写了个简单的线程,结果运行一会儿遇到个奇怪的bug--异常!,打印的信息为mcause: 0xlx,搞得我一头雾水,这是什么情况,下面将详述过程,望各位大神帮帮忙。

硬件平台:sipeed longan nano
软件平台:nucleiStudio IDE202009 + rtthread
一、前言
想在risc-v上移植rtthread有段时间了,一直忙着没时间,前不久闲下来看到sipeed的龙眼longan nano开发板,居然才十几块钱,果断下手,于是便开始操作。

二、IDE及工具
longan nano采用的是兆易创新的GD32VF103CB芯片,主频108MHz,128K FLASH,32K SRAM,移植rtthread毫无压力;
有了开发板,还得找个IDE和下载工具,sipeed官方给的是vs code上的platform IO,rtthread官方给的是eclipse,芯来科技给的是更改版的eclipse--nucleiStudio IDE和segger的IDE,对比了下,发现将rtthread和IDE结合的较好的是nucleiStudio IDE,202009版可以直接在IDE里创建rtthread例程;下载工具采用的是JLINK v10;

三、过程

IDE里创建例程较为简单,一步步跟着向导就OK了,创建成功后进行了如下修改;

main线程初始化USART2为DMA接收和DMA发送方式,进入while(1)前启动DMA接收,长度为12字节,在DMA接收中断里发出信号量,主线程while(1)里一直等待该信号量,等到后将接收到的数据通过DMA发出,然后再次启动DMA接收,回到while(1)头部,继续等待信号量;

通过USB--TTL连接longan nano的USART2,定时100ms向开发板发出“hello world!”,可以看到串口调试助手收到了“hello world!”的回复,这样连续运行几分钟或十几分钟后程序突然就挂掉了,不再有任何回复,通过连接longan nano的USART0(console)的USB--TTL可以看到不停的有数据从板子发出,发现是重复的“mcause :0xlx”(这个是L的小写,不是1),查找代码发现是以下代码发出的信息;

  static void system_default_exception_handler(unsigned long mcause, unsigned long sp)
{
    /* TODO: Uncomment this if you have implement printf function */
    printf("MCAUSE: 0x%lx\r\n", mcause);
    printf("MEPC  : 0x%lx\r\n", __RV_CSR_READ(CSR_MEPC));
    printf("MTVAL : 0x%lx\r\n", __RV_CSR_READ(CSR_MBADADDR));
    while(1);
}

用JLINK进入调试模式,挂掉后的确停在printf("MCAUSE: 0x%lxrn", mcause);这句上,查看mcause的值,发现是0x30000001,查看手册,第0位为1表示“指令地址非对齐(Instruction address misaligned)”,28/29位为1表示“进入中断前的特权模式”为0x03;
进行到这儿,就卡住了!不知该如何下手!
risc-v本身bug?移植rtthread有问题?线程写的有问题?为什么一直不停的重复printf而不是卡在while(1);

望大神帮帮忙,谢谢!

查看更多

关注者
0
被浏览
311
1 个回答
aozima
aozima 2020-09-24
拒绝白嫖,拒绝键盘侠!

整理得挺好,

建议可以对比下这个完整代码包 https://item.taobao.com/item.htm?id=602081071158

以及看下这位坑友 https://whycan.com/t_5131.html

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览