diff --git a/doc/langref.html.in b/doc/langref.html.in index ac8671ebb7..5075458aad 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -2227,16 +2227,23 @@ or Unlike normal structs, {#syntax#}packed{#endsyntax#} structs have guaranteed in-memory layout:

@@ -2247,8 +2254,7 @@ or {#code|test_packed_structs.zig#}

- The backing integer is inferred from the fields' total bit width. - Optionally, it can be explicitly provided and enforced at compile time: + The backing integer can be inferred or explicitly provided. When inferred, it will be unsigned. When explicitly provided, its bit width will be enforced at compile time to exactly match the total bit width of the fields:

{#code|test_missized_packed_struct.zig#} @@ -2295,12 +2301,11 @@ or {#code|test_packed_struct_equality.zig#}

- Using packed structs with {#link|volatile#} is problematic, and may be a compile error in the future. - For details on this subscribe to - this issue. - TODO update these docs with a recommendation on how to use packed structs with MMIO - (the use case for volatile packed structs) once this issue is resolved. - Don't worry, there will be a good solution for this use case in zig. + Packed structs can be used to interact with memory-mapped input-output (MMIO), which is + common in embedded applications. A pointer of the correct alignment and address to a packed struct + can be constructed to faciltiate manipulation of bit-packed registers without arduous bitshifting. + + {#code|packed_struct_mmio.zig#}

{#header_close#} diff --git a/doc/langref/packed_struct_mmio.zig b/doc/langref/packed_struct_mmio.zig new file mode 100644 index 0000000000..79236a76ea --- /dev/null +++ b/doc/langref/packed_struct_mmio.zig @@ -0,0 +1,16 @@ +pub const GPIORegister = packed struct(u8) { + GPIO0: bool, + GPIO1: bool, + GPIO2: bool, + GPIO3: bool, + _reserved: u4 = 0, +}; + +/// Write a new state to the memory-mapped IO. +pub fn writeToGPIO(new_states: GPIORegister) void { + const gpio_register_address = 0x0123; + const raw_ptr: *align(1) volatile GPIORegister = @ptrFromInt(gpio_register_address); + raw_ptr.* = new_states; +} + +// syntax