重点要抓住中断,中断是一条极其重要的主线,贯穿到18个外围功能部件环环相扣,即就是说每一个外设都与中断紧密相连。由此可见,如果以中断为根,以外围为枝,VIC中断向量控制器就是它们之间的桥梁,从而构成了“中断关联多叉树”,于是学习ARM也就有主线了。
当CPSR中的F、I为1时,则禁止使用中断,反之允许IRQ、FIQ中断使能,即就是“CPU可以响应中断了”。那么到底需要满足什么条件CPU才能“响应外设中断”呢?那么到底需要满足什么条件CPU的“外设才能产生中断”呢?由此可见,居于ARM内核中的I、F是就是中断的总开关,如果不允许IRQ、FIQ使能,即便外设产生了中断也不能真正地起到作用。 只要解决了中断问题,余下的就是如何使用外设了,而是如何使用外设也就非常简单了。
学习中最重要的一个环节就是要学会使用“图解法”,将每一段自己理解的文字变成简单易懂的“图”,也可以由此检验您是否真的懂了,很多人读书就是将书一遍一遍地翻过去,然后就是一边编程一边查资料。
我们知道,所有的外设都是通过设定寄存器的控制位来实现的,也就是说寄存器的每一位控制位不是“0”便是“1”,要想将书读懂唯一的办法就是画图,画出外设“寄存器逻辑开关控制图”,一个外设只要一张纸就可以说明清楚了,这张纸就是编程指南。
学习中的第二个环节就是写学习体会,比如,从内核开始到VIC中断向量控制器,再到相关的外设,以中断为主线连贯起来写成一篇论文,可以取名为“LPC2000系列ARM中断机理”,详细阐述中断的使能,CPU是如何响应外设中断的以及外设是如何产生中断的,这就是人们常常说的读书之道--“由厚到薄”的过程。
还有比如学习处理器的模式,用户模式、系统模式与管理模式之间的切换与关联,以uC/OS-II为例,使用汇编程序探索OS底层“任务调度与任务切换”的秘密。移植一个OS在C语言中要调用汇编,一般来说是通过SWI软件中断来实现的,还有临界区的保护,当由用户模式切换到管理模式时,OS需要保护当前任务的环境和现场数据,然后再切换到系统模式,在系统模式下将OSPrioHighRdy赋值给OSPrioCur,使OSTCBCur与OSTCBHighRdy指向同一位置,最后切换到管理模式返回,PC指向将要执行的函数(函数名即就是任务的首地址,也就是程序开始的地方),因此可以将凡是与这些相关的内容连贯起来写成一篇论文。
比如说,汇编程序“LDR R5,=OSTCBHighRdy”与“MOV R5,=OSTCBHighRdy”之间“细节”的区别,还有C程序通过SWI调用汇编程序的细节就更需要知道了,当C语言程序中出现“OS_TASK_SW()”语句时,编译器就将它编译成以下汇编指令:“MOV R0, #0 //设置功能号为0”和“SWI 0 //实现中断,但不指明调用的功能号”。比如还有压栈指令,编译器首先判SP后面是否有“!”,有没有“!”SP的值是不一样的,还要看指令后面是否有“^”,有了“^”之后还要看大刮号里面是否有“PC”,那么压栈的过程呢?一定要注意,寄存器与内存单元的对应关系是:编号低的寄存器对应于内存中低地址单元,编号高的寄存器对应于内存中高地址单元。
通过上述写技术笔记的学习方法,我们学到的知识就全部变成了自己的知识,否则还是别人的。由此可见,认真学习只能达到一般的效果,而用心学习才能产生意外的惊喜。
|
|
文章评论(0条评论)
登录后参与讨论