打印

TI的AM335x能够准确响应的最短定时中断是多少?

[复制链接]
5219|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
silverpal|  楼主 | 2013-10-17 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,我设置定时器每10us中断一次,发现1秒时间内只响应了7万多次,而理论上应该会有10万次中断产生。差距有点大,ARM A8的中断响应时间不应该是ns级别的吗?怎么会差这么多?而且我是裸机跑的,中断处理函数中也没做什么事情,应该对中断响应没什么影响才对。

相关帖子

沙发
dirtwillfly| | 2013-10-17 11:00 | 只看该作者
请高手来帮助回答 @zhangmangui

使用特权

评论回复
板凳
silverpal|  楼主 | 2013-10-17 11:24 | 只看该作者
dirtwillfly 发表于 2013-10-17 11:00
请高手来帮助回答 @zhangmangui

版主大人,有没有什么想法?

使用特权

评论回复
地板
silverpal|  楼主 | 2013-10-17 11:38 | 只看该作者
我使用beaglebone开发板,修改并调试StarteWare里面的定时器例程。具体描述如下:

1. 配置两个定时器DMTimer2和DMTimer3,都是自动重装载,其中DMTimer2设置10us中断一次(自动重装载值0xFFFFFFFF -  240),DMTimer3设置1秒中断一次(自动重装载值0xFFFFFFFF - 24000000).两个中断的优先级分别为0和1.

2. DMTimer2中断处理函数中只对一个变量cntValue进行自加操作

3. DMTimer3中断处理函数中通过串口输出cntValue的值,并将cntValue清零

调试发现输出的cntValue每次都只有74600多,按理论计算1秒时间内10us中断应触发100000次才对,这个差距太大了。将DMTimer2定时值修改为20us,30us,丢失的中断会少很多,但还是存在。

请问这究竟是怎么回事?AM335x的中断响应时间应该是非常短才对呀。

使用特权

评论回复
5
dirtwillfly| | 2013-10-17 12:20 | 只看该作者
silverpal 发表于 2013-10-17 11:38
我使用beaglebone开发板,修改并调试StarteWare里面的定时器例程。具体描述如下:

1. 配置两个定时器DMTim ...

我没用过AM335x。
但我觉得这个操作过程肯定有占用时间影响中断的操作,你看没看过这个过程执行一次花费多长时间?

使用特权

评论回复
6
zhangmangui| | 2013-10-17 12:25 | 只看该作者
你确定一下Timer clock in
和System clk的关系  
10us应该是没问题的

使用特权

评论回复
7
silverpal|  楼主 | 2013-10-17 15:14 | 只看该作者
zhangmangui 发表于 2013-10-17 12:25
你确定一下Timer clock in
和System clk的关系  
10us应该是没问题的

我把1秒中断处理函数中的打印语句移到主循环中,然后把两个中断处理函数中清中断操作都改成直接操作寄存器,之前是调用库函数做的。现在1秒能够响应99585次左右中断,但还是没达到100%正确。之前没想到这两个地方对中断响应影响这么大!因为我一直以为AM3359工作在700M主频啊,10us应该能做很多事情。。。
现在两个中断处理函数都已经非常精简了,再精简就啥事也做不成了。。。还有没有别的办法能再改进一下,保证1秒能响应100000个中断呢?

使用特权

评论回复
8
silverpal|  楼主 | 2013-10-17 15:21 | 只看该作者
dirtwillfly 发表于 2013-10-17 12:20
我没用过AM335x。
但我觉得这个操作过程肯定有占用时间影响中断的操作,你看没看过这个过程执行一次花费 ...

我小白了,之前没想到中断处理程序占用了那么长的时间。。。现在1秒能够响应99585次左右中断了,离100000已经近在咫尺了,但还是不完全正确啊。

使用特权

评论回复
9
dirtwillfly| | 2013-10-17 16:08 | 只看该作者
silverpal 发表于 2013-10-17 15:21
我小白了,之前没想到中断处理程序占用了那么长的时间。。。现在1秒能够响应99585次左右中断了,离100000 ...

加油。不懂AM335x,你可以继续研究下执行一次操作花费了多长时间,甚至于每一句代码花费的时间

使用特权

评论回复
10
zhangmangui| | 2013-10-17 16:34 | 只看该作者
silverpal 发表于 2013-10-17 15:14
我把1秒中断处理函数中的打印语句移到主循环中,然后把两个中断处理函数中清中断操作都改成直接操作寄存 ...

