大家有没有发现,使用HEW创建一个工程时(R8C,H8,SH等),中断向量表是默认分配好的,且一般是位于FLASH ROM中。我们只需要找到对应的ISR,往里面加入代码即可。
HEW创建工程当然是最简单的办法,对于不熟悉瑞萨开发环境的人来说,很容易上手。但是这样的工程显然不够灵活,而且在性能上要打些折扣。
下面我们来介绍一种在硬件上提升中断响应速度的办法。
中断发生时,CPU会查找向量表的入口,然后根据中断向量找到对应的ISR,装入PC后去执行它。注意,这时CPU是在ROM中查找的,也就是要访问ROM。如果我们将向量表放在RAM中,CPU就会访问RAM了。访问RAM的速率远远快于ROM,这样就大大提高了中断响应速度。
先申明一个函数指针数组,用于存放ISR。这里假设系统中有10个中断源。
由于该数组位于RAM中,初始化数组后,整个向量表就位于RAM里了。
void (*fun_isr[10])(void);
然后初始化数组,就是把ISR根据向量号注册到数组里。CPU会根据数组下标(向量号)索引到相关的数据。
void register_isr(void)
{
fun_isr[0] = ISR0;
fun_isr[1] = ISR1;
fun_isr[2] = ISR2;
fun_isr[3] = ISR3;
fun_isr[4] = ISR4;
fun_isr[5] = ISR5;
fun_isr[6] = ISR6;
fun_isr[7] = ISR7;
fun_isr[8] = ISR8;
fun_isr[9] = ISR9;
}
最后在系统初始化时,设置向量表的入口地址。一般CPU中会有相关的基址寄存器,将入口地址填充该寄存器即可。
例如M16C/R8C的基址寄存器为INTB寄存器。
void start(void)
{
......
register_isr(); // 注册中断向量
asm("ldintb _fun_isr"); // 设置INTB寄存器
asm("fset i");
......
}
文章评论(0条评论)
登录后参与讨论