在AT组件中创建并使用响应结构体,释放时一直出现 RT_ASSERT((((rt_ubase_t)rmem) & (RT_ALIGN_SIZE - 1)) == 0);
的断言。
翻论坛找到下面这个帖子,说是内存堆使用时没对齐
https://club.rt-thread.org/ask/question/425347.html
上面帖子时 rt_malloc
出断言,我这边是 rt_malloc
时没问题,rt_free
出断言。
片子是 STM32F407,RTT版本是 4.0.2。
请问需要如何解决?
at_response_t resp = RT_NULL;
resp = at_create_resp(AT_RESP_BUF_SIZE, 0, rt_tick_from_millisecond(1000));
if (resp == RT_NULL) {
LOG_E("no memory for response structure.");
result = -RT_ENOMEM;
goto __exit;
}
//...
__exit:
if(resp)
at_delete_resp(resp);
调大至
0x400
之后,在使用resp
的过程中(不是第一次使用时,从第二次使用开始),每次使用时都出现直到最后在使用
at_delete_resp(resp)
删除resp
时出现下面断言使用过程中并没有使用
at_delete_resp(resp)
删除resp
out of buffer size,是at_create_resp时设置的大小太小了。执行每条AT命令都会用到这个resp,而且不同地方用的大小可能不一样。到底是哪条配置的不够,你得结合日志来查看,打印出详细的AT数据出来。勾上下面的选项,具体配置方法在rtthread文档里面应该有的。

不过我建议你先解决断言的问题。如果你确实没有执行两次at_delete_resp,那么这应该还是内存溢出的问题。你是不是只调大了系统栈,没调大线程栈?或者,你遗漏了某个线程栈。拿at_socket_sim800c举例,它里面创建了两个线程,sim800c_init_thread_entry,check_link_status_entry。两个都要改大噢
谢谢回复,系统栈、线程栈都调大了问题还是一样。倒是在不经意间把自己结构体中的一些 8 位变量,改成 32 位变量,就没有出现过这个问题了...(数据本身本身不会超过 8 位,使用时也使用了强制类型转换)
@Line 你是不是指定了字节对齐为1字节,并且把结构体中的某个变量的地址传到其他地方去用了:)