Qemu访问SysTick寄存器报Blocked re-entrant IO错的原因与解决
问题分析与解决办法
错误原因
这个警告并非意味着QEMU完全禁止访问SysTick寄存器,而是触发了重入IO访问拦截,常见原因有两个:
- 你使用了错误的SysTick寄存器地址
- 在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
相关产品推荐
相关产品推荐

