我有一个真正讨厌的错误,终于找到了它的原因。但问题是,我不明白它来自哪里。
我在一个类的方法 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 的文件