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

注册于 4 months ago

回答
627
文章
13
关注者
39

首先把所有线程栈大小捋顺一遍,1024以上。别用 256,太小了
排除线程栈问题之后,再确定是哪个线程什么位置,或者进行什么操作的时候出现的问题。

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

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 只用于判断区分空满两种状态了。

prev == next 不是问题,问题是 thread 和 sthread 不应该一样。
sthread->next 应该是指向 list 0x2000594C 或者其它地址的,但是它指向了自己。这是死循环的原因。

或者说,这个线程曾经执行过 rt_sem_take ,它已经被挂到了信号量的挂起线程列表上。但是某种原因让 thread 的 tlist 指针从链表上脱落了,指向了它自己,但是信号量的挂起线程列表上还挂着它的指针,进而出现了 sthread 和 thread 相等的现象。

强烈建议使用我刚做的工具查一下。rt_sem_take 前后把thread和sem的内存打印出来。

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

准确的说,是每一个线程控制块结构体内置了一个定时器。这个看 rt_thread 结构体定义就明白了。
而初始化线程的时候,默认初始化那个定时器和线程是同名的。

bsp 里有还好,没有,或者驱动不全的才揪心。我们准备用 nuc970了。

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

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

确定是 LCD_X_DisplayDriver 这个函数里崩溃的?不是第二次从这个函数出去之后崩溃的?
配置是啥样的?GUI_X_Config 里分配了多少内存?

free 一下,看看剩余内存还有多少。可能堆不足,动态申请内存失败了。。。

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

换一个真终端工具看看
这些输出信息是 rtt 系统里打印输出的?程序里输出的汉字?

  1. 频繁 start 没多少影响,只是重新开始定时。
  2. 改参数最好 stop control start 三部曲

错误提示的意思是 serial 线程栈溢出。。。
如果你没有这个线程,那铁定是内存溢出,内存被污染了嘛。导致异常打印的信息也没多少参考价值了
看看我的文章里怎么讲排查这种问题的吧。

你这个 sscanf 是什么用法?正则表达式?!!!

回到
顶部

发布
问题

投诉
建议