libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
ch32_interrupt_guard.h
1#pragma once
2
3#include <stdint.h>
4
5#if !defined(__riscv_zicsr) || !defined(__riscv_zifencei)
6#error "CH32 interrupt guards require the RISC-V Zicsr and Zifencei extensions"
7#endif
8
9enum
10{
11 LIBXR_CH32_INTERRUPT_ENABLE_MASK = 0x88U,
12};
13
14// 保存并屏蔽中断,随后同步取指 / Save and mask interrupts, then synchronize instructions.
15static inline uint32_t libxr_ch32_interrupt_save_and_disable(void)
16{
17 uint32_t interrupt_state;
18 const uint32_t mask = LIBXR_CH32_INTERRUPT_ENABLE_MASK;
19 __asm volatile("csrrc %0, 0x800, %1\n\tfence.i"
20 : "=r"(interrupt_state)
21 : "r"(mask)
22 : "memory");
23 return interrupt_state;
24}
25
26// 只恢复原本启用的中断位 / Restore only interrupt bits that were previously enabled.
27static inline void libxr_ch32_interrupt_restore(uint32_t interrupt_state)
28{
29 const uint32_t restore = interrupt_state & LIBXR_CH32_INTERRUPT_ENABLE_MASK;
30 if (restore != 0U)
31 {
32 __asm volatile("csrs 0x800, %0" : : "r"(restore) : "memory");
33 }
34}