有这样一段代关于systick.c,如下:
#include “SysTick.h”
volatile unsigned int TimingDelay ; // 准确延时在SysTick中止里用的计数变量
// 在大局变量里边一定要加上volatile关键字(易变的),不然在大局引证中简单形成编译器的传递过错
void SysTick_1ms_Configuration(void)
{
/* Setup SysTick Timer for 1 msec interrupts */
if (SysTick_Config(SystemFrequency / 1000))
{
/* Capture error */
while (1);
}
}
void Delay_Ms(unsigned int nTime)
{
TimingDelay = nTime;
while(TimingDelay);
}
systick.c的头文件如下:
#ifndef __SYSTICK_H
#define __SYSTICK_H
/* Includes ——————————————————————*/
#include “stm32f10x.h”
/* Exported types ————————————————————*/
/* Exported constants ——————————————————–*/
/* Exported Global variables ————————————————-*/
extern volatile unsigned int TimingDelay; // 准确延时在SysTick中止里用的计数变量
/* Exported macro ————————————————————*/
/* Exported functions ——————————————————- */
void SysTick_1ms_Configuration(void); // 装备 1ms 时钟心跳
void Delay_Ms(unsigned int nTime); // 1ms 延时
#endif /* __SYSTICK_H */
在中止向量里的函数如下:
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval : None
*/
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay–;
}
}
便是这样一段代码,在stm32里是最常用的准确延时函数,在编译器编译等级为0的时分全部OK,可是一旦上调编译等级到2或许3的时分程序就会死在代码中绿色的方位。最终经测验知道了是需要在大局变量里运用volatile关键字,不然在编译器进行优化的时分简单发生过错。
仔细分析下相似与变量竞赛,一个是中止不断在引证,别的一个是while的循环。假如运用volatile关键字,编译器就会对每次的变量操作进行实践赋值,然后确保了变量数据的真实性。