RISC-V, QingKeV2 (CH32V006). По мере роста размера кода (4кБ
сейчас), начал сваливаться в хардфолт. Компилятор GCC15 для WCH от
Mounriver (из дистрибутива MRS2). mcause = 4, не прерывание. Говорит, не выровненная загрузка. При этом да, у меня байт по нечётному адресу. Но и инструкция, перед фолтом, SB!
ОК. Попробовал заменить байтовую переменную на слово 32бит. Та же фигня. Хотя адрес уже выровнен по 4.
Пока чую - связано с прерываниями - фолт зависит от обработчика в прерывании, не связанного с проблемным кодом.
UPD: Стал разбиратся детальнее. Вышло странно. То попадает в HMI (немаскируемое прерывание) с кодом 2 - illegal instruction, то с кодом 4 - load instruction address misalignment - в хардфолт.
Предварительно, выяснил, что, вероятно, это последствия переноса из MRS2 в Eclipse. В свойствах целевого процессора, у Эклипса нет некоторых параметров, которые есть и установлены в MRS2. Поэтому проблемная сборка велась "фирменным" GCC, но без некоторых ключей.
Добавил в параметры целевого процессора (для CH32V006) ключи, которые собрал в диагностическом выводе MRS2 при сборке кода под мой чип:
-march=rv32ec_zmmul_xw -mno-small-data-limit=0 -msave-restore -misa-spec=2.2
И перестал попадать в немаскируемые прерывания. Кроме этого, объём кода снизился с 4096 до 3652 байт.