野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21873|回复: 3

微秒中断的问题

[复制链接]
发表于 2014-3-5 17:36:01 | 显示全部楼层 |阅读模式
经常见到Delay_us(x)的延时函数,用的无非是systick定时器或者TIMx定时器作微秒中断使计数器自增,并执行while循环直到计数器达到x,以此完成延时。

假如是36MHz的主频,一个时钟周期是1/36微秒。1微秒中断一次,假如中断函数里写了几个语句翻译成汇编之后超过了36个时钟周期,那这样功能就不正常了吧。

即使中断函数里,很简洁,就几个时钟周期,可以让定时器跑起来。但是,不感觉这个时候CPU负担太重了吗?1微秒中断一次,让后执行零点几微秒,几乎CPU一直在跑吧。这样遇到其他中断任务呢?是不执行?还是插入?如果其他中断优先级高,插进来,执行了几十微秒的任务,那那个定时任务岂不是耽误了几十微秒。

像做单总线通讯时,需要自己控制时序,就要有这个微秒的延时函数。这样通讯的时候CPU就被占光了吧,也不能让其他中断插进来,否则就通讯出错啦。假如我外面还有一个系统时钟,每1ms定时中断一次,用来记录运行了多少ms的,或者判断超时的。要么是时钟计时弄坏了通讯,要么通讯弄得时钟不准~

求大侠高手前辈们指点,这种微妙级的中断该怎么使用。
回复

使用道具 举报

发表于 2014-3-5 19:07:46 | 显示全部楼层
虽然定时器可以精确到微秒级,但实际应用里很少经常对微秒级的延时也使用定时器的,一来太浪费,二来会出现你上面说的问题,cpu老在中断里,太忙了。所以在stm32用在ucos里最小的一般是以毫秒为单位,1毫秒调用一次调度器。
像你说的用在时序里us级的延时,用普通类似的  delay() {while(i--)} 这样来做吧,至少10us以上的再考虑使用定时器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-6 08:10:16 | 显示全部楼层
随风 发表于 2014-3-5 19:07
虽然定时器可以精确到微秒级,但实际应用里很少经常对微秒级的延时也使用定时器的,一来太浪费,二来会出现 ...

请教楼上的,while(i--);它是个空循环函数,怎么让它在编译时不被优化掉。
假如用while(i){i--;},36M主频时,i设多大的初始值能实现1微秒的延时呢。计算公式是怎样的呢?
回复 支持 反对

使用道具 举报

发表于 2014-3-6 09:05:11 | 显示全部楼层
yinhao 发表于 2014-3-6 08:10
请教楼上的,while(i--);它是个空循环函数,怎么让它在编译时不被优化掉。
假如用while(i){i--;},36M主 ...

会被优化掉,那再在while循环加多一个for循环吧,可以使用软件仿真,在执行函数前设置一个断点,执行函数后设置一个断点,比较执行到这两个断点时的时间差值即可(仿真时在mdk的左侧右一个time还是period参数的)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-22 13:33 , Processed in 0.042482 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表