Тащ Клён! Разрешите обратиться! Обновился EVT WCH для CH32V3xx. И
вот такую штуку они зафигачили в обработчик прерываний: __attribute__( ( always_inline ) ) RV_STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
{
NVIC->IRER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F));
__asm volatile ("fence.i");
}
Код работает в GCC12 от WCH. Компилятор сборки riscv32-kgp-elf_@_x86_64-kgp-linux-gnu_haswell-avx2 с параметрами:
-march=rv32imafc -mabi=ilp32f -mtune=rocket -mcmodel=medlow -msmall-data-limit=8 -msave-restore -mcpu=ch32v317 -Ofast -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -ffreestanding -fsingle-precision-constant -flto=auto -Wunused -Wuninitialized -Wall -g3
ругается на последнюю строчку кода:
Assembler messages:
.../Core/core_riscv.h:185: Error: unrecognized opcode `fence.i', extension `zifencei' required
При этом, в версии 1.0.1 core_riscv.h этой инструкции не было. В текущей версии заголовков 1.0.2 (китайцы буквально вчера обновили CH32V307EVT.ZIP) fence.i появилась.
Неужели в архитектуре сh32v317 есть zifencei? Если есть, то нужно добавить в набор параметров -mcpu=ch32v317 и иже с ними.