那就是,每一个CPU都会有自己独立的tasklet队列,虽然一个tasklet类型的软中断只对应一个action处理程序,但是我们可以在该处理程序中轮询执行一个tasklet队列,队列里面的每一个tasklet_struct都会对应一个tasklet处理函数,这样当我们的驱动程序中需要使用到tasklet的时候,只要往这个tasklet队列加入我们自定义的tasklet_struct对...
调度, 它在完成后会再次运行; 这保证了在其他事件被处理当中发生的事件受到应有的注意. 这个做法也允许一个 tasklet 重新调度它自己staticinlinevoidtasklet_hi_schedule(structtasklet_struct*t);// 调度 tasklet 执行,如果tasklet在运行中被调度, 它在完成后会再次运行; 这保证了在其他事件被处理当中发生的事件受到...
tasklet_schedule()细节:(1)检查tasklet的状态是否为TASKLET_STATE_SCHED。如果是,说明tasklet已经被调度过了。(2)保存中断状态,然后禁止本地中断。确保当tasklet_schedule()处理这些tasklet时,处理器上的数据不会弄乱。(3)把需要调度的tasklet加到每个处理器一个的tasklet_vec链表或tasklet_hi_vec链表的表头上去。(4...
2.调用_tasklety_schedule() 3.保存中断状态,然后禁止本地中断。在我们执行tasklet代码时,这么做能够保证党tasklet_schedule()处理这些tasklet时,处理器上的数据不会弄乱 4.把需要调度的tasklet加到每个处理器一个的tasklet_vec链表或tasklet_hi_vec链表的表头上去 5.唤起TASKLET_SOFTIRQ或HI_SOFTIRQ软中断,这样在下...
使用tasklet步骤: 1.先定义tasklet,需要使用时调用tasklet_schedule,驱动卸载前调用tasklet_kill。 2.tasklet_schedule只是把tasklet放入内核队列,它的func函数会在软件中断的执行过程中被调用。 注意: tasklet_schedule只会把tasklet放入队列一次,调用完成后需要再次放入队列中。
使用tasklet步骤: 1.先定义tasklet,需要使用时调用tasklet_schedule,驱动卸载前调用tasklet_kill。 2.tasklet_schedule只是把tasklet放入内核队列,它的func函数会在软件中断的执行过程中被调用。 注意: tasklet_schedule只会把tasklet放入队列一次,调用完成后需要再次放入队列中。
3.3 调度tasklet 已经调度的tasklet存放在两个单处理器数据结构中:tasklet_vec(普通tasklet)和tasklet_hi_vec(高优先级的tasklet)。 tasklet由tasklet_schedule()和tasklet_hi_schedule(),接收一个只需将tasklet_struct结构的指针作为参数。 tasklet_schedule()执行步骤: ...
使用tasklet步骤: 1.先定义tasklet,需要使用时调用tasklet_schedule,驱动卸载前调用tasklet_kill。 2.tasklet_schedule只是把tasklet放入内核队列,它的func函数会在软件中断的执行过程中被调用。 注意: tasklet_schedule只会把tasklet放入队列一次,调用完成后需要再次放入队列中。
函数的核心代码就是将 t 加入到 tasklet_vec 中。前面提到,Linux 内核中的 tasklet 本质就是一种“软中断”,所以 __tasklet_schedule 函数最后触发了“软中断”TASKLET_SOFTIRQ,由软中断做进一步的处理。 运行tasklet 处理函数 现在知道 Linux 内核是如何调度 tasklet 的了,那内核是如何执行 tasklet 的...
voidtasklet_handler(unsigned long data) 由于小任务不能睡眠,因此不能在小任务中使用信号量或者其它产生阻塞的函数。但是小任务运行时可以响应中断。 3. 调度自己的小任务通过调用tasklet_schedule()函数并传递给它相应的tasklt_struct指针,该小任务就会被调度以便适当的时候执行: ...