為何 for只要 4 us

2021-09-12 07:06:37 字數 2781 閱讀 7725

雖然 delaymicroseconds( ) 很好用,

可是常常有人喜歡用 for 來做 delay 延遲, 然後就發現怪怪的 !!

其實如下這句寫法是等於沒寫的:

for(int i=0; i < 32000; ++i);
如果你這樣測量:

unsigned long begt = micros( );

for(int i=0; i < 32000; ++i);;;

unsigned long endt = micros( );

serial.println(string("run time=") + (endt-begt) );

你會發現印出 run time=4

甚至有時還出現 run time=0

怎會這樣?

arduino 的 cpu 有這麼快嗎?.. arduino當然不可能那麼快 !

阿那怎會只用 4 us ?

其實是因為 compiler 很聰明, 發現你那 for loop 根本沒做事, 於是就很好心的幫你移除了, 等於沒寫!

所以, 如果發現 run time=4 是因為 micros( ) 一定是四的倍數,

而這個 4 其實是因為執行了 begt = micros( ); 需要大約 2 us 的時間!

偶而會出現 0 則是剛好做 endt = micros( ); 正好還沒變化, 但很可能快要變化了,

注意剛說了, micros( ) 每次變化就是多 4, 一定是四的倍數 !

如果控制 for 的 i 是全域性變數, 則目前的 arduino 就不會把空白的 for 移除掉!

為了方便好奇的網友測試,

以下我寫了五個版本如下, 都只改一句, 大家可以測試看看

(1) for loop 會被移除, run time 大約 4

注意然在 setup( ) 與 loop( ) 之間有乙個全域性變數 int i;

但以下這 for(int i 的 i 當然不是外面在 void loop( ) 之前那個 i,

因為區域性變數本來就可以與外面全域性變數同名!

compiler 發現這 for loop 沒事可做, 主動把整個 for loop 全部移除!

void setup( ) 

int i;

void loop( )

endt = micros( );

serial.println(string("run time =") + (endt-begt) +"us" );

delay(3388);

} // loop(

(2) for loop 正常執行, run time 大約 1608us

注意這 for(int i 當然也不是外面在 void loop( ) 之前那個 i,

還有, 因為這 for loop 內部有指令 「nop」,

編譯程式 compiler 知道不可以把 for loop 移除 !

void setup( ) 

int i;

void loop( )

endt = micros( );

serial.println(string("run time =") + (endt-begt) +"us" );

delay(3388);

} // loop(

(3) for loop 正常執行, run time 至少 1400us (留給你測

注意以下這個 for( ) 的 i 是外面全域性變數的 i

void setup( ) 

int i;

void loop( )

endt = micros( );

serial.println(string("run time =") + (endt-begt) +"us" );

delay(3388);

} // loop(

//(4) for loop 正常執行, run time 至少 1600us (留給你測

注意以下這個 for( ) 的 i 也是外面全域性變數的 i

void setup( ) 

int i;

void loop( )

endt = micros( );

serial.println(string("run time =") + (endt-begt) +"us" );

delay(3388);

} // loop(

(5) for loop 會被移除, run time 大約 4

怎麼會 ?!

for loop 內不是有 kk = i; 要做事嗎?

可是 run time 只有 4 us, 你認為 for loop 有存在嗎?

不過, 很神奇的, kk 答案是正確的喔 (3199)!

可見 compiler 有多聰明了

void setup( ) ");

}int i, kk;

void loop( )

endt = micros( );

serial.println(string("run time =") + (endt-begt) +"us" );

serial.println("string("kk=") + kk + ",, should be 3199");

delay(3388);

} // loop(

您為何會鹹魚 衝刺day4

這個作業屬於哪個課程 這個作業要求在 homework 11542 這個作業的目標 團隊專案合作衝刺階段,記錄每一天的過程收穫 作業正文 您為何會鹹魚 衝刺day4 其他參考文獻 無 新增只看資料 只看小道訊息 檢視所有型別功能 實現點選奇偶次公升 降序 搜尋功能 做出自己負責的部分相對於來說的簡陋...

Spark 4 為何要處理資料傾斜

對spark hadoop這樣的大資料系統來講,資料量大並不可怕,可怕的是資料傾斜。何謂資料傾斜?資料傾斜指的是,並行處理的資料集中,某一部分 如spark或kafka的乙個partition 的資料顯著多於其它部分,從而使得該部分的處理速度成為整個資料集處理的瓶頸。如果資料傾斜沒有解決,完全沒有可...

基於STM32F4的US 100超聲波測距

開發板是乙個叫icore的板子,但是晶元是f4的,總體大同小異,只是引腳定義不一樣,改一改就可以直接用。先拔掉跳線帽轉到串列埠觸發模式下,通過給感測器傳送0x55就可以接收到距離資料,串列埠中斷裡面拿兩個數放到陣列裡面計算就可以了 distance.c檔案 void usart6 init u32 ...