实例:中断的下半部分之-软中断


在linux中断加入自已的软中断
软硬件环境:linux-2.6.36/s3c2440
步骤如下:
1>在软中断定义的枚举类型列表中加入自已的软中断号MY_SOFTIRQ
   具体到linux-2.6.36/include/linux/interrupt.h的第376行的枚举列表。其中已经有10项,在NR_SOFTIRQS之前加入MY_SOFTIRQ就可以了。make编译后使用新内核
2>注册软中断
   如:open_softirq(MY_SOFTIRQ, my_softirq_action)
     对2.6.36内核,在使用前需用EXPORT_SYMBOL_GPL(open_softirq)导出此函数。
3>在中断处理程序中触发软中断
   如:raise_softirq(MY_SOFTIRQ)
   同样,使用前要用EXPORT_SYMBOL_GPL(raise_softirq)导出此函数。

下面是在s3c2440上实现的一个例子。其中GPF0设为中断EINT0, 在EINT0的中断处理函数中触发软中断。
test.c

#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/irq.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhanglong");

void my_softirq_action(struct softirq_action *data)
{
    printk("my softirq atcion ok!\n");
    return;
}

static irqreturn_t irq_handle(int irq, void *dev_id, struct pt_regs *regs)
{
    int flag;

    raise_softirq(MY_SOFTIRQ); //触发软中断

    printk("irq %s ok.\n", dev_id);


    return 0;
}

int test_init(void)
{
    int ret = 0;
    
    open_softirq(MY_SOFTIRQ, my_softirq_action); //注册软中断

    set_irq_type(IRQ_EINT0, IRQ_TYPE_EDGE_RISING); //EINT0中断设为上升沿中断
    ret = request_irq(IRQ_EINT0, irq_handle, IRQF_SHARED, "my irq", "123"); //注册EINT0中断

    if (ret) {    
        printk("request irq failed.\n");
        return -EBUSY;
    }

    return ret;
}

void test_exit(void)
{
    free_irq(IRQ_EINT0, "123");
}

module_init(test_init);
module_exit(test_exit);


Makefile

#KERNEL    = /home/zl/my2440-2.6.13
KERNEL    = /media/STUDY/linux/kernel/my2440-2.6.36
#KERNEL    = /lib/modules/$(shell uname -r)/build

default:
    make -C $(KERNEL) M=$(shell pwd) modules

clean:
    make -C $(KERNEL) M=$(shell pwd) modules clean

modules_install:
    make -C $(KERNEL) M=$(shell pwd) modules_install INSTALL_MOD_PATH=/home/zl/s3c2440_nfs
    depmod --b /home/zl/s3c2440_nfs 2.6.13-ZL2440

obj-m    += test.o


make后插入生成的test.ko模块。按下GPF0所在的按键,终端会有输出:
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
irq 123 ok.
my softirq atcion ok!
...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值