使用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,丢失的中断会少很多,但还是存在。
来自21ic论坛
leo chen:
可以看一下串口打印是否占用了时间
mangui zhang:
回复 leo chen:
串口打印的时候,10us的定时器应该是没关系的
Zhou Feng:
这个帖子是我在21ic发的,没想到这么快就有人转到这里来了。我之前在这里发过,但没人理我。
我现在把打印语句移到主循环中去了,然后把清中断标志位的地方改用直接操作寄存器,而不是调用库函数,现在已经能够达到每秒响应99500多次中断了。但中断处理程序中压根做不了什么事情,因为进入中断处理程序前压栈等操作占用了太多时间。
我用STM32做了测试,1秒能响应99800多次,而且中断处理函数长一点也没关系,难道AM335x在中断响应速度方面比STM32都不如?两个的主频差距可是差不多10倍啊。
kooking:
回复 Zhou Feng:
不知道我这个理解对你是否有帮助,这个和AM335x没有必然的联系,linux系统对中断的处理并不是时实的,所以对中断和时序要求比较高的场合,比如接收红外控制器的命令,都不会用linux,一般是用单独的M3或者实时性更高的μclinux
Yaoming Qin:
回复 kooking:
kooking
不知道我这个理解对你是否有帮助,这个和AM335x没有必然的联系,linux系统对中断的处理并不是时实的,所以对中断和时序要求比较高的场合,比如接收红外控制器的命令,都不会用linux,一般是用单独的M3或者实时性更高的μclinux
leo chen:
回复 mangui zhang:
也可以反汇编看一下,这个地方走了多少条指令周期,大概可以算出来时间
Zhou Feng:
回复 Yaoming Qin:
我把MMU和Cache都打开后,中断处理程序里多几条指令也没关系了,中断响应次数大致不变,但仍然达不到每秒中断100000次,请问您觉得这个误差是由什么原因产生的呢?
STONE:
回复 Zhou Feng:
个人认为DMTimer2设置10us溢出中断自动重装载值应为0xFFFFFFFF – 239.
另外两个Timer的中断号分为68和69,若将两个优先级都设置为0试试呢?
Zhou Feng:
回复 STONE:
果然是这样的,将自动重装载值设为0xFFFFFFFF – 239,则可以正确地得到100000次中断响应!
谢谢!