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后缀的同名可重入函数版本。

C语言函数重入的更多相关文章

  1. C语言可重入函数和不可重入函数

    可重入函数和不可重入函数的概念 在函数中如果我们使用静态变量了,导致产生中断调用别的函数的 过程中可能还会调用这个函数,于是原来的 静态变量被在这里改变了,然后返回主体函数,用着的那个静态变量就被改变 ...

  2. KEILC51可重入函数及模拟栈浅析

    MARK:文章中的红色部分是个人的理解. KEILC51可重入函数及模拟栈浅析 关键字:keilc51,模拟堆栈,可重入函数调用,参数传递,C?XBP,C?ADDXBP 摘要:本文较详细的介绍了kei ...

  3. c语言中函数参数入栈的顺序是什么?为什么

    看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){   ...

  4. Chipmunk碰撞回调短时间内重入的解决办法

    Chipmunk引擎中碰撞行为可能在细微处与一般认识略有不同. 比如碰撞回调方法可能会重入.不知道方法(函数)重入概念的童鞋可以自行谷哥或度娘. 第一次碰撞方法还未返回,第二次碰撞回调又被调用了.至于 ...

  5. C语言之可重入函数 && 不可重入函数

    可重入函数 在 实时系统的设计中,经常会出现多个任务调用同一个函数的情况.如果这个函数不幸被设计成为不可重入的函数的话,那么不同任务调用这个函数时可能修改其他任 务调用这个函数的数据,从而导致不可预料 ...

  6. Use Reentrant Functions for Safer Signal Handling(译:使用可重入函数进行更安全的信号处理)

    Use Reentrant Functions for Safer Signal Handling 使用可重入函数进行更安全的信号处理 How and when to employ reentranc ...

  7. Linux 多线程可重入函数

    Reentrant和Thread-safe 在单线程程序中,整个程序都是顺序执行的,一个函数在同一时刻只能被一个函数调用,但在多线程中,由于并发性,一个函数可能同时被多个函数调用,此时这个函数就成了临 ...

  8. reentrant可重入函数

    在多任务操作系统环境中,应用程序的各个任务是并发运行的,所以会经常出现多个任务“同时”调用同一个函数的情况.这里之所以在“同时” 这个词上使用了引号,是因为这个歌”同时“的含义与我们平时所说的同时不是 ...

  9. 函数可重入问题reentrant functions(函数执行过程中可以被中断,允许多个副本)

    最近经常听到这个名词,以前也听到过,不过接触更多的是“线程安全问题”,而且本人也一直理解的是两个名字的含义是一样的.今天仔细总结一下这个名词相关的概念. 引用博文:可重入函数和不可重入函数 (http ...

随机推荐

  1. php json_decode失败,返回null

    在使用json_decode之前,一定得保证字符串是utf-8编码,而执行json_decode失败的原因有很多,罗列如下: 1)编码不对: 2)字符串格式不对: 3)字符串格式对,但是有异常字符: ...

  2. HTML5学习笔记 视频

    许多时髦的网站都提供视频.html5提供了展示视频的标准 检测您的浏览器是否支持html5视频 Web上的视频 直到现在,仍然不存在一项旨在网页上显示视频的标准. 今天,大多数视频是通过插件(比如Fl ...

  3. mongodb - 查看数据库状态

    > use test switched to db test > db.stats() { "db" : "test", #数据库名 "c ...

  4. ⽤运营的思路来做无线产品測试-第13届BQConf上的分享

    ⽤运营的思路来做无线产品測试,在2014.10.25.第13届B'QConf(北京软件质量大会)上分享的一个主题.主要是关于京东无线測试的一些实践,包含android和ios的代码覆盖率.无线的接口自 ...

  5. Python读取键盘输入

    Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.例如以下: raw_input input raw_input函数 raw_input() 函数从标准输入读取一个行.并返回 ...

  6. NFS介绍

    一.NFS服务介绍 NFS是 Network File system的缩写 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机 ...

  7. .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)

    过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...

  8. 点滴积累【JS】---JS小功能(JS实现动态添加运动属性)

    效果: 思路: 首先遍历div挨个执行onmouseover事件,再设置获取非行间样式.然后编写setInterval计时器框架,框架内容是:将三个参数 div.div属性.div的目标点,分别获得, ...

  9. PHPCMS 后台学习

    1.final 不能被子类改写,不可扩展2.私有不能被继承3.构造方法,第一个被调用的方法4.static访问 类名::方法名 parent::test();这里test可以不静态 m=模块名& ...

  10. HDU 1978 How many ways DP问题

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...