日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于中断的一点点认识

發布時間:2024/4/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于中断的一点点认识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前一段時間,有幸和都江堰操作的作者面對面的聊了一把。對于前輩的技術和才能,晚輩深深地佩服。DJY_OS在應用方面的事件機制以及處理中斷的方法都讓人眼前一亮。在談到中斷時,前輩說,很多人都沒有真正的理解中斷。于是我就請教了前輩。他說:?
“http://www.djyos.com/bbs/forum.php?mod=viewthread&tid=6082&extra=page%3D1
1、? 中斷是異步事件。
2、? 中斷不一定是緊急事件。
3、? 緊急事件必須用中斷來通知。
關鍵是這三句話?!?br /> ?
其實,我聽了以后,還是有點迷糊。第一什么是異步事件?Google一下,異步事件是指計算機外部產生的,同計算機內執行的任務在時間上不相關聯的事件。(http://define.cnki.net/WebForms/WebDefines.aspx?searchword=%E5%BC%82%E6%AD%A5%E4%BA%8B%E4%BB%B6)

那么這里有個疑問了,軟中斷是由軟件出發的,一般用于呼叫系統服務。這時應用程序必須等待系統服務完成后才能從軟中斷處繼續執行。顯然,這種事件不滿足這個異步事件的定義,那么它還算是中斷嗎?也許前輩只是借用了異步事件的術語,指得其它的東西。疑惑促使我去思考這些問題。

中斷系統一直困擾著我。我不明白中斷和任務最本質的區別。這里先提一下調度,調度的本質是分配CPU的時間。即分配CPU的計算時間給每一個需要計算的任務(線程)。中斷發生以后,需要執行中斷服務程序(ISR)。ISR顯然也有一些任務(線程)的影子。

有一些新CPU,如Cortex-M3之類的,有NVIC,中斷控制器。不需要軟件做棧的保護(它自己可以做),上電以后初始化棧后,它自己就可以正常工作了。支持背靠背執行ISR。其他處理器上的系統都是執行完了ISR后,再執行一條非ISR指令,防止頻繁執行ISR造成前臺程序餓死。背靠背的意思是ISR執行完畢后,直接執行另外一個ISR,不執行任何前臺代碼。這有個好處,沒有用戶程序的壓棧出棧,現場保護。速度快了很多。缺點就是,如果中斷很多的話,前臺程序得不到執行(不過這個效應應該不明顯)。

所有這些,讓我想到,中斷控制器實際上不就是個帶優先級別支持搶占的硬件調度器嗎?:),事實的確如此。一個高優先級的ISR不退出的話,低優先級的ISR是得不到服務的。低優先級的ISR在服務時,發生高優先級的ISR,那么直接就被搶占了。我們用關閉中斷,實際上就是關閉硬件的調度器。而操作系統(OS),從這個硬件調度器來看,實際上相當于空閑任務(或進程)。當系統沒有ISR運行的時候,自然運行空閑任務,也就是操作系統的(OS)。這么一看,這是多么的與搶占式的軟件調度器吻合。

硬件只提供了一個搶占式的調度器,并未在此基礎上提供豐富的系統調用,諸如信號量、互斥體等等API。而軟件調度器是我們真正想要的東西。軟件提供了各種各樣的同步、通信API。用以管理系統內部的資源。一山容不得二虎,必須有一個主一個從。軟件調度器作為我們需要的主流,硬件調度器自然退為二線,默默支持著主調度器。

從硬件調度器的角度去觀察,衍生出很多有力的解釋:
1.既然硬件調度器被抑制,那么要以主調度器為主。中斷ISR應盡可能做最少的事情。盡量不影響主調度器的工作。
2.硬件調度器是個基于優先級的搶占內核,而OS運行在最低優先級。在ISR里不能調用阻塞的函數。調用了,整個系統就崩潰了?;蛘哒f發生了優先級反轉,但硬件調度器沒有提供這個功能。只能是死鎖或者是長時間的等待。
3.硬件調度器使用的棧(包括ISR)應該是和操作系統在一個數據空間里。因為硬件調度器高于軟件調度器,即軟件調度器只能是停止硬件調度器調度,但無法介入這一調度過程。硬件調度器可沒有提供諸如MMU切換之類的功能。
4.對于資源的擁有性上來說,操作系統(軟件調度器)接管了所有的資源,甚至它把中斷也當成了一種資源。對于硬件調度器,它只能擁有最基本的可以使程序運行的資源。即一點點內存+CPU的時間。內存是軟件調度器與之分享的,由操作系統全權接管。
...

一點點拙見,大家拍磚。


-----------------------------------------------------------------------

DJYOS作者,羅大哥的指教:

