第一篇:供電中斷方案
故障停電應急預案
為保證故障停電時,各項應急工作能夠高效、有序進行,全面提高公司應對停電的應急處理能力,最大限度的預防和減少人員傷害、保障工藝生產和設備安全,特制定本預案。
一、基本原則
以人為本、安全第一、預防為主;統(tǒng)一指揮、分級負責、部門分工、協(xié)調一致。在車間應急指揮小組的統(tǒng)一指揮領導下,開展事故處理、事故搶險與恢復、應急救援、恢復生產等各項應急工作,提高事故處理和應急搶險的能力,以及員工應對能力。
二、專業(yè)術語
故障停電:是指供電系統(tǒng)無論何種原因,造成電能非計劃性停止供應。分為內部故障停電和外部故障停電兩類。本預案涉及的故障停電是指影響供電區(qū)域大,涵蓋一個或多個單位(車間)的整體供電。小范圍故障停電,且無人身、設備安全的不在此列。
一級負荷:是指中斷供電將造成人身傷亡,或將損壞主要設備且長期難以修復,或對國民經濟帶來巨大損失。
二級負荷:是指中斷供電將在政治、經濟上造成較大損失時;或中斷供電將影響重要用電單位的正常工作。
三、適用范圍
本預案適用于集團本部內發(fā)生的停電情況。各子公司、事業(yè)部可以結合自己的實際情況制定車間級應急預案。
四、組織機構及職責 1.公司成立應急指揮小組,組長由主管能源供應的副總經理擔任,副組長公共事業(yè)部經理和工程部經理擔任,組員由停電區(qū)域的負責人及電氣專業(yè)人員、安全員等組成。組長:王一寧
副組長:鮑立民 王立軍
組員:齊海潮、陳紅明、焦海燕、王國穎、張保軍、李進寶、張冰純、各車間領導等
2.指揮小組職責:
制定應急預案,統(tǒng)一領導、指揮和協(xié)調停電應急響應和處置工作。
3、公共事業(yè)部職責:
①公司內、外的停送電信息收集、協(xié)調與發(fā)布;
②高壓電器與高壓線路的故障分析查找;
③高壓側停、送電及倒閘聯(lián)絡操作。
4、各單位車間職責:
①結合車間自身的特點,制定適合本車間更為詳實的故障停電應急預案;
②一、二級負荷供電的單位,確保雙電源或雙回路供電的正常供電;定期檢查落實備用電源情況。
③負責本單位員工的故障停電相關知識的培訓; ④定期組織故障停電應急演練。
五、應急處理程序 外部故障停電
1、發(fā)生停電時,公共事業(yè)部開閉所值班人員,立即將信息上報事業(yè)部領導和調度,并時刻監(jiān)控所停線路的動態(tài);
2、調度與保定供電公司區(qū)調進行信息反饋與溝通,落實停電時長與故障原因;了解和落實各車間停電后狀況及生產受損情況;及時將有關信息向應急指揮小組匯報。
3、4、車間根據(jù)停電影響情況,決定是否起動車間級應急處理程序。如果停電時間短,未超過30分鐘,開閉所不必進行倒閘操作;如果停電時間超過30分鐘,則開閉所在請示應急指揮小組允許后,及時進行倒閘操作。
5、各變(配)電室管理單位,在發(fā)生故障停電后,及時安排電氣人員到變(配)電室,隨時觀察電源的恢復情況。等待公共事業(yè)部的總體安排與指揮。有備用電源或備用回路的,確認其是否正常工作。
內部故障停電
停電區(qū)域(或車間):
1、發(fā)生停電后,停電區(qū)域(或車間)值班人員及時向公共事業(yè)部調度反應情況。同時啟動車間停電應急程序。
2、電氣專業(yè)人員檢查確認備用電源是否已投入,并且正常工作。有事故排風的車間,由工藝專業(yè)人員確認事故排風的開啟。
3、車間電氣專業(yè)人員檢查各斷路器的分合狀態(tài),確認是否有脫扣現(xiàn)象。有脫扣現(xiàn)象的,應立即:第一用萬用表測量相間電阻和接地電阻是否合乎絕緣規(guī)范,第二用500V兆歐表搖測絕緣,判斷該回路狀態(tài),并記錄。
4、檢查各電纜頭、母排、抽屜柜、電纜溝、柜體底部是否有異物和異常情況,柜內元器件是否有發(fā)熱跡象。配電室內是否有異味等。
5、測量配電室總進線處,各相間的電阻以及接地電阻。判斷配電室電氣總體絕緣情況,并將測量結果記錄,上報公共事業(yè)部開閉所。以備故障判斷和送電運行。公共事業(yè)部
1、開閉所值班人員根據(jù)高壓柜的報警情況,確定報警原因,并及時向車間領導匯報報警情況。
2、調度將停電信息向應急領導小組匯報;
3、開閉所分析高壓脫扣原因。通過測量高壓電纜絕緣阻值,高壓電纜耐壓試驗、變壓器耐壓試驗和脫扣值整定值校核,判斷高壓側是否正常。高壓判斷正常時,向應急指揮小組匯報同意后,并在保證低壓總開關斷開的情況下,實施送電。并配合低壓開展故障分析與查找。如果高壓試驗不合格,則向應急小組匯報情況,申請轉入維修程序。有備用變壓器的,則申請投運供電。
六、正常供電后處理程序
查明故障后,如果能及時解決的,待故障解除后,高壓送電。如果故障不能及時解決的,及時將情況向應急小組匯報,根據(jù)應急小組的決定來操作。送電時要嚴格按照從高壓到低壓逐級送電的原則,送電后,要進行逐級確認。如果保持停送狀態(tài),則懸掛必要的工作標示,等待命令,擇機再行送電。
2013-6-19
第二篇:親子關系中斷[范文]
“親子關系中斷”與療愈
“親子關系中斷”。通常來說,0-7歲的孩子,尤其是0-3歲之間的孩子,最好和父母在一起,受到父母的照顧。如果要和父母分開的話,分開的時間也不要太長。因為0-3歲的孩子,神經系統(tǒng)還沒有足夠的承受力,如果跟父母分離很長時間,會產生極度的恐懼,對孩子來講是一個很大的情緒創(chuàng)傷。孩子長大之后,他/她內心的安全感,他/她與人連結的能力都會受到影響。
“鐵臉實驗”,把一群一兩歲的孩子放在一個游戲室里,讓這些孩子去玩,然后讓媽媽全部出去。孩子玩了一會,發(fā)現(xiàn)媽媽不見了,就開始哭,開始叫。實驗人員規(guī)定,這種情況下,不管孩子怎么哭怎么叫,媽媽都不要理他/她,媽媽都要拒絕他/她。這樣幾輪下來之后,突然有一刻,所有的孩子都不再哭了,都安靜下來了。這時候媽媽再上來逗孩子,孩子的表情都成了“鐵臉”,沒表情了,麻木了,不理媽媽了。
實驗到了這里,無法在進行下去,因為媽媽們投訴得很厲害。由此也可以看到,當小孩子被媽媽拒絕,被媽媽忽略,被媽媽不理會,離開媽媽的時候,遭到的創(chuàng)傷。
當孩子比較小的時候,你可以上班,可以出差,但是請盡量多的與孩子待在一起。你每次回家,最好多擁抱他/她一會。孩子在父母的懷抱里,感覺是最安全的。父母,尤其是媽媽,既是創(chuàng)傷的開始,也是療愈的開始。
在孩子0-3歲這段時間,誰在照顧他/她,他/她就可能把這個人當成自己的爸爸媽媽。所以養(yǎng)育孩子,最好父母自己帶;第二給自己的父母帶,也就是爺爺奶奶、姥姥姥爺帶,再其次是給自己的兄弟姐妹帶,比如叔叔姑姑;最次是給陌生人帶,比如讓阿姨帶,讓保姆帶,而且父母也不經常去看孩子,這對孩子會是相當大的心理創(chuàng)傷。
問:如果創(chuàng)傷已經發(fā)生,怎樣去彌補?
答:剛才說了,有一種方式叫“強抱”,緊緊地去擁抱孩子,不管孩子愿不愿意,你都去擁抱他/她。例如七八歲的孩子,調皮搗蛋,父母去抱他/她,他/她往往會把父母推開。但是你耐心一點,多抱一會兒,比如一個小時,你會發(fā)現(xiàn)孩子會軟化下來,孩子其實很需要你。
問:如果早年有親子關系的創(chuàng)傷,父母已經去世了,該怎么辦?
答:有個方法,找個老婆回來,先當她是媽,然后再把她當成伴侶,也有療愈效果。
第三篇:場用電中斷應急演練方案
場用電中斷事故演練方案
(2013年)
批 準:審 定:編制部門:冰峰風電場編制時間:
2013年09月
一、反事故演習目的
1、貫徹落實“安全第一、預防為主”的方針,加強各級生產人員的安全意識,提高業(yè)務水平,使生產人員掌握迅速處理事故和異常現(xiàn)象的正確方法,幫助生產人員進一步掌握現(xiàn)場規(guī)程,熟悉設備運行特性,預防發(fā)生人員責任事故。
2、通過反事故演習,檢驗應急小組之間的協(xié)作配合能力。
3、通過反事故演習,演練事故緊急處理預案,可以進一步完善反事故措施,提高反事故預案的有效性,確保各部門能協(xié)調配合、迅速、準確地處理事故。
二、應急組織結構 總指揮:張軍
副總指揮:何乾、王福強 現(xiàn)場指揮組:付湘濡、吳德、曹曄
應急搶險組:張志厚、徐瑞龍、任亮民、郭東陽 通信聯(lián)絡組:張蕾、胡亞娜、黃光遠、后勤保障組:、劉亞濤、王寧
三、演習要求
1、使用標準調度術語、操作術語。
2、著裝符合要求,態(tài)度嚴肅認真。
3、演習人員接到命令后必須進行復誦,然后才能操作。
4、演習人員之間通話要清楚、明確。
四、演習時間 2013年9月21日
五、演習地點
冰峰風電場主控室、35KV配電室
六、反事故演習方案
14:00,張軍下達演習開始命令,各任務組按照演練方案執(zhí)行。14:10,當日值班員胡亞娜向當值值長何乾匯報:
“14:08,35KV2#母線三相電壓異常,A相電壓示數(shù)為零,B、C兩相電壓不平衡”。
當值值長立即通知風電場場長張軍事件的現(xiàn)象,然后立即組織運行人員根據(jù)現(xiàn)象進行現(xiàn)場檢查,確認事故原因。
何乾帶領運行人員在做好安全措施后,進行檢查確認,確定為2-9PT柜A相PT燒壞。
14:15,何乾向張軍匯報:“經檢查,本次事故為2-9PT柜A相PT燒壞”。
張軍場長立即向調度匯報情況,并申請302開關以及2#母線所帶的風機線路停電。
場長告知全場人員緊急集合,同時啟動應急響應,并成立應急指揮機構,告知各小組職責并清點人數(shù)。
14:20張軍通知各救援組立即趕赴現(xiàn)場進行指揮。何乾下令進行倒閘操作:
1)切換站用變;
2)拉開2#母線所帶的310、312、314、316、318、320開關; 3)將302開關由運行轉為檢修。
14:30,張軍下令應急搶險組立即對設備進行搶修。更換2-9PT柜三相PT。16:00三相PT更換完成。
16:05總指揮張軍向調度匯報故障已處理完畢,申請恢復送電。并按照調度命令將302開關由檢修轉運行,合上310、312、314、316、318、320開關,切回站用變。
值班人員觀察2#母線電壓恢復正常,故障處理完畢。搶險成功,清理現(xiàn)場后,指派專人負責清點人數(shù),避免不清楚傷亡狀況的情況出現(xiàn)。
17:00,自己宣布應急預案解除,演練結束。
第四篇:中華文明未曾中斷
中華文化未曾中斷的原因探析
世界四大文明古國----巴比倫、埃及、印度和中國,各自都有悠久的歷史和文化。但是,古埃及文化、巴比倫文化、印度的哈拉巴文化、古希臘文化毀滅殆盡,唯有崛起于東亞大陸黃河流域的中華文化,在坎坷跌宕中延綿發(fā)展數(shù)千年,經歷改朝換代,分分合合,卻始終未曾中斷,成為世界史上“連續(xù)性文化”的典范。那么,為什么中華文化在幾千年滄海桑田的變化中,不僅未曾中斷,而且不斷發(fā)展、豐富,形成了博大精深的獨特文化體系,被世人稱為“神秘的東方文化”呢?
第一,“敬天、法祖”的原始信仰。從地理環(huán)境看,大中華處于半封閉的大陸性地域之中:一面臨海,三面是高山險阻,由此造成了華夏人與外部世界相對隔絕的狀態(tài),自給自足的小農經濟也是在這個條件下形成的。人們不求對外的開拓發(fā)展,而只追求日出而作、日落而息的穩(wěn)定的生活方式,以及講究個人的自我完善的道德生活。從社會性質看,古代華夏是宗法制的農業(yè)社會,以家庭為單位,逐步向外輻射,形成家族、宗族為紐帶的社會網絡。這個網絡是以親情編織起來的,道德倫理就成為這個社會上每個人首先必須遵守的,也是自覺遵守的、高于一切的標準,從而形成華夏人注重血緣關系的社會心理。
正是由于這種半封閉的大陸性地域、農業(yè)經濟格局、宗法與專制的社會組織結構相互影響和制約,構成了華夏族社會獨特的、穩(wěn)定的生存系統(tǒng),與此相適應,華夏文化的形成與發(fā)展顯示了鮮明的倫理型特色。它是一種具有強烈的重德求善的倫理價值取向的文化,正是這種獨特的地理環(huán)境和社會性質造成了獨具一格原始信仰—— “敬天法祖”。而這種“敬天法祖”的原始信仰在六千年的歷史長河中衍生出以下觀念:
其一、宗法觀念。中華民族自從開始在黃河、長江流域繁衍生息之日起,就產生了自己的信仰。這種信仰以部落神、氏族英雄人物為崇拜對象,相傳燧人發(fā)明用火,伏羲發(fā)明家畜馴化,炎帝、神農發(fā)明種植、醫(yī)藥,黃帝是發(fā)明舟車、宮室、衣服等器物制造的神,還創(chuàng)制了文字。他們是人,也是神,中國古代民族信仰,往往是氏族領袖死后被尊為神,受到本部族的祀奉。
在古代祖先祭祀與天帝信奉相伴相隨,糾結在一起。隨著部落組織形式的日趨完備,上帝的輪廓、形象逐漸形成,也日趨完整。祭祖先,敬天神,二者緊密糾結膠固,凝為一體,構成中華民族傳統(tǒng)的宗祖觀念。
宗祖觀念的核心是“孝”,它是從血緣而產生的“親親”之情,并且通過宗祖神的崇拜和祈求保佑家族繁榮而表達出來,以此維護家族內部的團結。
家庭或家族成員在經濟上相互依賴,父母有撫養(yǎng)子女的義務,并有要求子女贍養(yǎng)的權利,子女有贍養(yǎng)父母的義務。作為家長的父親,享有絕對的權威,有權支配子女,子女對其有尊敬和服從的義務。《尚書.酒誥》云:“肇率牛車,遠服賈,用孝養(yǎng)厥父母。”《詩.小雅》亦云:“父兮生我,母兮鞠我,拊我畜我,長我育我,顧我復我,出入腹我,欲報之德,昊天罔報。”“孝”這一道德觀念,主要是用來維系宗法制度的,周代奉行嫡長子繼承制,并在此基礎上確立了“大宗”、“小宗”的宗法制。由此看來,“孝”就不僅限于家庭倫理范疇,子女贍養(yǎng)父母的義務已擴大到“小宗”對“大宗”的義務,并在政治上延伸為卿大夫對諸侯、諸侯對天子的義務。血緣上“追孝”、“尊祖”觀念成為維系統(tǒng)治階級內部的紐帶。于是,由家族到國家達到了倫理與政治的統(tǒng)一。之后,孔子又在《孝經》中提出“不孝有三,無后為大。”這就把人放在了一個立體坐標中,一個人不僅要對當代家族的人負責,而且要上對得起列祖列宗,下對得起子孫后代。在老百姓心里,“忘本”、“沒良心”、“敗家子”、“數(shù)祖忘典”是最大的恥辱,而“光宗耀祖”、“德高望重”、“封妻蔭子”、“流芳百世”又成為有志者的畢生追求,正是這種宗法觀念對中華民族的文化起到了非常深遠的影響。
其二、大一統(tǒng)的國家觀念。在秦漢以后,“敬天法祖”的原始信仰具體化為“忠孝節(jié)義”、“三綱五常”。它使“敬天法祖”的原始信仰內容更趨完善化,它是宗教信仰,又是政治思想,更能適應大一統(tǒng)國家的生存要求。
數(shù)千年來,中華民族遭受到內憂外患,政權經過多次更迭,社會經過無數(shù)動蕩,民族之間以融合為基調,也有過暫時的戰(zhàn)爭。總之,秦漢以后的中國,人民已習慣于在中央高度統(tǒng)一的政權下生活,因為大一統(tǒng)國家與國與民都具有重大利益:
(1)、大一統(tǒng)國家可以給人民帶來實際利益。比如說,國家統(tǒng)一,老百姓可以不見兵戈,安居樂業(yè)地過日子;國家統(tǒng)一,可以借助強大的國力抵御各種自然災害,調劑各地歲收豐歉,從而避免人民流離失所。
(2)、大一統(tǒng)國家可以充分發(fā)揮大國的綜合國力辦成大事。古代中國是個自然經濟結構的小農經濟之國,一家一戶為生產單位,生產的產品除了供全家消費,所余無幾。正是借助統(tǒng)一大國的高度集中,把分散、零星的少量財富集中起來,聚沙成塔,集腋成裘,集中全國人力、物力進行大規(guī)模的物質建設和文化建設,如修長城、開運河、整治大河河道,進行重大項目的文化建設,修纂大的文化典籍,如《永樂大典》、《四庫全書》等。戰(zhàn)時還可以調動全國人力抵御外來侵略勢力。
(3)、大一統(tǒng)國家吸引力強,便于光大中華文明。第二周期秦漢帝國把大中華文明光大于西域,乃至中亞、西亞;第三周期的隋唐帝國把大中華文明光大于朝鮮、日本,乃至東南亞;第四周期元明清帝國把大中華文明光大于歐亞大陸,乃至非洲。
(4)、大一統(tǒng)國家影響力大,即便分裂時期大中華文化仍占主導地位。第一周期春秋戰(zhàn)國時期,東周和東方六國都是華夏文化,逼迫西戎秦國首先把自己“華”化;第二周期三國兩晉南北朝時期,盡管出現(xiàn)了許多政權,華夏文化始終保持占主導地位的態(tài)勢。魏、蜀、吳、兩晉、南朝都是華夏文化,北方16國,更是以炎黃子孫的身份自居,不失時機地進行漢化改革;第三周期宋代出了程朱理學,遼、夏、金、元無不爭奪漢族儒家名士,接受道教;第四周期清朝相對于元、明仍是分裂時期大中華文明圈內的一個大國,盡管其曾推行“剃頭令”,搞“圈地運動”,但是,之后它也極力奉行程朱理學,搞“華、夷之辯”,以證明自己是正宗的大中華文明。
中華民族接受、支持、維護這個大一統(tǒng)的國家制度,從諸子百家到佛、道、儒三教分別站在自己的宗教立場論證其合理性。從“三綱”、“五常”的言行中體現(xiàn)天理,宣揚忠孝是出自人的本性,不忠、不孝是違背人的天性,不但不能成佛、成仙、成圣賢,甚至也不足以為人。從孝敬父母作起,推及到孝忠祖上、祖先、祖國,形成中華民族的價值觀:以尊祖、愛國、報恩、報國為榮,以竊國、賣國、篡國為恥。在老百姓心里,最臭的莫過于“漢奸”、“賣國賊”,可以說比罵祖宗八代還厲害。這類人不光個人被判了“死刑”,就連子孫后代也抬不起頭來。
就這樣,大一統(tǒng)觀念促進大一統(tǒng)國家的形成,大一統(tǒng)國家又進一步光大了大中華文明,形成滾雪球式的良性運轉,使大中華文明不僅未曾中斷,而且不斷發(fā)展、豐富,形成了博大精深的獨特文化體系。
第二,保皇的是儒家,造反的也是儒家。在原始社會和奴隸制社會,敬天法祖的原始信仰,與當時中央政權的統(tǒng)治不太集中、中央統(tǒng)攝力還不夠強大的政治形勢相適應。秦漢以后,封建王朝勢力強大了,上帝的統(tǒng)攝范圍也擴大了,不但山川、日月,連人們的內心活動、意念善惡也要受宗教神學的管束。由皇帝直接管理天下的郡縣,參與管理的有丞相、三公。但皇帝經常受到諸侯、后黨、權臣的干擾,甚至發(fā)生宮廷政變,皇權遭到篡奪。為了加強中央集權,鞏固社會秩序,漢朝以后,加強了儒學的教化作用。特別是隋唐兩代,以科舉取士,官方用考試制度強力推行儒教思想,凡是走這條路的士人都要系統(tǒng)地接受儒教思想培訓,這對儒教的普及起了有力的作用。宋朝以后,儒教以教化力量鞏固了中央集權,使它更趨穩(wěn)定,故有權臣而沒有篡臣。曹操在唐以前有能臣的形象,宋以后,曹操成為奸臣;唐以前,揚雄在思想界有較好的聲望,宋以后,由于揚雄做過王莽的官,聲望下降。
中國的儒教有一個顯著的特點,即高度的政教合一,政教不分,政教一體,皇帝兼任教皇,或稱教皇兼皇帝。神權、政權融為一體,儒教的教義得以以政府政令的方式下達。朝廷的“圣諭廣訓”是圣旨,等同于教皇的手諭。中世紀歐洲的國王即位,要教皇加冕,才算取得上帝的認可。中國皇帝即位,只要自己向天下發(fā)布詔書就行了。詔書必以“奉天承運,皇帝詔曰”開始,皇帝的詔書同時具有教皇敕令的權威。
儒教是中華民族特有的準宗教,凡是生活在中國這塊古老土地上的各民族,包括各少數(shù)民族,如北方的遼、金、元、西夏及清,歷代王朝都以儒教為國教,尊孔子為教主。儒、佛、道三教同為古代傳統(tǒng)宗教。唯有儒教利用政教結合的優(yōu)勢得以成為國教,儒教的神權與皇權融為一體,不可分割。然而,一旦皇權制度被廢除,儒教也隨著皇權制度一同凋謝。
歷史證明,行政命令打不倒信仰,但政權是可以更迭的,儒教與皇權融為一體,所以才隨著皇權的廢除而暫時銷聲匿跡,這便出現(xiàn)了另一種現(xiàn)象:保皇的是儒家,造反的也是儒家。孔子是思想家、教育家,但不能算政治家。儒學被后人宗教化后,既是學術,又是準宗教。它不僅能為統(tǒng)治階級服務,也能為被統(tǒng)治階級反抗剝削壓迫提供思想武器。
均平原則構成中國古代經濟改革和農民起義的指導思想。均平原則是針對財富占有行為的一種分配理論,孔子對此有過經典闡述:“丘也聞有國有家者,不患寡而患不均,不患貧而患不安。蓋均無貧,和無寡,安無傾。”中國古代平均主義蓋源于此。其實孔子的均平思想是對古代社會大同理想的描摹,也是體現(xiàn)其本人確立的“仁”學風格。“仁”是一種以普遍情感為基調的理論原則,它在分配行為上必然體現(xiàn)出和諧溫馨,而不是巧取豪奪、毫不利人、專門利已。但孔子講的并非絕對平均,他將“仁”、“禮”相互貫通,將平均原則寄于“禮運”之中,禮的實質是區(qū)分上下尊卑等級秩序,在分配行為上應該體現(xiàn)不同等級對財富的不同占有,超越或低于起碼的標準,那也是不允許的,是對禮制的踐踏。因此分配行為應該是依禮而行,均衡有序,使貧富、貴賤之間差距不至于無限擴大。荀子也指出“制禮儀以分之”的目的,就在于“皆使人載其事而各得其宜,然后使殼祿多少厚簿之稱。使夫群居合一之道也。”主張“以禮分施,均遍而不偏”,“非禮不進,非義不受”。因此均平思想成為民族意識和分配標準,成為歷次改革和農民起義的重要目標和理論武器。從北魏孝文帝的“均田制”,王安石提的“方田均稅法”,張居正的“一條鞭法”都是以均平為指導思想提出來的。
農民起義、騷動、**更是如此,“均平”始終是農民起義軍最感親切、最得人心、最有號召力的戰(zhàn)斗旗幟。綠林、赤眉起義是因為“力作所得,不足以給賦稅。”黃巾軍的原發(fā)組織“太平道”宣稱“人無貴賤,皆天所生。”隋末農民起義首先在山東發(fā)難,是由于山東地主是土地兼并及其嚴重的“狹鄉(xiāng)”地區(qū)。唐未農民起義軍第一次打出了“均平”的旗幟,王仙芝自稱“天補平均大將軍”。南唐諸佑起義提出了“使富者貧,貧者富”的口號,宋代王小波、李順起義明確提出“均貧富”。明末李自成提出“均田免糧”的綱領。
儒家不僅為造反大軍提供行動綱領和鮮明的旗幟,還為造反大軍提供了領袖人物和骨干力量。秦末農民起義的隊伍中,范增、張良、蕭何、陳平、陸賈、酈食其、曹參皆飽學之士。
《明史?儒林傳序》說:“明太祖起布衣,定天下。當干戈搶攘之時,所至征召耆儒,講論道德,修明治術,興起教化,煥乎成一代之宏規(guī)。雖天亶英姿,而諸儒之功不為無助也。”意思是朱元璋雖然是個馬上皇帝,但是在他的高級幕僚中諸儒占主要成分,在他興兵造反、奪取天下的過程中諸儒功不可沒。
朱元璋一開始就注重網羅儒者文士。早在渡江前,他即已征用馮國用及其弟國勝、李善長等人,馮氏兄弟“俱喜讀書,通兵法,元末結寨自保”(《明史》卷129《馮勝傳》)。朱元璋進軍滁陽,途經妙山時,馮氏兄弟“著儒服”來見,朱元璋謂:“若書生耶?試為我計安出?”國用曰:“建康,龍蟠虎踞,帝王都會,自古記之。幸而近我,其帥懦弱不任兵,宜急擊下其城,踞以號召四方。事仿仁義,勿貪子女玉帛若群豎子者,天下不難定也”(焦竑編:《國朝獻征錄》卷六王世貞《宋國公馮勝傳》)。朱元璋遂令其為幕府參謀,計議大事。不久,定遠人李善長也到軍營求見。他“少讀書,有智計,習法家言,策事多中”(《明史》卷127《李善長傳》)。初謁朱元璋,即曰:“秦亂,漢高起布衣,豁達大度,知人善任,五載成帝業(yè)。今元綱既紊,天下土崩瓦解。公,濠產,距沛不遠,山川王氣,公當受之。法其所為,天下不足定也”(同上),殷殷期其成為當今的漢高祖劉邦。朱元璋對他甚為信任,留在幕府掌書記。
渡江后,朱元璋更是大力羅致人才,“所克城池,得元朝官吏及儒士盡用之”(劉辰:《國初事跡》)。至正十一年(1355),兵克太平,儒士陶安、李習、潘庭堅、梁貞等出城迎接。陶安,博涉經史,尤深于《易》,與朱元璋語,甚合其意,遂留參幕府,拜左司員外郎,從克金陵,升左司郎中;李習,自幼老成持重,治《尚書》,又旁通群經,攻性理之學,被朱元璋用為太平府知府;潘庭堅,元末用薦為富陽縣學教諭,朱元璋任之為太平府儒學教授,次年取金陵后改為中書博士;梁貞,元至正中為國子監(jiān)生,后由國子伴讀授太平路儒學教授,見朱元璋時,所言輒援《詩》、《書》,被命為江南行省都事。至正十六年(1356),朱元璋率軍取金陵,得儒士夏煜、孫炎、楊憲等十余人,各授官職。又因秦元薦而以書聘陳遇。陳遇,博通經史,尤邃于先天之學,元末為江東明道書院山長。朱元璋稱其“學貫三史六經,博覽兵書百技,才兼文武,實我良輔”(《國朝獻征錄》卷116陳鎬《陳靜誠先生遇傳》)。他與朱元璋相見后,希望其“以不嗜殺人,薄斂任賢,復先王禮樂為首務”(《明史》卷135《陳遇傳》),被命籌帷幄,諸計劃多秘不傳。至正十八年(1358),朱元璋下徽州,召儒士唐仲實,問:“漢高帝、光武、唐太祖太宗、元世祖一平天下,其道何由?”對曰:“此數(shù)君者,皆以不嗜殺人,故能定天下于一。今公英明神武,驅除禍亂,未嘗妄殺。然以今日觀之,民雖得歸而未遂生息”,元璋深以為然(《明通鑒》“前編”卷一)。又素聞儒士朱升之名,遂“潛就訪之。升因進三策曰:‘高筑墻,廣積糧,緩稱王。’”朱元璋大悅,命預帷幄密議,“大抵禮樂征伐之議,贊畫居多”(《朱楓林集》卷九《學士朱升傳》)。
在建置百官的同時,又遣起居注吳林、魏觀待訪求遺賢于四方,以期使更多的儒者文士聚集在自己周圍。這樣便逐漸形成了一個以劉基、宋濂等出自浙東的儒家學者為核心的幕僚集團,這對朱元璋的思想及他的帝業(yè)之成功均有重大影響。
近代更是如此,洪秀全、石達開、康有為、梁啟超、孫中山、陳獨秀、章太炎、毛澤東本身就是儒家,而且是大儒、鴻儒、通儒。毛澤東曾經崇拜過孔子、陳獨秀。他的許多政略出自《論語》,其革命理想也是孔子說的大同世界。
治世治國安民靠儒家,亂時打天下也靠儒家,也就是說在中國歷史上,無論治亂興亡,哪一個階段都離不開儒家,這本身就是文明的繼承。換句話說,在中國只要有儒家存在中華文明就不會中斷,而中國的文人中,百分之九十是儒家,中華文明怎么辦會中斷呢?
第三,道家有“興滅繼絕”的功能。道家文化作為中華文明的根基,具有旺盛的再生能力。魯迅先生(1881—1936)曾經斷言“中國根柢全在道教”,李約瑟博士(1900—1995年)也敏銳地指出:“中國如果沒有道家思想,就會像是一棵某些深根已經爛掉了的大樹”。道學文化中既蘊藏著死而復生的活力,又具有包羅萬象、海納百川的品格。為什么中國文化在古代能接納印度佛教,在近代又能接納西方的基督教文明,這顯然不是“嚴夷夏之防”的儒家文化的功能,而是靠道家善于融匯異質文化的博大包容的特性。在中國歷史上,歷代統(tǒng)治者也都以儒守成,以道達變,人們深知道家智慧有如“水善利萬物而不爭”的寬容氣度,以及能生能化,善于應變的長處。
“反者,道之動。”說明道家的核心是革命的哲學。在中國歷史上,凡是大的社會變革,總是由道家首先發(fā)起對舊思想、舊習慣、舊制度、舊體制的批判開路。從先秦的老子、莊子、列子,到近代的魏源、魯迅都是舊社會的批判者,是革命的先行和旗手。
道學的策略思想是以曲求伸、以弱勝強、以柔克剛,在士人被腐化,思想被扭曲,人民失去信仰時,道家以開放的思想體系和儒家自我封閉體系有著互補作用。每逢儒學走向唯心主義,成為僵化的“官文化”時,道家便對儒學進行補救。統(tǒng)治階級既無創(chuàng)業(yè)的歷史使命和事業(yè)壓力,又拋棄了儒學德治思想的約束,逐漸成為“無道”。必然形成信仰危機。儒學道統(tǒng)衰弱,禮崩樂壞。而儒家剛性太強,“天不變,道亦不變,”、“士可殺而不可辱。”在這種情況下,道家發(fā)揮自己的優(yōu)勢,“窮則變,變則通,通則久。”從而起到對中華民族興滅繼絕的作用。(見第八章第二節(jié))
“無”和“反”是《易經》所說的“窮則變,變則通,通則久”和《道德經》所謂“大曰逝,逝曰遠,遠曰反”的兩種不同表現(xiàn)形式。無中生有是創(chuàng)新,反其道而行之是改革。有了改革和創(chuàng)新就可以達到“興滅繼絕”了。道學主導的歷史階段是“國亂”(久亂)一直延續(xù)到強治周期段的前期。“國亂”(久亂)周期段,國破了,(皇)家散了——諸侯坐大,法、儒兩家的招數(shù)都使絕了,不靈驗了,因此導致信仰危機,出了危機怎么辦?只有道學出來救駕。但救駕的方式不是助一臂之力,而是掛倒檔,開倒車,返本開新,另辟蹊徑,重開新路。
第一周期,當神學出現(xiàn)了信仰危機之后,圣哲把人、神、道德、天文和巫、卜相結合出了《易經》,這便是道學的根基。
第二周期,在“禮崩樂壞”的春秋時代,孔夫子發(fā)出“興滅國,繼絕世,舉逸民”的呼喊。然而,他并未做到,真正做到的是道家。道家在批判神學、天帝、圣賢的同時,以法家的面目出現(xiàn),運用“法”、“術”、“勢”,推出一系列改革方案、政策和措施,最終實用武力完成統(tǒng)一大業(yè)。故司馬遷在《史記》中特意將老子和韓非子寫在一起。
第三周期,東漢末年經學地位下降,道家的何宴、王弼將道學和儒學相揉合,創(chuàng)立了“玄學”。
第四周期,南宋時期,儒學危機時,朱熹融合儒、道、佛創(chuàng)立了理學。可以說是道家一次又一次地維護了中國的“道統(tǒng)”。
第五周期,從啟蒙運動、洋務運動、太平天國異教運動、戊戌變法、新文化運動、共產主義運動,到文化大革命運動,儒學連續(xù)受到沖擊,在這信仰危機、民族危亡的日子里,是道學在批判儒學的同時返本開新,敞開思想,對世界開放,實行“拿來主義”。實證主義進來了,馬克思列寧主義也進來了,新儒學復活了,古老的中國才又一次煥發(fā)生機。
道家的一個重要信條是“不為王者師,便為萬世師”。在政局混亂的時期,一些有高深道學的人轉而為師,如鬼谷子、文中子即是。他們是諸子百家中一流的、非常規(guī)的教育家。他們用改朝換代的帝王之術授徒課業(yè),培養(yǎng)一批因緣時會、出入軍機的人才,使之逐鹿中原,以求一逞。隋末天下鼎沸,文中子王通先生教出了魏征、李密、徐懋公等幾個知兵領軍的干才,他們都是扭轉乾坤的命世之才。鬼谷子、文中子通過自己的學子達到了對國家、民族“興滅繼絕”的目的。
中華民族文化周期性的更新再造功能不是別的,就是“道”。因為它是開放型的,且具備“體”的特質,有隱性世界的力量,這也是中華文明未出現(xiàn)斷層的一個內在原因。如自然界,月季花枝繁葉茂,月月開花,可是花農每年冬季都平一次茬。翌年生長出來的新枝條粗壯鮮嫩,開的花比上年更大、更鮮艷。
第四,具有強大生命力的原始民主制。公元前7——2世紀,為什么經濟、文化相當落后的西戎小國——秦能打敗政治、經濟、文化相當先進的東方六國呢?13世紀,為什么經濟、文化相當落后的僅有150萬人口的蒙古能打平歐亞大陸,建立四大可汗國呢?為什么16世紀經濟、文化相當落后僅有幾十萬人口的女真族能打敗6000多萬人口的大明王朝呢?研究發(fā)現(xiàn):根本原因在于原始民主制勝過封建專制、獨裁政治。而這種原始民主制與之后的專制、獨裁在中華大地上長期并存,經六千年之久,歷三個大周天,九個周期。每當中原地區(qū)的政權走向專制、獨裁,搞得民不聊生時,底層民眾或邊疆的部族就祭起原始民主制的法寶,組織起一支又一支的革命大軍,摧毀專制、獨裁的腐敗政權,改朝換代,使華夏文化走上一個新的臺階。
原始民主政治制度是原始社會普遍實行的制度。我國在夏以前實行的“禪讓”制度實際就是原始民主制。原始民主制始建于父系社會,是在家族議事會的基礎上形成的。最初的議事會由各父系的大家長(長老)組成,負責處理內部事務以及與其它氏族交往的事務。在母系社會民眾大會觀念淡薄之后,這些大家長(長老)逐漸形成氏族的貴族,是氏族酋長的輔佐兼保護人,對氏族的各種活動有參與權。
部落議事會由各氏族首領和家族族長組成。部落的重大事情,如戰(zhàn)爭、講和、締結盟約、推舉部落首領等,都必須由部落議事會作出決定。部落議事會成員一律平等,采取民主的方式協(xié)商討論,實行原始民主制。史載:“伏羲氏以龍紀,故龍師名官。”(《通典》卷19《職官一》)傳說“黃帝置六相”,“堯有十六相”——“四岳”、“十二枚”,“官員六十名”。(同上)“少昊氏以鳥名官,風鳥為歷正,玄鳥為司分,伯趙氏為司至,青鳥氏為司啟,丹鳥氏為司閉,祝鴆氏為司徒,(且鳥)鴆氏為司馬,(尸鳥)鴆氏為司空,爽鴆氏為司寇,(骨鳥)鴆氏為司事”。(《左傳昭公十七年》)
原始民主是與之后的封建專制、特權相對的,要實現(xiàn)民主就勢必反對特權。所謂特權是指超越任何制約、濫用國家權利的權利,必然遭到大多數(shù)人的強烈抗議,反對特權,就能取得多數(shù)人的擁護,產生極大的向心力、凝聚力和戰(zhàn)斗力。
第一、二周期之交的春秋戰(zhàn)國時期,東周和東方六國的封建領主專制制度已經走向窮途末路,在西南邊陲的秦國,由于封建領主專制制度的基礎薄弱,經過“商鞅變法”最先廢除了封建領主專制制度,建立了封建地主制的生產關系。
秦原系顓頊之后,西周時是一個附庸小國,東周初年被封為諸侯國。長期活動在陜西和甘肅東部,與西戎部落雜居,非子為秦部落領袖,時因替周孝王養(yǎng)馬有功,受封為附庸,由犬丘(今陜西興平東南)遷至秦(今甘肅張家川東),始以秦為稱號。公元前659—621年,秦穆公實行原始民主制,任用百里奚、蹇叔等,積極加強國勢。插手中原國家的事務,謀求向東發(fā)展。但是晉國在晉文公的統(tǒng)治下迅速強大,阻礙了秦國東進的計劃。尤其在崤之戰(zhàn)中,秦軍慘敗。因此,秦穆公轉而向西發(fā)展。先爭取到西戎謀臣由余歸降,然后用由余的計謀進攻戎地,短時期內兼并了十二個戎國。開拓了上千里的土地,取得了獨霸西戎的地位。
秦穆公稱霸西戎國。但終因僻處西方,經濟文化落后,國力遜于中原華夏大國。秦孝公即位后,繼續(xù)實行原始民主制,任用商鞅變法,大力招徠六國居士,迅速取得富國強兵的效果。一躍成為戰(zhàn)國七雄中的強國,秦始皇奮六世之余烈,東并六國,建立秦帝國,結束了長達五百年的混戰(zhàn)。
第三、四周期之交的夏、遼、金、元最初都是實行原始民主制凝聚本部各部落的力量。蒙古族的“庫里勒臺”就是實行原始民主制建立起來的,“庫里勒臺”是各部落首領舉行的一種會議,它決定有關部落的重大事情,如戰(zhàn)爭、講和、締結盟約、推舉部落首領等,都必須由部落議事會做出決定。后來演變成“宗王大會”。與會成員一律平等,采取民主的方式協(xié)商討論,具有極大的凝聚力。一是人才選拔面寬。凡是各部落的首領及貝勒都是大汗的后選人,能夠優(yōu)中選優(yōu);二是即使選不上大汗,當攝政王同樣可以發(fā)揮作用。多爾袞就是以攝政王的身份指揮八旗入關,消滅大明王朝的的。由于夏、遼、金、元實行原始民主制還涌現(xiàn)出一批女主,如西夏惠宗秉常母梁太后、遼太祖阿保機皇后述津氏、遼圣宗母承天皇太后蕭綽、金熙宗皇后裴滿氏、成吉思汗皇后孛爾臺旭真、元文宗皇后弘吉刺氏等,臨朝稱制少則幾年,多則十幾年,其中承天皇太后蕭綽“裁決國事”長達40年之久,在歷史上產生了深遠的影響。
綜上所述,大中華文明未曾中斷的根本原因有四:根深蒂固的“敬天法祖”的原始信仰衍生了宗法觀念和大一統(tǒng)觀念是思想基礎;儒學是個雙刃劍,坐天下治國安民是儒家的長項,打天下安邦定國也離不開儒家;道家是中國人的哲學,是中華文化的“體”,具有“返本開新”、“興滅繼絕”的功能,在吸收異質文化,推動大中華文化與時俱進中具有隱性世界的力量;原始民主制是“德文化”的根基,是改朝換代的原動力,是專制、獨裁、腐敗分子的克星。
第五篇:linux中斷總結
1.Linux中斷的注冊與釋放:
在
unsigned int irq:所要注冊的中斷號
irqreturn_t(*handler)(int, void *, struct pt_regs *):中斷服務程序的入口地址。unsigned long flags:與中斷管理有關的位掩碼選項,有三組值: 1.SA_INTERRUPT :快速中斷處理程序,當使用它的是后處理器上所有的其他中斷都被禁用。2.SA_SHIRQ :該中斷是在設備之間可共享的
3.SA_SAMPLE_RANDOM :這個位表示產生的中斷能夠有貢獻給 /dev/random 和 /dev/urandom 使用的加密池.(此處不理解)const char *dev_name:設備描述,表示那一個設備在使用這個中斷。void *dev_id:用作共享中斷線的指針.它是一個獨特的標識, 用在當釋放中斷線時以及可能還被驅動用來指向它自己的私有數(shù)據(jù)區(qū)(來標識哪個設備在中斷)。這個參數(shù)在真正的驅動程序中一般是指向設備數(shù)據(jù)結構的指針.在調用中斷處理程序的時候它就會傳遞給中斷處理程序的void *dev_id。(這是我的理解)如果中斷沒有被共享, dev_id 可以設置為 NULL, 但是使用這個項指向設備結構不管如何是個好主意.我們將在“實現(xiàn)一個處理”一節(jié)中看到 dev_id 的一個實際應用。
中斷號的查看可以使用下面的命令:“cat /proc/interrupts”。
/proc/stat 記錄了幾個關于系統(tǒng)活動的低級統(tǒng)計量, 包括(但是不限于)自系統(tǒng)啟動以來收到的中斷數(shù).stat 的每一行以一個文本字串開始, 是該行的關鍵詞;intr 標志是我們在找的.第一個數(shù)是所有中斷的總數(shù), 而其他每一個代表一個單個 IRQ 線, 從中斷 0 開始.所有的計數(shù)跨系統(tǒng)中所有處理器而匯總的.這個快照顯示, 中斷號 4 已使用 1 次, 盡管當前沒有安裝處理.如果你在測試的驅動請求并釋放中斷在每個打開和關閉循環(huán), 你可能發(fā)現(xiàn) /proc/stat 比 /proc/interrupts 更加有用.以下是一個統(tǒng)計中斷時間間隔的中斷服務程序。
irqreturn_t short_interrupt(int irq, void *dev_id, struct pt_regs *regs){ static long mytime=0;static int i=0;struct net_device *dev=(struct net_device *)dev_id;if(i==0){ mytime=jiffies; }else if(i<20){ mytime =jiffies-mytime;printk(“Request on IRQ %d time %dn”,irq , mytime);mytime=jiffies; printk(“Interrupt on %s-----%d n”,dev->name,dev->irq);} i;return IRQ_HANDLED;} 這個函數(shù)實現(xiàn)的只是對兩次發(fā)生中斷的時間間隔的統(tǒng)計,時間單位是毫秒
前言
在前面分析了中斷的基本原理后,就可以寫一個內核中斷程序來體驗以下,也可以借此程序繼續(xù)深入來了解內核中斷的執(zhí)行過程 一.內核中斷程序 :
我們還是來看一看成程序:
在看程序之前,要熟悉如何進行模塊編程,和了解module_pararm()的用法。如果不熟悉的話請大家看,module_param()的學習和Linux內核模塊編程,在此不作解釋。1.程序interrupt.c /* 2 *file name :interrupt.c 3 *atuthor : john 4 */ 5 #include
printk(KERN_ERR “%s interrrupt can't register %d IRQ n”,interface,irq);21 return-EIO;22 } 23 printk(“%s request %d IRQn”,interface,irq);24 return 0;25 } 26 static irqreturn_t myirq_handler(int irq,void *dev)27 { 28 printk(“%d IRQ is workingn”,irq);29 return IRQ_NONE;30 } 31 static void __exit myirq_exit(void)32 { 33 printk(“the module is leaving!n”);34 printk(“the irq is bye bye!n”);35 free_irq(irq,&irq);36 printk(“%s interrupt free %d IRQn”,interface,irq);37 38 } 39 module_init(myirq_init);0 module_exit(myirq_exit);41 module_param(interface,charp,0644);42 module_param(irq,int,0644);43 1 /* 2 *file name :interrupt.c 3 *atuthor : john 4 */ 5 #include
printk(KERN_ERR “%s interrrupt can't register %d n”,interface,irq);21 return-EIO;22 } 23 printk(“%s request %d IRQn”,interface,irq);24 return 0;25 } 26 static irqreturn_t myirq_handler(int irq,void *dev)
IRQ 27 { 28 printk(“%d IRQ is workingn”,irq);29 return IRQ_NONE;30 } 31 static void __exit myirq_exit(void)32 { 33 printk(“the module is leaving!n”);34 printk(“the irq is bye bye!n”);35 free_irq(irq,&irq);36 printk(“%s interrupt free %d IRQn”,interface,irq);37 38 } 39 module_init(myirq_init);40 module_exit(myirq_exit);41 module_param(interface,charp,0644);42 module_param(irq,int,0644);43 2.Makefile的編寫 1 obj-m:=tiger.o 2 3 CURRENT_PATH:=$(shell pwd)4 VERSION_NUM:=$(shell uname-r)5 LINUX_PATH:=/usr/src/linux-headers-$(VERSION_NUM)6 7 8 all : 9 make-C $(LINUX_PATH)M=$(CURRENT_PATH)modules 10 clean: 11 make-C $(LINUX_PATH)M=$(CURRENT_PATH)clean 1 obj-m:=tiger.o 2 3 CURRENT_PATH:=$(shell pwd)4 VERSION_NUM:=$(shell uname-r)5 LINUX_PATH:=/usr/src/linux-headers-$(VERSION_NUM)6 7 8 all : 9 make-C $(LINUX_PATH)M=$(CURRENT_PATH)modules 10 clean: 11 make-C $(LINUX_PATH)M=$(CURRENT_PATH)clean(程序的調試,加載和運行,在此不進行說明)3.首先我們來分析下內核加載模塊
在內核加載模塊中最重要的的action就是注冊中斷處理程序。很明顯,這一動作是通過request_irq()函數(shù)來完成的。int request_irq(unsigned int irq, irq_handler_t handler,unsigned long flags, const char *devname, void *dev_id)A.先來分析形參:
第一個參數(shù)irq: 表示要分配的中斷號。對于一些設備(系統(tǒng)時鐘或鍵盤)它的值是預先固定的,而對于大多數(shù)設備來說,這個值是動態(tài)確定的。第二個參數(shù) handler: 表示要掛入到中斷請求對列中的中斷服務例程,這個中斷服務函數(shù)的原型是static irqreturn_t handler(int , void *);中斷處理程序的前綴為static,因為它從來不會被別的文件中的代碼直接調用。第三個參數(shù)flags:為標志位。可以取IRQF_DISABLED、IRQF_SHARED和IRQF_SAMPLE_RANDOM之一。在本實例程序中取 IRQF_SHARED,該標志表示多個中斷處理程序共享irq中斷線。一般某個中斷線上的中斷服務程序在執(zhí)行時會屏蔽請求該線的其他中斷,如果取 IRQF_DISABLED標志,則在執(zhí)行該中斷服務程序時會屏蔽所有其他的中斷。取IRQF_SAMPLE_RANDOM則表示設備可以被看做是事件隨見的發(fā)生源。以下是官方解釋: /* * These flags used only by the kernel as part of the * irq handling routines.* * IRQF_DISABLEDirq is used to feed the random generator * IRQF_SHAREDset by callers when they expect sharing mismatches to occur * IRQF_TIMERInterrupt is per cpu * IRQF_NOBALANCINGInterrupt is used for polling(only the interrupt that is * registered first in an shared interrupt is considered for * performance reasons)*/ #define IRQF_DISABLED 0x00000020 #define IRQF_SAMPLE_RANDOM 0x00000040 #define IRQF_SHARED 0x00000080 #define IRQF_PROBE_SHARED 0x00000100 #define IRQF_TIMER 0x00000200 #define IRQF_PERCPU 0x00000400 #define IRQF_NOBALANCING 0x00000800 #define IRQF_IRQPOLL 0x00001000 /* * These flags used only by the kernel as part of the * irq handling routines.* * IRQF_DISABLEDirq is used to feed the random generator * IRQF_SHAREDset by callers when they expect sharing mismatches to occur * IRQF_TIMERInterrupt is per cpu * IRQF_NOBALANCINGInterrupt is used for polling(only the interrupt that is * registered first in an shared interrupt is considered for * performance reasons)*/ #define IRQF_DISABLED 0x00000020 #define IRQF_SAMPLE_RANDOM 0x00000040 #define IRQF_SHARED 0x00000080 #define IRQF_PROBE_SHARED 0x00000100 #define IRQF_TIMER 0x00000200 #define IRQF_PERCPU 0x00000400 #define IRQF_NOBALANCING 0x00000800 #define IRQF_IRQPOLL 0x00001000 第四個參數(shù)devname:是請求中斷的設備的名稱。當你加載模塊成功后可以在/proc/interrupts中查看到具體設備的名稱,與此同時也可以看到這個設備對應的中斷號以及請求次數(shù)。
第五個參數(shù)dev_id:為一個指針型變量。注意該參數(shù)為void型,也就是說通過強制轉換可以轉換為任意類型。dev_id主要用于共享中斷線,對每個注冊的中斷處理程序來說,(Dev_id must be globally unique.Normally the address of the device data structure is used as the cookie.)dev_id參數(shù)必須唯一(指向任一設備結構的指針就可以滿足此要求,選擇設備結構因為它是唯一的,而且中斷處理程序可能會用到它)如果無需共享中斷線,則將該參數(shù)賦值為NULL。B:函數(shù)返回值
requset_irq()函數(shù)成功執(zhí)行后返回0。如果返回非0值,就表示錯誤發(fā)生。此時,指定的中斷處理程序不會被注冊。這里面有幾個疑問: 為什么要注冊中斷函數(shù)
共享中斷線的概念,參數(shù)dev_id的作用是什么 看一個圖進行說明:
1>由圖可知:有16個中斷線。要使用中斷線,就要進行中斷線的 申請,也常把申請一條中斷線稱為申請一個中斷號,這就 與request_irq()函數(shù)中的第一個形參 irq 有關系。2>Linux有256個中斷向量,而外部中中斷向量只有16個(32~47)。由于硬件上的限制,很多外部設備不得不共享中斷線。
(例如:一些PC機所用的網卡和圖形卡可以把它們分配到一條中斷線上)讓每個中斷源獨自占用一條中斷線是不實現(xiàn)的。3>共享中斷線的話雖然解決了中斷資源的問題,但是,此時引出了另一個問題(任何事物都有其兩面性),此時僅僅用中斷描述符并不能提供中斷產生的所有信息。為了解決這個問題,內核必須對中斷線給出近一步的描述,所以在Linux設計中,為每個中斷請求IRQ設置了一個專用隊列(中斷請求隊列)。
4>中斷服例程序和中斷處理程序的區(qū)別: a.中斷服務例程(interrupt service routine):
Linux中,15條中斷線對應15個中斷處理程序,依次命名是IRQ0x00_interrupt(),IRQ0x01_interrupt().....IRQ0X1f_interrupt().中斷處理程序相當于某個中斷向量的總處理程序。
eg:IRQ0X05_interupt()是5號中斷(向量為37)的總處理程序。b.中斷服務例程是針對一個具體設備的中斷。5>.注冊中斷服務例程: 在IDT表完成初始化時,每個中斷服務隊列還為空。此時即使打開中斷且某個外設的中斷真的發(fā)生了,也得不到實際的服務。因為CPU雖然通過中斷門進入了某個中斷向量的總處理程序。但是,具體的中斷服務例程還沒有掛入中斷請求隊列。所以,在設備驅動程序的初始化階段,必須通過request_irq()函數(shù)將響應的中斷服務例程掛入中斷請求隊列,也就是進行注冊。
6>分析一下中斷服務程序,即request_irq()函數(shù)中第二個參數(shù)所對應的函數(shù) static irqreturn_t myirq_handler(int irq,void *dev_id){ printk(“ISR is Workingn”);return IRQ_HANDLED;} 中斷服務例程的形參: a.int irq :中斷號。
b.void *dev_id :與request_irq()的參數(shù)dev_id一致,可以根據(jù)這個設備id號得到相應設備的數(shù)據(jù)結構,進而得到相應設備的信息和相關數(shù)據(jù)。
c.返回值:中斷程序的返回值是一個特殊類型 rqreturn_t。但是中斷程序的返回值卻只有兩個值IRQ_NONE和IRQ_HANDLED。
IRQ_NONE:中斷程序接收到中斷信號后發(fā)現(xiàn)這并不是注冊時指定的中斷原發(fā)出的中斷信號。IRQ_HANDLED:接收到了準確的中斷信號,并且作了相應正確的處理。一般 中斷處理程序要做什么service,主要取決于產生的設備和該設備為什么要發(fā)送中斷。John哥說明:
1.當一個給定的中斷處理程序正在執(zhí)行時,這條中斷線上的其它中斷都會被屏蔽。but,所有其他中斷線上的中斷都是打開的。因此這些不同中斷線上的其他中斷都能被處理。
2.request_irq()函數(shù)可能會睡眠,所以,不能在中斷上下文或其它不允許阻塞的代碼中調用該函數(shù)。
4.在深入分析request_irq()函數(shù)之前,先來看幾個重要的數(shù)據(jù)結構。
A.irqaction的數(shù)據(jù)結構(用irqaction結構體來描述一個具體的中斷服務例程)113struct irqaction { 114 irq_handler_t handler;115 unsigned long flags;116 const char *name;117 void *dev_id;118 struct irqaction *next;119 int irq;120 struct proc_dir_entry *dir;121 irq_handler_t thread_fn;122 struct task_struct *thread;123 unsigned long thread_flags;124};125 113struct irqaction { 114 irq_handler_t handler;115 unsigned long flags;116 const char *name;117 void *dev_id;118 struct irqaction *next;119 int irq;120 struct proc_dir_entry *dir;121 irq_handler_t thread_fn;122 struct task_struct *thread;123 unsigned long thread_flags;124};125
1>handler:指向具體的一個中斷服務例程。
2>flags:表示中斷標志位,對應于request_irq()函數(shù)中所傳遞的第三個參數(shù),可取IRQF_DISABLED、IRQF_SAMPLE_RANDOM和IRQF_SHARED其中之一。
3>name:請求中斷的設備名稱,對應request_irq()函數(shù)中所傳遞的第四個參數(shù)
4>dev_id: 共享中斷時有用。對應于request_irq()函數(shù)中所傳遞的第五個參數(shù),可取任意值,但必須唯一能夠代表發(fā)出中斷請求的設備,通常取描述該設備的結構體。5>strct irqaction *next:指向irqaction描述符的下一個元素。用一條鏈表將共享同一條中斷線上的中斷服務例程鏈接起來。
6>irq:所申請的中斷號
7>dir:指向proc/irq/NN/name entry
8>thread_fn:指向具體的一個線程化的中斷。
9>thread:指向線程中斷的指針。
10>thread_flags:線程中斷的標志。
B.irq_desc的數(shù)據(jù)結構體 每個中斷向量都有它自己的irq_desc 描述符。即用irq_desc來描述中斷向量。所有的這些中斷描述符組織在一起就形成了irq_desc irq_desc[NR_IRQS]數(shù)組
175struct irq_desc { 176 unsigned int irq;177 struct timer_rand_state *timer_rand_state;178 unsigned int *kstat_irqs;179#ifdef CONFIG_INTR_REMAP 180 struct irq_2_iommu *irq_2_iommu;181#endif 182 irq_flow_handler_t handle_irq;183 struct irq_chip *chip;184 struct msi_desc *msi_desc;185 void *handler_data;186 void *chip_data;187 struct irqaction *action;/* IRQ action list */ 188 unsigned int status;/* IRQ status */ 189 190 unsigned int depth;/* nested irq disables */ 191 unsigned int wake_depth;/* nested wake enables */ 192 unsigned int irq_count;/* For detecting broken IRQs */ 193 unsigned long last_unhandled;/* Aging timer for unhandled count */ 194 unsigned int irqs_unhandled;195 raw_spinlock_t lock;196#ifdef CONFIG_SMP 197 cpumask_var_t affinity;198 const struct cpumask *affinity_hint;199 unsigned int node;200#ifdef CONFIG_GENERIC_PENDING_IRQ 201 cpumask_var_t pending_mask;202#endif 203#endif 204 atomic_t threads_active;205 wait_queue_head_t wait_for_threads;206#ifdef CONFIG_PROC_FS 207 struct proc_dir_entry *dir;208#endif 209 const char *name;210} ____cacheline_internodealigned_in_smp;211 212extern void arch_init_copy_chip_data(struct irq_desc *old_desc, 213 struct irq_desc *desc, int node);214extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);215 216#ifndef CONFIG_SPARSE_IRQ 217extern struct irq_desc irq_desc[NR_IRQS];175struct irq_desc { 176 unsigned int irq;177 struct timer_rand_state *timer_rand_state;178 unsigned int *kstat_irqs;179#ifdef CONFIG_INTR_REMAP 180 struct irq_2_iommu *irq_2_iommu;181#endif 182 irq_flow_handler_t handle_irq;183 struct irq_chip *chip;184 struct msi_desc *msi_desc;185 void *handler_data;186 void *chip_data;187 struct irqaction *action;/* IRQ action list */ 188 unsigned int status;/* IRQ status */ 189 190 unsigned int depth;/* nested irq disables */ 191 unsigned int wake_depth;/* nested wake enables */ 192 unsigned int irq_count;/* For detecting broken IRQs */ 193 unsigned long last_unhandled;/* Aging timer for unhandled count */ 194 unsigned int irqs_unhandled;195 raw_spinlock_t lock;196#ifdef CONFIG_SMP 197 cpumask_var_t affinity;198 const struct cpumask *affinity_hint;199 unsigned int node;200#ifdef CONFIG_GENERIC_PENDING_IRQ 201 cpumask_var_t pending_mask;202#endif 203#endif 204 atomic_t threads_active;205 wait_queue_head_t wait_for_threads;206#ifdef CONFIG_PROC_FS 207 struct proc_dir_entry *dir;208#endif 209 const char *name;210} ____cacheline_internodealigned_in_smp;211 212extern void arch_init_copy_chip_data(struct irq_desc *old_desc, 213 struct irq_desc *desc, int node);214extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc);215 216#ifndef CONFIG_SPARSE_IRQ 217extern struct irq_desc irq_desc[NR_IRQS];
1>irq:表示這個描述符所對應的中斷號。
2>handle_irq:指向該IRQ線的公共服務程序(即該IRQ所對應的中斷處理程序。
3>chip:它是一個struct irq_chip類型的指針,是中斷控制器的描述符。在2.6以前的版本中它是hw_irq_controller。
4>handler_data:是handler_irq的參數(shù)。5>chip_data:是指向irq_chip的指針。6>atcion:一個struct irqaction類型的指針,它指向一個單鏈表。該鏈表是由該中斷線上所有中斷服務例程鏈接起來的。7>status:表示中斷線當前的狀態(tài)。
8>depth:中斷線被激活時,值為0;當值為正數(shù)時,表示被禁止的次數(shù)。9>irq_count:表示該中斷線上發(fā)生中斷的次數(shù)
10>irqs_unhandled:該IRQ線上未處理中斷發(fā)生的次數(shù) 11>name:申請中斷設備的名字。
C.struct irq_chip結構體:
struct irq_chip是一個中斷控制器的描述符。Linux支持N種可編程中斷控制器PIC(中斷控制器),通常不同的體系結構就有一套自己的中斷處理方式。內核為了統(tǒng)一的處理中斷,提供了底層的中斷處理抽象接口,對于每個平臺都需要實現(xiàn)底層的接口函數(shù)。這樣對于上層的中斷通用處理程序就無需任何改動。
struct irq_chip的具體代碼如下:
111struct irq_chip { 112 const char *name;113 unsigned int(*startup)(unsigned int irq);114 void(*shutdown)(unsigned int irq);115 void(*enable)(unsigned int irq);116 void(*disable)(unsigned int irq);117 118 void(*ack)(unsigned int irq);119 void(*mask)(unsigned int irq);120 void(*mask_ack)(unsigned int irq);121 void(*unmask)(unsigned int irq);122 void(*eoi)(unsigned int irq);123 124 void(*end)(unsigned int irq);125 int(*set_affinity)(unsigned int irq, 126 const struct cpumask *dest);127 int(*retrigger)(unsigned int irq);128 int(*set_type)(unsigned int irq, unsigned int flow_type);129 int(*set_wake)(unsigned int irq, unsigned int on);130 131 void(*bus_lock)(unsigned int irq);132 void(*bus_sync_unlock)(unsigned int irq);133 134 /* Currently used only by UML, might disappear one day.*/ 135#ifdef CONFIG_IRQ_RELEASE_METHOD 136 void(*release)(unsigned int irq, void *dev_id);137#endif 138 /* 139 * For compatibility,->typename is copied into->name.140 * Will disappear.141 */ 142 const char *typename;143};144 111struct irq_chip { 112 const char *name;113 unsigned int(*startup)(unsigned int irq);114 void(*shutdown)(unsigned int irq);115 void(*enable)(unsigned int irq);116 void(*disable)(unsigned int irq);117 118 void(*ack)(unsigned int irq);119 void(*mask)(unsigned int irq);120 void(*mask_ack)(unsigned int irq);121 void(*unmask)(unsigned int irq);122 void(*eoi)(unsigned int irq);123 124 void(*end)(unsigned int irq);125 int(*set_affinity)(unsigned int irq, 126 const struct cpumask *dest);127 int(*retrigger)(unsigned int irq);128
int
(*set_type)(unsigned int irq, unsigned int flow_type);129 int(*set_wake)(unsigned int irq, unsigned int on);130 131 void(*bus_lock)(unsigned int irq);132 void(*bus_sync_unlock)(unsigned int irq);133 134 /* Currently used only by UML, might disappear one day.*/ 135#ifdef CONFIG_IRQ_RELEASE_METHOD 136 void(*release)(unsigned int irq, void *dev_id);137#endif 138 /* 139 * For compatibility,->typename is copied into->name.140 * Will disappear.141 */ 142 const char *typename;143};144
name:中斷控制器的名字; Startup:啟動中斷線; Shutdown:關閉中斷線; Enable:允許中斷; Disable:禁止中斷;
分析了struct irq_desc,struct irq_chip和irqaction的數(shù)據(jù)結構之后我們來看看他們之間的關系。
現(xiàn)在深入分析request_irq()內部是如何實現(xiàn)的。
135request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, 136 const char *name, void *dev)137{ 138 return request_threaded_irq(irq, handler, NULL, flags, name, dev);139} 140 135request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, 136 const char *name, void *dev)137{ 138 return request_threaded_irq(irq, handler, NULL, flags, name, dev);139} 140
可以看到request_irq()函數(shù)里面有封裝了request_threaded_irq(irq, handler, NULL, flags, name, dev)函數(shù)。
先看一下官方的解釋
1006/** 1007 * request_threaded_irqallocate an interrupt line 1008 * @irq: Interrupt line to allocate 1009 * @handler: Function to be called when the IRQ occurs.1010 * Primary handler for threaded interrupts 1011 * If NULL and thread_fn!= NULL the default 1012 * primary handler is installed 1013 * @thread_fn: Function called from the irq handler thread 1014 * If NULL, no irq thread is created 1015 * @irqflags: Interrupt type flags 1016 * @devname: An ascii name for the claiming device 1017 * @dev_id: A cookie passed back to the handler function 1018 * 1019 * This call allocates interrupt resources and enables the 1020 * interrupt line and IRQ handling.From the point this 1021 * call is made your handler function may be invoked.Since 1022 * your handler function must clear any interrupt the board 1023 * raises, you must take care both to initialise your hardware 1024 * and to set up the interrupt handler in the right order.1025 * 1026 * If you want to set up a threaded irq handler for your device 1027 * then you need to supply @handler and @thread_fn.@handler ist 1028 * still called in hard interrupt context and has to check 1029 * whether the interrupt originates from the device.If yes it 1030 * needs to disable the interrupt on the device and return 1031 * IRQ_WAKE_THREAD which will wake up the handler thread and run 1032 * @thread_fn.This split handler design is necessary to support 1033 * shared interrupts.1034 * 1035 * Dev_id must be globally unique.Normally the address of the 1036 * device data structure is used as the cookie.Since the handler 1037 * receives this value it makes sense to use it.1038 * 1039 * If your interrupt is shared you must pass a non NULL dev_id 1040 * as this is required when freeing the interrupt.1041 * 1042 * Flags: 1043 * 1044 * IRQF_SHARED Interrupt is shared 1045 * IRQF_SAMPLE_RANDOM The interrupt can be used for entropy 1046 * IRQF_TRIGGER_* Specify active edge(s)or level 1047 * 1048 */
5.首先分析request_threaded_irq()函數(shù)中的各個形參 1>:irq:表示申請的中斷號。2>:handler:表示中斷服務例程
3.> thread_fn:中斷線程化,此處傳遞的是NULL。NULL表示沒有中斷線程化。此參數(shù)是最新版本中才出現(xiàn)的。為什么要提出中斷線程化? 在 Linux 中,中斷具有最高的優(yōu)先級。不論在任何時刻,只要產生中斷事件,內核將立即執(zhí)行相應的中斷 處理程序,等到所有掛起的中斷和軟中斷處理完畢后才能執(zhí)行正常的任務,因此有可能造成實時任務得不
到及時的處理。中斷線程化之后,中斷將作為內核線程運行而且被賦予不同的實時優(yōu)先級,實時任務可以
有比中斷線程更高的優(yōu)先級。這樣,具有最高優(yōu)先級的實時任務就能得到優(yōu)先處理,即使在嚴重負載下仍
有實時性保證。but,并不是所有的中斷都可以被線程化,比如時鐘中斷,主要用來維護系統(tǒng)時間以及定時器 等,其中定時器是操作系統(tǒng)的脈搏,一旦被線程化,就有可能被掛起,這樣后果將不堪設想,所以不應當 被線程化。
4>.irqflags:表示中斷標志位。
5>.devname:表示請求中斷的設備的名稱。
6>.dev_id: 對應于request_irq()函數(shù)中所傳遞的第五個參數(shù),可取任意值,但必須唯一能夠代表發(fā)出中斷請求的設備,通常取描述該設備的結構體。共享中斷時所用。現(xiàn)在繼續(xù)迭代深入 request_threaded_irq()內部是如何實現(xiàn)的。
1049int request_threaded_irq(unsigned int irq, irq_handler_t handler, 1050 irq_handler_t thread_fn, unsigned long irqflags, 1051 const char *devname, void *dev_id)1052{ 1053 struct irqaction *action;1054 struct irq_desc *desc;1055 int retval;1056 1057 /* 1058 * Sanity-check: shared interrupts must pass in a real dev-ID, 1059 * otherwise we'll have trouble later trying to figure out 1060 * which interrupt is which(messes up the interrupt freeing 1061 * logic etc).1062 */ 1063 if((irqflags & IRQF_SHARED)&&!dev_id)1064 return-EINVAL;1065 1066 desc = irq_to_desc(irq);1067 if(!desc)1068 return-EINVAL;1069 1070 if(desc->status & IRQ_NOREQUEST)1071 return-EINVAL;1072 1073 if(!handler){ 1074 if(!thread_fn)1075 return-EINVAL;1076 handler = irq_default_primary_handler;1077 } 1078 1079 action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);1080 if(!action)1081 return-ENOMEM;1082 1083 action->handler = handler;1084 action->thread_fn = thread_fn;1085 action->flags = irqflags;1086 action->name = devname;1087 action->dev_id = dev_id;1088 1089 chip_bus_lock(irq, desc);1090 retval = __setup_irq(irq, desc, action);1091 chip_bus_sync_unlock(irq, desc);1092 1093 if(retval)1094 kfree(action);1095 1096#ifdef CONFIG_DEBUG_SHIRQ 1097 if(!retval &&(irqflags & IRQF_SHARED)){ 1098 /* 1099 * It's a shared IRQ--the driver ought to be prepared for it 1100 * to happen immediately, so let's make sure....1101 * We disable the irq to make sure that a 'real' IRQ doesn't 1102 * run in parallel with our fake.1103 */ 1104 unsigned long flags;1105 1106 disable_irq(irq);1107 local_irq_save(flags);1108 1109 handler(irq, dev_id);1110 1111 local_irq_restore(flags);1112 enable_irq(irq);1113 } 1114#endif 1115 return retval;1116} 1049int request_threaded_irq(unsigned int irq, irq_handler_t handler, 1050 irq_handler_t thread_fn, unsigned long irqflags, 1051 const char *devname, void *dev_id)1052{ 1053 struct irqaction *action;1054 struct irq_desc *desc;1055 int retval;1056 1057 /* 1058 * Sanity-check: shared interrupts must pass in a real dev-ID, 1059 * otherwise we'll have trouble later trying to figure out 1060 * which interrupt is which(messes up the interrupt freeing 1061 * logic etc).1062 */ 1063 if((irqflags & IRQF_SHARED)&&!dev_id)1064 return-EINVAL;1065 1066 desc = irq_to_desc(irq);1067 if(!desc)1068 return-EINVAL;1069 1070 if(desc->status & IRQ_NOREQUEST)1071 return-EINVAL;1072 1073 if(!handler){ 1074 if(!thread_fn)1075 return-EINVAL;1076 handler = irq_default_primary_handler;1077 } 1078 1079 action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);1080 if(!action)1081 return-ENOMEM;1082 1083 action->handler = handler;1084 action->thread_fn = thread_fn;1085 action->flags = irqflags;1086 action->name = devname;1087 action->dev_id = dev_id;1088 1089 chip_bus_lock(irq, desc);1090 retval = __setup_irq(irq, desc, action);1091 chip_bus_sync_unlock(irq, desc);1092 1093 if(retval)1094 kfree(action);1095 1096#ifdef CONFIG_DEBUG_SHIRQ 1097 if(!retval &&(irqflags & IRQF_SHARED)){ 1098 /* 1099 * It's a shared IRQ--the driver ought to be prepared for it 1100 * to happen immediately, so let's make sure....1101 * We disable the irq to make sure that a 'real' IRQ doesn't 1102 * run in parallel with our fake.1103 */ 1104 unsigned long flags;1105 1106 disable_irq(irq);1107 local_irq_save(flags);1108 1109 handler(irq, dev_id);1110 1111 local_irq_restore(flags);1112 enable_irq(irq);1113 } 1114#endif 1115 return retval;1116}
程序的第一行和第二行分別定義了:
(1)struct irqaction *action;
(2)2struct irq_desc *desc;
兩個指針action和desc,它們分別指向了結構體irqaction和 irq_desc。
(3)if((irqflags & IRQF_SHARED)&&!dev_id)return-EINVAL;
作用是:判斷中斷標志位,如果是共享中斷的話就必須要有一個唯一的dev_id,否則返回一個錯誤。
(4)desc = irq_to_desc(irq);
irq_to_desc(irq):根據(jù)中斷號irq在 irq_desc[NR_IRQS]數(shù)組中 返回一個具體的irq_desc。即根據(jù)irq找到它的中斷處理程序。
(5)if(!desc)
return-EINVAL;
當返回一個空值時返回一個錯誤。說明申請中斷號失敗。
(6)if(desc->status & IRQ_NOREQUEST)return-EINVAL;
判斷中斷線的狀態(tài),若為IRQ_NOREQUEST時(IRQ_NOREQUEST表示 IRQ 不能被申請)
(7)if(!handler){ if(!thread_fn)return-EINVAL;handler = irq_default_primary_handler;}
判斷中斷服務例程是否為空,如果handler為空,則判斷線程中斷服務例程,若線程中斷服務例程也為空,則返回一個錯誤值。否則中斷服務例程指向: rq_default_primary_handler。
(8)
1079 action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);1080 if(!action)1081 return-ENOMEM;1082 1083 action->handler = handler;1084 action->thread_fn = thread_fn;1085 action->flags = irqflags;1086 action->name = devname;1087 action->dev_id = dev_id;
從1079~1087:根據(jù)requst_irq()函數(shù)中傳遞的參數(shù)生成一個irqaction.1097 if(!retval &&(irqflags & IRQF_SHARED)){ 1098 /* 1099 * It's a shared IRQ--the driver ought to be prepared for it 1100 * to happen immediately, so let's make sure....1101 * We disable the irq to make sure that a 'real' IRQ doesn't 1102 * run in parallel with our fake.1103 */ 1104 unsigned long flags;1105 1106 disable_irq(irq);1107 local_irq_save(flags);1108 1109 handler(irq, dev_id);1110 1111 local_irq_restore(flags);1112 enable_irq(irq);1113 }
1097~1113:如果為共享中斷的話,在執(zhí)行中斷服務例程之前,要先把這條中斷線上的中斷屏蔽,讓后在執(zhí)行,執(zhí)行完之后打開中斷。
6.有注冊中斷服務函數(shù),那必然有相應的釋放中斷函數(shù)。
可以調用void free_irq(unsigned int irq, void *dev_id)來釋放我們申請的中斷線。
函數(shù)形參:
1>unsigned int riq:表示申請的中斷號與request_irq()函數(shù)中的第一個形參對應。
2>void *dev_id:與request_irq()函數(shù)中的最后一個形參含義和用法相同,在此不再說明。
函數(shù)功能:
如果指定的中斷線不是共享的,那么,該函數(shù)刪除處理程序的同時將禁用這條中斷線。如果中斷線是共享的,則僅刪除dev_id所對應的處理程序,而這條中斷線本省只有在刪除了最后一個處理程序時才會被禁止。
切記:This function must not be called from interrupt context
freee_irq()函數(shù)不能在中斷上下文中被調用。
3>深入分析下free_irq()函數(shù)內部是如何實現(xiàn)的
993void free_irq(unsigned int irq, void *dev_id)994{ 995 struct irq_desc *desc = irq_to_desc(irq);996 997 if(!desc)998 return;999 1000 chip_bus_lock(irq, desc);1001 kfree(__free_irq(irq, dev_id));1002 chip_bus_sync_unlock(irq, desc);1003} 993void free_irq(unsigned int irq, void *dev_id)994{ 995 struct irq_desc *desc = irq_to_desc(irq);996 997 if(!desc)998 return;999 1000 chip_bus_lock(irq, desc);1001 kfree(__free_irq(irq, dev_id));1002 chip_bus_sync_unlock(irq, desc);1003} 可以看到free_irq()函數(shù)了封裝了_free_irq(irq,dev_id)函數(shù)。free_irq()調用_free_irq()把每一個具體的中斷服務例程()釋放。
本篇文章來源于 Linux公社網站(原文鏈接: