函数的可重入性(Reentrancy)

来源:互联网 发布:windows平台开发swift 编辑:程序博客网 时间:2024/05/29 13:24

什么是可重入?

可重入函数是一个可以被多个任务调用的过程,任务在调用时不必担心数据是否会出错。

    在写函数时只要考虑到尽量用局部变量(例如寄存器、堆栈中的变量),对于要使用的全局变量要加以保护(例如采用关中断、信号量等),这样构成的函数就一定是一个可重入的函数。

    此外,编译器是否有可重入函数的库,与它所服务的操作系统有关,例如DOS下的BorlandC和MicrosoftC/C++等就不具备可重入的函数库,这是因为DOS是一个单用户单任务的操作系统。为了确保每一个任务控制自己的私有变量,在一个可重入的C函数中,须将这样的变量声名为局部变量。C编译器将这样的变量存放在调用栈上或寄存器里。

    在VxWorks中,多个任务可调用同一子函数或函数库。VxWorks系统动态连接工具使这相当容易,这种共享代码让系统更加高效,易于维护。

VxWorks系统主要采用如下的几种可重入技术:

  动态堆栈变量

许多子函数只是纯代码,除了动态堆栈变量外没有其他数据。调用程序的参数作为子函数的数据。这种子函数是完全可重入的,多个任务同时使用这种子函数,不会互相影响,因为它们各有自己的堆栈空间。

  受保护的全局和静态变量

一些函数库包含公有数据,多个任务的同时调用很可能会导致对公有数据的破坏,使用起来要格外小心。系统采用信号量互斥机制来防止任务同时运行代码的临界区。

  任务变量

一些公用函数要求对于每一调用程序都有明确的全局或静态变量值。为了满足这一点,VxWorks提供的任务变量允许4字节变量加入到任务上下文中,当任务切换时变量的值也切换。

    编写可重入的函数,必须遵循以下的规则:

    1.将所有的局部变量申明为auto(缺省态)或寄存器型。

    2.尽量不要使用static或extern变量。如有必要,要用互斥机制进行保护。

个人心得:

在平时代码开发过程中,设计的可重入函数还是比较多的,他的优点,如前面所说,设计可重入函数满足多任务调用同一个函数,是系统更加高效,易于维护。

原创粉丝点击