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

SDCC编译8051代码时delay_ms函数返回触发模拟器报错问题

问题分析与根本原因

你遇到的 eMcu::stepCpu: Error PC = 4096 PGM size = 4096 错误,本质是程序计数器(PC)越界——8051的程序存储空间只有4096字节,地址范围是0x0000~0x0FFF,而PC=4096对应地址0x1000,已经超出了有效范围,所以模拟器直接终止运行。

结合你的代码表现(宏定义正常、函数调用出错),根本原因主要有两个方向:

1. SDCC编译的函数栈/返回地址生成异常

当delay_ms用uint16_t做循环变量时,SDCC编译该函数可能在处理16位局部变量时出问题:

  • 8051函数调用会把2字节的返回地址压入栈,uint16_t局部变量也占2字节栈空间。SDCC生成的代码可能错误修改了栈指针(SP)或者返回地址的存储位置,导致函数返回时弹出的地址无效,最终PC跳到了0x1000这个非法地址。
  • 宏定义是直接把代码展开,没有函数调用和栈操作,自然不会触发这个问题。

2. SimulIDE 1.1.0的模拟兼容性bug

SimulIDE 1.1.0对SDCC 4.4.0生成的某些指令序列处理有缺陷:

  • 当函数包含uint16_t局部变量并循环调用其他函数时,模拟器对栈的读写模拟出错,破坏了返回地址。你已经尝试过不同编译器版本,可以再试试升级SimulIDE到最新版,看是否能解决这个问题。

验证和修复建议

  • 把delay_ms里的uint16_t i改成uint8_t i(如果你的延时需求不超过255ms),如果不再报错,那就是SDCC对16位局部变量的编译逻辑有问题。
  • 优化delay_1ms:TMOD=0x01只需要初始化一次,不用每次调用都设置,去掉这个冗余代码。
  • 升级SimulIDE到最新稳定版,大概率能修复这类模拟bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:20:06