我的忽悠观与ARM7中断学习总结

ARM 135浏览

  作总结是一件耗费时间的东西。新加坡南洋理工的教授陈至宁来我们学校作报告时讲,他总是要求不要花太多的时间写paper,因为太耗时,不过,可以把写paper当作休闲。就这样,他的硕士还能发IEEE Transaction,晕。当然,我写的东西是远不能算是paper的,也不敢企及IEEE,我只是想把我的学习体会给总结出来,锻炼一下表达能力,以求能提升一下我的忽悠能力。我发现我的表达能力,特别是写作能力不如高中时候了,这是一个很严重的问题,最起码能说会道是能讨女孩子欢心的。我们都知道,在防忽悠意识比较淡薄的今天,能忽善悠之人士大行其道,忽悠早已成为辉煌腾达必备之良药。所以,身逢盛世,掌握忽悠本领不光可防身,还可闻达于诸侯。因此,我是决定多写写博客的,不断锻炼油嘴滑舌、妙笔生花的本领,以求将来能忽悠个学术头衔也未必不可能,最起码还有上海交大研制出中国DSP处理器的经验可以借鉴嘛。呵呵,如果搞嵌入式的朋友能从我这得到什么启发,也能让我倍感开心。
  这段时间一直在看ARM7的启动代码,一开始有点摸不到头绪。启动代码设计到的知识比较多,把启动代码完全弄懂了,基本上对芯片的工作原理就非常清楚了,其他的东西就比较简单了。
  启动代码中,最重要的就是对中断的处理了。在程序的最开始地址是要放中断向量表,向量表的前8个就是对异常的处理。其中第一条就是复位中断向量,跳转到复位中断处理函数。在此函数中,要完成ARM7各种工作模式的堆栈初始化,不过,不使用的工作模式可以不分配其堆栈。一般可以使用系统模式而放弃用户模式。
  对于中断的学习,我是先看Philip的ARM7处理器,然后又看Samsung的ARM7处理器。我一开始发现两个芯片的启动代码不一样,很是不明白,后来把两个芯片的中断控制器都看来,才发现它们的中断控制器不一样(我以前以为ARM7的中断都是一样的,晕)。
  ARM7的中断向量表的前8个中断向量中,最后两个是IRQ和FIQ。可以从这两个中断向量跳转到相应的中断服务函数中去。在ARM7中,IRQ中断用的比较多。当产生一个IRQ中断之后,首先要保存当前工作状态的环境,然后将中断服务函数地址赋给PC,跳转到中断服务函数。执行完中断服务函数之后,再恢复中断前的工作状态环境,返回正常的工作模式。
  对于Philip的ARM7来说,IRQ中断又分为非向量IRQ中断和向量IRQ中断。如果是向量IRQ中断,产生向量中断之后,VICVectAddr寄存器的值会自动为中断向量服务函数的地址。所以,IRQ中断产生之后,PC指向0x00000018处执行,读取VICVectAddr寄存器的内容,然后执行中断服务函数。当然,在此之前必须为不同的中断源分配中断slot,并设置相应的中断服务函数,这样,当中断发生时此寄存器的内容就是中断服务函数地址。(这里,可以在中断服务函数前冠以irq等关键字,这将由编译器完成中断时的寄存器保存等内容。也可以使用宏定义来实现这部分功能,这样就不用使用关键字了)。
  如果是非向量IRQ中断,由于没有为中断源分配slot以及中断服务函数,VICVectAddr寄存器的内容就是VICDefVectAddr寄存器的内容了,在初始化时此寄存器应配置为非向量IRQ中断的服务函数。在此服务函数中,要对中断进行处理,比如读取中断状态寄存器,判断中断源,然后跳转到此中断源的中断服务函数处处理中断程序。
  对于三星S3C440b处理器,是必须要定义中断向量表的,并将中断向量表放置在最初的位置。Samsung的ARM7处理器一般不使用非向量中断的,使用向量中断。在中断源产生中断之后,处理器会自动根据中断源来将正确的中断向量地址赋给PC。所以,我们必须在启动代码中事先设置好中断向量表,为使用的中断设置相应的中断服务函数。当PC指针指向中断源唯一对应的中断向量处之后,就会跳转到相应的中断处理函数。
  学习ARM,难点是学习启动代码,学习启动代码的难点是理解中断处理过程。其实大多处理器的都是相通的,学懂了一个,其他的就只是看看Datasheet就可以了。学习的动力是兴趣以及压力,我以前没学好微机系统原理,当我接触嵌入式之后,通过不断的学习积累,已慢慢地不断深入地理解了处理器的工作机制。当你发现你理解了处理器,并能随心所欲地控制处理器的时候,那种快乐完全不亚于看《疯狂的石头》!