導航:首頁 > 操作系統 > linux中斷延時

linux中斷延時

發布時間:2022-10-05 18:36:59

linux中斷服務程序中可以調用sleep()嗎

中斷服務程序不能執休眠,這是一般的建議,其實有些驅動程序中,也執行一些短暫的延時,比如使用usleep這樣的函數,只要時間短就對系統性能影響是不大的。但是要注意,只有usleep這些函數可以使用,因為這些函數實際上CPU忙等待形成延時,實際上就是一個While循環。

㈡ linux計劃任務如何實現延時執行腳本,求簡潔實例

兩個方法:
1)crontab中的時間設定最小可以到分鍾,如果你的延時是分鍾級別的,直接放大crontab中的分鍾設定即可。
2)修改腳本,在腳本開頭(當然要在shell聲明語句如#!/bin/bash之後)加usleep(微秒級)或sleep命令(秒級),也可以實現延時。

㈢ linux下怎樣在for循環中設置延遲,也就是每次循環都要暫停一段時間

調用函數 Sleep 3, ,休息三秒在繼續。

㈣ 在linux下,想用sleep函數實現延時五秒,應該怎麼設參數

使用許可權 : 所有使用者
使用方式 : sleep [--help] [--version] number[smhd]
說明 : sleep 可以用來將目前動作延遲一段時間
參數說明 :
--help : 顯示輔助訊息
--version : 顯示版本編號
number : 時間長度,後面可接 s、m、h 或 d
其中 s 為秒,m 為 分鍾,h 為小時,d 為日數
例子 :
顯示目前時間後延遲 1 分鍾,之後再次顯示時間 :
date;sleep 1m;date

這個命令更多應用於shell腳本編程里和程序里

如下面的一段程序:

應用程序:

復制代碼
代碼如下:

#include <syswait.h>
usleep(n) //n微秒
Sleep(n)//n毫秒
sleep(n)//n秒
驅動程序:
#include <linux/delay.h>
mdelay(n) //milliseconds 其實現
#ifdef notdef
#define mdelay(n) (\
{unsigned long msec=(n); while (msec--) udelay(1000);})
#else
#define mdelay(n) (\
(__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \
({unsigned long msec=(n); while (msec--) udelay(1000);}))
#endif
調用asm/delay.h的udelay,udelay應該是納秒級的延時
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒

每一個平台不太一樣,最好自己定義一套跨平台的宏進行控制

秒還是微秒?關於延時函數sleep()
因為要寫一段代碼,需要用到sleep()函數,在我印象中,sleep(10)好像是休眠10微秒,結果卻是休眠了10秒(在Linux下)。覺得很奇怪,因為頭兒也記得好像是微秒為單位的。所以就查了一下。

原來linux下的sleep函數原型為:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函數原型為:
void Sleep(DWORD dwMilliseconds);
也就是說,Linux下(使用的gcc的庫),sleep()函數是以秒為單位的,sleep(1);就是休眠1秒。而MFC下的sleep()函數是以微秒為單位的,sleep(1000);才是休眠1秒。原來如此啊。而如果在Linux下也用微妙為單位休眠,可以使用線程休眠函數:void usleep(unsigned long usec);當然,使用的時候別忘記#include <system.h>哦。

另外值得一提的是,linux下還有個delay()函數,原型為extern void delay(unsigned int msec);它可以延時msec*4毫秒,也就是如果想延時一秒鍾的話,可以這么用 delay(250);

㈤ 如何測試嵌入式linux系統中斷延遲時間

這種毫秒甚至有可能微秒級的延遲只有接示波器看波形了吧

㈥ Linux實例網站訪問丟包延時高怎麼解決

需要從兩個方向找原因
1、網路問題,一般丟包和延時高都是網路出現問題了。如果linux實例在區域網內部,請檢查交換機等設備。如果是託管到機房的或者使用雲伺服器,請先檢查自己的網路是否有問題,比如打開其他網站看看,如果沒問題就聯系機房或者雲提供商協助檢查處理。
2、linux實例問題,如果linux負載太高也有可能出現訪問丟包嚴重,延時高的問題,這種情況下只能通過top找到導致負載高或者消耗CPU的進程,能停止掉或者殺掉,再看看延時是否就下降了。

㈦ linuxn內核驅動延時怎麼做

jiffies
計數器定時器中斷由系統定時硬體以規律地間隔產生; 這個間隔在啟動時由內核根據 HZ 值來編程, HZ 是一個體系依賴的值, 每次發生一個時鍾中斷, 一個內核計數器的值遞增.這個計數器在系統啟動時初始化為 0, 因此它代表從最後一次啟動以來的時鍾嘀噠的數目.
這個計數器和來讀取它的實用函數位於 , 盡管你會常常只是包含 ,
#includeunsigned long j, stamp_1, stamp_half, stamp_n; j = jiffies; /* read the current value */stamp_1 = j + HZ; /* 1 second in the future */stamp_half = j + HZ/2; /* half a second */stamp_n = j + n * HZ / 1000; /* n milliseconds */

