@@ -76,13 +76,7 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) {
76
76
// Something else might have used the ADC in a different way,
77
77
// so we completely re-initialize it.
78
78
79
- // Adding the "asm volatile" memory fence here or many places after this declaration
80
- // fixes an issue with gcc13 which causes `value` to always be zero.
81
- // Compiling with gcc10 or gcc12 is fine.
82
- // It can also be fixed by declaring `value` to be static.
83
- // I think I'd like to declare this as volatile, but that causes type errors.
84
79
nrf_saadc_value_t value = 0 ;
85
- asm volatile ("" : : : "memory" );
86
80
87
81
const nrf_saadc_channel_config_t config = {
88
82
.resistor_p = NRF_SAADC_RESISTOR_DISABLED ,
@@ -126,6 +120,13 @@ uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) {
126
120
127
121
nrf_saadc_disable (NRF_SAADC );
128
122
123
+ // Adding the "asm volatile" memory fence here or anywhere after the declaration of `value`
124
+ // fixes an issue with gcc13 which causes `value` to always be zero.
125
+ // Compiling with gcc10 or gcc12 is fine.
126
+ // It can also be fixed by declaring `value` to be static.
127
+ // I think I'd like to declare `value` as volatile, but that causes type errors.
128
+ asm volatile ("" : : : "memory" );
129
+
129
130
// Stretch 14-bit ADC reading to 16-bit range
130
131
return (value << 2 ) | (value >> 12 );
131
132
}
0 commit comments