From 6ff2ff6844316eca4de4ebdb6d8ded875e4aa15a Mon Sep 17 00:00:00 2001 From: dengxingting Date: Mon, 23 Mar 2026 10:45:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=89=87=E4=B8=AD=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TimeSlice_Timer_v2.cs | 161 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 TimeSlice_Timer_v2.cs diff --git a/TimeSlice_Timer_v2.cs b/TimeSlice_Timer_v2.cs new file mode 100644 index 0000000..f8565e4 --- /dev/null +++ b/TimeSlice_Timer_v2.cs @@ -0,0 +1,161 @@ +//============================================================================ +// SimpleWriter - 带中断功能的写寄存器外设 +//============================================================================ + +using System; +using Antmicro.Renode.Core; +using Antmicro.Renode.Logging; +using Antmicro.Renode.Peripherals.Bus; +using Antmicro.Renode.Peripherals.IRQControllers; + +namespace Antmicro.Renode.Peripherals.Timers1 +{ + public class SimpleWriter : IDoubleWordPeripheral, IKnownSize + { + // 寄存器偏移地址 + private const uint REG0_OFFSET = 0x0000; + private const uint REG1_OFFSET = 0x0004; + private const uint REG2_OFFSET = 0x0008; + private const uint REG3_OFFSET = 0x000C; + + private const uint SIZE = 0x1000; + + // 寄存器值 + private uint reg0; + private uint reg1; + private uint reg2; + private uint reg3; + + // 中断输出 - 必须为public,类型为GPIO + public GPIO Interrupt { get; private set; } + + public SimpleWriter(IMachine machine) + { + + this.Log(LogLevel.Info, "[中断输出创建] 中断触发: REG1低8位=0x{0:X2}, 中断=高电平", currentLow8Bits); + + // 创建中断输出 + Interrupt = new GPIO(); + + this.Log(LogLevel.Info, "[中断输出创建] 中断触发: REG1低8位=0x{0:X2}, 中断=高电平", currentLow8Bits); + + // 初始化寄存器 + InitializeRegisters(); + + LogInitializationInfo(); + } + + public void Reset() + { + InitializeRegisters(); + // 复位时清除中断 + Interrupt.Set(false); + } + + /// + /// 更新中断状态 + /// + private void UpdateInterrupt() + { + uint currentLow8Bits = reg1 & 0xFF; + bool interruptActive = (currentLow8Bits != 0); + + // 设置中断电平 + Interrupt.Set(interruptActive); + + if (interruptActive) + { + this.Log(LogLevel.Info, "[SimpleWriter] 中断触发: REG1低8位=0x{0:X2}, 中断=高电平", currentLow8Bits); + } + else + { + this.Log(LogLevel.Info, "[SimpleWriter] 中断清除: REG1低8位=0x00, 中断=低电平"); + } + } + + private void InitializeRegisters() + { + reg0 = 0xFFFE8040; + reg1 = 0x01F90040; // 低8位=0x40,有1存在 + reg2 = 0x00000040; + reg3 = 0x00000000; + + UpdateInterrupt(); + } + + public uint ReadDoubleWord(long offset) + { + uint value = 0; + + switch ((uint)offset) + { + case REG0_OFFSET: + value = reg0; + this.Log(LogLevel.Info, "[SimpleWriter] REG0读取: 0x{0:X8}", value); + break; + case REG1_OFFSET: + value = reg1; + this.Log(LogLevel.Info, "[SimpleWriter] REG1读取: 0x{0:X8}", value); + break; + case REG2_OFFSET: + value = reg2; + this.Log(LogLevel.Info, "[SimpleWriter] REG2读取: 0x{0:X8}", value); + break; + case REG3_OFFSET: + value = reg3; + this.Log(LogLevel.Info, "[SimpleWriter] REG3读取: 0x{0:X8}", value); + break; + default: + this.Log(LogLevel.Warning, "[SimpleWriter] 读取未定义地址: 0x{0:X8}", offset); + break; + } + + return value; + } + + public void WriteDoubleWord(long offset, uint value) + { + switch ((uint)offset) + { + case REG0_OFFSET: + this.Log(LogLevel.Info, "[SimpleWriter] REG0写入: 0x{0:X8}", value); + reg0 = value; + break; + case REG1_OFFSET: + this.Log(LogLevel.Info, "[SimpleWriter] REG1写入: 旧值0x{0:X8}, 新值0x{1:X8}", reg1, value); + reg1 = value; + UpdateInterrupt(); // 写入REG1后更新中断状态 + break; + case REG2_OFFSET: + this.Log(LogLevel.Info, "[SimpleWriter] REG2写入: 0x{0:X8}", value); + reg2 = value; + break; + case REG3_OFFSET: + this.Log(LogLevel.Info, "[SimpleWriter] REG3写入: 0x{0:X8}", value); + reg3 = value; + break; + default: + this.Log(LogLevel.Warning, "[SimpleWriter] 写入未定义地址: 0x{0:X8} = 0x{1:X8}", offset, value); + break; + } + } + + public long Size => SIZE; + + private void LogInitializationInfo() + { + this.Log(LogLevel.Warning, "=========================================="); + this.Log(LogLevel.Warning, "SimpleWriter 已初始化"); + this.Log(LogLevel.Warning, ""); + this.Log(LogLevel.Warning, "寄存器初始化值:"); + this.Log(LogLevel.Warning, " REG0: 0x{0:X8}", reg0); + this.Log(LogLevel.Warning, " REG1: 0x{0:X8} (低8位=0x{1:X2})", reg1, reg1 & 0xFF); + this.Log(LogLevel.Warning, " REG2: 0x{0:X8}", reg2); + this.Log(LogLevel.Warning, " REG3: 0x{0:X8}", reg3); + this.Log(LogLevel.Warning, ""); + this.Log(LogLevel.Warning, "中断功能:当REG1低8位有任何1时,输出高电平中断"); + this.Log(LogLevel.Warning, "当前中断状态: {0}", (reg1 & 0xFF) != 0 ? "高电平" : "低电平"); + this.Log(LogLevel.Warning, "=========================================="); + } + } +} \ No newline at end of file