您尚未登录。

楼主 # 2023-05-26 10:35:27

耳东陈
会员
注册时间: 2023-05-06
已发帖子: 10
积分: 11

pikaPython下串口接收几组数据后,出现空间不足错误

在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,仍然存在接收十几组数据后报错的问题,请高手支招。

离线

楼主 #1 2023-05-26 16:51:19

耳东陈
会员
注册时间: 2023-05-06
已发帖子: 10
积分: 11

Re: pikaPython下串口接收几组数据后,出现空间不足错误

测试发现执行

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)

离线

#2 2023-05-27 12:29:18

xddl
会员
注册时间: 2021-02-19
已发帖子: 7
积分: 12

Re: pikaPython下串口接收几组数据后,出现空间不足错误

似乎应该用个循环缓冲区吧?

离线

#3 2023-05-28 04:04:44

lyon1998
Moderator
注册时间: 2021-12-01
已发帖子: 110
积分: 55

Re: pikaPython下串口接收几组数据后,出现空间不足错误

@耳东陈
append之后加一个arg_deinit(),因为list的append操作会拷贝一份arg

可以参考一下这个例子:

http://pikascript.com/doc/cmodule_enhance.html#list

离线

楼主 #4 2023-05-29 15:36:31

耳东陈
会员
注册时间: 2023-05-06
已发帖子: 10
积分: 11

Re: pikaPython下串口接收几组数据后,出现空间不足错误

问题已解决,需要在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;

离线

楼主 #5 2023-05-29 16:34:36

耳东陈
会员
注册时间: 2023-05-06
已发帖子: 10
积分: 11

Re: pikaPython下串口接收几组数据后,出现空间不足错误

lyon1998 说:

@耳东陈
append之后加一个arg_deinit(),因为list的append操作会拷贝一份arg

可以参考一下这个例子:

http://pikascript.com/doc/cmodule_enhance.html#list

请问,这个arg_deinit()函数都用在什么情况下?只是list下面的append后面需要用?还是说只要用到Arg* arg_i = ***这样定义的就需要arg_deinit?

离线

#6 2023-05-30 12:35:53

lyon1998
Moderator
注册时间: 2021-12-01
已发帖子: 110
积分: 55

Re: pikaPython下串口接收几组数据后,出现空间不足错误

@耳东陈
这个不是特别好直接判断,推荐的做法是尽量简化c模块的内存操作,比较复杂的代码用python来写

离线

#7 2023-05-30 12:37:37

lyon1998
Moderator
注册时间: 2021-12-01
已发帖子: 110
积分: 55

Re: pikaPython下串口接收几组数据后,出现空间不足错误

@耳东陈
通常情况下,c代码编译成汇编之后,也是通过跳转指令来循环的,这种情况下在循环内,循环外对代码体积的影响不大。只有在非常激进的性能优化下,编译器才会把循环进行完全展开,不过换句话说,如果要用激进的性能优化,也不会在乎代码体积的问题了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn