C/C++基础-C语言重入函数

来源:互联网 发布:2017淘宝卖童装怎么样 编辑:程序博客网 时间:2024/06/11 23:07

序言

之前看C语言和C++区别的时候看到有一个是C++有函数重载而C语言不存在重载的问题,重载是通过形参区分函数的使用,而重入是指多个任务调度同一个函数的情况。


1. 可重入和不可重入函数

  • [1] 可重入函数

    可以被中断的函数,即这个函数执行时,可以中断其执行,可以由一个或多个任务并发使用,而不必担心数据错误

  • [2] 不可重入函数

    不能运行在多任务环境下,除非能保证互斥(使用信号量/代码的关键部分禁用中断)

    • 由于使用了未受保护的系统资源,如全局变量区,中断向量表等。

    • 不可重入函数在实时系统设计中被视为不安全函数。

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

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

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

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

    (4) 进行了浮点运算。许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现)


2. 可重入和不可重入函数的特点

  • [1] 可重入函数特点
    • 没有静态数据结构
    • 不返回指向静态数据的指针
    • 所有函数数据由函数的调用者提供
    • 使用auto变量,或通过全局变量的拷贝来保护全局变量
    • 若必须访问全局变量,则利用互斥信号保护
    • 不调用不可重入函数
可重入函数列表:_exit()、 access()、alarm()、cfgetispeed()、cfgetospeed()、cfsetispeed()、cfsetospeed ()、chdir()、chmod()、chown()、close()、creat()、dup()、dup2()、execle()、 execve()、fcntl()、fork()、fpathconf ()、fstat()、fsync()、getegid()、 geteuid()、getgid()、getgroups()、getpgrp()、getpid()、getppid()、getuid()、 kill()、link()、lseek()、mkdir()、mkfifo()、 open()、pathconf()、pause()、pipe()、raise()、read()、rename()、rmdir()、setgid ()、setpgid()、setsid()、setuid()、 sigaction()、sigaddset()、sigdelset()、sigemptyset()、sigfillset()、 sigismember()、signal()、sigpending()、sigprocmask()、sigsuspend()、sleep()、 stat()、sysconf()、tcdrain()、tcflow()、tcflush()、tcgetattr()、tcgetpgrp()、 tcsendbreak()、tcsetattr()、tcsetpgrp()、time()、times()、 umask()、 uname()、unlink()、utime()、wait()、waitpid()、write()。
  • [2] 不可重入函数特点
    • 函数中使用了静态变量,无论是全局静态变量还是局部静态变量
    • 函数返回静态变量
    • 函数中调用了不可重入函数
    • 函数体内调用了malloc()或者free()函数
    • 函数体内调用了其他标准I/O函数
    • 函数是singleton中的成员函数,而且使用了不属于线程独立存储的成员变量


3. 可重入规则改写不可重入函数

把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。

  • 可重入规则:

    • [1] 不要使用全局变量。如果必须使用记得用互斥信号量保护,因为别的代码很可能修改这些变量值

    • [2] 在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断

      • 完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/ OS_EXIT_KERNAL来描述。
    • [3] 不能调用任何不可重入的函数

    • [4] 谨慎使用堆栈。最好先在使用前先OS_ENTER_KERNAL。

总之,必须“保证中断是安全的



参考文章
http://www.cnblogs.com/pukaifei/p/5475626.html
http://www.cnblogs.com/AlwaysOnLines/p/3912680.html

2017.10.18

原创粉丝点击