<style id="7i3y3"></style>

      <sub id="7i3y3"><i id="7i3y3"></i></sub>

        午夜精品一区二区三区成人,中文字幕av一区二区,亚洲AVAV天堂AV在线网阿V,肥臀浪妇太爽了快点再快点,国产网友愉拍精品视频手机,国产精品无码a∨麻豆,久久中文字幕一区二区,a级国产乱理伦片在线观看al
        首頁 新聞 工控搜 論壇 廠商論壇 產品 方案 廠商 人才 文摘 下載 展覽
        中華工控網首頁
          P L C | 變頻器與傳動 | 傳感器 | 現場檢測儀表 | 工控軟件 | 人機界面 | 運動控制
          D C S | 工業以太網 | 現場總線 | 顯示調節儀表 | 數據采集 | 數傳測控 | 工業安全
          電 源 | 嵌入式系統 | PC based | 機柜箱體殼體 | 低壓電器 | 機器視覺
        Linux內核學習之BogoMIPS值的計算
        深圳市盈鵬飛科技有限公司
        收藏本文     查看收藏
           對于每一個linux編程愛好者來說,他們都有一個共同的心愿,就是了解linux的內核。但是linux內核的龐大與復雜讓人望而生畏。往往是鼓足勇氣一頭扎進去,學得昏天黑地的,卻沒有學到什么。這里我想說,初學者不妨先學習學習內核中一些簡單的函數,從中既可以得到樂趣,又能了解到內核的一些編程風格。然后,再將linux劃分成幾個部分,如進程調度、內存管理等,對每個部分從原理上去把握了解。接著,在詳細分析各個部分的具體實現。最后,各部分串在一起,把過去單獨分析時,不懂的地方加以重新了解。這樣循環監禁,可以讓我們更快更系統的學習linux的內核。
           這是我對內核學習的一些理解,歡迎各位提寶貴意見。我今天向大家介紹的是linux內核中一個有趣的函數calibrate_delay()。
           calibrate_delay()函數可以計算出cpu在一秒鐘內執行了多少次一個極短的循環,計算出來的值經過處理后得到BogoMIPS值,Bogo是Bogus(偽)的意思,MIPS是millions of instructions per second(百萬條指令每秒)的縮寫。這樣我們就知道了其實這個函數是linux內核中一個cpu性能測試函數。由于內核對這個數值的要求不高,所以內核使用了一個十分簡單而有效的算法用于得到這個值。這個值雖然不準確,但也足以令我們心動。如果你想了解自己機器的BogoMIPS,你可以察看/proc/cpuinfo文件中的最后一行。在你知道了自己cpu的BogoMIPS之后,如果你覺得不過癮,那么讓我們一起來看看calibrate_delay函數是怎么完成工作的。
           下面是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()函數分析如下:
           1 定義計算BogoMIPS的精度,這個值越大,則計算出的BogoMIPS越精確。
           7 loops_per_sec為每秒鐘執行一個極短的循環的次數。
           9 printk()是內核消息日志打印函數,用法同printf()函數。
           10 第10至21行,是第一次計算loops_per_sec的值,這次計算只是一個粗略的計算,為下面的計算打好基礎。
           11 第11 至16行,是用于等待一個新的定時器滴答(它大概是百萬分之一秒)的開始?梢韵胂笪覀円嬎鉲oops_per_sec的值,可以在一個滴答的開始時,立即重復執行一個極短的循環,當一個滴答結束時,這個循環執行了多少次就是我們要求的初步的值,再用它乘以一秒鐘內的滴答數就是loops_per_sec的值。
           12 系統用jiffies全局變量記錄了從系統開始工作到現在為止,所經過的滴答數。它會被內核自動更新。這行語句用于記錄當前滴答數到tick變量中。
           13 注意這是一個沒有循環體得空循環,第14行僅有一個“;”號。這條循環語句是通過判斷tick的值與jiffies的值是否不同,來判斷jiffies是否變化,即是否一個新的滴答開始了
           16 記錄下新的滴答數以備后用。
           17 根據loops_per_sec值進行延時(及執行loop_per_sec次極短循環)。
           18 以下三行用于判斷執行的延時是否超過一個滴答。一般loops_per_sec的初始值并不大,所以循環會逐步加大loops_per_sec的值,直到延時超過一個滴答。我們可以看出,前一次loops_per_sec的值還因太小不合適時,經過一次增大,它提高了兩倍,滿足了循環條件,跳出循環,而這個值實在是誤差太大,所以我們還要經過第二次計算。這里還要注意的是通過上面的分析,我們可以知道更加精確的loops_per_sec的值應該在現在的值與它的一半之間。
           23 這里開始就是第二次計算了。它用折半查找法在我們上面所說的范圍內計算出了更精確的loops_per_sec的值。
           25 義查找范圍的最小值,我把它稱為起點。
           26 定義查找范圍,這樣我們就可以看到loop_per_sec的值在“起點”與“起點加范圍(終點)”之間。
           27 進入循環,將查找范圍減半。
           28 重新定義起點,起點在“原起點加27行減半范圍”處,即新起點在原先起點與終點的中間。這時我們可以看出loops_per_sec在“新起點”與“新起點加減半范圍(新終點)”之間。
           29 第29至32行與第12至17行一致,都是等待新的滴答,執行延時。
           33 如果延時過短,說明loops_per_sec的值小了,將會跳過這部分,再次進入循環。它將是通過不斷的折半方式來增大。如果延時過長,說明loops_per_sec的值大了,將起點重新返回原起點,當再次進入循環,由于范圍減半,故可以達到減小的效果。
           38 計算出每秒執行極短循環的次數。從這里我們可以看出它好像是個死循環,所以加入了lps_precision變量,來控制循環,即LPS_PREC越大,循環次數越多,越精確?赡苓@些不太好懂,總的說來,它首先將loop_per_sec的值定為原估算值的1/2,作為起點值(我這樣稱呼它),以估算值為終點值.然后找出起點值到終點值的中間值.用上面相同的方法執行一段時間的延時循環.如果延時超過了一個tick,說明loop_per_sec值偏大,則仍以原起點值為起點值,以原中間值為終點值,以起點值和終點值的中間為中間值繼續進行查找,如果沒有超過一個tick,說明loop_per_sec偏小,則以原中間值為起點值,以原終點值為終點值繼續查找。
           40 出BogoMIPS,并打印。
           至此,我們就分析完了calibrate_delay()函數。你從中學到了什么沒有?如果你還有什么不明白的地方,可以給我發Email,如果你認為有什么更好的方法,歡迎來信我們一同探討,我的Email是:feixiangniao@sina.com

         

        狀 態: 離線

        公司簡介
        產品目錄

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

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

        主站蜘蛛池模板: 疯狂做受xxxx高潮欧美日本| 精品欧美小视频在线观看| 精品国产一区二区三区2021| 亚洲熟妇少妇任你躁在线观看无码| 日韩人妻少妇一区二区三区 | 国产一级黄色片在线观看| 成人一区二区三区久久精品| 人妻激情视频一区二区三区 | 丰满少妇内射一区| 日本精品不卡一二三区| 国产精品久久久天天影视香蕉 | P尤物久久99国产综合精品| gogogo高清免费观看| 欧产日产国产精品精品| 亚洲精品久久片久久久久| 日本经典中文字幕人妻| 亚洲人成网站在线播放2019| 丰满人妻熟妇乱又仑精品| 高清有码国产一区二区| 一区二区三区国产偷拍| 久久无码中文字幕免费影院| 亚洲精品一区二区三区四区乱码 | 免费国产裸体美女视频全黄| 亚洲熟女乱色综合一区| 丰满高跟丝袜老熟女久久| 十八禁午夜福利免费网站| 国产精品国产三级国快看| 国产欧美精品一区aⅴ影院| 大地资源免费视频观看| 色偷偷www.8888在线观看| 被黑人巨大一区二区三区| 少妇人妻偷人一区二区| 中文字幕无码人妻aaa片| 午夜视频免费试看| 久久国产综合色免费观看| 免费播放一区二区三区| 又大又硬又爽免费视频| a午夜国产一级黄片| 国产AV永久无码青青草原| 成人性无码专区免费视频| 又湿又紧又大又爽A视频男|