<nobr id="zkazv"></nobr>

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

       

      狀 態(tài): 離線

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

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

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

      主站蜘蛛池模板: 色综合色综合综合综合综合| 国产91精品一区二区亚洲| 国产国产成人精品久久蜜| 日韩a∨精品日韩在线观看 | 亚洲区一区二区三区亚洲| 国产蜜臀av在线一区在线| 色综合国产一区二区三区| 成人自拍小视频在线观看| 麻花传媒在线观看免费| 中文字幕精品久久久久人妻红杏1| 成人看的污污超级黄网站免费| 大陆精大陆国产国语精品| 国产精品天干天干综合网| 日本中文字幕一区二区三| 精品国产一区二区亚洲人| 国内自拍偷拍一区二区三区| 91麻豆精品国产91久| 国产色一区二区三区四区| 一区二区三区午夜无码视频| 18禁黄无遮挡网站免费| 精品日韩亚洲av无码| 亚洲成人一区二区av| 精品日韩色国产在线观看| 久久精品国产亚洲αv忘忧草| 欧洲码亚洲码的区别入口| 色综合久久久久综合体桃花网| 国产精品原创不卡在线| 在线国产毛片| 亚洲一区精品伊人久久| 麻豆成人传媒一区二区| 日韩在线视频线观看一区| 国产免费一区二区不卡| 国产办公室秘书无码精品99| 日韩丝袜欧美人妻制服| 国产精品麻豆中文字幕| 99中文字幕国产精品| 日本五十路熟女一区二区| 国产福利片一区二区三区| 亚洲一精品一区二区三区| 激情久久av一区二区三区| 综合久久av一区二区三区|