1、可重入函数的概念:
可重入函数是可以被中断的函数。它可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。
不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。I/O代码通常不是可重入的,因为它们依赖于像磁盘这样共享的,单独的资源。
2、可重入的条件:
不含有静态(全局)非常量数据
不返回静态(全局)非常量数据的地址
只处理由调用者提供的数据
不能依赖于单例模式(Singleton)资源的锁
不能调用不可重入的函数
不能修改函数本身(除非执行在其专有的存储空间)
3、可重入函数使用的变量有两种情况:
1)使用局部变量,变量保存在CPU寄存器中或者堆栈中;
2)使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。
void strcpy(*dest,*src)
{
while(* dest++ = *src ++){;}
*dest = NUL;
}
1)函数内使用了静态的数据。
2)函数内使用了malloc()或者free()函数的。
3)函数内调用了标准的I/O函数的。
可重入函数是可以被中断的函数。它可以被一个以上的任务调用,而不担心数据破坏。可重入函数在任何时候都可以被中断,而一段时间之后又可以恢复运行,而相应的数据不会破坏或者丢失。也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。
不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。I/O代码通常不是可重入的,因为它们依赖于像磁盘这样共享的,单独的资源。
2、可重入的条件:
不含有静态(全局)非常量数据
不返回静态(全局)非常量数据的地址
只处理由调用者提供的数据
不能依赖于单例模式(Singleton)资源的锁
不能调用不可重入的函数
不能修改函数本身(除非执行在其专有的存储空间)
3、可重入函数使用的变量有两种情况:
1)使用局部变量,变量保存在CPU寄存器中或者堆栈中;
2)使用全局变量,但是这时候要注意保护全局变量(防止任务中断后被其它任务改变变量)。
void strcpy(*dest,*src)
{
while(* dest++ = *src ++){;}
*dest = NUL;
}
strcpy-字符串复制。参数是存放在堆栈中的,因而函数可以被多任务调用,而不必担心各个任务调用期间会互相破坏对方的指针。
4、不可重入的函数<基本上>:1)函数内使用了静态的数据。
2)函数内使用了malloc()或者free()函数的。
3)函数内调用了标准的I/O函数的。
5、常用的可重入函数的方法有:
1)不要使用全局变量,防止别的代码覆盖这些变量的值。
2)调用这类函数之前先关掉中断,调用完之后马上打开中断。防止函数执行期间被中断进入别的任务执行。
3)使用信号量(互斥条件)。
可重入函数的其他知识点有待进一步学习...