16C语言中volatile类型修饰符有什么特殊用途?

2026-06-11 10:001阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计204个文字,预计阅读时间需要1分钟。

16C语言中volatile类型修饰符有什么特殊用途?

关于上述伪代码的简化,以下是一个简化的版本:

plaintext比较外部键盘输入与假设场景下的键盘输入。

使用while循环,默认为直接循环。

当外部输入不是10%以上差异时,存储变量a。

while循环默认为直接循环。

对于上面假设场景比如100来自外部键盘输入输入后存入变量a。while循环默认一直循环。当外界有新的输入不为10

对于上面假设场景比如100来自外部键盘输入输入后存入变量a。

while循环默认一直循环。

16C语言中volatile类型修饰符有什么特殊用途?

当外界有新的输入不为100则跳出死循环执行mylcd

编译器编译后的汇编

f1从内存取数据存入寄存器R0

f2比较R0与立即数100

f3如果相等则调到f1

f4如果不等执行mylcd

如果没有volatile 去修饰变量a则编译器可能会做出如下优化每次取都是从同一个内存地址去取默认会以为来自同一个地址的值不会改变于是优化为只取一次对于频繁访问的变量默认放到寄存器从第2轮循环开始就不再继续从内存去取数据读内存要比读寄存器慢很多而是直接从寄存器中去取。这样如果后续键盘输入的值若发生改变则内部逻辑不会响应。与设计初衷不符。

volatile常用于硬件开发与外界硬件交互的场合。

 

本文共计204个文字,预计阅读时间需要1分钟。

16C语言中volatile类型修饰符有什么特殊用途?

关于上述伪代码的简化,以下是一个简化的版本:

plaintext比较外部键盘输入与假设场景下的键盘输入。

使用while循环,默认为直接循环。

当外部输入不是10%以上差异时,存储变量a。

while循环默认为直接循环。

对于上面假设场景比如100来自外部键盘输入输入后存入变量a。while循环默认一直循环。当外界有新的输入不为10

对于上面假设场景比如100来自外部键盘输入输入后存入变量a。

while循环默认一直循环。

16C语言中volatile类型修饰符有什么特殊用途?

当外界有新的输入不为100则跳出死循环执行mylcd

编译器编译后的汇编

f1从内存取数据存入寄存器R0

f2比较R0与立即数100

f3如果相等则调到f1

f4如果不等执行mylcd

如果没有volatile 去修饰变量a则编译器可能会做出如下优化每次取都是从同一个内存地址去取默认会以为来自同一个地址的值不会改变于是优化为只取一次对于频繁访问的变量默认放到寄存器从第2轮循环开始就不再继续从内存去取数据读内存要比读寄存器慢很多而是直接从寄存器中去取。这样如果后续键盘输入的值若发生改变则内部逻辑不会响应。与设计初衷不符。

volatile常用于硬件开发与外界硬件交互的场合。