广皓图文建站品牌

13518219792
  • 南部网站建设
  • 关于我们
    • 如何选择
    • 选择理由
  • 案例作品
    • 网站建设
    • 优化推广
    • 微信开发
    • 电商托管
  • 服务项目
    • 网站建设
    • 移动端/APP
    • 微信/小程序
    • 技术支持
    • 其它服务
  • 建站知识
    • 南部网站建设
    • 南部做网站
    • 南部网站设计
  • 网站售后
    • 南部网站运营
    • 南部网站维护
    • 南部网站推广
  • 客服中心
  • 全国分站

如何理解可重入函数

本篇内容介绍了“如何理解可重入函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

创新互联建站-成都网站建设公司,专注网站建设、网站制作、网站营销推广,域名注册,网站空间,网站托管、服务器托管有关企业网站制作方案、改版、费用等问题,请联系创新互联建站。

 1 前言

最近在公司维护的项目中碰到一个解决了定位很久的 bug , bug 找到的时候发现犯了很低级的错误——在中断处理函数中调用了 printf  函数,因为中断处理函数的调用了不可重入函数,导致中断丢失和系统位置错误,这里直接导致嵌入式 linux  系统应用进程中的所有线程停掉,进而导致看门狗进程得不到喂狗,设备重启。

  • 那什么是不可重入函数呢?

  • 为什么中断处理函数不能直接调用不可重入函数?

  • 怎样写可重入函数?

就以上三个问题展开小短文:

2 什么是不可重入函数?

可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入 OS  调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。

满足下列条件的函数多数是不可重入的:

  • 函数体内使用了静态(static)的数据结构;

  • 函数体内调用了 malloc() 或者 free() 函数;

  • 函数体内调用了标准 I/O 函数;

A. 可重入函数

void strcpy(char *lpszDest, char *lpszSrc)  {     while(*lpszDest++=*lpszSrc++);///< 使用的局部变量     *dest=0; }

B. 不可重入函数1

char cTemp;    ///< 全局变量 void SwapChar1(char *lpcX, char *lpcY)  {     cTemp=*lpcX;     *lpcX=*lpcY;     lpcY=cTemp;   ///< 访问了全局变量 }

C. 不可重入函数2

void SwapChar2(char *lpcX,char *lpcY) {     static char cTemp;  ///< 静态局部变量     cTemp=*lpcX;     *lpcX=*lpcY;     lpcY=cTemp;   ///< 使用了静态局部变量 }

3 为什么中断处理函数不能直接调用不可重入函数?

在多任务系统下,中断可能在任务执行的任何时间发生;如果一个函数的执行期间被中断后,到重新恢复到断点进行执行的过程中,函数所依赖的环境没有发生改变,那么这个函数就是可重入的,否则就不可重入。

在中断前后不都要保存和恢复上下文吗,怎么会出现函数所依赖的环境发生改变了呢?我们知道中断时确实保存一些上下文,但是仅限于返回地址,cpu  寄存器等之类的少量上下文,而函数内部使用的诸如全局或静态变量,buffer  等并不在保护之列,所以如果这些值在函数被中断期间发生了改变,那么当函数回到断点继续执行时,其结果就不可预料了。

在中断处理函数中调用有互斥锁保护的全局变量,如果恰好该变量正在被另一个线程调用,会导致中断处理函数不能及时返回,导致中断丢失等严重问题。

并且在多线程环境中使用,在没有加锁的情况下,对同一段内存块进行并发读写,就会造成 segmentfault/coredump 之类的问题。

总而言之,中断处理函数做的事情越简单越好。

4 如何写出可重入的函数?

  • 在函数体内不访问那些全局变量;

  • 如果必须访问全局变量,记住利用互斥信号量来保护全局变量。或者调用该函数前关中断,调用后再开中断;

  • 不使用静态局部变量;

  • 坚持只使用缺省态(auto)局部变量;

  • 在和硬件发生交互的时候,切记关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用  OS_ENTER_KERNAL/OS_EXIT_KERNAL 来描述;

  • 不能调用任何不可重入的函数;

  • 谨慎使用堆栈。最好先在使用前先 OS_ENTER_KERNAL;

“如何理解可重入函数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


网页标题:如何理解可重入函数
文章路径:http://www.ndjierui.cn/article/jccdhe.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

其他资讯

  • CentOS7网络管理与配置
  • Eclipse如何安装FreemarkIDE集成开发工具
  • Node.js中WorkerThreads的示例分析
  • python中导入包的方式有哪些
  • Oracle与PostgreSQL子查询有什么不同

行业动态

企业网站建设的重要性!

现在虽然是移动互联网时代,但企业网站依然重要,包含PC站点,移动站。可以说企业网站关系企业的未来发展和前途,尤其对中小企业更是如此,一些中小企业老板,对自己的名片很在乎,因为这是个门面。...

服务项目

  • 网站建设

    查看详情
  • 移动端/APP

    查看详情
  • 微信/小程序

    查看详情
  • 技术支持

    查看详情
  • 其它服务

    查看详情
  • 更多服务项目

    用我们的专业和诚信赢得您的信赖,从PC到移动互联网均有您想要的服务!

    获取更多

联系吧 在百度地图上找到我们

电话:13518219792

如遇占线或暂未接听请拨:136xxx98888

业务咨询 技术咨询 售后服务
网站设计
成都网站设计
成都网站设计
企业网站设计
温江网站设计
网站制作
成都网站制作
成都网站制作
成都网站制作
绵阳网站制作公司
联系我们
电话:13518219792
邮箱:631063699@qq.com
地址:成都青羊区锦天国际1002号
网址:www.ndjierui.cn
网站建设
雅安网站建设
达州网站建设
企业手机网站建设
网站建设方案

微信二维码

  • 友情链接
  • 成都光华电信机房
  • 公司画册设计
  • 西充网站建设
  • 犀浦封阳台
  • 公关活动
  • 富顺网站建设
  • 公司宣传册设计
  • app软件定制开发
  • 成都seo优化
  • 佑馨产后护理

Copyright © 2002-2025 www.ndjierui.cn 广皓图文建站品牌 QQ:244261566 版权所有 备案号:蜀ICP备2025118593号-2

  • 在线咨询
  • 13518219792
  • 微信二维码

  • 移动版官网