【问题标题】:Reorganizing STM32 code example in a new project slows down code在新项目中重新组织 STM32 代码示例会减慢代码速度
【发布时间】:2020-10-30 21:09:20
【问题描述】:

我已经根据STM32Cube_FW_L4_V1.15.0\Projects\NUCLEO-L432KC\Examples\TIM\TIM_PWMInput 中的示例代码构建了一个项目。我使用的 Nucleo 板是 NUCLEO-L432KC,我正在使用 STM32CubeIDE 1.3.0 对其进行编程。

随着项目变得越来越大,我尝试在一个包含头文件和源文件的新项目中更好地组织代码,因为除了 STM HAL 项目中的普通文件之外,几乎所有内容都在 main.c 中。我最终让代码与在 STMCubeIDE 中创建为 STM32 项目的新的和重组的项目一起运行。然而,与大部分代码在main.c 中的项目相比,它的运行速度非常慢,这很奇怪,因为它主要是定义、初始化等。在main.c 我有无限循环和HAL_TIM_IC_CaptureCallback()。循环如下所示:

  while (1)
  {
      if (TIM15_DutyCycle > 50 && TIM2_DutyCycle < 50)
      {
          BSP_LED_Off(LED3);
          DWT_Delay_us(200);
      }else
      {
          BSP_LED_On(LED3);
          DWT_Delay_us(200);
      }
  }
}

它产生一个信号,我用另一个定时器读取它的频率。现在的问题是此代码适用于示例项目,但不适用于新项目。使用示波器,我看到信号仍在生成,因此代码正在运行,但时间完全关闭并且非常慢。我想我的问题是什么可能导致这种情况?将代码组织在多个文件中会导致过多的上下文切换和执行速度变慢吗?或者可能是 STM32CubeIDE 中的某些项目设置导致了这种情况?我还没有发现任何区别。时钟设置等应该都是一样的,但我可能会错过一些东西,即使它主要是从另一个项目复制粘贴,只是重新组织。任何项目都没有给出编译器错误或警告。

我意识到这些都是非常普遍的问题,但是由于我的代码在原始项目中具有预期的行为,我认为可能没有必要显示所有代码。也许有人以前经历过类似的事情?

【问题讨论】:

  • 在不同文件中排列代码是为了便于用户阅读/理解。将代码重新排列到文件中对性能的影响应该为零。
  • 您是否尝试测量某些函数的执行时间?如果您至少有一个空闲引脚,您可以将其与不同的脉冲一起使用,并使用示波器或逻辑分析仪查看时间丢失的地方。不过,这些额外的东西需要一些时间。
  • 用延迟衡量代码的性能没有任何意义

标签: embedded stm32


【解决方案1】:

将代码组织在多个文件中会导致上下文过多 切换和执行速度变慢?

没有。

我的第一个猜测是您无意中更改了时钟设置。您是否更改了 SystemClock_Config()?

启用主时钟输出 (MCO) 引脚,然后使用示波器检查时钟是否以预期频率(80 MHz?)运行。在调用 SystemClock_Config() 之后添加此行以启用 MCO。这假设您正在使用示例中的 PLL。

SystemClock_Config();
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);

我的第二个猜测是你的代码中有一个错误,它的行为不像你期望的那样。您需要显示更多代码才能获得帮助。例如,显示计时器配置并显示DWT_Delay_us()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2014-06-20
    • 2012-01-02
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多