為什么interrupt context中不能調用導致睡眠的kernel API呢?如果驅動這么做會導致什么樣的后果呢? 本文的實驗在X86 64bit + 標准4.4內核上完成。 看下一個中斷: #define DRIVER_DESC "context schedule ...
前幾天被人問到了 中斷里為什么不能睡眠 這個問題,之前我並沒有深究過這個問題。后來查了一下資料,基本上所有的論壇和博客都說:因為中斷沒有上下文,如果睡眠被切換出去之后就無法再切回來。我實在是不能認同這種說法,中斷確實沒有自己的上下文,但是中斷發生的時候它使用的是被中斷進程的上下文,如果真的讓中斷睡眠的話在switch to函數里會把當前中斷的cs:eip保存到被中斷進程的thread里,所以在一些 ...
2020-04-29 22:22 0 765 推薦指數:
為什么interrupt context中不能調用導致睡眠的kernel API呢?如果驅動這么做會導致什么樣的后果呢? 本文的實驗在X86 64bit + 標准4.4內核上完成。 看下一個中斷: #define DRIVER_DESC "context schedule ...
中斷分析 首先來看中斷的流程: 如果條件滿足了(即:有中斷描述符,並成為調度器的調度單位,棧也不溢出了,理論上是可以做到中斷睡眠的),中斷是可以睡眠的,但會引起很多問題. 例如,你在時鍾中斷中睡眠了,那操作系統的時鍾就亂了,調度器也了失去依據;例如,你在一個IPI(處理器間中斷)中 ...
睡眠和休眠都是筆記本電腦的節能方式,但有細微的差別: 睡眠還保持着開機狀態的,休眠是關機了,但是再次開機之后和關閉時的系統狀態是一樣的。 睡眠還是保持着系統運行數據在內存中,而休眠則將內存中的數據保存在硬盤中。(應該是虛擬內存) 睡眠的喚醒時間應該比休眠要短。 參考來源 ...
一個是只要是內存動態申請,必然涉及到了堆,所以必然是要做共享資源保護的,FreeRTOS里,用了臨界區,沒毛病。第二,只要是內存的動態管理,必然涉及到了復雜的算法,他的運行時間是帶有很強的不確定性的。在中斷里跑算法,跑耗時的操作,只會是坑你自己而已。 當你在一個多線程環境內使用堆時,會出 ...
中斷的概念 中斷是指在程序執行過程中,出現某種緊急事件,CPU暫停執行現行程序,轉去執行處理該事件的程序——中斷服務程序,執行完后再返回到被暫停的程序繼續執行,這一過程稱為中斷。 中斷源 引起中斷的設備或事件稱為中斷源。 分類: 可籠統地分為兩類:CPU內產生的,稱為內部中斷 ...
最近,我看了《睡眠革命》一書,作者介紹了如何使用獨創的R90睡眠法進行高效睡眠,顛覆了我以往對睡眠的認知。這本書是英超多個豪門球隊(曼聯、阿森納等)特聘睡眠教練、前英國睡眠協會會長——利特爾黑兒斯寫的。 下面是我整理的筆記內容。 遵守晝夜節律 圖解:身體在晚上9點開始分泌褪黑素讓我們產生 ...
/* 上一例在主函數中利用累計定時器中斷的次數來實現獨立按鍵的檢測,但是 如果在某些項目中,需要主函數里面間歇性地執行一些一氣呵成的耗時任務, 當主函數正在執行一氣呵成的耗時任務時(前提沒有關閉定時器中斷),這個時候 如果有按鍵按下來,就有可能沒有被及時響應而遺漏了。 解決辦法 ...
在程序里面使用到定時器,初始化的時候賦值分頻系數和自動重裝值: TIM3_Int_Init(5000-1,8400-1); 但是在應用里面經常需要這個定時器能夠扮演很多時間長度的角色,在中斷或者打開定時器前 加入對arr重新賦值,就可以定時不同的長度 TIM3->ARR= arr ...