QTimer在linux设置实时线程,linux - ARM上意外的QT5 QTimer持续时间 - 堆栈内存溢出

在QT控制台应用程序中,作者发现QTimer在ARMCPU上运行时,其触发间隔显著偏离预期,大约为1946毫秒,而非设置的100毫秒。在x86_AMD64平台上,问题并未出现。通过对比测试和代码审查,已排除了构建链和嵌入式QT安装的问题。代码显示QTimer与输入传感器状态检查相关联,并记录了经过时间。在ARM上,计时器触发间隔明显延长,导致功能不正常。作者寻求帮助以找出可能导致此问题的原因。
摘要由CSDN通过智能技术生成

我正在QT控制台应用程序上执行以在ARM CPU上执行,并且遇到了QTimer的一个非常奇怪的行为:该计时器不是计划的100毫秒,而是在1946毫秒后过期。 我更改了持续时间,但是观察到的行为没有改变(大约几毫秒,例如1958 ms,而不是40 ms)。 当在x86_AMD64上执行相同的代码时(我将调用搁置在特定的HW API函数上;在没有QTimer插槽的情况下执行该函数所需的时间少于3 ms),计时器持续时间为预期的+/- 100 ms。

注意:嵌入式QT版本为5.4.1; PC QT的版本是5.9.5

我尝试了不同的持续时间,包括0。到期时间大致相同。

我监视了CPU使用率(小于30%)和平均负载(小于0.15)。

我还编写了一个小型QT控制台应用程序,该应用程序启动了一些不同持续时间的计时器并记录了经过的时间。 结果是正确的(经过的时间漂移​​,如“预期”;),所以我认为buildchain和嵌入式QT安装是好的。

我在我的初始代码中添加了QElapsedTimer,并以40 ms QTimer的slot方法记录了经过的时间。

我在PC上获得了跟踪:

mDebugMessage = ("elapsed time = 42 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=true - time = 46", "elapsed time = 81 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=true - time = 81", "elapsed time = 122 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=true - time = 122", "elapsed time = 162 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 163", "elapsed time = 201 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 201", "elapsed time = 242 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=true - time = 242", "elapsed time = 281 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 281", ...

在ARM上,跟踪是不同的,持续时间约为2秒,而不是预期的+/- 40 ms:

mDebugMessage = ("elapsed time = 1958 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 1961", "elapsed time = 3916 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 3919", "elapsed time = 5873 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 5876", "elapsed time = 7830 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 7833", "elapsed time = 9787 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 9790", "elapsed time = 11744 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 11747", "elapsed time = 13700 ms - INPUT_DOOR_LOCKED_SENSOR=false - INPUT_DOOR_UNLOCKED_SENSOR=false - time = 13705", ...

我需要您的帮助以了解为什么我的QTimer不能按预期过期,或者有任何线索可以针对目标进行调查,这可能会阻止我的计时器过期。

谢谢你的想法。

最好的祝福,

编辑:根据要求,代码

const int CDoorManagement::I_DOOR_LOCKING_DURATION_MS = 40;

const int CDoorManagement::I_DOOR_LOCKING_ALARM_DURATION_MS = 12000;

CDoorManagement::CDoorManagement(CInputOutputManagerPtr ioPtr)

: QObject(nullptr)

, mIOManagerPtr(ioPtr)

, mOperationElapsedTimer()

, mDoorLockingTimer()

, mDebugMessages()

{

connect(&mDoorLockingTimer, SIGNAL(timeout()), this, SLOT(slotDoorLocking()), Qt::UniqueConnection);

}

void CDoorManagement::slotDoorLocking()

{

const auto elapsedTime = mOperationElapsedTimer.elapsed();

if (elapsedTime > I_DOOR_LOCKING_ALARM_DURATION_MS)

{

mDoorLockingTimer.stop();

mIOManagerPtr->setActuator(OUTPUT_DOOR_LOCKING_ACTUATOR, false);

mDebugMessages << QString("elapsed time = %1 ms - INPUT_DOOR_LOCKED_SENSOR=%2 - INPUT_DOOR_UNLOCKED_SENSOR=%3 - time = %4")

.arg(elapsedTime)

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_LOCKED_SENSOR)?"true":"false")

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_UNLOCKED_SENSOR)?"true":"false")

.arg(mOperationElapsedTimer.elapsed());

qDebug() << "door locking - mDebugMessage =" << mDebugMessages;

abort(QSTR_LOCKING_ABORTED);

}

if(mIOManagerPtr->getTorInputState(INPUT_DOOR_LOCKED_SENSOR))

{

mDoorLockingTimer.stop();

mIOManagerPtr->setActuator(OUTPUT_DOOR_LOCKING_ACTUATOR, false);

syslog(LOG_INFO, "%s::%s() - locked: elapsedTime = %lld, max time=%d",

LOG_PREFIX, __FUNCTION__, elapsedTime, I_DOOR_LOCKING_ALARM_DURATION_MS);

mDebugMessages << QString("elapsed time = %1 ms - INPUT_DOOR_LOCKED_SENSOR=%2 - INPUT_DOOR_UNLOCKED_SENSOR=%3 - time = %4")

.arg(elapsedTime)

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_LOCKED_SENSOR)?"true":"false")

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_UNLOCKED_SENSOR)?"true":"false")

.arg(mOperationElapsedTimer.elapsed());

qDebug() << "door locking - mDebugMessage =" << mDebugMessages;

emit signalDoorLocked();

}

else

{

mDebugMessages << QString("elapsed time = %1 ms - INPUT_DOOR_LOCKED_SENSOR=%2 - INPUT_DOOR_UNLOCKED_SENSOR=%3 - time = %4")

.arg(elapsedTime)

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_LOCKED_SENSOR)?"true":"false")

.arg(mIOManagerPtr->getTorInputState(INPUT_DOOR_UNLOCKED_SENSOR)?"true":"false")

.arg(mOperationElapsedTimer.elapsed());

}

}

void CDoorManagement::startLocking()

{

mDebugMessages.clear();

qDebug() << "start of mDoorLockingTimer using " << I_DOOR_LOCKING_DURATION_MS << " ms delay";

mOperationElapsedTimer.start();

mDoorLockingTimer.start(I_DOOR_LOCKING_DURATION_MS);

if(!mIOManagerPtr->setActuator(OUTPUT_DOOR_LOCKING_ACTUATOR, true))

{

mIOManagerPtr->setActuator(OUTPUT_DOOR_LOCKING_ACTUATOR, false);

syslog(LOG_WARNING, "%s::%s() - failed to activate OUTPUT_DOOR_LOCKING_ACTUATOR", LOG_PREFIX, __FUNCTION__);

abort(QSTR_LOCKING_ACTIVATION_FAILURE);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值