当前位置:网站首页>Volatile of C language
Volatile of C language
2022-07-05 07:56:00 【feiyingzaishi】
C Language volatile
emOsprey Osprey talk about MCU 2 month 21 Japan
Estimated reading time : 4 minute
and const Different ( About const You can see const Section ), When a variable is declared as volatile, It means that this variable will be changed unexpectedly . The most typical is I/O The input register of , Because the value of this variable is related to the external level , Once the external level changes , Then this variable will change . Of course, there are other registers as well , For example, various status registers 、 Timing counter, etc , Their change depends on hardware , Your program can only read data , So it must be stated as volatile Talent , So when your optimization level improves , Your program can also ensure that there will be no problems due to over optimization .
Then state as volatile What effect does the variable of have on the compiler ? We know that the compiler has optimization function , A lot of times , The value of some variables may be unchanged during operation , If you need to get the variable value from the original memory every time you access this variable , That's a waste of time , If you let your compiler not optimize , Then every time it accesses this variable, it will read data from memory , This is not only inefficient , The amount of code will also be relatively large , Once optimized , The compiler will save the amount it considers unchanged in the internal register , You can access this register every time you access this variable , In this way, the operation efficiency will be greatly improved . So there are usually two versions when writing code , One is Debug edition , One is Release edition . Debug Version and Release One of the differences between versions is the optimization level , Of course, their differences are not only reflected in these two aspects .
First, let's take a look at the code under two different optimization levels :
You can see that the effect is still very obvious .
First of all Code Less 24.1%,RO-data unchanged ,RW-data Reduced 8, This is because I stated in the program that two pointers are not used in the program , So it was optimized .
It is these two goods that occupy 8 Byte space , Now because the optimization level is improved , It's been optimized . then ZI-data remain unchanged .
So it looks like , The optimization effect is still obvious . But will there be any problems with the operation of the code , It's largely volatile The problem. .
Now look at the library function GPIO Structure declaration :
You can see that each register declaration is __IO, and __IO Finally, you can see volatile:
So every time the compiler encounters a declaration of volatile The variables in the register cannot be used for backup , Instead, access data from the original memory .
In addition to hardware registers , There are also variables shared by multiple threads and variables used by interrupt service programs , They are all similar , It may not change in one function , And in other functions ( Interrupt handler functions or functions of other threads ) Possible changes , If you don't declare volatile, Then the compiler sees that this variable does not change in a function , You may only access memory once , Then save to register , When used, you may only use copies of registers , Once other programs also write to this variable , It is imperceptible , It may also destroy this write operation , See the semaphore section for details .
Speaking of this , Just think of the situation encountered by a friend . At that time, he had a variable added by himself in the interrupt handler , And in the main Function , Then debugging found that this variable was always read as 0, There's no change at all , But you can be sure that you have entered the interrupt handler . At that time, I also knew such a situation , But I have other things , There is no deep study . Later, he adjusted it for a long time and added volatile Keywords can be solved , Then I asked him if the compilation optimization level was too high , He said that the optimization level had never been changed , So he just suspects , I didn't really look at the level of his compiler . When I asked him to verify again, I found that the optimization level was really high , Not at all level 0, It is level 3.
Yes, of course , If you know a little assembly language , This problem should be easier to solve , Because no matter how optimized the compiler , Will eventually be reflected at the assembly level , If you find that assembly code always uses a copy of the register , Then we can judge that the optimization is basically too high , At this time, set the optimization level to level 0 There is no problem , But the best way is to add volatile, Because you may optimize it in the future !
-THE END-
边栏推荐
- Use stm32cubemx tool to write the demo program of FreeRTOS
- [untitled] record the visual shock of the Winter Olympics and the introduction of the display screen
- The global and Chinese market of lithographic labels 2022-2028: Research Report on technology, participants, trends, market size and share
- Makefile application
- Drive LED -- GPIO control
- STM32 learning method
- UEFI development learning 5 - simple use of protocol
- Shell脚本基本语法
- Development tools -- gcc compiler usage
- Some errors in configuring the environment
猜你喜欢
UEFI development learning 3 - create UEFI program
Interview catalogue
C language uses arrays to realize the intersection, union, difference and complement of sets
C WinForm [change the position of the form after running] - Practical Exercise 4
研究發現,跨境電商客服系統都有這五點功能!
Could NOT find XXX (missing: XXX_LIBRARY XXX_DIR)
Extended application of single chip microcomputer-06 independent key
Mlperf training v2.0 list released, with the same GPU configuration, the performance of Baidu PaddlePaddle ranks first in the world
Scm-05 basis of independent keyboard
Network communication model -- Network OSI tcp/ip layering
随机推荐
UEFI development learning 2 - running ovmf in QEMU
assert_ Usage of param function
[untitled] record the visual shock of the Winter Olympics and the introduction of the display screen
研究发现,跨境电商客服系统都有这五点功能!
Improve lighting C program
C WinForm [help interface - send email] - practice five
Altium designer 19.1.18 - hide the fly line of a network
Altium Designer 19.1.18 - 隐藏某一个网络的飞线
Ten thousand words detailed eight sorting must read (code + dynamic diagram demonstration)
Gradle composite construction
UEFI development learning 4 - getting to know variable services
Altium designer 19.1.18 - clear information generated by measuring distance
Day09 how to create packages import package naming conventions Alibaba Development Manual
Global and Chinese market of urban rail connectors 2022-2028: Research Report on technology, participants, trends, market size and share
Extern keyword function
How to define guid in AMI code
MySQL - storage engine
Oracle triggers and packages
Reasons for rapid wear of conductive slip rings
Embedded composition and route