RTEMS 中断程序的思路

昨天做的中断demo例子
http://blog.csdn.net/etual/article/details/8435701

之前分析中断原理的文章
http://blog.csdn.net/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 ,不然就不能再次中断了。这里需要继续再看看
代码,看看底层是怎么处理的。这个就留给以后再分析了。现在的工作先到这里。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值