zoukankan      html  css  js  c++  java
  • C语言函数重入

    C语言函数重入

    • 可重入函数:可以被中断的函数,即这个函数执行时,可以中断其执行,可以由一个或多个任务并发使用,而不比担心数据错误。
    • 不可重入函数(不安全函数)
    1. 不能运行在多任务环境下,除非能保证互斥(使用信号量/代码的关键部分禁用中断)
    2. 是由于使用了未受保护的系统资源,如全局变量区,中断向量表等。

    可重入函数:

    1. 没有静态数据结构
    2. 不返回指向静态数据的指针
    3. 所有函数数据由函数的调用者提供
    4. 使用auto变量,或通过全局变量的拷贝来保护全局变量
    5. 若必须访问全局变量,则利用互斥信号保护
    6. 不调用不可重入函数

    不可重入函数有:

    如果一个函数在重入条件下使用了未受保护的共享的资源,那么它是不可重入的。 

    1. 函数中使用了静态变量,无论是全局静态变量还是局部静态变量。 
    2. 函数返回静态变量
    3. 函数中调用了不可重入函数
    4. 函数体内使用了静态的数据结构
    5. 函数体内调用了malloc()或者free()函数
    6. 函数体内调用了其他标准I/O函数
    7. 函数是singleton中的成员函数,而且使用了不使用线程独立存储的成员变量

     

    不可重入函数改写成可重入函数:

    1、不使用全局变量

    2、在和硬件发生交互时,可能会发生中断时,先关闭中断(有些系列叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述,这是临界区保护)

    3、不调用不可重入函数

    4、谨慎使用堆栈,最好在使用前OS_ENTER_KERNAL

     

    中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。中断服务子程序ISR

    __interrupt double compute_area (double radius)  
    { 
        double area = PI * radius * radius; 
        printf("\nArea = %f", area); 
        return area; 
    } 

    错误:

    1、ISR没有返回值

    如果它有返回值,返回给谁,某种中断源产生中断,系统使用ISR进行处理。ISR是链接在某一个中断源上的,而中断源的产生是随机的,所以ISR并没有一个固定的调用者,也没有固定的返回地址,所以返回值没有用。

    2、ISR不能传递参数

    3、在许多编译器/处理器中,浮点数是不可重入的。有些不允许在ISR中做浮点运算。

    4、ISR应该短、有效率的,做浮点数不明智。

    5、printf是不可重入函数。

     

    解释:

    1、浮点数:一般浮点运算都是由专门的硬件来完成,举个例子假设有个硬件寄存器名字叫做FLOAT,用来计算和存放浮点数的中间运算结果
    假设有这么个函数

    void fun()
    {
    //...这个函数对FLOAT寄存器进行操作
    }

    假如第一次执行,有个对浮点数操作运算的结果临时存在FLOAT寄存器中,而就在这时被中断了,而中断函数或者另一个进程也调用fun函数,这时第二次调用的fun函数在执行的过程中就会破坏第一次FLOAT寄存器中的结果,这样当返回到第一次fun函数的时候,结果就不正确了。

     

    2、printf函数

    引用全局变量stdout,这是标准输入输出流的一个对象

    malloc --------全局内存分配表
    free    --------全局内存分配表

    unix里面通常都有加上_r后缀的同名可重入函数版本。

     

  • 相关阅读:
    在 Linux 下查看硬件配置
    对于 ASP.NET 在 IIS 上的一些高并发处理配置
    处理 目标主机SSH服务存在RC4、CBC或None弱加密算法 的问题
    处理 Windows Server 中 CVE-2016-2183(SSL/TLS) 漏洞的方法
    在 Windows Server 2008 R2下部署 asp.net core 3.1 网站遇到的问题
    在 Windows Server 2012 安装最新版 SSMS 遇到错误 0x80070005 -Acess Denied
    在 CentOS 中安装 7zip
    在 npm run build 时遇到报错 [BABEL] No "exports" main defined in
    【性能项目实战:k8s+微服务】热门测试技术,提升职场竞争力(持续更新中。。。)
    windows下安装skywalking8.6.0(用于本地开发调试代码)
  • 原文地址:https://www.cnblogs.com/pukaifei/p/5475626.html
Copyright © 2011-2022 走看看