“const volatile”类型限定符的实时应用是什么?

“const volatile”类型限定符的实时应用是什么?,c,embedded,C,Embedded,const volatile类型限定符的实时应用是什么?在哪种情况下会使用此选项。我知道volatile关键字和const限定符的应用,但我不了解const volatile的用法。请分享你的想法 C标准(ISO/IEC 9899:2011§6.7.3类型限定符)给出了一个示例: 示例1声明了一个对象 extern const volatile int real_time_clock; 可以由硬件修改,但不能指定、递增或递减 这告诉C编译器,虽然程序不能修改实时时钟,但实时时钟可以改变,因此在

const volatile
类型限定符的实时应用是什么?在哪种情况下会使用此选项。我知道
volatile
关键字和
const
限定符的应用,但我不了解
const volatile
的用法。请分享你的想法

C标准(ISO/IEC 9899:2011§6.7.3类型限定符)给出了一个示例:

示例1声明了一个对象

extern const volatile int real_time_clock;
可以由硬件修改,但不能指定、递增或递减


这告诉C编译器,虽然程序不能修改实时时钟,但实时时钟可以改变,因此在优化引用它的代码时必须谨慎对待。

const
volatile
可以通过三种方式组合,以获得不同的有用效果。示例:

  • 要声明硬件寄存器的恒定地址,请执行以下操作:

    uint8_t volatile* const p_led_reg = (uint8_t *) 0x80000;
    
    uint8_t const volatile* const p_latch_reg = (uint8_t *) 0x10000000;
    
  • 要声明只读处理器间共享内存,其中另一个处理器是写入程序,请执行以下操作:

    int const volatile comm_flag;
    
    uint8_t const volatile comm_buffer[BUFFER_SIZE];
    
  • 要声明只读硬件寄存器,请执行以下操作:

    uint8_t volatile* const p_led_reg = (uint8_t *) 0x80000;
    
    uint8_t const volatile* const p_latch_reg = (uint8_t *) 0x10000000;
    
  • 请注意,每种情况下的类型限定符都是:

    • volatile*const
      -可变易失性数据的常量地址
    • const volatile
      -只读易失性数据
    • const volatile*const
      -只读易失性数据的常量地址

    Michael Barr在Embedded.com的文章

    中提供了这些用法的完整描述。
    volatile
    const
    限定符都与实时无关。@Olaf-也许他指的是“真实世界”?关于这些限定符的使用,有三种情况;“副本”并没有真正解决这些问题(即使答案适用,也不是真正的副本)。@Clifford:推测。关于RT的含义有很多困惑。这个词甚至在商业广告中被误用。我们不是透视者。