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

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

现象:

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

影响:

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

原因:

C51的变量是编译时预先分配好的,每个变量地址已经固定,不会变动。
(51单片机资源有限,为了提高运行效率,C51采用静态分配局部变量的方式,所以不可递归。而标准C语言的堆栈是动态分配的。)

解决方案:

给需要重复调用的函数加上 reentrant关键字,使用方式如下图
在这里插入图片描述

最后再编译发现警告消失。

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

相关推荐

  1. C#“ref“关键使用

    2023-12-12 15:54:02       47 阅读
  2. C#is,as,using关键使用

    2023-12-12 15:54:02       26 阅读
  3. Kotlinobject关键使用

    2023-12-12 15:54:02       60 阅读
  4. 如何关闭C源代码指定警告

    2023-12-12 15:54:02       54 阅读
  5. 关于 Static 静态关键使用,你了解多少?

    2023-12-12 15:54:02       62 阅读
  6. import关键使用

    2023-12-12 15:54:02       38 阅读
  7. C语言volatile关键用法

    2023-12-12 15:54:02       43 阅读
  8. C++const关键多种用法

    2023-12-12 15:54:02       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-12 15:54:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-12 15:54:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-12 15:54:02       82 阅读
  4. Python语言-面向对象

    2023-12-12 15:54:02       91 阅读

热门阅读

  1. ChatGpt

    ChatGpt

    2023-12-12 15:54:02      62 阅读
  2. docker中CMD和ENTRYPOINT 的区别

    2023-12-12 15:54:02       61 阅读
  3. 互联网服务器更新运维

    2023-12-12 15:54:02       57 阅读
  4. Android:监听开机广播自己唤醒

    2023-12-12 15:54:02       69 阅读
  5. 架构:服务名词解释

    2023-12-12 15:54:02       60 阅读
  6. postgresql数据库中的建表和约束

    2023-12-12 15:54:02       64 阅读
  7. GSIL:GitHub敏感信息泄露监控工具使用

    2023-12-12 15:54:02       65 阅读
  8. 找到字符串中所有字母异位词(LeetCode 438)

    2023-12-12 15:54:02       52 阅读