其他分享
首页 > 其他分享> > str71x系列中断控制器介绍

str71x系列中断控制器介绍

作者:互联网

  arm7tdmi体系的中断向量的地址是动态分配在中断向量控制器的寄存器中,例如,意法半导体(st)公司生产的str71x系列arm微控制器,

其增强型的中断控制器(eic)eic_ivr寄存器(中断向量寄存器)eic_sirn寄存器(源中断寄存器)都是用于存储相关中断通道的中断服务程序在存储器中的地址,内核响应irq中断后,再根据当前对应的中断通道的中断向量进行散转,执行相应的中断服务程序。对于一般的8位mcu,通常是将向量中断入口固定分配rom中,例如mcs-51单片机各个中断的入口地址是固定的。两者相比,arm的中断体系具有较大的灵活性,但却降低了安全性和可靠性。

  在系统长时间运行和强干扰的作用下,保存在寄存器中的arm的各个中断地址很容易受干扰信号的影响。当中断向量地址被改写后,程序必定跑飞,这种情况是无法忍受的,特别是在工控系统中。针对这种情况,本文提出了基于str71x系列arm微控制器将中断向量固化到rom的思路,可以提高系统的安全性和可靠性。

 

2 str71x结构分析

  str71x内部有一个独立的增强型中断控制器,可完成多个中断通道的硬件处理、中断优先级决策和自动产生中断向量等功能。eic中的优先级解码器是一个不断计算挂起irq最高优先级的组合模块,当决策出最高优先级中断后,它把eic_ivr寄存器(中断向量寄存器)更新为最高优先级中断服务程序的地址,并且拉低nirq内部信号。软件读取eic_ivr寄存器的内容后。获得当前中断通道所对应的中断服务程序的地址,从而散转执行对应的中断服务程序。而在读取eic_ivr寄存器值的一个时钟周期后,eic_cicr寄存器(当前中断通道寄存器)被更新为当前响应的irq中断通道的标号,eic_cipr寄存器(当前中断优先级寄存器)被更新为当前响应的irq中断通道的优先级

 

中断向量寄存器eic_ivr是一个32位的寄存器,其中,高16位ivr[31:16]不依赖于当前响应的中断。对于所有的irq中断通道来说,这16位都是相同的,它是在初始化时由用户程序配置的。而低16位ivr[15:0]则依赖于当前响应的中断(即当前具有最高优先级的有效中断),并且它是当前系统响应的中断通道所对应的eic_sir寄存器中源中断向量(siv)的副本。eic_sirn是通道n的源中断寄存器,其高16位siv[31:16]是中断通道n对应的中断服务程序的存储器地址的低16位【源中断寄存器的高16位内存着地址,16位地址是低16位】。eic_ivr寄存器的高16位ivr[31:16]【默认是0XE59F】与eic_sirn的高16位siv[31:16]【存放着中断函数地址的低16位】构成了中断通道n对应的中断服务程序的存储器地址的首址

 

3 irq中断防御体系的构建

  根据上面的分析可知,str71x arm中各个irq中断通道的中断服务程序入口地址是动态存放在eic_ivreic_sirn等可读写的寄存器中,即存放在ram中的,这样很容易受干扰信号影响。当这些寄存器中的中断服务程序地址被干扰信号改写,产生中断时,系统肯定无法正确进入相应的中断服务程序,系统程序必定跑飞。所以,保护各个irq中断通道的中断服务程序入口地址就显得相当必要。

  软件根据eic_ivr寄存器中存放的地址去散转执行对应的中断服务程序的具体实现代码。下面列举了st公司公布的标准固件代码中关于irq中断部分处理的代码:

 
 
  在上述程序中,系统响应中断后,首先把r0~r12、spsr等寄存器入栈保护,然后再通过读取e-ic_ivr寄存器获得当前响应的中断通道所对应的中断服务程序入口地址。


  由前面的分析可知,eic_cicr寄存器是存储当前响应的irq中断通道的标号,eic_cicr寄存器在此成为构建防御体系的关键,利用它可将中断向量固化到rom中。

  在构建的防御体系中,eic响应irq中断,软件读取一次eic_ivr后,eic_cicr寄存器更新当前响应的irq中断通道的标号,然后获取此标号的值,跳转到固化在rom的对应当前中断通道的中断服务程序入口,执行所响应的中断通道的中断服务程序。在上述所列出代码的基础上,修改了代码如下,实现防御体系的构建。

 

  比较修改前后的代码,修改后每次执行的代码只比原来增加了5条指令,中断响应处理的实时性有所下降,但是,在高

标签:服务程序,控制器,str71x,16,中断,eic,ivr,寄存器
来源: https://www.cnblogs.com/icaowu/p/16673807.html