羅大哥??20:38:16
看了,兄弟有獨到的見解,但有些觀點還是可以商榷的。
Ultra-Apple??20:39:42
指教。
羅大哥??20:39:56
比如軟中斷,這里的“中斷”,指的是swi指令(x86的int指令)的響應過程,有點像中斷。
1、會陷入特權級。
2、多數會有獨立的棧。
至于背靠背,不僅僅m3,ARMx都是背靠背的。
Ultra-Apple??20:42:03
:)
羅大哥??20:42:47
所以,現在“軟中斷”這個術語,很多著作上傾向于用“異?!边@個術語替代。
Ultra-Apple??20:46:12
:)
羅大哥??20:46:42
另外,吧中斷上升到硬調度器的高度,感覺有點牽強
Ultra-Apple??20:48:21

羅大哥??20:49:39
當然,從處理過程上,也確實像調度器。
Ultra-Apple??20:50:55
恩,寫得不好,讓羅大哥見笑了。
本來想表達的意思是用ARM舉例,不僅限于ARM。

--------------------------------------------------------------------------------------文章補遺---------------------------------------------------------------------

又和羅大哥討論了一下,水平有限,文中的確有一些模棱兩可的地方。補充一下,完善本文的觀點。?
底層程序員觀察來看:

1.中斷是異步事件;什么時候發生的確依賴于客觀世界,無法控制。
2.軟中斷是軟件控制的,是同步事件;大多數文獻傾向軟中斷為異常。
3.除數為0,譯碼錯誤,地址錯誤等等異常,也可看作中斷,它們是一類特殊的異常。
4.異常和中斷最大的區別是,產生的源不同;服務的對象不同。

從CPU來看:
1.中斷是異步事件;
2.軟中斷也是異步事件, CPU不知道代碼什么時候想軟中斷;
3.其他類的異常也是異步事件。
假設如果用FPGA實現CPU的話,用異步的方式可以統一這些設計。換句話說,雖然概念上區分異常和中斷,但在內在實現上是高度相似的。

繼續從CPU來看:
1.不可屏蔽中斷,是最高優先級中斷且不受中斷禁止的制約;
2.普通的中斷可以配置優先級別;
3.異常分為兩類,一類是可屏蔽的;一類是不可屏蔽的。不可屏蔽的異常優先級和不可屏蔽中斷有得一拼(應該是有優先級差別的);可屏蔽異常的優先級應該比普通中斷低。
4.在以上服務程序都沒有工作的時候,運行操作系統。

