jicheng0622

【原创】小技巧之实时查看Kinetis当前活动的中断服务向量号

0
阅读(6721)

    前一段时间在看飞思卡尔官方例程的时候发现了一个挺有意思的地方,而后查了查资料,觉着挺有用的,所以就记下了,今晚就拿出来晒一晒跟大家分享一下,算是作为一个小技巧系列吧,如果觉着有用就收着,无用的话就可以略过了,嘿嘿。 我查了查,这个小技巧是在Cortex-M4平台上通用的(M3也可以),这里还是以Kinetis为例说说它吧...

   说到题目的话题,就不得不提到一个M3和M4都有的一个寄存器——ICSR(中断控制及状态寄存器),呵呵,可能说这个好多人都没听过也没用过,的确对简单的应用来说,我们一般不会涉及到这个寄存器,不过如果我说出它的内存映射的地址是0xE000_ED04,不知道会不会有人觉着熟悉,嘿嘿,可能一上来想不起来在哪见过,那下面就上图瞅瞅吧:

上图是飞思卡尔官方例程里面vector.c文件里的default_isr中断服务函数了,那个地址就是我上面提到的ICSR的地址,至于default_isr函数,通过查看vector.h文件就知道了它是所有没被重定义的中断向量的默认中断服务函数(即中断入口),而这个官方例程的该函数的作用就是可以打印出当前进入该服务函数的中断异常向量号(当然前提是对前16个中断已经使能了全局中断,而对后面的IRQ中断同时也使能了相应的IRQ中断,不过没有重定义中断服务函数,所以就默认进入到该函数里了)。

    另外还要说的是ICSR是32位寄存器而上面的服务函数却把它强制转换成指向uint8_t的地址了,为何来,呵呵,还是拿出事实说话,这里我们就需要了解ICSR这个寄存器各个位段的作用了,还是上图吧:

呵呵,怎么样,这下就直观了吧,前面我们暂且不管,看[9:0]这个位段的作用就可以知道其代表的是当前活动的中断服务(ISR)编号了,所以对我们来说我们只需要查看0xE000_ED04地址的前8位(对Kinetis来说也就100多个中断号,所以8位已足够)即可知道当前正在进行的中断服务号了,很强大的有木有~

    这里我们就知道了这个地址的作用了,至于它有何实际应用,其实除了像官方的例程那样打印出来当前活动中断向量号,我见到过有人用在多异常共享一个中断服务函数然后读取该地址再跳转到分支函数里的应用,具体发挥还是靠大家的创造力了,众人拾柴火焰高,如果看到本篇文章有所感悟想到一些实际应用希望能在下面留言大家共同分享,群众的眼光是雪亮的,群众的智慧更是无穷的,嘿嘿,期待沙发哦,哈哈...

    enjoy it,未完待续~