如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
C语言编程技巧volatile的用法volatile的本意是“易变的”EETOP专业博客---电子工程师自己的家园!~XP0Z,|Rz[#p~M7pe6W{5d#k'^0由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:EETOP专业博客---电子工程师自己的家园9x+Q%ww_staticinti=0;jtY/WV5y1t0EETOP专业博客---电子工程师自己的家园$`7@(jC/w7G0hfintmain(void)EETOP专业博客---电子工程师自己的家园'C,yk@4xUM+]{,Q,](b4J!?zp@0...!xN"N~hd;[0while(1)WMG3S&^P-U7w&C0{EETOP专业博客---电子工程师自己的家园f/\hZd*Eif(i)dosomething();6mCWhI~0}1f&]I)t5Z0x&q^c)T0}EETOP专业博客---电子工程师自己的家园0N-O$P'r2r8Pq/O8tiu^`if[0/*Interruptserviceroutine.*/EETOP专业博客---电子工程师自己的家园T}+i6MYvoidISR_2(void)$v%^#{*IM4kui0{EETOP专业博客---电子工程师自己的家园C:j(u\b:`i=1;EETOP专业博客---电子工程师自己的家园6A!G#w?C-?}&kO}cQM(ED"A0#x3ix"?@)JTkEI0程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。+Z{e[,{/IzB0EETOP专业博客---电子工程师自己的家园ADwVWf;[w&s8R一般说来,volatile用在如下的几个地方:y\&V.atr,?-\*V0EETOP专业博客---电子工程师自己的家园(A-RcO&uY1、中断服务程序中修改的供其它程序检测的变量需要加volatile;EETOP专业博客---电子工程师自己的家园n?b'w'AwA"ub3HT:lj,v(K02、多任务环境下各任务间共享的标志应该加volatile;*cS.M'Y(r0EETOP专业博客---电子工程师自己的家园;t5g)AW'Ko}?9m1Ha3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;EETOP专业博客---电子工程师自己的家园E*v|8j2v$b7_6\#Y;~%p%jV]:Upf0另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。关于C++中的内联函数(inline)在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数。]&CMgR6s%MU08OI'D+eC&N3{X6c*k0可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。下面我们来看一个例子:#include<iostream>cRY+Y']1ba&h+Hh3L0#include<string>VHN&Z+J*u5e0usingnamespacestd;OS7a2RD{(~J5}'M*{6A\(Z$B6B0inlinestringdbtest(inta);//函数原形声明为inline即:内联函数%E_'S{#Bq0K4c6lxk3N0EETOP专业博客---电子工程师自己的家园8UA@dg/M9U3J8peM7ZEETOP专业博客---电子工程师自己的家园+o%H)E?-I+V1a*]xvoidmain():rYQ&Oz*^Fs|'HN0{5M[|UXxj|o0for(inti=1;i<=10;i++),py3scpHK)`&C0{EETO