Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT组件
内存写穿溢出
30
N58使用at组件后内存溢出
发布于 2022-12-29 11:09:32 浏览:512
订阅该版
运行出错,如图 ![1.png](https://oss-club.rt-thread.org/uploads/20221229/1da4815e42225eb8775e9614a8848428.png) debug发现mutex的值为0 ![2.png](https://oss-club.rt-thread.org/uploads/20221229/45ec947352c155a39ed4332a98e56e00.png) 1、debug发现client的地址为0x20022958,地址上的数据为0x20004bfc,此时client->lock的值为0x200280d8 ![3.png](https://oss-club.rt-thread.org/uploads/20221229/8cd9827047a0ff91abd02acf7785b4d7.png.webp) 2、继续运行发现代码运行到at_resp_parse_line_args_by_kw(resp, "+CCID:", "+CCID: %s", ccid)之后,client地址0x20022958上指向的地址被修改了 ![4.png](https://oss-club.rt-thread.org/uploads/20221229/f00a307a3a98a9d9b0ba176f629b5ea0.png.webp) ```c static void n58_init_thread_entry(void *parameter) { #define INIT_RETRY 5 #define CPIN_RETRY 10 #define CSQ_RETRY 10 #define CREG_RETRY 60 #define CEREG_RETRY 30 #define CCID_SIZE 20 int i, retry_num = INIT_RETRY; char ccid[CCID_SIZE] = {0}; char parsed_data[10] = {0}; rt_err_t result = RT_EOK; at_response_t resp = RT_NULL; struct at_device *device = (struct at_device *)parameter; struct at_client *client = device->client; resp = at_create_resp(128, 0, rt_tick_from_millisecond(300)); if (resp == RT_NULL) { LOG_E("no memory for n58 device(%s) response structure.", device->name); return; } while (retry_num--) { rt_memset(parsed_data, 0, sizeof(parsed_data)); rt_thread_mdelay(1000); n58_power_on(device); rt_thread_mdelay(5000); //check the n58 hardware manual, when we use the pow_key to start n58, it takes about 20s,so we put 25s here to ensure starting n58 normally. LOG_I("start initializing the n58 device(%s)", device->name); /* wait n58 startup finish */ if (at_client_obj_wait_connect(client, N58_WAIT_CONNECT_TIME)) { result = -RT_ETIMEOUT; goto __exit; } /* disable echo */ AT_SEND_CMD(client, resp, 0, 300, "ATE0"); /* get module version */ AT_SEND_CMD(client, resp, 0, 300, "ATI"); /* show module version */ for (i = 0; i < (int)resp->line_counts - 1; i++) { LOG_I("%s", at_resp_get_line(resp, i + 1)); } /* check SIM card */ for (i = 0; i < CPIN_RETRY; i++) { at_resp_set_info(resp, 128, 2, 5 * RT_TICK_PER_SECOND); if (at_obj_exec_cmd(client, resp, "AT+CCID") < 0) { LOG_E("AT+CCID ERROR! retry:%d.", i); rt_thread_mdelay(1000); continue; } if (at_resp_parse_line_args_by_kw(resp, "+CCID:", "+CCID: %s", ccid)) { LOG_I("n58 device(%s) SIM card detection success.", device->name); LOG_I("CCID: %s", ccid); break; } rt_thread_mdelay(1000); } ``` 4、继续debug,进入`at_resp_parse_line_args_by_kw(resp, "+CCID:", "+CCID: %s", ccid)`中,发现代码执行完`vsscanf(resp_line_buf, resp_expr, args)`之后,client地址0x20022958指向的内容就被更改了 ```c int at_resp_parse_line_args_by_kw(at_response_t resp, const char *keyword, const char *resp_expr, ...) { va_list args; int resp_args_num = 0; const char *resp_line_buf = RT_NULL; RT_ASSERT(resp); RT_ASSERT(resp_expr); if ((resp_line_buf = at_resp_get_line_by_kw(resp, keyword)) == RT_NULL) { return -1; } va_start(args, resp_expr); resp_args_num = vsscanf(resp_line_buf, resp_expr, args); va_end(args); return resp_args_num; } ``` 尝试把n58_init_thread_entry的线程栈改大无效,把申请resp的空间改大改小也没有效果 问题:请问这个是什么问题,该怎么解决
查看更多
2
个回答
默认排序
按发布时间排序
chc
2022-12-29
这家伙很懒,什么也没写!
已经找到问题了, iccid长度为20,执行`at_resp_parse_line_args_by_kw(resp, "+CCID:", "+CCID: %s", ccid)`后ccid不够存20字节的字符串, 把`#define CCID_SIZE 20`改为`#define CCID_SIZE 24`就解决了。。。。
JonasWen
2022-12-29
这家伙不懒,但是什么也不想写!
sscanf解析字符串会在缓冲区末尾添加结束符'\0',你的字符串长度是20, 缓冲区是20。那就会在缓冲区外填充一个'\0',越界了。
撰写答案
登录
注册新账号
关注者
0
被浏览
512
关于作者
chc
这家伙很懒,什么也没写!
提问
3
回答
3
被采纳
0
关注TA
发私信
相关问题
1
关于AT组件移植到裸机,uart部分和轮询解析如何处理?
2
AT组件开启之后有报错
3
rt-thread studio 添加了AT Device组件后,编译报错
4
使用AT组件的时候,使用一个客户端,却提醒我创建一个客户端,该怎么创建客户端呢
5
AT组件设置接收符不起作用
6
AT组件遇到\r\n后是怎么处理数据的?
7
AT组件启动流程是怎么样的?
8
AT组件和MQTT组件的使用问题
9
中移M5311软件包使用问题
10
关于AT组件的URC数据处理问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部