順便發個招聘信息
深圳或杭州的兄弟姐妹有誰有興趣到華為的嗎?要求重點本科2年經驗/碩士1年經驗,有C語言開發經驗。有興趣的將簡歷 發到kgha@sohu.com,謝謝!
posted @ 2010-07-01 22:17 璞石 閱讀(1530) | 評論 (6) | 編輯 收藏
posted @ 2010-07-01 22:17 璞石 閱讀(1530) | 評論 (6) | 編輯 收藏
經過3天沒日沒夜的定位,終于把一個阻塞近一個周的問題解決了,再拖下去估計老大要把我給吃了。回想起這三天定位的過程,簡直不亞于任何一部偵探小說。無數次的失望,無數次的毫無頭緒或者千頭萬序,但總能在關鍵時刻發現點點蜘絲馬跡,引導問題進一步深入。猜想、驗證、再猜想、再驗證。幾乎每次都覺得問題很快就會找到頭緒了,結果測試的數據無情的否定了猜想。但是又能根據測試結果引入更加深層次的問題。定位過程走了很多彎路,現在回想起來感覺就是磕磕碰碰的走過來,很多沒有必要的工作也浪費了大量的時間。真是有山窮水盡疑無路、柳岸花明又一村的感覺。真是佩服古人能用如此精確的語言把這種感覺說出來。要是我想到死也想不出如何形容當時的感覺了。^_^
每次定位完一個問題后,在整理思路的時候,總是感覺這是多么自然而然的事情啊,居然當時沒有想到。哈哈,可能很多人都有同樣的感受,可是真正身在其中有太多的因素干擾你,把你引入歧途,等你發現的時候又要從頭而來。由己及人,我們對待別人的問題是否也是這樣,一個看似很簡單的邏輯其中也包含了別人在很多錯誤基礎上的嘗試。或許我們在嘲笑別人犯錯誤的同時,更要看到別人正在向正確邁進。
呵呵,每次寫BOLG都發現腦子有很多東西都混成一團,不知道從哪里開始,寫起來東一句西一句的,可能這也是我高中語文作文總是不及格的原因吧。看來要找時間好好整理下自己的思路了。
posted @ 2007-08-12 01:00 璞石 閱讀(313) | 評論 (0) | 編輯 收藏
posted @ 2007-06-02 00:52 璞石 閱讀(669) | 評論 (0) | 編輯 收藏
posted @ 2007-03-10 23:03 璞石 閱讀(392) | 評論 (0) | 編輯 收藏
posted @ 2007-03-04 16:34 璞石 閱讀(3172) | 評論 (1) | 編輯 收藏
在編寫設備驅動時,
tasklet
機制是一種比較常見的機制,通常用于減少中斷處理的時間,將本應該是在中斷服務程序中完成的任務轉化成軟中斷完成。
為了最大程度的避免中斷處理時間過長而導致中斷丟失,有時候我們需要把一些在中斷處理中不是非常緊急的任務放在后面執行,而讓中斷處理程序盡快返回。在老版本的
linux
中通常將中斷處理分為
top half handler
、
bottom half handler
。利用
top half handler
處理中斷必須處理的任務,而
bottom half handler
處理不是太緊急的任務。
但是
linux2.6
以后的
linux
采取了另外一種機制,就是軟中斷來代替
bottom half handler
的處理。而
tasklet
機制正是利用軟中斷來完成對驅動
bottom half
的處理。
Linux2.6
中軟中斷通常只有固定的幾種:
HI_SOFTIRQ(
高優先級的
tasklet
,一種特殊的
tasklet)
、
TIMER_SOFTIRQ
(定時器)、
NET_TX_SOFTIRQ
(網口發送)、
NET_RX_SOFTIRQ
(網口接收)
、
BLOCK_SOFTIRQ
(塊設備)、
TASKLET_SOFTIRQ
(普通
tasklet
)。當然也可以通過直接修改內核自己加入自己的軟中斷,但是一般來說這是不合理的,軟中斷的優先級比較高,如果不是在內核處理頻繁的任務不建議使用。通常驅動用戶使用
tasklet
足夠了。
軟中斷和
tasklet
的關系如下圖:
?
???
???上圖可以看出,
ksoftirqd
是一個后臺運行的內核線程,它會周期的遍歷軟中斷的向量列表,如果發現哪個軟中斷向量被掛起了(
pend
),就執行對應的處理函數,對于
tasklet
來說,此處理函數就是
tasklet_action
,這個處理函數在系統啟動時初始化軟中斷的就掛接了。
Tasklet_action
函數,遍歷一個全局的
tasklet_vec
鏈表(此鏈表對于
SMP
系統是每個
CPU
都有一個),此鏈表中的元素為
tasklet_struct
。此結構如下
:
struct tasklet_struct
{
?????? struct tasklet_struct *next;
?????? unsigned long state;
?????? atomic_t count;
?????? void (*func)(unsigned long);
?????? unsigned long data;
};
每個結構一個函數指針,指向你自己定義的函數。當我們要使用
tasklet
,首先新定義一個
tasklet_struct
結構,并初始化好要執行函數指針,然后將它掛接到
task_vec
鏈表中,并發一個軟中斷就可以等著被執行了。
原理大概如此,對于
linux
驅動的作者其實不需要關心這些,關鍵是我們如何去使用
tasklet
這種機制。
Linux
中提供了如下接口:
DECLARE_TASKLET(name,function,data)
:此接口初始化一個
tasklet
;其中
name
是
tasklet
的名字,
function
是執行
tasklet
的函數;
data
是
unsigned long
類型的
function
參數。
static inline void tasklet_schedule(struct tasklet_struct *t)
:此接口將定義后的
tasklet
掛接到
cpu
的
tasklet_vec
鏈表,具體是哪個
cpu
的
tasklet_vec
鏈表,是根據當前線程是運行在哪個
cpu
來決定的。此函數不僅會掛接
tasklet
,而且會起一個軟
tasklet
的軟中斷
,
既把
tasklet
對應的中斷向量掛起
(pend)
。
兩個工作完成后,基本上可以了,
tasklet
機制并不復雜,很容易的使程序盡快的響應中斷,避免造成中斷丟失。
posted @ 2007-02-10 00:18 璞石 閱讀(7364) | 評論 (4) | 編輯 收藏
posted @ 2007-02-06 21:07 璞石 閱讀(304) | 評論 (0) | 編輯 收藏