999国内精品永久免费视频,色偷偷9999www,亚洲国产成人爱av在线播放,6080亚洲人久久精品,欧美超高清xxxhd

首頁 新聞 工控搜 論壇 廠商論壇 產(chǎn)品 方案 廠商 人才 文摘 下載 展覽
中華工控網(wǎng)首頁
  P L C | 變頻器與傳動 | 傳感器 | 現(xiàn)場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
  D C S | 工業(yè)以太網(wǎng) | 現(xiàn)場總線 | 顯示調(diào)節(jié)儀表 | 數(shù)據(jù)采集 | 數(shù)傳測控 | 工業(yè)安全
  電 源 | 嵌入式系統(tǒng) | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
Linux內(nèi)核學習之BogoMIPS值的計算
深圳市盈鵬飛科技有限公司
收藏本文     查看收藏
   對于每一個linux編程愛好者來說,他們都有一個共同的心愿,就是了解linux的內(nèi)核。但是linux內(nèi)核的龐大與復雜讓人望而生畏。往往是鼓足勇氣一頭扎進去,學得昏天黑地的,卻沒有學到什么。這里我想說,初學者不妨先學習學習內(nèi)核中一些簡單的函數(shù),從中既可以得到樂趣,又能了解到內(nèi)核的一些編程風格。然后,再將linux劃分成幾個部分,如進程調(diào)度、內(nèi)存管理等,對每個部分從原理上去把握了解。接著,在詳細分析各個部分的具體實現(xiàn)。最后,各部分串在一起,把過去單獨分析時,不懂的地方加以重新了解。這樣循環(huán)監(jiān)禁,可以讓我們更快更系統(tǒng)的學習linux的內(nèi)核。
   這是我對內(nèi)核學習的一些理解,歡迎各位提寶貴意見。我今天向大家介紹的是linux內(nèi)核中一個有趣的函數(shù)calibrate_delay()。
   calibrate_delay()函數(shù)可以計算出cpu在一秒鐘內(nèi)執(zhí)行了多少次一個極短的循環(huán),計算出來的值經(jīng)過處理后得到BogoMIPS值,Bogo是Bogus(偽)的意思,MIPS是millions of instructions per second(百萬條指令每秒)的縮寫。這樣我們就知道了其實這個函數(shù)是linux內(nèi)核中一個cpu性能測試函數(shù)。由于內(nèi)核對這個數(shù)值的要求不高,所以內(nèi)核使用了一個十分簡單而有效的算法用于得到這個值。這個值雖然不準確,但也足以令我們心動。如果你想了解自己機器的BogoMIPS,你可以察看/proc/cpuinfo文件中的最后一行。在你知道了自己cpu的BogoMIPS之后,如果你覺得不過癮,那么讓我們一起來看看calibrate_delay函數(shù)是怎么完成工作的。
   下面是calibrate_delay的源代碼,我在每行之前都加上了行號,以便講解。
   1 #define LPS_PREC 8
   2 void __init calibrate_delay(void)
   3 {
   4  unsigned long ticks,loopbit;
   5  int lps_precision=LPS_PREC
   6 
   7  loops_per_sec=(1<<12);
   8 
   9  printk(“Calibrating delay loop…”);
   10  while(loops_per_sec<<=1) {
   11   /* wait for “start of” clock tick */
   12   ticks=jiffies;
   13   while(ticks==jiffies)
   14    /* nothing */;
   15   /* Go… */
   16   ticks=jiffies;
   17   __delay(loops_per_sec);
   18   ticks=jiffies-ticks;
   19   if(ticks)
   20    break;
   21  }
   22 
   23 /* Do a binary approximation to get loops_per_second set
   24 * to equal one clock (up to lps_precision bits) */
   25  loops_per_sec >>=1;
   26  loopbit=loop_per_sec;
   27  while(lps_precision-- && (loopbit >>=1) ) {
   28   loops_per_sec |= loopbit;
   29   ticks=jiffies;
   30   while(ticks==jiffies);
   31   ticks=jiffies;
   32   __delay(loops_per_sec);
   33   if(jiffies!=ticks) /* longer than 1 tick */
   34    loops_per_sec &=~loopbit;
   35  }
   36 /* finally,adjust loops per second in terms of seconds
   37 * instead of clocks */
   38  loops_per_sec *= HZ;
   39 /* Round the value and print it */
   40  printk(“%lu.%02lu BogoMIPSn”,
   41   (loops_per_sec+2500)/500000,
   42   ((loops_per_sec+2500)/5000) % 100);
   43 }
   對calibrate_delay()函數(shù)分析如下:
   1 定義計算BogoMIPS的精度,這個值越大,則計算出的BogoMIPS越精確。
   7 loops_per_sec為每秒鐘執(zhí)行一個極短的循環(huán)的次數(shù)。
   9 printk()是內(nèi)核消息日志打印函數(shù),用法同printf()函數(shù)。
   10 第10至21行,是第一次計算loops_per_sec的值,這次計算只是一個粗略的計算,為下面的計算打好基礎。
   11 第11 至16行,是用于等待一個新的定時器滴答(它大概是百萬分之一秒)的開始。可以想象我們要計算loops_per_sec的值,可以在一個滴答的開始時,立即重復執(zhí)行一個極短的循環(huán),當一個滴答結束時,這個循環(huán)執(zhí)行了多少次就是我們要求的初步的值,再用它乘以一秒鐘內(nèi)的滴答數(shù)就是loops_per_sec的值。
   12 系統(tǒng)用jiffies全局變量記錄了從系統(tǒng)開始工作到現(xiàn)在為止,所經(jīng)過的滴答數(shù)。它會被內(nèi)核自動更新。這行語句用于記錄當前滴答數(shù)到tick變量中。
   13 注意這是一個沒有循環(huán)體得空循環(huán),第14行僅有一個“;”號。這條循環(huán)語句是通過判斷tick的值與jiffies的值是否不同,來判斷jiffies是否變化,即是否一個新的滴答開始了
   16 記錄下新的滴答數(shù)以備后用。
   17 根據(jù)loops_per_sec值進行延時(及執(zhí)行l(wèi)oop_per_sec次極短循環(huán))。
   18 以下三行用于判斷執(zhí)行的延時是否超過一個滴答。一般loops_per_sec的初始值并不大,所以循環(huán)會逐步加大loops_per_sec的值,直到延時超過一個滴答。我們可以看出,前一次loops_per_sec的值還因太小不合適時,經(jīng)過一次增大,它提高了兩倍,滿足了循環(huán)條件,跳出循環(huán),而這個值實在是誤差太大,所以我們還要經(jīng)過第二次計算。這里還要注意的是通過上面的分析,我們可以知道更加精確的loops_per_sec的值應該在現(xiàn)在的值與它的一半之間。
   23 這里開始就是第二次計算了。它用折半查找法在我們上面所說的范圍內(nèi)計算出了更精確的loops_per_sec的值。
   25 義查找范圍的最小值,我把它稱為起點。
   26 定義查找范圍,這樣我們就可以看到loop_per_sec的值在“起點”與“起點加范圍(終點)”之間。
   27 進入循環(huán),將查找范圍減半。
   28 重新定義起點,起點在“原起點加27行減半范圍”處,即新起點在原先起點與終點的中間。這時我們可以看出loops_per_sec在“新起點”與“新起點加減半范圍(新終點)”之間。
   29 第29至32行與第12至17行一致,都是等待新的滴答,執(zhí)行延時。
   33 如果延時過短,說明loops_per_sec的值小了,將會跳過這部分,再次進入循環(huán)。它將是通過不斷的折半方式來增大。如果延時過長,說明loops_per_sec的值大了,將起點重新返回原起點,當再次進入循環(huán),由于范圍減半,故可以達到減小的效果。
   38 計算出每秒執(zhí)行極短循環(huán)的次數(shù)。從這里我們可以看出它好像是個死循環(huán),所以加入了lps_precision變量,來控制循環(huán),即LPS_PREC越大,循環(huán)次數(shù)越多,越精確?赡苓@些不太好懂,總的說來,它首先將loop_per_sec的值定為原估算值的1/2,作為起點值(我這樣稱呼它),以估算值為終點值.然后找出起點值到終點值的中間值.用上面相同的方法執(zhí)行一段時間的延時循環(huán).如果延時超過了一個tick,說明loop_per_sec值偏大,則仍以原起點值為起點值,以原中間值為終點值,以起點值和終點值的中間為中間值繼續(xù)進行查找,如果沒有超過一個tick,說明loop_per_sec偏小,則以原中間值為起點值,以原終點值為終點值繼續(xù)查找。
   40 出BogoMIPS,并打印。
   至此,我們就分析完了calibrate_delay()函數(shù)。你從中學到了什么沒有?如果你還有什么不明白的地方,可以給我發(fā)Email,如果你認為有什么更好的方法,歡迎來信我們一同探討,我的Email是:feixiangniao@sina.com

 

