Поймал точку возникновения бага с MPU - ничего не понимаю
Файл GPIO.h класс REVOMINIDigitalSource метод write()
Если я его оборачиваю в #pragma GCC optimize ("O0") / #pragma GCC pop_options то все работает. Код в этом случае имеет такой вид
write(b)
08099050: push {r7, lr}
08099052: sub sp, #8
08099054: add r7, sp, #0
08099056: str r0, [r7, #4]
08099058: mov r3, r1
0809905a: strb r3, [r7, #3]
0809905c: ldr r3, [r7, #4]
0809905e: ldr r1, [r3, #4]
08099060: ldr r3, [r7, #4]
08099062: ldrb r2, [r3, #8]
08099064: ldrb r3, [r7, #3]
08099066: mov r0, r1
08099068: mov r1, r2
0809906a: mov r2, r3
r0=dev r1=4 r2=0
0809906c: bl 0x8099008 <gpio_write_bit(gpio_dev const*, uint8_t, uint8_t)>
08099070: adds r7, #8
08099072: mov sp, r7
08099074: pop {r7, pc}
собственно gpio_write_bit(gpio_dev const*, uint8_t, uint8_t):
08099008: movs r3, #1
0809900a: lsls r3, r1
0809900c: uxth r3, r3
173 if (val) {
0809900e: cbz r2, 0x8099016 <gpio_write_bit(gpio_dev const*, uint8_t, uint8_t)+14>
174 dev->GPIOx->BSRRL = bv;
08099010: ldr r2, [r0, #0]
08099012: strh r3, [r2, #24]
08099014: bx lr
176 dev->GPIOx->BSRRH = bv;
08099016: ldr r2, [r0, #0]
; запись r2=0x40020000 r3=0x10
08099018: strh r3, [r2, #26]
0809901a: bx lr
В таком виде все работает.
Если же я комментарю прагму отмены оптимизации, то код приобретает такой вид
0809903c: ldr r2, [r0, #4]
171 uint16_t bv = BIT(pin);
0809903e: ldrb r0, [r0, #8]
08099040: movs r3, #1
08099042: lsls r3, r0
08099044: uxth r3, r3
173 if (val) {
08099046: cbz r1, 0x809904e <REVOMINI::REVOMINIDigitalSource::write(unsigned char)+18>
174 dev->GPIOx->BSRRL = bv;
08099048: ldr r2, [r2, #0]
0809904a: strh r3, [r2, #24]
0809904c: bx lr
176 dev->GPIOx->BSRRH = bv;
0809904e: ldr r2, [r2, #0]
; запись r2=0x40020000 r3=0x10
08099050: strh r3, [r2, #26]
08099052: bx lr
В тот же самый регистр пишется то же самое значение - и НЕ РАБОТАЕТ.
Ничего не понимаю