github.com/tinygo-org/tinygo@v0.31.3-0.20240404173401-90b0bf646c27/src/runtime/volatile/volatile.go (about)

     1  // Package volatile provides definitions for volatile loads and stores. These
     2  // are implemented as compiler builtins.
     3  //
     4  // The load operations load a volatile value. The store operations store to a
     5  // volatile value. The compiler will emit exactly one load or store operation
     6  // when possible and will not reorder volatile operations. However, the compiler
     7  // may move other operations across load/store operations, so make sure that all
     8  // relevant loads/stores are done in a volatile way if this is a problem.
     9  //
    10  // These loads and stores are commonly used to read/write values from memory
    11  // mapped peripheral devices. They do not provide atomicity, use the sync/atomic
    12  // package for that.
    13  //
    14  // For more details: https://llvm.org/docs/LangRef.html#volatile-memory-accesses
    15  // and https://blog.regehr.org/archives/28.
    16  package volatile
    17  
    18  // LoadUint8 loads the volatile value *addr.
    19  func LoadUint8(addr *uint8) (val uint8)
    20  
    21  // LoadUint16 loads the volatile value *addr.
    22  func LoadUint16(addr *uint16) (val uint16)
    23  
    24  // LoadUint32 loads the volatile value *addr.
    25  func LoadUint32(addr *uint32) (val uint32)
    26  
    27  // LoadUint64 loads the volatile value *addr.
    28  func LoadUint64(addr *uint64) (val uint64)
    29  
    30  // StoreUint8 stores val to the volatile value *addr.
    31  func StoreUint8(addr *uint8, val uint8)
    32  
    33  // StoreUint16 stores val to the volatile value *addr.
    34  func StoreUint16(addr *uint16, val uint16)
    35  
    36  // StoreUint32 stores val to the volatile value *addr.
    37  func StoreUint32(addr *uint32, val uint32)
    38  
    39  // StoreUint64 stores val to the volatile value *addr.
    40  func StoreUint64(addr *uint64, val uint64)