串口+DMA接收数据,发送数据一般会用到缓存区.这几天使用UART+DMA+ringbuff+缓存区的方式处理json数据时,发现程序会跑飞,也就是ringbuffer溢出. 按理说,官方的代码应该不会有什么问题,但问题就是在这,不清楚是中断的问题,还是缓存区的问题. 问题是怎么发生的: 首先,如下代码: #defineRT_SERIAL_RB_BUFSZ 128 RT...
至此完成difftest for devices。 此时npc已经能够运行amtest中的yielod,但是在尝试运行kernels/yield时出现bug如下: 80000040: 08852783 lw a5,136(a0)错误发生在该指令,查看pc_next或者a0的值, 观察到a0的值为0xa,所以读取的136+a,我们单独运行nemu查看一下。 显然线程切换之后的a0值不对。
加了memset 清零操作后,果然触发了几个死机,并且牵出来 【链表未初始化】 就直接使用的 BUG 操作。 有些操作可能运行一次并未发生死机等【当场就出现】的死机等错误,但是多次运行,错误累积起来,就会触发更严重的错误 代码编写时,规范化、充分测试非常有必要。 调试改善代码的时间往往比编写代码时间多很多,因此在代码...
意外的BUG发现:数据节点的链表的头,也就是 链表head也没有初始化,解决方法同上,需要初始化 链表的头:使用rt_list_init,这样问题得到解决 移植的代码之前使用的hashlist,声明时即初始化了,不需要显示的初始化,而RT-Thread list,必须初始化,否则把链表节点插入 链表头部的时候,就会出现 野指针或空指针 访问成员的...
但是,上面这些只是扯淡,并不能定位到错误位置。定位问题是个方法论范畴的概念。每个人都应该有自己熟悉的一套做法,我的想法请见rt-thread 工具讲解系列(二) 之 如何排查系统 bug Q10. 怎么定义变量到指定内存位置? 非gcc 版 定义一个宏 #ifndef __MEMORY_AT #if (defined (__CC_ARM)) #define __MEMORY_...
第1个bug:我在一个建好的工程里面移植了一个4G模块的程序,编译的时候报错了,提示我有几个未定义的函数,我看了一下,是一个延时函数,确实没有定义,然后我用vsc把那几个延时函数全部替代成RT-thread的延时函数,然后我用RT-Thread Studio查看那几个函数,已经修改成功了,但是编译的时候依然报之前一样的错误,然后我...
1、分步计算,不知道你想到了什么BUG?这个问题其实在以往的笔记都提过,这次再说一次。当你在获取CPU使用率时,如果刚好在更新这两个值,那么可能整数部分是上一次计算的值,而小数部分却是这次计算的值,那么肯定有问题。这就涉及到数据完整性获取的问题。怎么解决。关调度器、关中断都可以。但是因为是粗略计算,那么...
所以,BUG确定了,是RT-Thread Studio那个下载工具的问题,如果通过WCH-LinkUtility或者其它工具下载,都是一切正常。 3 总结与吐槽 总结就是用RT-Thread Studio编译得到镜像文件,再通过其它烧录工具(WCH-LinkUtility/WCHISPStudio)下载程序,或者换IDE比如MounRiver Studio。这个问题仅限ch32。
触发这个bug的方法很假单,在putty中连接UART,在fish中,直接右击粘贴一长串字符,如果驱动采用中断接收的话,就会直接触发这个bug,fish出现不能输入,只能输出的现象。 解决方法: 在rt_thread_suspend自己之前再次加锁保护的情况下,检查是否已经有数据ready。
}#ifBUG_FIXEDcaseSERIAL2_STATE_BAD_FRAME: {/* 读取一段数据 */while(rt_device_read(serial2,0, &c,1) !=0) { framebuf[i] = c; i++;if(i >= UART2_RB_BUFSZ) { i =0; rt_kprintf("%s: bad frame.\n", __func__);break; ...