狀 態(tài): 離線

公司簡介
產(chǎn)品目錄

公司名稱: 深圳市盈鵬飛科技有限公司
聯(lián) 系 人: 李希崗
電  話: 0086-13602511395
傳  真: 0755-82523175,82523176-819
地  址: 深圳市福田區(qū)福明路40號,雷圳大廈12A06
郵  編: 518033
主  頁:
 
該廠商相關技術文摘:
WINCE下如何添加CPL應用程序
Wince sqlite3移植
EAC-C925開機畫面實現(xiàn)手冊
英貝德推出單板機產(chǎn)品軟件升級解決方案(WinCE篇)
EP9315電路設計要點
Linux下創(chuàng)建和使用RamDisk的技巧
英貝德科技移植PPP大揭秘:PPP撥號在ARM2410平臺上的移植
AT91SAM9263在人機界面方面的應用
詳解WinCE下USB Host驅(qū)動開發(fā)(2)
詳解WinCE下USB Host驅(qū)動開發(fā)(1)
WinCE驅(qū)動中設備中斷的處理
更多文摘...
立即發(fā)送詢問信息在線聯(lián)系該技術文摘廠商:
用戶名: 密碼: 免費注冊為中華工控網(wǎng)會員
請留下您的有效聯(lián)系方式,以方便我們及時與您聯(lián)絡

關于我們 | 聯(lián)系我們 | 廣告服務 | 本站動態(tài) | 友情鏈接 | 法律聲明 | 不良信息舉報
工控網(wǎng)客服熱線:0755-86369299
版權所有 中華工控網(wǎng) Copyright©2022 Gkong.com, All Rights Reserved