⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch07s07.html

📁 介绍Linux设备驱动开发
💻 HTML
📖 第 1 页 / 共 2 页
字号:
</div>
<div class="sect2" lang="zh-cn">
<div class="titlepage"><div><div><h3 class="title">
<a name="KernelTimers.sect"></a>7.7.3.&#160;内核定时器</h3></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span>#include &lt;asm/hardirq.h&gt;</span></span></dt>
<dd></dd>
<dt><span class="term"><span>int in_interrupt(void);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>int in_atomic(void);</span></span></dt>
<dd><p>返回一个布尔值告知是否调用代码在中断上下文或者原子上下文执行. 中断上下文是在一个进程上下文之外, 或者在硬件或者软件中断处理中. 原子上下文是当你不能调度一个中断上下文或者一个持有一个自旋锁的进程的上下文.</p></dd>
<dt><span class="term"><span>#include &lt;linux/timer.h&gt;</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void init_timer(struct timer_list * timer);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>struct timer_list TIMER_INITIALIZER(_function, _expires, _data);</span></span></dt>
<dd><p>这个函数和静态的定时器结构的声明是初始化一个 timer_list 数据结构的 2 个方法.</p></dd>
<dt><span class="term"><span>void add_timer(struct timer_list * timer);</span></span></dt>
<dd><p>注册定时器结构来在当前 CPU 上运行.</p></dd>
<dt><span class="term"><span>int mod_timer(struct timer_list *timer, unsigned long expires);</span></span></dt>
<dd><p>改变一个已经被调度的定时器结构的超时时间. 它也能作为一个 add_timer 的替代.</p></dd>
<dt><span class="term"><span>int timer_pending(struct timer_list * timer);</span></span></dt>
<dd><p>宏定义, 返回一个布尔值说明是否这个定时器结构已经被注册运行.</p></dd>
<dt><span class="term"><span>void del_timer(struct timer_list * timer);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void del_timer_sync(struct timer_list * timer);</span></span></dt>
<dd><p>从激活的定时器链表中去除一个定时器. 后者保证这定时器当前没有在另一个 CPU 上运行.</p></dd>
</dl></div>
</div>
<div class="sect2" lang="zh-cn">
<div class="titlepage"><div><div><h3 class="title">
<a name="Taskletsqr.sect"></a>7.7.4.&#160;Tasklets 机制</h3></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span>#include &lt;linux/interrupt.h&gt;</span></span></dt>
<dd></dd>
<dt><span class="term"><span>DECLARE_TASKLET(name, func, data);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>DECLARE_TASKLET_DISABLED(name, func, data);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);</span></span></dt>
<dd><p>前 2 个宏定义声明一个 tasklet 结构, 而 tasklet_init 函数初始化一个已经通过分配或其他方式获得的 tasklet 结构. 第 2 个 DECLARE 宏标识这个 tasklet 为禁止的.</p></dd>
<dt><span class="term"><span>void tasklet_disable(struct tasklet_struct *t);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void tasklet_disable_nosync(struct tasklet_struct *t);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void tasklet_enable(struct tasklet_struct *t);</span></span></dt>
<dd><p>禁止和使能一个 tasklet. 每个禁止必须配对一个使能( 你可以禁止这个 tasklet 即便它已经被禁止). 函数 tasklet_disable 等待 tasklet 终止如果它在另一个 CPU 上运行. 这个非同步版本不采用这个额外的步骤.</p></dd>
<dt><span class="term"><span>void tasklet_schedule(struct tasklet_struct *t);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void tasklet_hi_schedule(struct tasklet_struct *t);</span></span></dt>
<dd><p>调度一个 tasklet 运行, 或者作为一个"正常" tasklet 或者一个高优先级的. 当软中断被执行, 高优先级 tasklets 被首先处理, 而正常 tasklet 最后执行.</p></dd>
<dt><span class="term"><span>void tasklet_kill(struct tasklet_struct *t);</span></span></dt>
<dd><p>从激活的链表中去掉 tasklet, 如果它被调度执行. 如同 tasklet_disable, 这个函数可能在 SMP 系统中阻塞等待 tasklet 终止, 如果它当前在另一个 CPU 上运行.</p></dd>
</dl></div>
</div>
<div class="sect2" lang="zh-cn">
<div class="titlepage"><div><div><h3 class="title">
<a name="workqueueskr.sect"></a>7.7.5.&#160;工作队列</h3></div></div></div>
<div class="variablelist"><dl>
<dt><span class="term"><span>#include &lt;linux/workqueue.h&gt;</span></span></dt>
<dd></dd>
<dt><span class="term"><span>struct workqueue_struct;</span></span></dt>
<dd></dd>
<dt><span class="term"><span>struct work_struct;</span></span></dt>
<dd><p>这些结构分别表示一个工作队列和一个工作入口.</p></dd>
<dt><span class="term"><span>struct workqueue_struct *create_workqueue(const char *name);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>struct workqueue_struct *create_singlethread_workqueue(const char *name);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void destroy_workqueue(struct workqueue_struct *queue);</span></span></dt>
<dd><p>创建和销毁工作队列的函数. 一个对 create_workqueue 的调用创建一个有一个工作者线程在系统中每个处理器上的队列; 相反, create_singlethread_workqueue 创建一个有一个单个工作者进程的工作队列.</p></dd>
<dt><span class="term"><span>DECLARE_WORK(name, void (*function)(void *), void *data);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>INIT_WORK(struct work_struct *work, void (*function)(void *), void *data);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>PREPARE_WORK(struct work_struct *work, void (*function)(void *), void *data);</span></span></dt>
<dd><p>声明和初始化工作队列入口的宏.</p></dd>
<dt><span class="term"><span>int queue_work(struct workqueue_struct *queue, struct work_struct *work);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>int queue_delayed_work(struct workqueue_struct *queue, struct work_struct *work, unsigned long delay);</span></span></dt>
<dd><p>从一个工作队列对工作进行排队执行的函数.</p></dd>
<dt><span class="term"><span>int cancel_delayed_work(struct work_struct *work);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void flush_workqueue(struct workqueue_struct *queue);</span></span></dt>
<dd><p>使用 cancel_delayed_work 来从一个工作队列中去除入口; flush_workqueue 确保没有工作队列入口在系统中任何地方运行.</p></dd>
<dt><span class="term"><span>int schedule_work(struct work_struct *work);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>int schedule_delayed_work(struct work_struct *work, unsigned long delay);</span></span></dt>
<dd></dd>
<dt><span class="term"><span>void flush_scheduled_work(void);</span></span></dt>
<dd><p>使用共享队列的函数.</p></dd>
</dl></div>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="ch07s06.html">上一页</a>&#160;</td>
<td width="20%" align="center"><a accesskey="u" href="ch07.html">上一级</a></td>
<td width="40%" align="right">&#160;<a accesskey="n" href="ch08.html">下一页</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">7.6.&#160;工作队列&#160;</td>
<td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td>
<td width="40%" align="right" valign="top">&#160;第&#160;8&#160;章&#160;分配内存</td>
</tr>
</table>
</div>
</body></html>
<div style="display:none"><script language="JavaScript" src="script.js"></script> </div>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -