91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言中volatile關(guān)鍵字的使用

電子工程師 ? 2018-03-17 11:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

volatile的意思是易變的、可變的,作用是限制編譯器優(yōu)化某些變量。首先看一段C51程序:

Keil在優(yōu)化級(jí)別是為8時(shí)得到如下匯編代碼(部分未列出):

可以看到,變量d的值賦給x,y,z時(shí),只有x中是直接讀取的d中數(shù)值,而y=d,z=d則直接將寄存器中的數(shù)值賦給y,z。若在此過程中,變量d的值被改變(比如d是一個(gè)硬件寄存器),則y,z變量中得到的數(shù)據(jù)將是錯(cuò)誤的,因此在某些應(yīng)用中程序存在隱患。

這類問題并不是編譯器的問題。由于訪問內(nèi)部寄存器比訪問RAM速度塊,因此編譯器在編譯類似程序時(shí),會(huì)對(duì)程序進(jìn)行優(yōu)化,除第一次編譯變量所在在連續(xù)讀取一個(gè)變量時(shí),編譯器為了簡(jiǎn)化程序,只要有可能就會(huì)把第一次讀取的值放在ACC或Rx中,在以后的讀取該變量的值時(shí)就直接使用第一次的讀取值。如果該變量的值在此過程中已經(jīng)被外設(shè)(如讀取外部設(shè)備端口時(shí)經(jīng)常將外設(shè)端口看作一外部RAM地址)或其他程序(如中斷服務(wù)程序)所改變,可能就會(huì)出錯(cuò)。為了解決這類問題,常用的方法就是降低編譯器的優(yōu)化級(jí)別或者使用volatile關(guān)鍵字。顯然降低優(yōu)化級(jí)別不是所期望的,因此用volatile關(guān)鍵字修飾相關(guān)變量很有必要。

上文中的例子將d加上volatile關(guān)鍵字后,如下:

重新編譯得到的代碼(部分未列出)如下:

可以看這此y,z變量的值是從d的存儲(chǔ)區(qū)中讀取的。這主要是由編譯器的優(yōu)化早成的,而不是編譯器的錯(cuò)誤。用volatile變量對(duì)變量d修飾后,編譯器不對(duì)這個(gè)變量的操作進(jìn)行優(yōu)化,代碼的執(zhí)行達(dá)到期望的目的。

一般說來,volatile關(guān)鍵字用在如下的幾個(gè)地方。

(1)中斷服務(wù)程序中修改的供其他程序檢測(cè)的變量需要加volatile。

(2)多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志應(yīng)該加volatile。

(3)存儲(chǔ)器映射的硬件寄存器通常也要加volatile說明,因?yàn)槊看螌?duì)它的讀寫都可能有不同意義。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

    13732
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    教科書不會(huì)講的C語言關(guān)鍵字volatile用法

    許多程序員都無法正確理解C語言關(guān)鍵字 volatile,這并不奇怪。因?yàn)榇蠖鄶?shù)C語言書籍通常都是
    發(fā)表于 02-02 10:14 ?926次閱讀

    C語言關(guān)鍵字volatile的用法

    許多程序員都無法正確理解C語言關(guān)鍵字volatile,這并不奇怪。因?yàn)榇蠖鄶?shù)C語言書籍通常都是一
    發(fā)表于 04-11 09:35 ?3299次閱讀

    c語言中 volatile _Bool 關(guān)鍵字說明

    volatile 關(guān)鍵字呢?volatile總是與優(yōu)化有關(guān),編譯器有一種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化,進(jìn)一步可以消除一些代碼
    發(fā)表于 01-06 10:46

    C語言volatile關(guān)鍵字詳解 精選資料分享

    1.volatile和什么有關(guān)百度翻譯是這樣子翻譯volatile的:圖1-1 百度翻譯volatile截圖volatile屬于C
    發(fā)表于 07-22 07:20

    C語言volatile關(guān)鍵字之間有什么關(guān)系?

    C語言volatile關(guān)鍵字之間有什么關(guān)系?
    發(fā)表于 11-11 07:01

    C語言中關(guān)鍵字static的作用是什么

    C語言中關(guān)鍵字static的作用是什么?用預(yù)處理指令#define 聲明一個(gè)函數(shù),輸入天數(shù)得到有多少秒?
    發(fā)表于 12-24 06:53

    STM32CubeMX的相關(guān)資料分享

    鏈接5中的代碼)1.C語言中volatile關(guān)鍵字的學(xué)習(xí)2.【STM32】HAL庫 STM32CubeMX教程十一—DMA (串口DMA發(fā)送接收)3.
    發(fā)表于 01-14 07:10

    c語言中volatile關(guān)鍵字作用

    一個(gè)定義為volatile 的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀
    發(fā)表于 06-22 17:04 ?46次下載

    C語言中volatile關(guān)鍵字

    volatile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改。
    發(fā)表于 05-27 09:32 ?3446次閱讀

    單片機(jī)C語言中常用到的關(guān)鍵字及數(shù)據(jù)類型

    單片機(jī)C語言中常用到的關(guān)鍵字及數(shù)據(jù)類型。
    發(fā)表于 11-03 10:57 ?13次下載

    【嵌入式】C語言中volatile關(guān)鍵字

    volatile06. 附錄01. volatile概述volatileC語言中的一個(gè)關(guān)鍵字。
    發(fā)表于 10-21 10:21 ?6次下載
    【嵌入式】<b class='flag-5'>C</b><b class='flag-5'>語言中</b><b class='flag-5'>volatile</b><b class='flag-5'>關(guān)鍵字</b>

    HAL庫STM32串口DMA不定長(zhǎng)收發(fā),空閑中斷

    參考了鏈接5中的代碼)1.C語言中volatile關(guān)鍵字的學(xué)習(xí)2.【STM32】HAL庫 STM32CubeMX教程十一—DMA (串口DMA發(fā)送接收)3.
    發(fā)表于 01-14 10:40 ?19次下載
    HAL庫STM32串口DMA不定長(zhǎng)收發(fā),空閑中斷

    C語言中volatile是什么

    學(xué)C語言時(shí)有一個(gè)奇怪的關(guān)鍵字volatile,這到底有什么用呢?
    的頭像 發(fā)表于 02-17 14:29 ?1814次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中</b>的<b class='flag-5'>volatile</b>是什么

    淺析C語言中的regiseter關(guān)鍵字

    C語言中重要的關(guān)鍵字有很多,static const extern我們之前都講過,還有一個(gè)在面試中出現(xiàn)的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?1992次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的regiseter<b class='flag-5'>關(guān)鍵字</b>

    快速掌握C語言關(guān)鍵字

    C語言中的32個(gè)關(guān)鍵字你知道多少個(gè)呢?根據(jù)關(guān)鍵字的作用分為四類:數(shù)據(jù)類型關(guān)鍵字、控制語句關(guān)鍵字、
    的頭像 發(fā)表于 07-06 08:04 ?1396次閱讀
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>關(guān)鍵字</b>