IIC和中断下半部分

驱动学习

IIC同步通信

IIC是一种两线式的串行总线,是半双工同步通信。

IIC开始信号

时钟线为高电平阶段,由主设备把数据线从高电平变为低电平就是开始。

IIC结束信号

时钟线为高电平阶段,把数据线从低电平变为高电平就是结束。

IIC数据有效性

在时钟线为高电平阶段,保持数据线数据稳定,在数据线数据的高低电平只能在时钟线为低电平才能修改。

IIC数据传输格式
写过程

主机产生起始信号---->发送从机设备地址和W—>从及设备产生应答(---->主机发送从机内部地址---->从机产生应答)---->主机发送数据---->从机产生应答---->直到结束

读过程

主机产生起始信号---->发送从机设备地址和R---->从及设备产生应答---->从机发送数据---->主机产生应答---->直到结束

主机产生起始信号---->发送从机设备地址和W—>从及设备产生应答---->主机发送从机内部地址---->从机产生应答---->主机产生起始信号---->发送从机设备地址和R---->从及设备产生应答---->从机发送数据---->主机产生应答---->直到结束

中断下半部分

中断处理时间长度不宜过长,处理耗时操作就会启用下半部分,将中断中的耗时操作延后处理,方式有softirq,tasklet,workqueue。
1、softirq:软中断,处理级别比较高,在内核机制中,需要修改内核源码功能
2、tasklet:实际上就是内部调用了softirq
3、workqueue:工作队列

tasklet

1、初始化
初始化任务队列
void tasklet_init(struct tasklet_struct * t,void(* func)(unsigned long),unsigned long data)
参数1:
struct tasklet_struct * t :任务队列头节点
参数2:
void(* func)(unsigned long):下半部分的实现逻辑
参数3:
unsigned long data:参数2函数的参数

2、在中断上半部分中,启动下半部分(放入内核线程中)
tasklet_schedule(struct tasklet_struct * t)
如:
tasklet_schedule(&(key.t));

workqueue

1、初始化
初始化工作队列
INIT_WORK(struct work_struct *work,void (*work_func_t)(struct work_struct *work));
参数1:
struct work_struct *work:初始化的工作队列对象(头节点)
参数2:
void (*work_func_t)(struct work_struct *work):工作队列下半部分实现的逻辑

2、在中断上半部分中,启动下半部分(放入内核线程中)–启动
schedule_work(struct work_struct *work);
如:
schedule_work(&(key.mywork));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值