c语言重新输入,C语言函数重新输入.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

c语⾔重新输⼊,C语⾔函数重新输⼊

C语⾔函数重新输⼊

由于使⽤了不受保护的系统资源(例如全局变量区,中断向量表),因此除⾮确保相互排斥(使⽤信号灯/代码的关键部分禁⽌中断),否则⽆法

在多任务环境中运⾏等

重⼊函数:

没有静态数据结构不会返回指向静态数据的指针.所有函数数据均由函数调⽤者提供.使⽤⾃动变量,或通过复制全局变量来保护全局变量.

如果必须访问全局变量,请使⽤互斥信号来保护它们.调⽤⾮可重⼊函数

不可重⼊函数为:

如果函数在重⼊条件下使⽤不受保护的共享资源,则该函数是不可重⼊的.

函数中使⽤静态变量,⽆论它是全局静态变量还是局部静态变量.该函数返回⼀个静态变量.在函数中调⽤⾮可重⼊函数.函数中使⽤静态数

据结构.在函数中调⽤malloc()或free()函数.该函数调⽤其他标准I/O函数.该函数是单例中的成员函数.并使⽤不使⽤线程独⽴存储的成员

变量

将⾮可重⼊函数重写为可重⼊函数:

1.不要使⽤全局变量

2.当与硬件交互时可能发⽣中断时ccriticalsection对应c语⾔,请先关闭该中断(某些系列称为“进⼊/退出内核”或使⽤

OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述,这是关键部分的保护)

3.不要调⽤⾮可重⼊函数

4.⼩⼼使⽤堆栈,最好在使⽤前使⽤OS_ENTER_KERNAL

中断是嵌⼊式系统的重要组成部分,这导致许多编译器开发⼈员提供了扩展,该扩展允许标准C⽀持中断.ISR:

错误:

1,ISR没有返回值

如果它具有返回值,并返回给谁,则某种中断源将⽣成⼀个中断,并且系统将使⽤ISR进⾏处理.ISR链接到某个中断源,并且中断源的⽣成

是随机的.因此,ISR没有固定的调⽤⽅和固定的返回地址,因此返回值没有⽤.

2,ISR⽆法传递参数

3.在许多编译器/处理器中,浮点数不是可重⼊的.有些不允许在ISR中进⾏浮点运算.

4.ISR应该简短有效.进⾏浮点数运算是不明智的.

5,printf是不可重⼊函数.

说明:

1.浮点数:通常,浮点操作由专⽤硬件执⾏.例如,假设有⼀个名为FLOAT的硬件寄存器,⽤于计算和存储浮点数的中间运算结果.

假设有这样的功能

如果是第⼀次执⾏,则浮点运算的结果会暂时存储在FLOAT寄存器中,并在此时被中断,并且中断函数或其他进程也将调⽤fun函数,这是

第⼆次调⽤的fun函数将在执⾏过程中破坏第⼀个FLOAT寄存器中的结果,因此,当返回第⼀个fun函数时,结果将不正确.

2,printf功能

引⽤全局变量stdout,它是标准输⼊和输出流的对象

malloc全局内存分配表

免费全局内存分配表

Unix通常具有可重⼊的函数版本,其名称后缀_r

这种情况发⽣在多任务系统中.当在任务执⾏期间捕获并处理信号时,信号处理程序会暂时中断该过程正在执⾏的指令序列.如果从信号处理

程序返回,它将继续在过程断点处执⾏正常的指令序列.从恢复到断点重新执⾏,函数所依赖的环境没有改变,可以说该函数是可重⼊的.否

则它不是可重⼊的.

众所周知,在进程中断期间,系统会保存并恢复进程的上下⽂,但是恢复的上下⽂仅限于少数上下⽂,例如返回地址,cpu寄存器等,以及

内部诸如全局或静态变量,缓冲区等函数.它不受保护,因此如果在函数中断期间这些值发⽣变化,则当函数返回到断点以继续执⾏时结果

将不可预测.例如,对于malloc,例如,某个进程当前正在执⾏malloc以分配堆空间.此时,程序捕获信号中断.信号处理程序中还有⼀个

malloc.这将对流程环境造成损害,因为Malloc通常会为其分配的存储区维护⼀个链接表.在插⼊和执⾏信号处理功能时,该进程可能正在

此表上运⾏,并且信号处理功能的调⽤仅覆盖了该过程的操作,从⽽导致错误.

以下⼤多数条件是不可重⼊函数:

(1)使⽤静态数据结构;

(2)称为malloc或free;

(3)调⽤标准I/O函数;标准io库的许多实现都以不可重⼊的⽅式使⽤全局数据结构.

(4)进⾏了浮点运算.在许多处理器/编译器中,浮点运算通常是不可重⼊的(浮点运算通常使⽤协处理器或软件仿真来实现.

1)信号处理程序A在内部和外部调⽤相同的不可重⼊函数B;B在执⾏过程中被信号中断并进⼊A(在A中调⽤B),并在完成后返回到B的中断

点以继续执⾏.这时,B函数的环境可能会更改,结果是不可预测的

2)多个线程在进程内部共享资源.如果两个线程A和B调⽤相同的不可重⼊函数F,则程A进⼊F之后,该线程被调度为切换到B,并且B也执

文档评论(0)

百分卷 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档