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)