数采日记10
2021/8/30
1、内存问题
在测试程序稳定性时发现,程序只能采集五十分钟左右。通过系统资源监视器器和TOP命令发现,程序内存会增加不少。在代码运行半个小时左右的时间时此程序会把计算机的空闲内存占满。然后运行一段时间后采集时间会变得不稳定直到程序崩溃。
原因:
C++的内存释放机制:
1、 在一个函数中,在函数运行结束时,c会自动释放在本函数申请的空间,释放数组空间。
2、但是c只知道固定长度数组所占用的空间,所以只有固定长度的数组会被自动释放。而动态数组因为长度不固定,不会被c自动释放,所以需要手动释放动态数组。
动态数组释放
// 实例1
Int16Array *iArrData = new Int16Array(poutchan[j], 20000);
deleteData(iArrData);
//实例2
s16 *pout = NULL;
memset((void*) pout, 0, _DAQ_CARD_BUF_MAX * sizeof(s16));
delete[] pout;
固定长度的数组:
//此数组不需要手动释放
s16 poutchan[_DAQ_CARD_CHANNEL_MAX][20000];
2、内时钟外触发
从很长时间一段时间里都没有这个功能都没有调试成功。因为此段程序没有说明文档,我只能通过自己的理解加上合理的推测来对这段代码进行调试(就是瞎改,全靠蒙),因为对代码的理解不到位,一直没有产生需要的结果,都是莫名其妙的效果,与设定不符。
今天再次回顾这段代码时,突然有了一个新的想法:
aiTrigger(board, tMSeries::tAI_Trigger_Select::kAI_START1_SelectPFI0,
tMSeries::tAI_Trigger_Select::kAI_START1_PolarityActive_High,
tMSeries::tAI_Trigger_Select::kAI_START2_SelectPFI0,
tMSeries::tAI_Trigger_Select::kAI_START2_PolarityActive_Low);
上面的代码中,忘记从哪看到的一星半点的说明里介绍kAI_START2为reference,然后我就把kAI_START2理解为"当kAI_START1不起作用是kAI_START2才会工作",所以之前我就把kAI_START1和kAI_START2配置为一样的方式。今天想到他们是不是一对控制方式,一个负责开始触发,一个负责停止触发,才修改为下面的代码后:
aiTrigger(board, tMSeries::tAI_Trigger_Select::kAI_START1_SelectPFI0,
tMSeries::tAI_Trigger_Select::kAI_START1_PolarityActive_High,
tMSeries::tAI_Trigger_Select::kAI_START2_SelectPFI0,
tMSeries::tAI_Trigger_Select::kAI_START2_PolarityActive_Low);
起作用了,当信号为上升沿并且保持为高电平时数据会一直在采集, 当信号为下降沿并保持低电平时数据就不会采集。
(但是这也只是我的一个猜测并且结果符合猜测,并不确定是不是正确的)