完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
7个回答
|
|
我也想知道。可能是一些你定义了,不想被编译器优化掉的变量如地址之类的才用到。至于想知道有没有被优化掉,得看反汇编文件
|
|
|
|
谢谢好心人!!
|
|
|
|
其实最简单的例子就是下面这个
void delay() { int i; for(i = 0; i < 5000;i++) } 如果 i 没有定义成volatile上面的这个延时函数可能就没有作用,编译器认为你这段程序没有任何意义就会优化掉。 当然有些编译器也许能明白你这段函数的意义就不会优化掉 |
|
|
|
|
|
|
|
中断里会改写的变量是指 中断会导致外面的值改变这种吗? 那一般的临时变量如 int i,j,这种需要吗?还有多线程我不是很明白,虽然知道有这么一回事,求指导
|
|
|
|
下面这段话是我从别的地方参考过来的.为什么说变量会被意想不到的改变呢,因为cpu在读写某个内存时,并不是直接与内存打交道的, cpu和内存之间还存在一个cache,如果没有volatile修饰, cpu读到的值实际上是保存在cache上的值. 但如果有volatile修饰, cpu每次都会直接从内存上读取,而不是从cache上读取.
我也了解不多, 有错请指正. =============================================== 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。 2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。 3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*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; a = *ptr; return a * a; } |
|
|
|
THANK YOU!
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2144 浏览 6 评论
1953 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4511 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 20:17 , Processed in 0.674936 second(s), Total 90, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号