函数的重入与递归

重入的问题 抛出个问题 有一个定时器,定时时间是1秒,然后里面有一个执行函数,里面的函数有时候执行500毫秒,有时候执行2秒,如果是这样的话,有没有问题,如果有问题,要怎么解决? 先说上面中断的问题 我之前写过一篇文章,专门说中断的,我又想起来之前说的那个重入和不重入的问题了,我们做软件设计的一定要考虑这个问题,就比如中断,因为工作很久了,遇到了很多芯片,了解有些CPU可以重入,有些芯片设计的中断不可以重入,... 阅读详情

什么是函数的重入

所谓重入,就是指某段子程序还没有执行完,就因为中断或者是多任务操作系统的调度原因,导致该子程序在一个新的寄存器上下文中被执行

引发函数重入的原因

  • 中断
  • 任务调度
  • 递归

函数可重入的条件

一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。满足下列条件的函数多数是不可重入的:

  • 函数体内使用了全局变量;
  • 函数体内使用了静态的数据结构
  • 函数体内调用了malloc()或者free()函数;
  • 函数体内调用了标准I/O函数;标准io库很多实现都以不可重入的方式使用全局数据结构
  • 函数体内进行了浮点运算。许多的处理器/编译器中,浮点一般都是不可重入的 (浮点运算大多使用协处理器或者软件模拟来实现

保证函数可重入的方法

  • 使用局部变量
  • 不调用不可重入函数
  • 如果确实需要访问全局变量(包括static),一定要注意实施互斥手段:如信号量等

什么是函数递归

函数自己直接或间接调用自己

函数递归的注意点

  • 函数递归也是一种重入
  • 避免递归的深度很深时,会造成函数栈的溢出
理解可重入函数与嵌套函数调用 本文将深入探讨可重入函数的概念以及嵌套函数调用的复杂性。通过理解函数参数的传递方式、栈的分配与管理以及寄存器的保存和恢复机制,我们可以编写出既高效又稳定的代码。同时,本文也将探讨递归函数的编写规则和注意事项。... 阅读详情

相关推荐

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

可重入函数

一、可重入函数1)什么是可重入性?可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。2)可重入函

奋起的blog 1016

【故障处理】- ORA-01722

在执行升级脚本@?/rdbms/admin/catupgrd.sql时报错ora-01722。

weixin_39099660的博客 854

函数可重入性(Reentrancy)概念详解

