Embedded 在新项目中重新组织STM32代码示例会降低代码速度

Embedded 在新项目中重新组织STM32代码示例会降低代码速度,embedded,stm32,Embedded,Stm32,我基于STM32Cube\u FW\u L4\u V1.15.0\Projects\NUCLEO-L432KC\Examples\TIM\TIM\u PWMInput中的示例代码构建了一个项目。我使用的核子板是核子L432KC,我用STM32CubeIDE 1.3.0编程 随着项目越来越大,我尝试在一个新项目中更好地组织代码,使用头文件和源文件,因为除了在STM HAL项目中找到的普通文件之外,几乎所有内容都在main.c中。我最终让代码与在STMCubeIDE中创建的STM32项目一起运行。但

我基于STM32Cube\u FW\u L4\u V1.15.0\Projects\NUCLEO-L432KC\Examples\TIM\TIM\u PWMInput中的示例代码构建了一个项目。我使用的核子板是核子L432KC,我用STM32CubeIDE 1.3.0编程

随着项目越来越大,我尝试在一个新项目中更好地组织代码,使用头文件和源文件,因为除了在STM HAL项目中找到的普通文件之外,几乎所有内容都在
main.c
中。我最终让代码与在STMCubeIDE中创建的STM32项目一起运行。但是,与大多数代码都在
main.c
中的项目相比,它运行速度非常慢,这很奇怪,因为它主要是定义、inits等。在
main.c
中,我有无限循环和
HAL\u TIM\u IC\u 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);
      }
  }
}
while(1)
{
如果(TIM15_DutyCycle>50和TIM2_DutyCycle<50)
{
BSP_发光二极管关闭(发光二极管3);
DWT_Delay_us(200);
}否则
{
BSP_发光二极管(发光二极管3);
DWT_Delay_us(200);
}
}
}
它产生一个信号,我用另一个定时器读取信号的频率。现在的问题是,该代码在示例项目中有效,但在新项目中无效。使用示波器,我看到信号仍然生成,因此代码正在运行,但计时完全关闭,而且非常慢。我想我的问题是什么会导致这种情况?将代码组织在多个文件中是否会导致过多的上下文切换和较慢的执行?或者是STM32CubeIDE中的某些项目设置导致了这种情况?我还没有发现任何不同。时钟设置等都应该是相同的,但我可能错过了一些东西,即使它主要是复制粘贴从其他项目,只是重新组织。任何项目都不会给出编译器错误或警告

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

在多个文件中组织代码是否会导致上下文过多 切换和较慢的执行

没有

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

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

SystemClock_Config();
HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);
我的第二个猜测是,您的代码中有一个bug,它的行为与您预期的不一样。您需要显示更多代码才能获得帮助。例如,显示计时器配置和显示
DWT\u Delay\u us()

在多个文件中组织代码是否会导致上下文过多 切换和较慢的执行

没有

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

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

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

我的第二个猜测是,您的代码中有一个bug,它的行为与您预期的不一样。您需要显示更多代码才能获得帮助。例如,显示计时器配置和显示
DWT\u Delay\u us()

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