You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qemu访问SysTick寄存器报Blocked re-entrant IO错的原因与解决

问题分析与解决办法

错误原因

这个警告并非意味着QEMU完全禁止访问SysTick寄存器,而是触发了重入IO访问拦截,常见原因有两个:

  1. 你使用了错误的SysTick寄存器地址
  2. 在SMP(双核)配置下,跨核访问了私有外设区域(SysTick属于每个核的私有外设,不能被其他核直接访问)

Cortex-M33的SysTick基地址是标准的0xE000E000,CTRL寄存器偏移0x10,正确地址应为0xE000E010,你代码中使用的0xE002E010属于错误地址,会导致QEMU无法正确映射到对应核的SysTick区域,进而触发重入IO警告。

另外,mps3-an524的双核配置中,每个核都有独立的私有外设空间,跨核直接访问其他核的SysTick寄存器也会触发这类错误。

解决办法

1. 修正SysTick寄存器地址

将代码中的地址改为标准的SysTick CTRL寄存器地址:

volatile uint32_t *systick_ctrl = (volatile uint32_t *)0xE000E010;

2. 确保访问当前核的私有外设

在SMP系统中,可通过读取CPUID寄存器确认当前运行的核,避免跨核访问:

// 读取当前核ID(Cortex-M33的CPUID寄存器偏移0x08)
volatile uint32_t *cpuid = (volatile uint32_t *)0xE000ED08;
uint32_t core_id = (*cpuid) & 0xFF;
// 确保只操作当前核的SysTick
if (core_id == 0) {
    // 核0的SysTick操作
} else if (core_id == 1) {
    // 核1的SysTick操作
}

3. 升级QEMU版本

部分旧版本QEMU在模拟Cortex-M33 SMP的私有外设时存在bug,升级到QEMU 7.2及以上的稳定版本,可修复这类重入IO检测的问题。

4. 跨核操作SysTick的正确方式

如果需要控制另一个核的SysTick,不能直接跨核访问其私有寄存器,需通过核间通信机制(如MPS3-An524自带的mailbox外设)发送指令,让目标核自行操作自身的SysTick寄存器。

内容的提问来源于stack exchange,提问作者RudraSama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 02:52:13