linux系统中的tasklet及其在alsa中的应用

linux系统中的tasklet及其在alsa中的应用

ID:34273127

大小:31.50 KB

页数:4页

时间:2019-03-04

linux系统中的tasklet及其在alsa中的应用_第1页
linux系统中的tasklet及其在alsa中的应用_第2页
linux系统中的tasklet及其在alsa中的应用_第3页
linux系统中的tasklet及其在alsa中的应用_第4页
资源描述:

《linux系统中的tasklet及其在alsa中的应用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、文章编号:1009-8119(2005)11-0044-03Linux系统中的Tasklet及其在ALSA中的应用仲原原张丽芬(北京理工大学计算机科学工程系,北京100081)摘要介绍了Linux系统中的一种下半部处理机制Tasklet,对其原理进行了详细的分析,并结合ALSA驱动实例介绍了Tasklet的使用。关键词中断,Tasklet,ALSATaskletinLinuxandtheExampleinALSADriverZhongYuanyuanZhangLifen(Dept.ofComputerScienceandEngineer

2、ing,BeijingInstituteofTechnology,Beijing100081)AbstractInthispaper,tasklet,akindofbottom-halfinLinux,isintroduced.ThentaskletisanalyzedindetailandisimplementedinanexampleALSAdriver.KeywordsInterrupt,Tasklet,ALSA1概述在Linux系统中,中断技术被用来管理各种各样的外围设备,起着重要的作用。通常,在外设完成I/O操作后,设备控制器

3、向CPU发送中断请求。CPU响应后,停止正在执行的代码,在堆栈中保存参数,然后转向中断服务程序。中断服务程序在执行时,会屏蔽同级中断甚至所有其它中断。因此,中断服务程序应该执行得越快越好,以免延误其他中断,而丢失信息。对于时间要求很严格的操作,应该在中断服务程序中执行,完成对硬件中断的即时响应。而对于时间要求不严格的操作,则应该移到中断服务程序之外再去完成,以便及时响应较低优先级的设备中断。这样,整个中断处理流程就被分为两个部分。第一部分是中断服务程序,另一部分称为下半部(BottomHalf)。在Linux发展的过程中曾经出现过多种下

4、半部实现机制。Tasklet则是在2.3版本中开始引入的。由于它可以动态创建,灵活性强,已经成为下半部最常用的一种形式。2Tasklet的使用Tasklet定义在include/linux/interrupt.h头文件中,数据结构tasklet_struct如下:structtasklet_struct{structtasklet_struct*next;//指向下一个tasklet的指针unsignedlongstate;//tasklet的当前状态atomic_tcount;//使能标志,为0时才能被执行void(*func)(un

5、signedlong);//tasklet的处理函数unsignedlongdata;//func的参数};Tasklet的当前状态state是位级定义的状态变量,只使用了32位中的最右边两位。右边第一位为TASKLET_STATE_SCHED,为1时表示tasklet已经被调度。右边第二位为TASKLET_STATE_RUN,为1时表示tasklet正在某个CPU上执行。由于下半部处理同样是中断处理的一部分,因此,tasklet的处理函数中,不允许有睡眠的操作,不可以访问用户空间,也不可以调用schedule()函数进行重新调度。首先

6、通过DECLARE_TASKLET(name,func,data)来创建tasklet。这是一个宏定义:#defineDECLARE_TASKLET(name,func,data)structtasklet_structname={NULL,0,ATOMIC_INIT(0),func,data}实际上就是创建一个tasklet_struct结构类型的变量”name”,其成员函数中的处理函数为func(data),count值为0。也可以使用DECLARE_TASKLET_DISABLED(name,func,data)创建taskle

7、t。这种方式创建的tasklet中成员count的值为1,所创建的tasklet即使被调度也不能运行。将已创建的tasklet的地址作为参数,调用tasklet_schedule(structtasklet_struct*t)或者tasklet_hi_schedule(structtasklet_struct*t)之后,该tasklet就会在适当的时机得到执行。3Tasklet的原理Tasklet是通过软中断(softirq)实现的。Linux系统中,软中断由softirq_action结构表示:structsoftirq_action

8、{void(*action)(structsoftirq_action*);//处理函数void*data;//处理函数的参数}系统允许最多有32个软中断,用数组softirq_vec[32]来保存,数组描

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。