您的位置 首页 知识

关于STM32 Systick 延时函数 变量大局引证的问题

有这样一段代关于systick.c,如下:#includeSysTick.hvolatileunsignedintTimingDelay;//精确延时在SysTick中断里用的计数…

有这样一段代关于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关键字,编译器就会对每次的变量操作进行实践赋值,然后确保了变量数据的真实性。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/252251.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部