一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

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

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

(3)存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能有不同意義。

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

    關(guān)注

    0

    文章

    46

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

    volatile 關(guān)鍵字呢?volatile總是與優(yōu)化有關(guān),編譯器有一種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化,進一步可以消除一些代碼
    發(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 聲明一個函數(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)鍵字作用

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

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

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

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

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

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

    volatile06. 附錄01. volatile概述volatileC語言中的一個關(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不定長收發(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不定長收發(fā),空閑中斷

    C語言中volatile是什么

    學(xué)C語言時有一個奇怪的關(guān)鍵字volatile,這到底有什么用呢?
    的頭像 發(fā)表于 02-17 14:29 ?1478次閱讀
    <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我們之前都講過,還有一個在面試中出現(xiàn)的頻率也比較高:register。
    的頭像 發(fā)表于 08-25 17:10 ?1452次閱讀
    淺析<b class='flag-5'>C</b><b class='flag-5'>語言中</b>的regiseter<b class='flag-5'>關(guān)鍵字</b>

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

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