1.什么是可重入性 重入一般可以理解为一个函数在同时多次调用,例如操作系统在进程调度过程中,或者单片机、处理器等的中断的时候会发生重入的现象。 可重入的函数必须满足以下三个条件: (1)可以在执行的过程中可以被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行,并正确执行。 可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。不可重入(non-reentrant...

lisheng19870305的专栏 5672

iPad秒变Mac副屏的隐藏技巧:用BetterDisplay实现无线竖屏+90度锁定

本文详细介绍了如何利用BetterDisplay软件突破苹果原生“随航”(Sidecar)功能的限制,将iPad无线设置为Mac的竖屏副屏,并实现90度方向锁定。通过创建虚拟显示器、配置分辨率与旋转参数,并校准鼠标指针,用户可以高效利用iPad的纵向空间进行文档阅读、编码等工作,显著提升多屏协作效率。

weixin_29266647的博客 603

别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗?

本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。

weixin_42699679的博客 579

函数 重载,重写,重入

最近被问到函数的重载,重写和重入有什么区别,突然一问这些概念,有点懵了,这里梳理总结一下这三个概念。其实重载,重写和重入完全是不同维度的概念,但是名字比较像,所以经常被拿来比较。尤其是重载和重写是最容易被比较的。这两个概念也是针对C++的,对于C语言的语法,重载和重写都是不支持的。下面也会详细说一下为什么C不支持。

RedCrabe的博客 1127

使用IntelliJ IDEA配置版本管理(SVN和Git)

在开发过程中,版本管理是必不可少的一部分,它可以帮助团队协作、管理代码历史记录,并且提供了代码回滚和分支管理等功能。本文将介绍如何使用IntelliJ IDEA配置版本管理,包括SVN和Git两种方式,另外列举了常见的问题并指导修复,以帮助开发者更高效地进行代码管理和协作。

2868

关于函数的可重入和递归

今天在阅读CM3 权威手册的时候,看到这么一段话:“所谓的重入,就是指某段子程序还没有执行完,就因为中断或者是多任务操作系统的调度原因,导致该子程序在一个新的寄存器上下文中被执行(请不要把重入与递归混淆,它们有本质的区别)。这种情况常常会闹出乱子,因此有“可重入性”的研究。”         我仔细想了想关于单片机可重入与递归的概念,结果越来越糊涂,从而感悟到单片机中还有很多没有弄明白的地方,于

前进的牛 2790

如何把DeepSeek这个奈斯工具接入到Pycharm里

DeepSeek接入到Pycharm中,提高编程效率,以及帮助解决遇到的问题。

学无止境,何以言满 2621

EuROC 数据集格式及相关代码

Euroc提供ROS和zip两种数据格式。

~勿据散客~的博客 2092

c语言函数递归调用 重入函数,C51函数的递归调用

前几天在写C51程序时用到了递归,简单程序如下:void WRITE_ADD(uchar addr,uchar wbyte){START(); //先发送起始信号WRITE_BYTE(0xa0); //设备地址+W命令if(!ERROR_Flag) //正确收到应答{WRITE_BYTE(addr); //写入地址}else{ERROR_Flag = ; //清错误标志WRITE_ADD...

weixin_39728213的博客 1281

【华为OD机试真题】7、字符串筛选排序 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >输入一个由N个大小写字母组成的字符串 按照ASCII码值从小到大进行排序 查找字符串中第K个最小ASCII码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为0) k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引 如果有重复字母则输出字母的最小位置索引

KJ.JK 2266

回调函数、递归函数、可重入函数

参考:http://blog.youkuaiyun.com/callmeback/article/details/4242260 1.什么是回调函数 回调就是一种利用函数指针进行函数调用的过程,使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中...

weixin_30684743的博客 213

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

函数的重入性,map,filter sorted函数,递归函数,闭包 closure

函数的重入性:    可重入是指一个函数传的参数一定,则结果必须一定    要求:        def定义的函数不要访问除局部变量以外的变量map函数:    map(func,*iterables) *星号元组形参    用函数和对可迭代对象中的每一个元素作为参数计算出新的可    迭代对象,当最短的一个可迭代象不再提供数据时,此可迭代    对象生成结束.filter函数:可以列表推倒式中 ...

weixin_42130019的博客 266

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

递归重入c语言延时函数多任务程序设计中的函数重入问题按照Keil的规范对函数添加关键字“reentrant”,将函数定义为可重入的 void Delay_MS(x) reentrant

c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题 weixin_395593332020-11-29 09:07:4439收藏 文章标签:c语言延时函数c语言延时函数delayc语言延时函数delay延时一秒中断函数中调用延时会影响其他中断? 中断是单片机最重要的功能,对多任务程序设计中的函数重入问题必须要给予足够的重视,下面给出了一个Keil的C51编译器的翻车现场。 (一) 函数重入问题 如果一个函数如果不受函数递归时或者被中断时被重新执行过的影响,还能继续正常运行...

二进制模----细微行动改变影响世界 794

Java锁之可重入锁和递归锁

Java锁之可重入锁和递归锁 目录 Java锁之可重入锁和递归锁基本概念 Java锁之可重入锁和递归锁代码验证 小结 理论,代码,小结,学习三板斧。 1. Java锁之可重入锁和递归锁基本概念 可重入锁(也叫递归锁),指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁,也即是说,线程可以进入任何一个它己经拥...

努力努力再努力L 1410

在51单片机上使用递归的注意事项

目录问题应对措施原理 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 问题        在Keil C51中直接使用递归会报如下警告:        recursive call to non-reentrant function &nbsp

乙酸氧铍的博客 3225

【C语言安全编码之可重入函数】1、可重入函数的基本概念

本系列文章将围绕可重入函数展开,将会涉及可重入函数的概念、要求、不可重入函数的处理等,敬请各位期待

一介草民,只为生活。 1941

可重入锁(又名递归锁)

可重入锁 指的是同一线程外层函数获得锁之后,内层递归函数仍能获取该锁的代码,在同一线程的外层获取锁的时候,在进入内层方法会自动获取锁,也就是说线程可以任意进入它已经拥有的锁的同步代码块。 synchronized 是一个典型的重入锁 使用synchronized 实现代码如下: public class ReenterLockDemo { public static void main(S...

weixin_44226334的博客 336

linux可重入函数与非可重入函数

可重入函数与非可重入函数 #何为函数的重入? 函数的重入是指对函数进行并发访问,比如函数F正在运行,由于中断或者多任务调度,函数F会被打断,失去对CPU控制权,而中断服务程序ISR或者其他任务再一次调用函数F,这就造成了函数F的重入。 #引起函数重入的情况 总的来说,引起函数发生重入的情况有3种: 中断 多任务调度 递归函数 #函数可重入的条件 并非所有函数都可以发生重入并且保证安全地...

liuqingshuige的博客 364

8051编译器生成不可重入函数的原因简析与使用的注意事项

注:编译器也仅仅是在编译期将可能的风险作为警告提示用户,而且可能存在有些风险发现不了的情况,这也对编程人员提出了更高的要求,但8051程序体量往往比较小,也是比较容易把控的,程序员在进行8051编程时尽量不要写有重入风险的程序。理由是,局部变量一般会保存到栈中或者寄存器中,每个函数都有自己的栈帧,寄存器中的局部变量,编译器也会保证在不同函数中是独立的。所以即使函数重入了,他们所访问的同一局部变量也是存储在不同的存储空间中。

dmf_fff的博客 596

【Java概念】可重入函数

什么是可重入函数 可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数。即:如果一个函数执行过程中,被中断服务程序打断,去执行另外一段代码,然后恢复先前的功能,而不妨碍其早期的操作,则称该函数能是可重入的。可重入函数用于硬件中断处理,递归等应用程序 可重入函数的条件 1 不使用全局和静态数据。虽然没有限制,但一般不建议。因为中断可能会改变某些全局值,之后使用新数据恢复可重入函数的动作过程可能会产生不希望的结果。 2 可重入函数不应修改自己的代码。我们需要函数的动作在整个代码中保

丑小鸭 789

C51中函数的递归调用

前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte)  {      START();  //先发送起始信号      WRITE_BYTE(0xa0); //设备地址+W命令      if(!ERROR_Flag)  //正确收到应答  {       WRITE_BYTE(addr); //写入地址

1368
下一篇: 基于LUT的设计方法
flyingthing
博客等级 码龄8年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值