可重入函数

在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况。如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料的后果。那么什么是可重入函数呢?所谓可重入是指一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。

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

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

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

(3)函数体内调用了标准I/O函数。

如何写出可重入的函数?在函数体内不访问那些全局变量,不使用静态局部变量,坚持只使用缺省态(auto)局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。或者调用该函数前关中断,调用后再开中断。

可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。可重入函数或者只使用局部变量,即保存在CPU寄存器中或堆栈中;或者使用全局变量,则要对全局变量予以保护。

说法2:

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

基本上下面的函数是不可重入的
(1)函数体内使用了静态的数据结构;

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

(3)函数体内调用了标准I/O函数。

把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。
其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。

第一,不要使用全局变量。因为别的代码很可能覆盖这些变量值。

第二,在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述。//这是临界区保护

第三,不能调用任何不可重入的函数。

第四,谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。

还有一些规则,都是很好理解的,总之,时刻记住一句话:保证中断是安全的!

转载于:https://www.cnblogs.com/wanghetao/archive/2012/03/24/2415235.html

什么是可重入函数和不可重入函数相关推荐

  1. Linux中的可重入函数和不可重入函数

    可重入函数 可重入函数(即可以被中断的函数)可以被一个以上的任务调用,而不担心数据破坏.可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失. 可重入函数使用的 ...

  2. 可重入函数与不可重入函数(转)

    转自:http://www.cppblog.com/franksunny/archive/2007/08/03/29269.html 主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数 ...

  3. 14.线程安全?线程不安全?可重入函数?不可重入函数?

    线程安全问题 基本定义 线程安全:简单来说线程安全就是多个线程并发执行同一段代码时,不会出现不同的结果,我们就可以说该线程是安全的: 线程不安全:如果多线程并发执行时会产生不同的结果,则该线程就是不安 ...

  4. 【Linux系统编程】可重入函数和不可重入函数

    在实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果有一个函数不幸被设计成为这样:那么不同任务调用这个函数时可能修改其他任务调用这个函数的数据,从而导致不可预料的后果.这样的函数是不安全的 ...

  5. 信号之函数的可重入性

    信号之函数的可重入性 在调用某个函数过程中出现中断信号,且改信号处理函数中再次调用该函数,访问全局.静态变量的函数是不可重入函数. 前后数据不一致,函数是不可重入的,特点:函数中使用全局变量或静态变量 ...

  6. 可重入函数与不可重入函数

    主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误:而不可重入的函数由于使 ...

  7. 函数的可重入和不可重入

    https://www.ibm.com/developerworks/cn/linux/l-reent.html这是一篇描述重入函数和不可重入函数的文章.先把他copy过来: 在早期的编程中,不可重入 ...

  8. Linux信号编程实践(二) 信号发送函数和可重入函数

    在早期的UNIX中信号是不可靠的,不可靠在这里指的是:信号可能丢失,一个信号发生了,但进程却可能一直不知道这一点. 现在Linux 在SIGRTMIN实时信号之前的都叫不可靠信号,这里的不可靠主要是不 ...

  9. strtok函数和可重入函数strtrok_s、strtok_r的使用和注意事项

    strtok函数--按照指定的分隔符将字符串分割 函数原型: char *strtok(char s[], const char *delim) 参数一:要被分割的字符串 参数二:指定的分隔符 内部实 ...

最新文章

  1. Vb自动读取本地HTML,VB获取网页源代码的五种方法
  2. IDEA中的项目没有被SVN管理解决办法
  3. [转]Oracle 服务器名配置
  4. 【机器学习基础】支持向量机超参数的可视化解释
  5. bash 的相关配置
  6. sublime text 3安装及使用
  7. PHP企业级开发环境配置全攻略-IDE+SVN++(转)
  8. 中国双氢青蒿素市场趋势报告、技术动态创新及市场预测
  9. 爬取常用的网站,整理成API:中国联通,大众点评,IT桔子,拉勾网,猫眼电影,人人贷......
  10. 防止Mac电脑屏幕进入休眠状态,该怎么设置?
  11. 深圳.NET俱乐部10月Asp.net技术讨论会小结暨超级英雄大赛事宜
  12. 不借助第三方变量实现两个整数变量值的互换
  13. DXperience GridControl 根据内容动态显示图标
  14. 主流PCB画图软件的对比区别(AD、Pads、Allegro)
  15. android 源码编译adb,ADB 源程序从android源码中提取
  16. 厦门大学2019年数学分析考研试题
  17. Oracle的本地网络服务名配置
  18. 计算机任意字符替换,Word中级技巧之同类字符的精确替换
  19. 真无线蓝牙耳机哪个牌子好?最适合打游戏的无线耳机
  20. 基于区块链的知识共享框架-Aletheia

热门文章

  1. 适应安装程序用的TreeView控件
  2. 2019.03.13 ZJOI2019模拟赛 解题报告
  3. 1.arm的linux系统搭建
  4. CF797E. Array Queries
  5. @Quelifier的用法,
  6. 基于机器学习的web异常检测(转)
  7. MSI-X 之有别于MSI
  8. 注解提高篇:自定义注解处理器(APT)
  9. linux su和sudo命令的区别(转)
  10. ActivityIndicator(菊花)的用法