昨天做的中断demo例子
http://blog.youkuaiyun.com/etual/article/details/8435701
之前分析中断原理的文章
http://blog.youkuaiyun.com/etual/article/details/8363938
昨天写中断的例子(代码看上面的连接),遇到了一些问题,记录如下。
中断的原理和思路,和之前分析的基本一致。
根据之前分析,rtems_interrupt_catch 这个函数来安装中断句柄的,因为我看
c user guide 是这么说的,然后之前看过network的驱动的时候同样是使用这个
函数注册,一直没有留意。
但是昨天写好了demo,编译的时候却提示没有 rtems_interrupt_catch 这个符号
根据经验,这种情况一般就是声明了一个函数,但是没有具体的函数体(实现)。
开始以为是不是没有include对头文件了,于是找了半天发现这个函数的声明是在
<rtems/rtems/intr.h> 中,于是加入了这个头文件,还是不行。最后没有办法了,
只能重新打开source insight分析代码。
发现 rtems_interrupt_catch 的函数体前面有个宏定义
#if (CPU_SIMPLE_VECTORED_INTERRUPTS == TRUE)
也就是说,这个函数并不一定实现的,除非 CPU_SIMPLE_VECTORED_INTERRUPTS 这个
宏为真。于是查找 CPU_SIMPLE_VECTORED_INTERRUPTS 这个宏,可以发现,在各个架构
中有定义,例如m68k 的在 /cpukit/score/cpu/m68k/rtems/score/cpu.h 中
问题来了,没有发现 ARM 架构的 cpu.h 文件定义了 CPU_SIMPLE_VECTORED_INTERRUPTS
这个宏,这就奇怪了。
出现这样的问题只有两个可能,第一就是写错了,感觉可能行不大。第二就是ARM架构
不使用这个函数了,改用其他函数。
于是查找。由于rtems的函数的名字很好记,都是完整的单词,而且属性分得很清晰,
既然这是interrupt相关的,那么就用source insight 查找 rtems_interrupt_
根据名字,很容易就发现了如下函数 :
rtems_status_code rtems_interrupt_handler_install(
rtems_vector_number vector,
const char *info,
rtems_option options,
rtems_interrupt_handler handler,
void *arg
);
查找了一下用法,于是尝试一下使用这个函数。我的开发板的按键是连接在 EINT0,
于是配置引脚 GPF0 为中断引脚,然后开对应的中断。
GPFCON = 0X02;
INTMSK &= ~(1<<0);
然后安装中断句柄
status = rtems_interrupt_handler_install(
BSP_EINT0,
"EINT0",
RTEMS_INTERRUPT_UNIQUE,
(rtems_interrupt_handler) EINT0_handler,
NULL
);
中断就让LED翻转一下就行了。
rtems_isr EINT0_handler (rtems_vector_number vector)
{
//rtems_event_send (taskid, RTEMS_EVENT_1);
GPBDAT ^= 1<<7;
SRCPND = 1<<vector;
INTPND = 1<<vector;
}
编译调试,在中断句柄设置断点,按键,发现停下来了!,也就是说,中断处理句柄
的安装已经是正确的了。能正常的响应中断。
目前发现需要手动清 SRCPND 和 INTPND ,不然就不能再次中断了。这里需要继续再看看
代码,看看底层是怎么处理的。这个就留给以后再分析了。现在的工作先到这里。