并且这个板子动态申请的内存默认不是0x00,而是 0xff,所以 free 了 非空的野指针触发死机 解决方法:malloc 后的数据结构,增加memset 清零操作,这样保证指针成员默认为 NULL,如果是野指针, 并且free 时不为 NULL,会造成释放内存操作异常,大概率触发死机。 触累与排雷 继续排查驱动里面,有几处也是通过动态内存申请 m...
通过进一步的排查并缩小范围,终于发现了问题点:这个函数在 插入链表 的操作部分死机了! 通过代码继续网上找,发现这个包含 RT-Thread list 的数据节点,是通过 rt_malloc 申请的,并且没有看到成员 list 使用 rt_list_init 初始化链表的操作 所以马上确认了问题: 链表的节点没有初始化造成的,通过增加 list 初始化,...
以上修改后,memheap 内存测试通过,不再触发死机 小结 memheap 使用起来还是比较的简单,可以通过设置 开启RT_USING_MEMHEAP_AUTO_BINDING,也就是 勾选[*] Use all of memheap objects as heap,决定新增加的 memheap 的内存是否参与系统常规的内存管理,如 rt_malloc、rt_free 用户可以单独的实现自己的 memheap 内存...
可能的解决办法: 1.检查动态内存分配malloc; 2.检查数组,特别是取变量地址的使用; 3.查外设配置,使用没使能的外设也可能会造成hard fault; 最后根据lr异常寄存器的值定位到出现错误的函数里面(学会调试很重要),是任务调度函数调用时出错,线程切换时可能由于内存资源分配的原因造成死机,重新分配线程堆栈大小,就没有出...
区别是有的,就是内存分配的方式,SDK用的是Freertos的heap_4.c中的分配内存的方法;而我的是用的rt-thread的rt_malloc函数分配内存 0 Kudos Reply 10-27-2022 07:03 PM 9,795 Views jeremyzhou NXP Employee Hi,谢谢回复。有测试过SDK中的USB例程吗?可以正常工作吗?Have a great day,TIC ---Note...
// 线程池池部结构体 #define THREAD_NUMBER_MAX 128 typedef struct ST_THREAD_POOL_ { int threadNumber; // 当前线程个数 void* threadReadLock; // 当前各个线程读锁 void* threadWriteLock; // 当前操作线程写锁 void* threadPollQueue; // 线程处理队列 ...
boundary_data = rt_malloc(1024); if(boundary_data == RT_NULL) { rt_kprintf("malloc boundary_data failed\n"); goto __exit; }session.event = rt_event_create("vt_event", RT_IPC_FLAG_FIFO);tid1 = rt_thread_create("tcpsrv", tcpserv, RT_NULL, 1024*4, 10, 10); if(tid1 != ...
就是用户在调用内存分配函数后,没有及时或者进行错误的内存释放操作,一次两次这样子的操作并没有什么影响,如果用户周期性调用mem_malloc()函数进行内存申请,并且在内存使用完的时候么有释放,这样子程序就会用完内存堆中的所有内存,最终导致内存耗尽无法申请内存,出现死机等现象。
通过进一步的排查并缩小范围,终于发现了问题点:这个函数在 插入链表 的操作部分死机了! 通过代码继续网上找,发现这个包含 RT-Thread list 的数据节点,是通过 rt_malloc 申请的,并且没有看到成员 list 使用 rt_list_init 初始化链表的操作 所以马上确认了问题: 链表的节点没有初始化造成的,通过增加 list 初始化,...