原创 使用函数指针数组来提高中断相应速度

2011-2-25 13:58 2109 4 4 分类: MCU/ 嵌入式
来源:瑞萨单片机论坛

大家有没有发现,使用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条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /3 下一条