出出啊
出出啊
It is Not the Mountain We Conquer, but Ourselves

注册于 6 months ago

回答
902
文章
19
关注者
55

单步调试,进 finsh 里打断点,看看上下键发过去的键值是多少。

先注释掉编译一下看看是不是 code 已经很大了,如果接近 flash 容量了就不要尝试了,即便添加上它,你也没空间加应用程序代码

这个是编译 sqlite 命令行工具的吧,要么按照 msh 命令格式改个名字,改成 msh 命令行命令。要么就排除编译。

  1. 如果单独使用,都能正常工作,首先排除配置的问题。
  2. 查看一下俩 spi 寄存器配置有没有异常变化的。导致 spi 通信失败了。

如果能单步,先单步看看走到什么位置错误返回了,这样最好

nan = “not a number” 0x400000 不是一个合法的浮点数。
内存肯定被破坏了。也不是除零操作,如果有从其它地方传输过来的数据参与运算,可能传输过来的数据就是 nan 了。nan 的任何数学运算结果都是 nan

warning 行告诉你原因,下一行告诉你问题根源,那个文件里可以指定使用哪一种编译器以及编译选项参数等等

不懂龙心,你可以去其它 bsp 下找类似的,看他们用什么编译器,仿照改一下

比较重要的编译器类型,编译器名,编译器路径,IDE

第一次见到100%的,还有83 72
别问,问就是线程栈溢出

看见乱码了吗? 你的用户名是中文的?换成英文的吧

can_sample 函数里使用了全局变量了?
有全局对象重复初始化了?这个可能性太小了吧。
我怀疑第一次运行已经破坏了内存,第二次运行就不正常了。如果想验证,可以检查 can_sample 函数有没有使用全局变量,有没有忘记释放某些对象。

对楼上大佬做一个补充,大佬有一个很重要的地方遗漏了。环形缓冲区空满状态的识别。

rt_inline enum rt_ringbuffer_state rt_ringbuffer_status(struct rt_ringbuffer *rb)
{
    if (rb->read_index == rb->write_index)
    {
        if (rb->read_mirror == rb->write_mirror)
            return RT_RINGBUFFER_EMPTY;
        else
            return RT_RINGBUFFER_FULL;
    }
    return RT_RINGBUFFER_HALFFULL;
}

read_mirror write_mirror 分别是两个 1bit 的值,也就是只能是 bool 型,要么0 要么1。

源码中所有其它地方的位翻转也只能在 0 1 之间翻转。
首先,环形缓冲区是一种逻辑数据结果,物理上仍然是一个普通的线性数组。
当写索引超过环形缓冲器(数组)长度时,将从数组 0 索引开始继续写。这时候 write_mirror 翻转。
写的情况是一样的,只不过是 read_mirror 翻转。这样从 0 到结尾然后又回到0 所以可以认为是个环形缓存。

由上面的函数可以看出来,mirror 只用于判断区分空满两种状态了。

"11.txt\0"
"9 14131770554 100644\0"
txt 文件的内容是啥?

assertion failed at function:rt_thread_control 这里的错误提示是某个地方调用 rt_thread_control 函数出错了,原因可能是传递了一个未初始化的线程句柄,或者一个非线程句柄。

w25q256_mount 这个函数在什么时候调用的?不会是初始化 board 阶段吧。

你说的问题不存在,首先线程打断一个中断的执行过程,这就是幻觉

没多大影响,是你的 debug_uartinit 函数定义返回值错了,不是 void 是 int。这个不同编译器版本可能会变成 error。但是不影响使用。

回到
顶部

发布
问题

投诉
建议