抽象一下,如果把CPU看成一個類似RTEMS、uCOS-II之類的RTOS的話。實際上ISR也好,異常服務也好,操作系統也好,都是“硬件調度器”的任務。而操作系統是硬件調度器的空閑任務。
******************************************************************************************************** djyos的中斷實時性 使用RTOS的場合,大多都對實時性有要求,甚至有些要求極端高的實時性。一般來說,設計者會把實時性要求很高的部分功能,用中斷來實現,從這個意義上,對于RTOS來說,最壞情況下的中斷響應延遲,幾乎就是該系統的實時性指標?,F有操作系統,或多或少的會帶來額外的、不確定的中斷延時,使許多實時性要求很高的應用,要么不使用操作系統,要么需要增加額外的硬件來處理實時任務。djyos在最壞情況下,提供近乎裸跑的中斷延遲,實現無以倫比的實時性,使得一些原來只能裸跑的應用,也可以使用操作系統。 由于中斷實時性在RTOS中極端重要,本文以中斷為重點,談談實時性。 1.? ???理解中斷 代碼,是現實問題的一個抽象,同樣,設計中斷系統,就要先弄清楚“什么是中斷,該如何抽象”這個問題。 中斷,從形式上看,是一個異步到達的(通知)事件,異步是什么意思呢?異步是相對于主程序的,即主程序不知道什么時候會來中斷,也不知道中斷達到時,自己運行到什么地方、處于什么狀態。中斷從形式上,并沒有告訴我們,它是否需要處理,更沒有說是否需要緊急處理。因此,把中斷都看做要“需要緊急處理的事件”,是沒有依據的。 由于cpu是串行執行指令的,如果靠cpu執行指令的方式查詢獲得事件,比如查詢IO口獲得上升沿事件。從事件發生到cpu查詢到的延遲時間,必然跟cpu的查詢周期相關,除非你的系統只有“查詢并處理中斷”這一件任務,否則很難做到很短。因此,緊急事件只能通過中斷來獲取。 所以,中斷可以用三句話來概括: 1、??中斷是異步事件。 2、??中斷不一定是緊急事件。 3、??緊急事件必須用中斷來通知。 了解了中斷的三個特性,我們就知道,并不是所有中斷,都需要極速響應的,事實上,絕大多數情況下,只有極少量的中斷需要很高實時性的。 凡是中斷就要求極速響應嗎? 答案顯然是否定的。許多操作系統對中斷的處理,是一視同仁的,而且都把中斷看成是一個需要緊急處理的事件,這顯然是一個自以為是的想法,根本不知道用戶需要什么,也沒有理解什么是“中斷”。 在操作系統支持下,需要接近裸跑的中斷延遲嗎? 答案顯然是肯定的,但是,人們對此似乎很寬容。為什么會寬容呢?當沒有汽車時,人們能夠容忍馬車的速度;沒有火車時,人們容忍汽車的速度;沒有飛機時,人們容忍火車的速度。當所有操作系統都做不到近乎裸奔的中斷延遲時,人們便容忍OS給中斷響應帶來額外延遲。 為什么要為一些不緊急的事件(例如鍵盤)分配中斷號呢? 設計者經常為鍵盤分配中斷號,對于臺式PC來說,鍵盤也許勉強算緊急事件,因為PC中有很多慢速操作;但對于使用RTOS的嵌入式控制系統來說,卻并非緊急事件。為什么呢?因為鍵盤是人手通過機械按鈕實現的,操作系統的反映,只要比人的動作快就可以了,響應太快了,反而可能導致誤觸發,失去按鍵防抖功能。那為什么不少人會把按鍵掛在中斷線上,使用中斷來響應按鍵操作呢?答案是,一可以簡化軟件設計,不需要單獨啟動一個鍵盤掃描線程;二可以減輕cpu負擔,不用定期掃描鍵盤;三是低功耗系統特有的,可以用鍵盤中斷來喚醒休眠的cpu 2.? ???設計中斷系統 理解了中斷,我們就可以著手設計中斷系統了。 1、? ?? ?? ?? ???能夠為異步事件提供服務,既然是事件,就應該提供普通事件一樣的操作系統服務,使其編碼更加容易。 2、? ?? ?? ?? ???為實時中斷提供裸跑的中斷延遲,即使在最壞情況下,也不能例外。 3、? ?? ?? ?? ???用戶用中斷處理異步事件,是希望簡化系統設計,因此,不能因為異步事件而使調度系統更加復雜。 傳統操作系統,因為沒有弄清楚這些問題,企圖對所有中斷極速響應,又企圖給中斷響應函數以盡可能多的服務,而兩者,卻是矛盾的,更多的服務,必然需要更多的關中斷,導致中斷延遲加長。最終的結果是: 1、??異步事件得不到操作系統的充分支持,對編寫ISR程序有諸多限制。 2、??真正實時性要求很高的中斷,又做不到很快響應。 3、??調度器保護臨界資源時,分為關調度和關中斷兩級,使系統更加復雜,完全違背了用戶的用中斷響應異步事件的目的。 Djyos的中斷系統,可以用這張圖來表示:
一般cpu的中斷控制器,都有許多中斷輸入線,每個中斷線對應一個中斷號,由一個獨立的開關控制。 每個中斷線,都允許獨立設置為實時中斷還是異步信號,該開關可能是硬件開關,也可能是軟件開關,依賴于具體硬件以及移植者的選擇。 異步信號有一個獨立的總使能開關,也就意味著,異步信號是可以整體關斷的。 實時中斷沒有獨立的使能開關,意味著,實時中斷是不允許集體關斷的。 異步信號和實時中斷有一個公共的總使能開關,意味著,允許用戶關閉所有中斷。 Djyos中,“異步信號使能開關”同時又是關調度開關,djyos沒有獨立的調度開關,使得djyos的臨界區保護代碼更加簡潔,和用戶希望通過“用中斷實現異步信號”來簡化軟件設計的目的,是相適應的。簡潔的調度器,也是djyos更加可靠。由于關異步信號和關中斷等同,使得異步信號處理函數可以使用操作系統提供的全部服務,更加方便易用。 操作系統運行過程中,總中斷使能開關時從來不會被關閉的,所以,djyos的實時中斷,達到裸跑的速度,這是架構決定的,跟中斷響應的代碼是否精簡無關。 雖然知道中斷實時性對RTOS極其重要,但許多RTOS,由于不能對中斷做正確的抽象,不能從架構角度提高實時性,往往愛使用一些很復雜的技巧來提高性能。但過多的技巧,實現高性能的同時,可能帶來不穩定因素。殊不知,對于實時控制系統來說,穩定性可靠性才是核心。而且,即使再巧妙的技巧,都不能對實時性的提高,帶來質的變化。 3.? ???Djyos中斷系統的特點 1、??實時中斷具有裸跑的實時性,使得有些原本不能使用操作系統的應用,可以享受操作系統的服務。 2、??編寫異步信號編程更加方便,像普通事件一樣,允許使用所有操作系統服務。 3、??系統更加簡潔可靠,與用戶“用中斷實現異步信號以簡化軟件”的目標相一致。

總結

以上是生活随笔為你收集整理的关于中断的一点点认识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。