在rt_thread系统下,通过pikapython控制2个串口传递数据,把从com4接收到的数据通过com1发送出去。PC端串口助手定时5s自动发送5个数据,运行发现在接收到14组数据后,系统报错Error: No heap space! Please reset the device.之后不再接收数据。
仿真发现程序停止在
void* pikaMalloc(uint32_t size) {
···
if (NULL == mem) {
pika_platform_printf("Error: No heap space! Please reset the device.\r\n");
while (1) {
}
}
}
中的while(1){}里边。另两个串口开辟接收空间大小均为100,
pikapython中的函数如下:
while True:
list = pikaRTFunctionModule.DEVICE.SerialIn('com4',list,13)
com1_comd = pikaRTFunctionModule.DEVICE.SerialOut('com1',list)
thread.mdelay(5000)
PikaObj* pikaRTFunctionModule_DEVICE_SerialIn(PikaObj *self, char* com, PikaObj* tempreceive,int maxnum)
{
PikaObj* list = newNormalObj(New_PikaStdData_List);
PikaStdData_List___init__(list);
Arg* str_arg1 = 0;
char tempda[30];
rt_uint8_t rece_num = 0;
char *p;
char ch;
p = com;
p +=3;
ch = *p;
switch(ch)
{
case '0':
{
uart1_rs485_read(tempda,maxnum,&rece_num);
for(char i=0;i<rece_num;i++)
{
str_arg1 = arg_newInt(tempda[i]);
PikaStdData_List_append(list, str_arg1);
}
}break;
······
default:break;
}
memset(tempda,0x00,sizeof(tempda));
arg_deinit(str_arg1); /* 销毁 arg */
return list;
}
void pikaRTFunctionModule_DEVICE_SerialOut(PikaObj *self, char* com, PikaObj* command)
{
char *p;
char ch;
p = com;
p +=3;
ch = *p;
rt_device_t serial;
rt_size_t result;
PikaList* list = obj_getPtr(command, "list");
switch(ch)
{
case '0':
{
serial = rt_device_find (RS232_UART_NAME2);
for(int i =0; i< pikaList_getSize(list); i++)
{
Arg* arg_i = pikaList_getArg(list, i);
result = rt_device_write(serial,0,arg_getStr(arg_i),1);
if (result != 1)
{
rt_kprintf("RS232_UART_NAME2 write failed\r\n");
return ;
}
}
}break;
······
default:break;
}
}
请教各位高手,pikapython这样操作是否会有空间占用不放开的问题?尝试过更改串口接收空间大小,从50增大到500,仍然存在接收十几组数据后报错的问题,请高手支招。
离线
测试发现执行
for(char i=0;i<rece_num;i++)
{
str_arg1 = arg_newInt(tempda[i]);
PikaStdData_List_append(list, str_arg1);
}
这两条命令后,heap剩余空间不断减小,如下是heap查询结果,每接收一组数据,heap剩余空间就不断减小,直到最后空间不足报错。各位大咖如何解决?
16:00:15<-[S18]: total : 17744
16:00:15<-[S18]: used : 16472
16:00:15<-[S18]: maximum : 17104
16:00:15<-[S17]: available: 1272
16:00:16<-[S06]: msh />
16:00:16->[S05]: free
16:00:16<-[S06]: free
16:00:16<-[S18]: total : 17744
16:00:16<-[S18]: used : 16632
16:00:16<-[S18]: maximum : 17392
16:00:16<-[S17]: available: 1112
16:00:17<-[S06]: msh />
16:00:18->[S05]: free
16:00:18<-[S06]: free
16:00:18<-[S18]: total : 17744
16:00:18<-[S18]: used : 16920
16:00:18<-[S18]: maximum : 17680
16:00:18<-[S16]: available: 824
16:00:18<-[S06]: msh />
16:00:18<-[S47]: Error: No heap space! Please reset the device.
最近编辑记录 耳东陈 (2023-05-26 16:57:21)
离线
问题已解决,需要在for()循环内部对arg进行删除操作arg_deinit(str_arg1),之前也有删除操作,只不过是放在了for循环的外部,结果就导致了内存的不断占用。不是很明白为啥需要在for里边进行这样做,如果循环100次,那就要创建删除100次?这样岂不是会增大代码空间?
case '0':
{
uart0_read(tempda,maxnum,&rece_num);
for(char i=0;i<rece_num;i++)
{
Arg* str_arg1 = arg_newInt(tempda[i]);
PikaStdData_List_append(list, str_arg1);
arg_deinit(str_arg1); /* 销毁 arg */
}
}break;
离线
@耳东陈
append之后加一个arg_deinit(),因为list的append操作会拷贝一份arg可以参考一下这个例子:
请问,这个arg_deinit()函数都用在什么情况下?只是list下面的append后面需要用?还是说只要用到Arg* arg_i = ***这样定义的就需要arg_deinit?
离线