MCU中断里使用软延时函数delay_ms(u16 x)问题及实例探讨

news/2024/4/19 15:00:14/文章来源:https://blog.csdn.net/weixin_50007421/article/details/136534872

原贴有误已删:https://blog.csdn.net/weixin_50007421/article/details/136138221

今天完善如下:

本意:只是想表达“复杂系统中断里当然尽量不用软延时函数,但简单系统只要心中有数逻辑清楚实测无妨就完全可行”。

但后来感觉还是不求甚解,还是想弄清楚究竟怎么回事,就引入了下面2个具体例子

ms延时函数就用如下最简代码 (注:MCU11.0592MHz,u8 i,j; u16 x):

void delay_ms(u16 x)
{   u8 i,j;while(x-- > 0){i = 15, j = 90;do while (--j);while (--i);}
}

1.若主程序正在运行delay_ms(100),x=100,已延时50ms时被中断,且中断里有个最简软延时消抖delay_ms(20),x=20,运行结果究竟如何的呢?

中断服务执行完返回主程序delay_ms(100)时,相当于执行delay_ms(20)了,不计其他,原主程序的延时函数实际延时50ms+中断消抖20ms+继续延时20ms=90ms,总延时90mS(缩短了10ms);若中断消抖等延时函数里X相对很小或可忽略不计,是否就相当于原主程序延时函数被中断后就跳过了剩余延时时间?!若个人觉得这个影响不大当然就完全无妨。那么:中断服务执行完返回主程序delay_ms(100)时,为什么相当于执行delay_ms(20)了呢?以及怎么去理解和解决这个问题呢?

有的说:你是用for循环在延时还是while在延时,不管哪一种情况,若中断发生在主程序延时过程中,如果X是局部变量(有个东西叫做栈),两个延时互不干扰,中断返回后继续计数延时。如果X是全局变量,中断返回后,这个X会变得更小(若是从delay函数从0计数)主程序会继续延时80ms...

2.又如:一节课45分钟,30分钟时老师突然“中断”出去接电话10分钟(若中断用同一延时函数,已延时10分钟),老师回来时离下课还有5分钟,那你说他会继续讲几分钟然后下课?

1种可能是15分钟(45-30=15,实际延时10分钟下课)?另一种可能:回来再讲5分钟就下课(45-30-10=5?即提前5分钟下课)?究竟该如何才能明确并选择哪种情况?

有的说:进中断之前,会保持当前场景,且delay形参是以变量而非地址的形式,中断里面的x影响不到主程序里面的x相当于调用了两次delay 两次互不影响...

探讨:

1.留意:Keil的C51编译器缺省是函数不可重入的(当然不是所有不可重入函数在后台和中断中同时调用都会发生问题)。对Keil的设置为大模式和不优化,所有的变量均实际存储在XRAM空间,因此延时函数“delay_ms()”是不可重入的。

中断中延时函数正常退出时,其3个变量的值未必会恢复到它们在主函数中的值:

等中断退出后,i和j的值为0。这时无论做--j或者做--i,其值将变为0xFF,不为0,因此要继续做减一循环,程序原地踏步。但是要把一个16位的长整数减为0,要花不止1秒的时间,

解决Keil的C51程序中断重入问题有两个方法!进一步的理解,请详见qq_25814297-npl的帖子(再次感谢博主):c语言延时函数_子牙篇(2)多任务程序设计中的函数重入问题-CSDN博客文章浏览阅读453次。中断是单片机最重要的功能,对多任务程序设计中的函数重入问题必须要给予足够的重视,下面给出了一个Keil的C51编译器的翻车现场。(一) 函数重入问题如果一个函数如果不受函数递归时或者被中断时被重新执行过的影响,还能继续正常运行下去,称这个函数是“可重入的”,否则称为“不可重入的”。(1)函数的递归调用。递归是一种很重要的计算方法。当一个函数进行递归时,函数从递归点开始又从头开始执行一次本函数,当函..._c语言多线程重入问题有哪些https://blog.csdn.net/weixin_39559333/article/details/110617431

2.本delay_ms()函数中:MCU11.0592MHz;变量定义u8 i,j; u16 x稍有不同;u=unsigned;

以上个人目前理解,欢迎探讨!
————————————————

                           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_997416.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H264的打包,nal,es,pes,pts,dts,ps,ts

编码层次 视频编码层:预测、变换、量化、熵编码等操作slice层:将视频帧分割成若干个编码单元,包含一定数量的宏块,提高编解码的并行性和容错性。NAL层:提升对网络传输和数据存储的亲和性 视频编码层 基准-Baseline …

火柴排队(逆序对 + 离散化)

505. 火柴排队 原题链接 思路 如下是画图分析的一些过程 在这里贪心的思路是排序,然后两个数组都是从小到大那样对应的话最终的答案可达到最小 而我们只能交换相邻的火柴,故在这里先假设一个简化版本,即A有序,而只需要对B进行…

HTML+CSS+BootStrap游乐园官网

一、技术栈 支持pc、pad、手机访问,页面自适应!! html5cssbootstrapjs 二、项目截图 接受项目定制,站内联系博主!!!

获取别人店铺的所有商品API接口

使用淘宝淘口令接口的步骤通常包括: 注册成为淘宝开放平台的开发者:在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥:在您的开发者控制台中创建一个应用,并获取用于API调用的密钥,如Client ID和Clie…

