ST意法半导体
直播中

douyin8

12年用户 1118经验值
私信 关注
[问答]

传递变量的值在函数调用期间发生变化的原因?

我有一个真正讨厌的错误,终于找到了它的原因。但问题是,我不明白它来自哪里。
我在一个类的方法 A 中计算一个变量,并在所述方法结束时按值将其传递给方法 B。单步执行代码时。在将变量 700 传递给方法 B 之前,我得到了正确的结果,但它在方法 B 中的计算结果为 200。该变量是方法 A 的本地变量。我还对类成员使用 m_ 命名约定。
我现在相当绝望,如果有帮助,我愿意分享我的大部分代码,至少是类。

这是我调用它们的两种方法和值:
调用方法 A 时 targetPos 为 1000。
  • void Stepper::SetTargetPos(uint16_t targetPos)
  • {
  •         if (!m_enabled || targetPos == m_postimer->CNT)
  •         {
  •                 return;
  •         }
  •         if (targetPos > m_posTimer->ARR)
  •         {
  •                 m_targetPos = m_posTimer->ARR;
  •         }
  •         else
  •         {
  •                 m_targetPos = targetPos;
  •         }
  •         uint16_t currentPos = m_posTimer->CNT;
  •         uint16_t dist;
  •         if (currentPos < m_targetPos)
  •         {
  •                 SetDirection(DIR_DOWN);
  •                 dist = targetPos - currentPos;
  •         }
  •         else
  •         {
  •                 SetDirection(DIR_UP);
  •                 dist = currentPos - targetPos;
  •         }
  •         uint16_t brkDist;
  •         uint16_t idx;
  •         // Bremsweg und maximale Geschwidigkeit berechenn
  •         // Fall: Ausreichend Strecke um 100% zu erreichen ausgehend von v0 = 10%, vend = 10%
  •         if (dist >= m_rampDataLen * 1.8f)
  •         {
  •                 brkDist = m_rampDataLen * 0.9f;
  •                 idx = m_rampDataLen;
  •         }
  •         // Fall: Nicht ausreichend Strecke
  •         else
  •         {
  •                 brkDist = dist * 0.5f;
  •                 idx = m_rampDataLen / 10 + brkDist;
  •         }
  •         m_posTimer->CCR2 =
  •                         (currentPos < m_targetPos) ?
  •                                         m_targetPos - brkDist : m_targetPos + brkDist;
  •         m_currentIdx = m_rampDataLen / 10;
  •         m_signalTimer->ARR = m_rampUpData[m_currentIdx];
  •         m_posReached = 0;
  •         // Zielposition in Postitionstimer hinterlegen
  •         m_posTimer->CCR3 = m_targetPos;
  •         // CCR2 und CCR3 Interrupts aktivieren
  •         SET_BIT(m_posTimer->DIER, ((TIM_DIER_CC2IE) | (TIM_DIER_CC3IE)));
  •         SetTargetIdx(idx);
  • }
方法 B 被调用为 700(通过逐步确认)。
  • void Stepper::SetTargetIdx(uint16_t targetIdx)
  • {
  •         if (!m_enabled || m_braking)
  •         {
  •                 return;
  •         }
  •         // UpdateCurrentIdx();
  •         if (targetIdx > m_rampDataLen)
  •         {
  •                 m_targetIdx = m_rampDataLen;
  •         }
  •         else
  •         {
  •                 m_targetIdx = targetIdx;
  •         }
  •         if (m_currentIdx == m_targetIdx)
  •         {
  •                 m_idxReached = 0;
  •                 Go();
  •                 return;
  •         }
  •         uint16_t count;
  •         uint32_t start;
  •         if (m_currentIdx < m_targetIdx)        // Zieldrehzahl höher -> rampUp
  •         {
  •                 count = m_targetIdx - m_currentIdx;
  •                 start = (uint32_t) &m_rampUpData[m_currentIdx];
  •         }
  •         else
  •         {
  •                 count = m_currentIdx - m_targetIdx;
  •                 start = (uint32_t) &m_rampDownData[m_rampDataLen - m_currentIdx];
  •         }
  •         SetDma(start, count);
  •         m_idxReached = 0;
  •         Go();
  • }
这是 stepper.h 和 stepper.cpp 的文件



回帖(1)

杨怡

2022-12-26 14:14:55
您可以在变量上设置一个硬件观察点,以准确了解值发生变化的内容/时间。可能是越界写入或堆栈溢出。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分