###LED按键中断
####中断方式获取键值: 单片机:
- 按键按下
- CPU发生中断,跳到异常向量入口执行
- b 函数
- 保存被中断的现场
- 执行中断处理函数
- 恢复
Linux:
-
异常向量
trap int 构造 b ... b vector_irq+offset
-
vector_irq:
用宏实现 保存现场 do_asm_IRQ 恢复现场
####单片机下的中断处理:
- 分辨是哪个中断
- 调用处理函数
- 清中断
####Linux:
asm_do_IRQ
desc->handle_irq( )
irq_desc
handle_edge_irq:
1. desc->chip->ack(irq) :清中断
2. handle_IRQ_event :处理中断
取出action链表中的成员
执行:action->handler
####按下按键后,会触发:
- 进入异常模式 b vector_irq+偏移
- __irq_usr
- b asm_do_IRQ
- irq_desc(irq中断号)->handle_irq
- handle_edge_irq
####注册中断程序: request_irq(irq, handle, irqflags, devname, dev_id);
- 分配irqaction结构
- setup_irq(irq, action)
- 在irq_desc(I irq)->action链表加入
- desc->chip->settype( ) 设置引脚
- desc->chip->startup / enable 使能中断
####卸载中断: free_irq(irq, dev_id);
出链表
禁止中断