机试指南:Ch5:线性数据结构 Ch6:递归与分治

文章目录 第5章 线性数据结构1.向量 vector2.队列 queue(1)队列的特点、应用(2)基本操作(3)例题例题1:约瑟夫问题2 (难度:中等) (4)习题习题1:排队打饭 (难度:中等) 3.栈 stack(1)栈…

【微前端】为什么需要微前端

1 什么是微前端 微前端就是将不同的功能按照不同的维度拆分成多个子应用。通过主应用来加载这些子应用。 微前端的核心在于拆,拆完后再合 2. 为什么去使用他 ○ 不同团队间开发同一个应用技术栈不同 ○ 希望每个团队都可以独立开发,独立部署 ○ 项目中…

mitmproxy代理

文章目录 mitmproxy1. 网络代理2. 安装3. Https请求3.1 启动mitmproxy3.2 获取证书3.3 配置代理3.4 运行测试 4. 请求4.1 读取请求4.2 修改请求4.3 拦截请求 5. 响应5.1 读取响应5.2 修改响应 6. 案例:共享账号6.1 登录bilibili获取cookies6.2 在代理请求中设置cook…

【单调栈】Leetcode 739.每日温度

【单调栈】Leetcode 739.每日温度 解法:维护单调栈栈中存的是数组的索引 解法:维护单调栈栈中存的是数组的索引 栈中存的是数组的索引 当新的值比当前栈顶的大,那么就执行出栈-更新result数组-判断当新的值比当前栈顶的大?的循环…

如何学习I2C协议

文章目录 学习I2C协议0 懒人直达1 了解协议开发者2 从恩智浦半导体公司下载官方技术文档3 翻译成中文4 资源下载 学习I2C协议 0 懒人直达 点击直达 1 了解协议开发者 I2C(Inter-Integrated Circuit)协议是由荷兰皇家飞利浦电子公司(现恩智…

Unity Samples和帧动画的问题

拖动序列帧图片和自己创建clip的帧率不同 我今天在创建帧动画的时候用了两种方式第一种是直接拖动序列帧图片到Hierachy,然后生成的第二种是这样我发现两者播放的动画速率不一样最后查了半天查不到原因。最后发现是Samples的原因,而且Unity把Samples这个…

Python数据处理实战(4)-上万行log数据提取并作图进阶版

系列文章: 0、基本常用功能及其操作 1,20G文件,分类,放入不同文件,每个单独处理 2,数据的归类并处理 3,txt文件指定的数据处理并可视化作图 4,上万行log数据提取并作图进阶版&a…

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落,我,一个普通的大专生,开始了我的软件测试之旅。四年的外包生涯,让我在舒适区里逐渐失去了锐气,技术停滞不前,仿佛被时间遗忘。然而,生活的转机总是在不经意间降临。 与女…

别再盲目推广!用Xinstall精准追踪App下载渠道

在移动互联网时代,App推广已经成为企业获取用户、提升品牌知名度的重要手段。然而,面对众多的推广渠道和复杂的用户行为,如何精准统计App下载渠道来源,成为了广告主和开发者亟待解决的问题。今天,我们就来聊聊国内专业…

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。 概念 Mutex是互斥锁,当一个 goroutine 获得了锁后,其他 goroutine 不能获取锁(只能存在一个写者或读者,不能同时…

docker 部署prometheus+grafana

首先进行部署docker 配置阿里云依赖: curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 配置centos 7的镜像源 yum install -y yum-utils device-mapper-persistent-data lvm2 # 安装一些后期或需要的的一下依…

[Java 探索之路~大数据篇] 新时代大数据流处理入门指南

本文主要介绍大数据基础,以及 flink 流计算 文章目录 【基础知识】1. 批处理与流处理1.批处理2.流处理 2. 为什么需要一个优秀的流处理框架1. 股票交易的业务场景2.生产者——消费者模型3. 流处理框架要解决的诸多问题(1)可扩展性&#xff08…

2024年腾讯云学生服务器优惠活动「云+校园」政策解读

2024年腾讯云学生服务器优惠活动「云校园」,学生服务器优惠价格:轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年,轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年,CVM云服务器2核4G配置842.4元一年&…

【C++从0到王者】第五十一站:B+树

文章目录 一、B树1.B树的概念2.B树的特性3.B树的插入的过程4.总结 二、B*树1. B*树的概念2.B*树的分裂 三、总结四、B树系列和哈希和平衡搜索树作对比五、B树的一些应用1.索引2.MySQL索引3.MyISAM2.InnoDB 一、B树 1.B树的概念 B树是B树的变形,是在B树基础上优化的…

C++ 链表OJ

目录 1、2. 两数相加 2、24. 两两交换链表中的节点 3、143. 重排链表 4、23. 合并 K 个升序链表 5、25. K 个一组翻转链表 解决链表题目常用方法: 1、画图 2、引入虚拟"头”结点 便于处理边界情况方便我们对链表操作 3、大胆定义变量,减少连接…

2024-3-7 市场分歧视角

昨天安奈儿市场带领市场情绪一致,新型工业化方向独占鳌头,日内高潮节点尾盘老龙 克来机电涨停,昨晚很多老师在YY老龙是不是要二波了,呵呵。 今天市场分歧从竞价就开始了,隔夜单我记忆中 天奇股份88亿,上海…