
可重入和不可重入函数
发布日期:2021-05-08 17:51:30
浏览次数:13
分类:原创文章
本文共 1554 字,大约阅读时间需要 5 分钟。
文章目录
1.可重入函数与不可重入函数的特点
-
那么什么是可重入函数呢?
所谓可重入函数是指一个可以被多个任务调用的过程,任务在调用时不必担心数据 是否会出错。 -
不可重入函数在实时系统设计中被视为不安全函数。满足下列条件的函数多数是不可重入的:
(1)函数体内使用了静态的数据结构;(静态存储区:全局变量+static类型的变量)
(2) 函数体内调用了malloc()或者free()函数;
(3) 函数体内调用了标准I/O函数。 -
如何编写可重入的函数?
在函数体内不访问那些全局变量,不使用静态局部变量,坚持只使用局部变量,写出的函数就将是可重入的。如果必须访问全局变量,记住利用互斥信号量来保护全局变量。 -
如何将一个不可重入的函数改写成可重入的函数?
把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写它。其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 1) 不要使用全局变量。因为别的代码很可能覆盖这些变量值。 2) 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”。 3) 不能调用其它任何不可重入的函数。 4) 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。
2.举例说明
A. 可重入函数 void strcpy(char *lpszDest, char *lpszSrc) { while(*lpszDest++=*lpszSrc++); *dest=0; }B. 不可重入函数1charcTemp;//全局变量void SwapChar1(char *lpcX, char *lpcY){ cTemp=*lpcX; *lpcX=*lpcY; lpcY=cTemp;//访问了全局变量}C. 不可重入函数2void SwapChar2(char *lpcX,char *lpcY){ static char cTemp;//静态局部变量 cTemp=*lpcX; *lpcX=*lpcY; lpcY=cTemp;//使用了静态局部变量}D. unsigned int sum_int( unsigned int base ){ unsigned int index; static unsigned int sum = 0; // 注意,是static类型 for (index = 1; index <= base; index++) sum += index; return sum;} 分析:所谓的函数是可重入的(也可以说是可预测的),即只要输入数据相同就应产生相同的输出。这个函数之所以是不可预测的,就是因为函数中使用了 static变量,因为static变量的特征,这样的函数被称为:带“内部存储器”功能的的函数。因此如果需要一个可重入的函数,一定要避免函数中使用 static变量,这种函数中的static变量,使用原则是,能不用尽量不用。 将上面的函数修改为可重入的函数,只要将声明sum变量中的static关键字去掉,变量sum即变为一个auto类型的变量,函数即变为一个可重入的函数。 当然,有些时候,在函数中是必须要使用static变量的,比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
转:https://www.cnblogs.com/reality-soul/p/6140932.html
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年03月31日 22时41分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
const与常量,傻傻分不清楚~
2019-03-06
Head First设计模式——迭代器模式
2019-03-06
MongoDB版本及存储引擎区别
2019-03-06
shell echo单行和多行文字定向写入到文件中
2019-03-06
AtCoder Beginner Contest 100 题解
2019-03-06
【数据结构】可持久化线段树初步
2019-03-06
后缀树
2019-03-06
Java高性能编程之CAS与ABA及解决方法
2019-03-06
从BIO到Netty的演变
2019-03-06
《算法导论》第二章笔记
2019-03-06
HTML节点操作
2019-03-06
HTML5新特性
2019-03-06
async/await剖析
2019-03-06
cmp命令
2019-03-06
一次编辑
2019-03-06
长按键入
2019-03-06
JavaScript中的链式调用
2019-03-06
day-04-列表
2019-03-06
Linux 磁盘管理(df fu fdisk mkfs mount)
2019-03-06
空间向量
2019-03-06