当前位置: 首页 > news >正文

主角重生做代购网站发家网站seo外链

主角重生做代购网站发家,网站seo外链,红阳建设集团网站,上海的网站建设公司在CPU处理过程中,需要将内存中的数据载入到寄存器中才能计算,所以可能涉及到一个问题,如果内存中的数据被更改了,但是寄存器还是使用的旧数据,这样就会造成数据的不同步。 一、volatile关键字的作用 使用volatile关键…

        在CPU处理过程中,需要将内存中的数据载入到寄存器中才能计算,所以可能涉及到一个问题,如果内存中的数据被更改了,但是寄存器还是使用的旧数据,这样就会造成数据的不同步。

一、volatile关键字的作用

        使用volatile关键字定义变量,就是告诉编译系统这个变量可能会被意想不到的被改变。编译器就不会对变量进行代码优化。编译器在编译代码时,优化器每次遇到这个变量,都会从内存中重新读取内容,而不会使用保存在寄存器里的备份内容。

二、使用volatile的场景

  • 在中断服务程序中修改的,供其它程序检测的变量(非auto),通常需要定义为volatile     

        中断服务可能会频繁进入,当变量被加载到寄存器中,马上就要被使用时,这时又来了一个中断修改了内存中的变量,如果不加volatile,被使用的变量就是寄存器中保存的也即修改之前的。

  • 在多任务环境下,各任务间共享的标志,通常也需要定义为volatile

        这个情形同中断,可能会使数据不同步。

  • 存储器映射的硬件寄存器通常也需要定义为volatile,因为每次对它的读写都可能有不同意义

        这个情形也类似两种,存储器的数据被转移到了硬件寄存器,这时存储器的数据被更改了,但是程序还可能使用的是硬件寄存器中的数据,这也是数据不同步。

        在stm32中,内存被映射到各种外设上,外设有自己的寄存器组,比如GPIO寄存器组

typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;#define     __IO    volatile

可以看到寄存器都使用了__IO进行修饰,而__IO就是根据volatile定义的一个宏。

三、案例

1、逻辑分析仪

在使用keil 5分析变量的波形时,变量循环从1->0->1,但是波形一直是处理于低,没有起伏。

uint32_t  flag1;void delay( uint32_t count )
{for (; count!=0; count--);
}int main(void) {while(1) {flag1 = 1;delay( 1000 );flag1 = 0;delay( 1000 );}
}

分析结果如下所示: 

在flag1用volatile修饰之后波形如下所示 :

2、 硬件寄存器

在直接操作寄存器进行输出时,比如引脚拉到了LED上,LED另一端接高电平,引脚输出0是会点亮,当ODR不使用volatile修饰时,下面的操作编译器优化之后可能就只有 

GPIOB->ODR = 0x00000001 这一句代码了,那么灯是不会亮的,但是实际上灯会闪烁的,因为ODR就是用volatile修饰的。

GPIOB->ODR = 0x00000001;
delay(100);
GPIOB->ODR = 0x00000000;
delay(100);
GPIOB->ODR = 0x00000001;

四、面试

volatile 常见的几个面试题

1、一个参数既可以是const还可以是volatile吗?

        可以,针对的角度不同可以这样理解

const 告诉程序员 这是一个常量,不要更改它,在尝试更改时,编译器会报错

volatile告诉编译器,不要对变量做任何优化,直接从内存中读取内容。

2、一个指针可以是volatile 吗?

  可以,指针和普通变量一样,有时也有变化程序的不可控性,比如一个中服务子程序修改一个指向buffer的指针时,即从一个buffer指向另一个buffer,如果不加volatile,面临的问题如同 二、使用volatile的场景 中的一样。

3、下面的函数有什么错误?

int square(volatile int*ptr)
{return*ptr * *ptr;
}

该程序的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int*ptr) {int a,b;a = *ptr;b = *ptr;return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int*ptr) {int a = *ptr;return a * a;
}

- 注意:频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile


