我正在将代码从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
是否可能在其他地方设置,因此用局部变量替换它可能有效?