#include "clint.h" volatile const uint32_t * const mtime_high = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIME_HIGH); volatile const uint32_t * const mtime_low = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIME_LOW); volatile uint32_t * const mtimecmp_high = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIMECMP_HIGH); volatile uint32_t * const mtimecmp_low = (volatile const uint32_t*)(CLINT_BASE + CLINT_MTIMECMP_LOW); volatile uint32_t mtimer_int_flag = 0; void set_mtimecmp(uint64_t value) { *mtimecmp_high = 0xFFFFFFFF; // 先写入高 32 位为全 1(禁用中断) *mtimecmp_low = (uint32_t)value; // 写入低 32 位 *mtimecmp_high = (uint32_t)(value >> 32); // 写入高 32 位 } uint64_t read_mtimer() { uint32_t hi, lo; do { hi = *mtime_high; // 读取高 32 位 lo = *mtime_low; // 读取低 32 位 } while (hi != *mtime_high); // 检查高 32 位是否变化(避免进位) return (((uint64_t)hi << 32) | lo); } void enable_mtimer_int() { __asm__ volatile ("csrs mie, %0" :: "r"(0x80)); // mie.MTIE = 1 __asm__ volatile ("csrs mstatus, %0" :: "r"(0x8)); // mstatus.MIE = 1 } void disable_mtimer_int() { __asm__ volatile ("csrc mie, %0" :: "r"(0x80)); // mie.MTIE = 0 __asm__ volatile ("csrc mstatus, %0" :: "r"(0x8)); // mstatus.MIE = 0 } void set_mtimer(uint32_t delta_t) { uint64_t t; t = read_mtimer(); t += delta_t; set_mtimecmp(t); #if 0 uint64_t t; t = *(volatile uint64_t *)(CLINT_BASE + CLINT_MTIME_LOW); t += delta_t; *(volatile uint64_t *)(CLINT_BASE + CLINT_MTIMECMP_LOW) = t; #endif }