当前位置: 首页 > news >正文

C51单片机中reentrant关键字的使用,关于MULTIPLE CALL TO FUNCTION警告的问题

关于可重入关键字reentrant的使用:

现象:

在一个项目中警告信息如下,提示该函数多次调用,因为该函数在串口中断和主循环中都有被调用。

影响:

如果在使用该函数期间被中断打断,而中断也调用了该函数,那么该函数的局部变量会被覆盖。当中断结束返回,则此时的变量已经被中断修改了,此时的数据不对,会出现意想不到的结果。
这就是:不可重入(non-reentrant)

原因:

Keil C51 为了省 RAM、提速,普通函数的参数和局部变量往往不放在硬件栈上,而是放在固定的静态内存里(类似全局变量)。
51单片机资源有限,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。而标准C语言的堆栈是动态分配的。

解决方案:

给需要重复调用的函数加上reentrant关键字,使用方式如下图(编译器会改成:参数/局部变量放到专用的可重入栈上,每次调用都有自己的一份,不再共用固定地址。)

这样中断里可以安全再调这个函数。
另外递归调用也可以(8051 上很少这么干,且很吃 RAM)
最后再编译发现警告消失。

注意:使用reentrant,要另外需要在启动文件中根据内存模型打开对应栈

3.IBPSTACK / XBPSTACK / PBPSTACK分别是什么?

它们对应三种内存模型下的可重入栈指针初始化

开关名字含义可重入栈放哪典型场景
IBPSTACKIdataBasePointer Stack内部 RAM(idata)Small 模型 +reentrant
PBPSTACKPdataBasePointer Stackpdata(一页 256 字节外存)Compact 模型 +reentrant
XBPSTACKXdataBasePointer Stackxdata(外部 RAM)Large 模型 +reentrant

建议:什么时候才需要reentrant

典型需求:

  1. 中断服务程序里要调用某个也会在主循环调用的函数,且该函数有局部变量/参数
  2. 需要递归
  3. 某些第三方库明确要求reentrant,并说明要开哪一种栈

更常见、更稳妥的做法:

  • 同个函数再复制一份(功能完全一样,但函数名不一样)
  • 中断里只置标志、收数据
  • 复杂处理放到主循环
  • 这样就不需要reentrant

参考文章:
1、C51的再入函数 reentrant RECURSIVE CALL TO SEGMENT
2、51单片机与递归的问题

http://www.jsqmd.com/news/1202434/

相关文章:

  • 回溯算法实战:从分书问题到约束满足的C++实现与优化
  • Grape-Entity 部署指南:生产环境中的最佳配置与监控
  • LFM2.5-Embedding-350M-bf16开发者指南:从模型加载到推理的完整流程
  • LFM2.5-Embedding-350M-bf16性能评测:bf16精度在8个数据集上的表现分析
  • MCP协议源码解析:一次搞懂Tool、Resource、Prompt三大核心能力
  • 深度解析 GPT-5.6:大模型架构演进与复杂任务实战指南
  • 成本分析:2026苹果录音软件app哪个好用,选对一年省138元
  • Bril项目结构解析:开源教育项目的组织方式
  • FastMCP源码深度解析:一个@tool()装饰器背后到底发生了什么?
  • 2026年无机纤维喷涂行业实力之选:廊坊强晟防腐材料有限公司品牌价值深度解析 - 甄选服务推荐
  • CANN/ops-nn最大池化梯度
  • Cervus部署最佳实践:生产环境中的内核模块配置与监控
  • 苹果折叠iPhone 7月量产,能否重塑折叠屏手机市场格局?
  • 如何5分钟快速部署SingGuard-8b:一站式多模态内容安全解决方案
  • LightTrack架构详解:探测器、姿态估计器与匹配器的协同工作原理
  • 终极解决方案:3步解决macOS与Android文件传输难题
  • Qwen3-Embedding-0.6B-8bit模型优化技巧:提升嵌入质量的10个实用方法
  • 帝舵官方售后服务中心电话和热线实地考察报告+多信源验证(2026年7月更新) - 帝舵中国官方服务中心
  • 三菱CNC数据采集
  • PyTumblr社区贡献指南:如何参与开源项目开发、提交PR和解决常见问题
  • Windows 再曝高危零日:LegacyHive 权限
  • openEuler服务能力参考:一站式操作系统服务标准完全指南
  • 通过同时双击左右耳恢复出厂设置
  • 雷达中国官方售后服务中心热线与地址实地考察报告+多信源验证(2026年7月更新) - 亨得利钟表维修中心
  • Ornith-1.0-9B-OptiQ-4bit常见问题解答:新手必知的10个关键问题
  • FastMCP + REST API实战:让AI一键调用企业ERP、CRM和第三方系统
  • 蓝牙耳机芯片,苹果弹窗电量显示为0的解决方法
  • 2026 年 7 月新发布:合江有实力的专业电梯拆除回收生产商有哪些,拆掉电梯,能赚回多少钱?揭秘回收的隐藏利润 - 企业信息推荐【官方】
  • 计算机体系结构----指令流水线性能量化:吞吐率、效率与加速比实战解析
  • openEuler/arkui-linux完全指南:从环境搭建到第一个应用开发的终极教程