重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
对同步问题,需要注意:
1)不能调用schedule的情况(wait_event、sleep等, 等待函数内部会调用schedule):
(1)中断、
(2)软中断、
(3)tasklet、
(4)timer(基于软中断实现)、
(5)hrtimer (软中断或硬中断环境下执行)执行环境下、
(6)或者“内核线程、普通线程内核态环境下调用了preempt_disable()/local_irq_disable()后”,
不能调用schedule()函数。
创新互联建站长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为罗城企业提供专业的网站设计制作、成都网站建设,罗城网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
因为spin_lock成功后,spin_lock内部调用了preempt_disable,所以spin_lock后,不能调用schedule()。当然spin_unlock会调用preempt_enable,所以后面可以根据什么执行context来判断是否能调用schedule()函数。
2)能调用等待函数的情况
(1) workqueue(内部实现用到kernel thread)、
(2) kernel thread、
(3) 普通线程的内核态,
这些context下,可以调用schedule()。前提是没有调用preempt_disable禁止抢占和local_irq_disable禁止中断等操作时。
具体的原因和原理,请看我的课程:
https://edu.51cto.com/course/17155.html
和
https://edu.51cto.com/course/17132.html
关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html
另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html
另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html
另外关于《关于如何编写linux设备驱动》
1)首先确定硬件接口使用的总线,
2)然后确定要实现的功能,是网卡、sensor还是什么?再确定对上层应用暴露的接口, 从而选择子系统,例如iio、input子系统等。由于linux只有字符设备、块设备、网络设备三种设备,其实iio、input子系统都是字符设备,只是它们帮你封装好了字符设备的file_operations和Major设备号了,另外提供统一的sysfs接口(一类sysfs接口)。你只需要按照子系统要求注册进子系统就行。子系统就像应用和你驱动之间的framework中间层,它帮你处理了很多通用的功能。另外自己再加入一些specific的sysfs接口即可。
确定了上面这些后,你就可以找到对应的例子去抄(参考)了。说白了,linux 内核设计者已经给你搭好了大的框架,你所要思考框架的东西并不多,你需要的是熟悉内核提供了什么框架子系统,如何使用。
什么样的bus,决定你调用什么总线API去访问硬件,什么样的功能决定你用什么样的子系统来暴露接口给上层应用使用。