zoukankan      html  css  js  c++  java
  • 延时函数出错,volatile一例

    莫名其妙的错误。使用Systick做的延时。

    初始化是这样的:

    //SysTick配置

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

    if(SysTick_Config(SystemCoreClock/1000))//开Systick中断,配置Systick时钟。

    {

    while(1);

    }

    然后:

    //延时函数。1个nTime相当于时间:1ms。

    static uint32_t TimingDelay;

    void Delay(__IO uint32_t nTime)

    {

    TimingDelay = nTime;

    while(TimingDelay != 0);

    }

    void TimingDelay_Decrement(void)

    {

    if (TimingDelay != 0x00)

    {

    TimingDelay--;

    }

    }

    本来一切都正常,这几句代码没任何问题。

    可今天不对劲了。

    这句:while(TimingDelay != 0);

    当TimingDelay 减到0 时候仍然不退出。延时失败。莫名其妙的东西。

    然后在群里边讨论了下发现问题了。

    这东西是编译器给优化掉了。

    定义static uint32_t TimingDelay;

    改成static __IO uint32_t TimingDelay = 0;

    即static volatile uint32_t TimingDelay = 0;

    就好了。

    volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

  • 相关阅读:
    es6-箭头函数
    高度自适应的div
    移动端css水平垂直居中
    跨域2-常用的跨域方式
    跨域1-CORS跨域
    前端路由分类
    K8S系列-2.常用命令
    Git多分支管理
    微服务-01初识
    VirtualBox虚拟Centos磁盘文件扩容
  • 原文地址:https://www.cnblogs.com/zyqgold/p/6135838.html
Copyright © 2011-2022 走看看