注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

一步一步写嵌入式操作系统7—中断处理1  

2011-11-15 22:18:57|  分类: ARM学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一步一步写嵌入式操作系统7—中断处理1
今天学习中断,至于啥是中断,没有什么好讲的,重点讲一下中断的工作原理和过程。按书上说,这里的中断指的是ARM V7之前的版本,特地查了一下这是啥。具体的讲起来就没边儿没沿了,说句简单的,其实就是指令精简了许多,应该和X86上的精简指令集和复杂指令集的区别有类似之处吧,说得不妥的地方,欢迎大家拍砖。
说重点,ARM一共有七种处理器的方式,分别为中止模式,中断模式,快速中断模式,管理模式,系统模式和未定义模式以及用户模式,用户模式以外全部为特权模式,把用户和系统模式以外的称为异常模式,这里要讲一下PC寄存器,这个东西其实就是R15,用来保存程序代码地址的东东,但在实际应用中因为大多数的CPU都采用了流水的方式,其实他指向的是正在取指的指令地址。CPSR和SPSR,用来保存程序当前的状态和各个异常模式下的程序状态,其中可以通过后者来恢复运行中的CPSR,异常的动作分为以下几步:
1、CPSR保存到相应异常模式下的SPSR。
2、PC寄存器保存到相应异常模式下的LR(R14:保存返回地址)中。
3、CPSR设置成相应的异常模式。
4、设置PC寄存器的值为相应处理程序的入口地址。
因为ARM采用的三级流水,所以PC指向的地址是当前正在执行的指令地址+8字节。(当前运行指令地址---译码指令---正在提取的指令),在ARM的五种异常模式中,每个异常的模式都有一个对应的唯一的入口地址,并且他们彼此相信,这就是异常向量表。在LINUX中,由前三G大小的地址空间分配给了用户空间,所以我们在这里要做一个小小的地址映射转换,将地址映射到后面一G的内核空间上。这此东东一般会用汇编来实现,我们前面讲那么多混合编程这里开始用到了,当然,单纯的使用汇编编程应该更好。
这里我们不得不提到两个指令:
stmfd和ldmfd,前者用来压栈,后者用来退栈。这里说明一下,在stmfd中,Rn!,后面这个感叹号代表着自增的意思,其实就是变址寻址,大家如果想知道的更清楚,可以看一下ARM7基础教程里说得更好。而在ldmfd中,^这个符号的意思是在退栈时将特定的SPSR恢复到CPSR状态寄存器中去。

在2410里,中断有两种,一种是主中断,一种是子中断,即前者独立拥有一根中断线,后者共用。中断的过程如下:
子中断源---SUBSRCPND----INTSUBMSK----SRCPND----INTMSK---INTMOD----PRIORITY----INTPND---IRQ(产生中断)
主中断源------------------------------|                    |---------------------------FIQ(快速中断)
这里不扩展开讲,重点讲一下软件的中断处理方法:
1、必须明确中断是如何产生,哪个硬件产生中断。快速的方法是读取INTOFFSET寄存器,这个东东中的0~31位的某个整数,代表个一个硬件,如28代表着串口,而这个数字与INTMSK,SRCPND等寄存器中代表硬件的位序号又是一致的,也就是INTPND寄存器中的第28位正是代表了零号的串口,这位为1则表示串口产生了中断。
2、必须清除掉SRCPND和INTPND两个寄存器中代表某一中断请求的相应位。这个原因很简单,如果不重置为0的话,那么代表中断请求的位置将永远为1,则不停的产生相应的中断,而实际上我们的中断只是产生了一次。
为了将程序运行起来,这里采用了定时器中断的方法,2410的定时器所需要的基础时钟是由PCLK提供,其典型值为50M,当然,2410还提供了内部的FCLK,提供给詗外设的HCLK以及USB的UCLK时钟,FCLK可以由内部锁相环将外接晶振倍频得到(不明白啥叫锁相环和倍频的自己看看书去,很简单滴)。而HCLK、PCLK又可以通过FCLK分频得到。而在TIMER中,50M仍然快,所以可以再次进行预分频,直到分到合适,(不行就分频呗)。
TIME4是一个内部的定时器,其相关的寄存器主要有:
TCFG0(0x51000000):15:8位代表TIMER4一级分频的值
TCFG1(0x51000004):23:20决定采用DMAT还是中断方式,19:16位代表二级分频的值
TCON(0x51000008):22:20位用于配置TIMER4
TCNTB4(0x5100003C):代表TIMER4的减数寄存器的值

所以根据这个可以很明白的写出相应的操作代码:
1、根据相应的TCFG0,TCFG1写入分频值。使用中断方式,二分之一分频,这个是默认的,当然也可以改写。
2、根据实际情况配置TCNTB4,高速减数器的值。
3、这里重点讲一个TCON中的autoreload功能,这个东东其实和单片机中的自动重新计数一样,设置他很很简单,只要将22位置高即可。第20位用来设置定时器的启动和停止。
这样一个简单的设置中断即可以正常工作了。
代码的相应修改看书,这里不再赘述。
时不我待!!!

  评论这张
 
阅读(986)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017