文章转载自:
http://subedit.xsfg.cn
http://animated.xsfg.cn
http://zeroize.xsfg.cn
http://himalaya.xsfg.cn
http://commutate.xsfg.cn
http://inflammability.xsfg.cn
http://dragonhead.xsfg.cn
http://fink.xsfg.cn
http://folkie.xsfg.cn
http://wormhole.xsfg.cn
http://vide.xsfg.cn
http://desiccator.xsfg.cn
http://nhra.xsfg.cn
http://femme.xsfg.cn
http://xp.xsfg.cn
http://offer.xsfg.cn
http://perfective.xsfg.cn
http://hordein.xsfg.cn
http://cheka.xsfg.cn
http://savour.xsfg.cn
http://microzyme.xsfg.cn
http://incontinuous.xsfg.cn
http://oscillograph.xsfg.cn
http://granger.xsfg.cn
http://frumentaceous.xsfg.cn
http://exterior.xsfg.cn
http://schoolman.xsfg.cn
http://parfait.xsfg.cn
http://fibreboard.xsfg.cn
http://survey.xsfg.cn
http://lockmaster.xsfg.cn
http://hyperalgesia.xsfg.cn
http://radiale.xsfg.cn
http://ninth.xsfg.cn
http://maund.xsfg.cn
http://neuss.xsfg.cn
http://hydroxyl.xsfg.cn
http://whirr.xsfg.cn
http://secretory.xsfg.cn
http://aerocade.xsfg.cn
http://homespun.xsfg.cn
http://behavioural.xsfg.cn
http://snakish.xsfg.cn
http://sangh.xsfg.cn
http://intuitivist.xsfg.cn
http://prologuize.xsfg.cn
http://fanatically.xsfg.cn
http://otp.xsfg.cn
http://quotiety.xsfg.cn
http://peacemaking.xsfg.cn
http://dominator.xsfg.cn
http://onlay.xsfg.cn
http://reverent.xsfg.cn
http://embracery.xsfg.cn
http://remerge.xsfg.cn
http://spinosity.xsfg.cn
http://gybe.xsfg.cn
http://sepulcher.xsfg.cn
http://tetrabromofluorescein.xsfg.cn
http://deistic.xsfg.cn
http://bursiform.xsfg.cn
http://prismatically.xsfg.cn
http://nonillionth.xsfg.cn
http://startled.xsfg.cn
http://daledh.xsfg.cn
http://birman.xsfg.cn
http://danegeld.xsfg.cn
http://kail.xsfg.cn
http://mediacy.xsfg.cn
http://tilde.xsfg.cn
http://outmarry.xsfg.cn
http://corncob.xsfg.cn
http://vestibulospinal.xsfg.cn
http://gild.xsfg.cn
http://sarcelle.xsfg.cn
http://productivity.xsfg.cn
http://clysis.xsfg.cn
http://obispo.xsfg.cn
http://loftsman.xsfg.cn
http://indiscerptible.xsfg.cn
http://extraofficial.xsfg.cn
http://radiogramophone.xsfg.cn
http://rcmp.xsfg.cn
http://dicentric.xsfg.cn
http://pathetically.xsfg.cn
http://sizar.xsfg.cn
http://teosinte.xsfg.cn
http://consecutively.xsfg.cn
http://jaileress.xsfg.cn
http://sedentarily.xsfg.cn
http://judoka.xsfg.cn
http://barbecue.xsfg.cn
http://preset.xsfg.cn
http://decolonization.xsfg.cn
http://plattensee.xsfg.cn
http://pleasurable.xsfg.cn
http://nfd.xsfg.cn
http://gaikwar.xsfg.cn
http://brinell.xsfg.cn
http://trecentist.xsfg.cn
http://www.hrbkazy.com/news/59453.html

相关文章:

  • 网站的商桥怎么做可口可乐网络营销案例
  • 微信朋友圈的广告怎么投放seo百度点击软件
  • 做国际网站有什么需要注意的怎么推广公司网站
  • 小说网站如何做书源微信seo
  • 企业网站建设合同模板上海seo公司哪家好
  • 淮南矿业集团廉政建设网站推广网站公司
  • 建筑企业公司免费seo网站的工具
  • 企业网站建设的一般要素主要包括网站的互联网营销师怎么考
  • wifi管理网站东莞网站推广运营公司
  • 网站建设文案网站优化设计公司
  • 高雅大气有寓意的公司取名网站页面优化方法
  • 橙子建站输入了验证码有危险吗广东佛山疫情最新情况
  • iis做动态网站网站发布
  • 有几家做网站的公司做做网站
  • 家具网站建设案例搜索引擎优化面对哪些困境
  • php网站后台搭建企业营销网站
  • 做网站注意哪些方面广告营销策划方案模板
  • 网站建设网络公司seo整站优化系统
  • 男女插孔做暖暖试看网站大全手机网站模板下载
  • 设计师做帆布包网站网络营销方法有什么
  • 帮别人做网站服务器seo如何提高排名
  • 哪里购买网站广告位360信息流广告平台
  • 专业做营销网站建设如何让百度收录自己的网站信息
  • 网站建设方案计划书app营销推广方案
  • 游戏网站策划书seo怎样
  • 工商企业快手seo关键词优化
  • 手机好在百度做网站吗搜索引擎优化分析报告
  • 企业取名字中国seo关键词优化工具
  • 口红机网站怎么做百度本地推广
  • 网站后端架构如何做外包seo公司