C语言 For循环不递增(可能是malloc问题)



我正在将代码从Intel XScale CPU架构(ARM)移植到i386 CPU架构(Vortex86 CPU)。我正处于代码编译和运行的地方,但我在软件启动时遇到了for()循环的奇怪行为。

我正在为4个不同的采样频率初始化数据缓冲区。和4个不同的通道,CH0, CH1, CH2, CH3,每个通道具有100Hz, 20Hz, 1Hz和10Min采样率。

sample = int。缓冲区大小为:

  • 100Hz = 6000samples * sizeof(sample)

  • 20Hz = 1200samples * sizeof(sample)

  • 1Hz = 3600samples * sizeof(sample)

  • 10Min = 144samples * sizeof(sample)

  • ChanID=0的循环成功

  • ChanId=1的循环成功,但是报告"CH0 initialized "…等等......重复

这是循环:

// THIS DOESN'T WORK.. I don't know why...
// Initialise() performs a malloc x 4 for each channel for the sizeof(buffer)
// Initialise() also opens a serial port DeviceNames[ChanId], with the FD returned
for (ChanId=0; ChanId < NUM_CHANNELS; ChanId++) 
{
if ((fds[ChanId] = Initialise(ChanId, DeviceNames[ChanId])) == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch%d", ChanId);           
return -1;
}
else
{   
syslog(LOG_INFO, "Ch%d Initialised", ChanId);           
}
}

我已经尝试了以下似乎没有问题的工作。

if ((fds[0] = Initialise(0, DeviceNames[0])) == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch0");            
return -1;
}
if ((fds[1] = Initialise(1, DeviceNames[1])) == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch1");            
return -1;
}
if ((fds[2] = Initialise(2, DeviceNames[2])) == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch2");            
return -1;
}
if ((fds[3] = Initialise(3, DeviceNames[3])) == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch3");            
return -1;
}

我已经把Malloc地址指针推到了日志中,它看起来是合理的。

我想知道malloc进程是否正在破坏当前堆中的变量?

完全相同的代码在ARM架构Intel XScale上运行良好

我怀疑这一行

if ((fds[ChanId] = Initialise(ChanId, DeviceNames[ChanId])) == -1)

在循环或定时运行时导致编译器优化问题(如您所述Initialise与串行端口交互)。这可以用

表示

ChanId=1的循环成功,但是报告"CH0 Initialised"…等等......重复

试题:

for (ChanId=0; ChanId < NUM_CHANNELS; ChanId++) 
{
int result = Initialise(ChanId, DeviceNames[ChanId]);
fds[ChanId] = result;
if (result == -1) 
{
syslog(LOG_INFO, "Failed to initialise RT Ch%d", ChanId);           
return -1;
}
else
{   
syslog(LOG_INFO, "Ch%d Initialised", ChanId);           
}
}

除此之外,ChanId是否可能在其他地方设置,因此用局部变量替换它可能有效?

最新更新