如果要做到非常精确  别的事情就别干了   虽然不影响定时器的中断   每次中断前后的进栈出栈耗得时间
别的也就干不了多少了   
个人觉得这已经差不多了  因为每次中断后要计数加一   还有请标志等操作都是要耗时的  
这些耗时肯定要算到你的1s定时中吧  所以1s内不可能达到100000个
建议你进入中断后马上清标志使能10us的定时器  然后在加一
还有每1s定时后   再次使能是否和10us的同时开始   这都会带来误差的

使用特权

评论回复
11
icecut| | 2013-10-18 09:39 | 只看该作者
够多了....
600 000 000hz的cpu,1000个时钟周期完成一次中断.而不是响应一次中断.

我用600M的a9+Linux测也比你这个高...估计测试方法不对

使用特权

评论回复
12
icecut| | 2013-10-18 09:40 | 只看该作者
你把中断设置成电平触发.
然后拉高1s,
每次进中断就加1然后退出.就会连续中断.这个估计会高很多.

使用特权

评论回复
13
silverpal|  楼主 | 2013-10-18 12:09 | 只看该作者
icecut 发表于 2013-10-18 09:39
够多了....
600 000 000hz的cpu,1000个时钟周期完成一次中断.而不是响应一次中断.

你好,请问你看了我在7楼的回复吗?我修改程序后已经达到了每秒钟99585次中断,我的中断是用定时器10us触发一次的。a9+Linux能达到这么多?我想达到的目的是1秒钟能准确地响应100000次10us定时中断,而且在中断中处理一些事情。目前看不可能,因为A8开始执行中断处理函数前要做太多事情,导致即使响应了中断也没多少时间在中断处理函数中做其它事情。中断响应速度这方面A8连M3都不如啊,我用同样的程序在STM32上执行,1秒钟能响应99726次中断,而且中断处理函数中随便加减语句都没什么影响。

使用特权

评论回复
14
icecut| | 2013-10-18 12:26 | 只看该作者
silverpal 发表于 2013-10-18 12:09
你好,请问你看了我在7楼的回复吗?我修改程序后已经达到了每秒钟99585次中断,我的中断是用定时器10us触 ...

m系列是a系列的删节版.我不认为a系列在这里会做复杂操作.

你确认编译器优化级别够了吗?你等中断响应完成再打印.

使用特权

评论回复
15
icecut| | 2013-10-18 12:27 | 只看该作者
silverpal 发表于 2013-10-18 12:09
你好,请问你看了我在7楼的回复吗?我修改程序后已经达到了每秒钟99585次中断,我的中断是用定时器10us触 ...

m系列是a系列的删节版.我不认为a系列在这里会做复杂操作.

你确认编译器优化级别够了吗?你等中断响应完成再打印.

使用特权

评论回复
16
silverpal|  楼主 | 2013-10-18 15:23 | 只看该作者
zhangmangui 发表于 2013-10-17 16:34
如果要做到非常精确  别的事情就别干了   虽然不影响定时器的中断   每次中断前后的进栈出栈耗得时间
别 ...

我有一个疑问,设置了一个定时器自动重装载,当定时器溢出并产生中断后,是立即重装载并继续执行,还是要等清除中断标志位后才进行重装载并继续执行?

使用特权

评论回复
17
zhangmangui| | 2013-10-18 16:00 | 只看该作者
silverpal 发表于 2013-10-18 15:23
我有一个疑问,设置了一个定时器自动重装载,当定时器溢出并产生中断后,是立即重装载并继续执行,还是要 ...

这个是自己重新转入的   它只判断溢出标志   与中断标志没关系

使用特权

评论回复
18
silverpal|  楼主 | 2013-10-18 17:19 | 只看该作者
zhangmangui 发表于 2013-10-18 16:00
这个是自己重新转入的   它只判断溢出标志   与中断标志没关系

原来是你把这个帖子转到了TI的论坛,那边太冷清了,呵呵。

使用特权

评论回复
19
zhangmangui| | 2013-10-18 18:20 | 只看该作者
silverpal 发表于 2013-10-18 17:19
原来是你把这个帖子转到了TI的论坛,那边太冷清了,呵呵。

嗯  是的  也就是协助帮你们解决    那边有TI的人

使用特权

评论回复
20
silverpal|  楼主 | 2013-10-24 17:38 | 只看该作者
终于把问题解决了,原因是要产生10us中断,定时器重装载值应设置为(0xFFFFFFFF -  240 + 1),这样定时器溢出时才是准确的10us。一个小问题,但是被忽视了,折腾了好久。希望后来者引以为戒。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

28

帖子

1

粉丝