我使用的是STM32F303 MCU。我使用STM32CubeIDE生成了一个简单的项目。在项目中,它在 main() -> while() 循环中将 int data 加 1。
int data = 0;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
// HAL_Delay(20);
data++;
}
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
如果我在调试模式下运行并在 data++ 行添加断点,一切都很好。我可以看到 int data 在 Live Expressions 中增加。
但是,如果我删除断点,int data将立即变为3145848并且固件停止。
此外,HAL_Delay()会导致固件失败。所以我把它注释掉了。
该固件在NUCLEO开发板中运行良好。
编译器知道,在您递增该值一次之后,接下来要做的唯一一件事就是再次递增它。通过一次增加全部而不是一次增加一点来节省时间,这很有帮助。
如果你不希望编译器像这样提供帮助,那么你需要将你的计数器声明为易失性的:
volatile int data = 0;
这告诉编译器按照指定的确切顺序一次执行一次对变量的访问。