workaround for compiler bug where volatile is not propagated over a field access (#57)

wch-ch32v003
Matt Knight 1 year ago committed by GitHub
parent ed12908afc
commit d05e8779b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -44,18 +44,23 @@ pub fn reset(mask: Mask) void {
while ((RESETS.RESET_DONE.raw & raw_mask) != raw_mask) {} while ((RESETS.RESET_DONE.raw & raw_mask) != raw_mask) {}
} }
pub fn reset_block(mask: Mask) void { pub inline fn reset_block(mask: Mask) void {
hw.set_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask); hw.set_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask);
} }
pub fn unreset_block(mask: Mask) void { pub inline fn unreset_block(mask: Mask) void {
hw.clear_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask); hw.clear_alias_raw(&RESETS.RESET).* = @bitCast(u32, mask);
} }
pub fn unreset_block_wait(mask: Mask) void { pub fn unreset_block_wait(mask: Mask) void {
const raw_mask = @bitCast(u32, mask); const raw_mask = @bitCast(u32, mask);
hw.clear_alias_raw(&RESETS.RESET).* = raw_mask; hw.clear_alias_raw(&RESETS.RESET).* = raw_mask;
while (RESETS.RESET_DONE.raw & raw_mask != raw_mask) {}
// have to bitcast after a read() instead of `RESETS.RESET_DONE.raw` due to
// some optimization bug. While loops will not be optimzed away if the
// condition has side effects like dereferencing a volatile pointer.
// It seems that volatile is not propagating correctly.
while (@bitCast(u32, RESETS.RESET_DONE.read()) & raw_mask != raw_mask) {}
} }
pub const masks = struct { pub const masks = struct {

Loading…
Cancel
Save