我想我的嵌入式固件代码中可能存在堆栈溢出问题或类似问题。我是一名新程序员,从未处理过 SO,所以我不确定这是否正在发生。
固件控制一个设备,该设备的轮子周围均匀分布着磁铁,电路板上有一个霍尔效应传感器,可以感应磁铁何时在上面。我的固件在监控磁传感器的同时操作步进器并计算步数,以检测车轮是否失速。
我在我的芯片上使用定时器中断(8 位,8057 acrh。)来设置输出端口来控制电机和失速检测。失速检测代码如下所示...
// Enter ISR
// Change the ports to the appropriate value for the next step
// ...
StallDetector++; // Increment the stall detector
if(PosSensor != LastPosMagState)
{
StallDetector = 0;
LastPosMagState = PosSensor;
}
else
{
if (PosSensor == ON)
{
if (StallDetector > (MagnetSize + 10))
{
HandleStallEvent();
}
}
else if (PosSensor == OFF)
{
if (StallDetector > (GapSize + 10))
{
HandleStallEvent();
}
}
}
每次触发 ISR 时都会调用此代码。PosSensor 是磁传感器。MagnetSize 是通过磁场所需的步进数。GapSize 是两个磁铁之间的步数。所以我想检测车轮是否被传感器卡在磁铁上或没有卡在磁铁上。
这在很长一段时间内都很好用,但过了一会儿,第一个失速事件会发生,因为“StallDetector > (MagnetSize + 10)”但是当我查看 StallDetector 的值时,它总是在 220 左右!这没有意义,因为 MagnetSize 总是在 35 左右。所以停止事件应该在 46 时触发,但不知何故它一直到 220?而且我没有在我的代码中的其他任何地方设置失速检测器的值。
你对我如何追查这个问题的根源有什么建议吗?
ISR 看起来像这样
void Timer3_ISR(void) interrupt 14
{
OperateStepper(); // This is the function shown above
TMR3CN &= ~0x80; // Clear Timer3 interrupt flag
}
HandleStallEvent
只是将一些变量设置回它们的默认值,以便它可以尝试另一个动作......
#pragma save
#pragma nooverlay
void HandleStallEvent()
{
///*
PulseMotor = 0; //Stop the wheel from moving
SetMotorPower(0); //Set motor power low
MotorSpeed = LOW_SPEED;
SetSpeedHz();
ERROR_STATE = 2;
DEVICE_IS_HOMED = FALSE;
DEVICE_IS_HOMING = FALSE;
DEVICE_IS_MOVING = FALSE;
HOMING_STATE = 0;
MOVING_STATE = 0;
CURRENT_POSITION = 0;
StallDetector = 0;
return;
//*/
}
#pragma restore