忙等待
如果你想延時執行多個時鍾嘀噠, 允許在值中某些疏忽, 最容易的( 盡管不推薦 ) 的實現是一個監視 jiffy 計數器的循環. 這種忙等待實現常常看來象下面的代碼, 這里j1 是 jiffies 的在延時超時的值:
while (time_before(jiffies, j1)){}
超時 到目前為止所展示的次優化的延時循環通過查看 jiffy 計數器而不告訴任何人來工作. 但是最好的實現一個延時的方法, 如你可能猜想的, 常常是請求內核為你做.有 2 種方法來建立一個基於 jiffy 的超時, 依賴於是否你的驅動在等待其他的事件.
如果你的驅動使用一個等待隊列來等待某些其他事件, 但是你也想確保它在一個確定時間段內運行, 可以使用 wait_event_timeout 或者wait_event_interruptible_timeout:
#includelong wait_event_timeout(wait_queue_head_t q, condition, long timeout);long wait_event_interruptible_timeout(wait_queue_head_t q, condition, long timeout);
這些函數在給定隊列上睡眠, 但是它們在超時(以 jiffies 表示)到後返回. 因此, 它們實現一個限定的睡眠不會一直睡下去. 注意超時值表示要等待的 jiffies 數, 不是一個絕對時間值. 這個值由一個有符號的數表示, 因為它有時是一個相減運算的結果, 盡管這些函數如果提供的超時值是負值通過一個 printk 語句抱怨. 如果超時到, 這些函數返回 0; 如果這個進程被其他事件喚醒, 它返回以 jiffies 表示的剩餘超時值. 返回值從不會是負值, 甚至如果延時由於系統負載而比期望的值大.
wait_event_timeout 和 wait_event_interruptible_timeout 被設計為有硬體驅動存在, 這里可以用任何一種方法來恢復執行: 或者有人調用 wake_up 在等待隊列上, 或者超時到. 這不適用於 jitqueue, 因為沒人在等待隊列上調用 wake_up ( 畢竟, 沒有其他代碼知道它 ), 因此這個進程當超時到時一直喚醒. 為適應這個特別的情況, 這里你想延後執行不等待特定事件, 內核提供了 schele_timeout 函數, 因此你可以避免聲明和使用一個多餘的等待隊列頭:
#includesigned long schele_timeout(signed long timeout);
這里, timeout 是要延時的 jiffies 數. 返回值是 0 除非這個函數在給定的 timeout 流失前返回(響應一個信號). schele_timeout 請求調用者首先設置當前的進程狀態, 因此一個典型調用看來如此:
set_current_state(TASK_INTERRUPTIBLE);schele_timeout (delay);
第一行調用 set_current_state 來設定一些東西以便調度器不會再次運行當前進程, 直到超時將它置回 TASK_RUNNING 狀態. 為獲得一個不可中斷的延時, 使用TASK_UNINTERRUPTIBLE 代替.
短延時
當一個設備驅動需要處理它的硬體的反應時間, 涉及到的延時常常是最多幾個毫秒.
內核函數 ndelay, udelay, 以及 mdelay 對於短延時好用, 分別延後執行指定的納秒數, 微秒數或者毫秒數. 它們的原型是:
#includevoid ndelay(unsigned long nsecs);void udelay(unsigned long usecs);void mdelay(unsigned long msecs);
有另一個方法獲得毫秒(和更長)延時而不用涉及到忙等待. 文件 聲明這些函數:
void msleep(unsigned int millisecs);unsigned long msleep_interruptible(unsigned int millisecs);void ssleep(unsigned int seconds)
前 2 個函數使調用進程進入睡眠給定的毫秒數. 一個對 msleep 的調用是不可中斷的; 你能確保進程睡眠至少給定的毫秒數. 如果你的驅動位於一個等待隊列並且你想喚醒來打斷睡眠, 使用 msleep_interruptible. 從 msleep_interruptible 的返回值正常地是 0; 如果, 但是, 這個進程被提早喚醒, 返回值是在初始請求睡眠周期中剩餘的毫秒數. 對 ssleep 的調用使進程進入一個不可中斷的睡眠給定的秒數.

㈧ 測試linux中斷延遲時間的程序代碼

在中斷服務程序中翻轉一個GPIO的輸出狀態,用示波器測量此GPIO的輸出波形並且測量頻率,這個是測量中斷調用頻度的。 如果要測量中斷的處理時間,則可以在進入中斷服務程序時設置GPIO狀態,退出時再設回來,用示波器可測量執行時間。

㈨ linux內核中的延時工作機制有哪些

MontaVista 4.0 (kernel version 2.6.X) 支持HRT,可以實現微妙級的延時,好像還到不了納秒。用關中斷和busy loop來實現當然可以,但是關中斷時間不能太長,而且只能在內核空間實現,肯定影響其他任務調度。如果需要長時間產生這樣的信號,那感覺用不太適合用Linux來實現。

閱讀全文

與linux中斷延時相關的資料

熱點內容
安卓如何重壓開槍 瀏覽:377
航天時代飛鵬圖像處理演算法 瀏覽:521
php比較兩個文件 瀏覽:737
加密貨幣市場活躍 瀏覽:334
最便宜的雲盤伺服器架設傳奇 瀏覽:790
java反向工程 瀏覽:110
pdf文檔轉換excel 瀏覽:8
主角叫楚天的都市小說 瀏覽:754
程序員三重境界 瀏覽:871
菜雞方舟上怎麼開伺服器 瀏覽:727
馬林固件編譯錯誤 瀏覽:910
市場營銷案例pdf 瀏覽:770
魔爪閱讀網 瀏覽:19
app地推業績統計在哪裡 瀏覽:993
維語電影網站大全 瀏覽:958
程序員骨腫瘤上熱搜 瀏覽:847
聚優電影 瀏覽:45
國企保底工資演算法 瀏覽:730
視聽說伺服器地址是什麼意思 瀏覽:657
一部男主叫大志的電影叫 瀏覽:650