中断子系统
1. 中断工作原理
1.1 异常处理流程
保存现场(cpu自动完成)
保存cpsr寄存器中的值,到spsr_寄存器中
修改cpsr寄存器中的值
修改状态位(T位)
根据需要禁止相应的中断位(I/F)
修改对应模式位
保存函数的返回地址到lr寄存器中
修改pc指向异常向量表
恢复现场(手动完成)
1.2 按键处理异常
2. 基于Linux中断中断子系统工作原理
3. 中断子系统API
#include <linux/interrupt.h>
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
函数功能:注册中断子系统
参数:
irq:软中断号
handler:中断处理函数
中断处理函数原型:irqreturn_t irq_handler_t(int irqno, void *dev)
flags:中断触发方式
IRQF_TRIGGER_RISING:上升沿触发方式
IRQF_TRIGGER_FALLING:下降沿触发方式
IRQF_TRIGGER_HIGH:高电平触发方式
IRQF_TRIGGER_LOW:低电平触发方式
name:中断名字
dev:向中断处理函数中传递参数
返回值:
成功返回0,失败返回错误码
void *free_irq(unsigned int irq, void *dev);
函数功能:注销中断子系统
参数:
irq:软中断号
dev:向中断处理函数中传递参数
返回值:无
4. 编写设备树
4.1 查看硬件电路图连接
4.2 编写设备树思路
4.3 分析设备树
4.4 参考内核帮助文档
4.5 编写设备树
定时器
1. 定时器工作原理
1.1 如何查看内核中定时器频率
在linux内核源码中.config文件中,CONFIG_HZ这个变量表示定时器频率
ARM架构 =====> CONFIG_HZ=100
x86架构 =====> CONFIG_HZ=250
1.2 定时时间加1表示多少
ARM架构 ==> 频率:CONFIG_HZ=100 ==> 周期:0.01s = 10ms
x86架构 ==> 频率:CONFIG_HZ=250 ==> 周期:0.004s = 4ms
1.3 如何获取当前内核时间
jiffies内核时钟节拍数
表示内核启动时,这个时间就随着内核的时间进行增加
jiffies变量就可以获取当前内核时间
1.4 定时1s钟如何表示
ARM架构 ==> jiffies + 100
x86架构 ==> jiffies + 250
2. 定时器API接口
分配定时器对象
#include <linux/timer.h>
struct timer_list {
struct hlist_node entry; //定时器在内核钟构成链表
unsigned long expires; //定时时间
void (*function)(struct timer_list *); //定时器处理函数
u32 flags; //默认0
};
struct timer_list mytimer;初始化定时器
mytimer.expires = jiffies + 100;//定时器事件1s
timer_setup(&mytimer,定时器处理函数, 0)启动定时器
void add_timer(struct timer_list *timer) //启动定时器
int mod_timer(struct timer_list *timer, unsigned long expires) //再次启动定时器注销定时器
int del_timer(struct timer_list *timer)