[英]GCC inline assembly - what's difference from __volatile__ and “memory”?
在GCC内联汇编中,有两种方法可以防止对其进行优化: __volatile__
volatile__关键字并将"memory"
插入到寄存器寄存器列表中。
我的问题是与__volatile__
和"memory"
有什么不同-似乎它们是相同的...但是,今天我遇到了一种奇怪的情况,这表明它们绝对不同! (当我使用"memory"
,我的程序在端口I / O功能中有一个错误,但是当我使用__volatile__
时,它就可以了。)
有什么不同?
我对GCC文档的阅读是__volatile__
关键字用于具有副作用的程序集:即,它除了从输出中产生输入外,还执行其他操作。 对于您的情况,我想“端口I / O功能”会引起副作用。
"memory"
缓冲区仅用于读取/写入除输入/输出操作数以外的内存的程序集。 尽管这是一个副作用,但并非所有副作用都涉及记忆。
从手册 :
Extended asm语句的典型用法是操纵输入值以产生输出值。 但是,您的asm语句也可能产生副作用。 如果是这样,您可能需要使用volatile限定符来禁用某些优化。
和
“内存”缓冲区告诉编译器,汇编代码对输入和输出操作数中未列出的项执行内存读取或写入操作(例如,访问由输入参数之一指向的内存)。
使用__volatile__
您可以确保始终从RAM中获取值, 而不用占用CPU缓存。 正如迈克尔·罗森(Michael Rawson)的回答所述,这会产生副作用,但是从某种意义上说,“禁用”了通过CPU缓存进行的常规优化,除此之外没有其他事情。
在您的情况下,从I / O端口读取的值(并存储在可变变量中)的更新速度可能比CPU缓存失效的更新速度更快,因此您可能会读取“旧”值。 使用__volatile__
总是读取非缓存的值 。
您还可以看到: 这篇文章 (我不知道您的体系结构是否为ARM,但概念相同)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.