程式的位置與執行時間有關

2021-09-06 15:50:20 字數 2419 閱讀 6883

一、概述

在我測量mian函式大迴圈的週期時,發生了怪事:我一點也沒有更改main函式的**,只在初始化時新增了一些無用的語句,結果測量時間發生了巨大的差異。

二、事件詳情

1、測試**

main函式

/*

* * @brief 主函式

* @param 無

* @retval 無

*/int main(void

)}

delay函式

static

void delay(void) //

簡單的延時函式

}

說明:(1)測量**段

led1(on);led2(off);led3(off);

delay();

led1(off);led2(on);led3(off);

delay();

led1(off);led2(off);led3(on);

delay();

2)無效**段之所以稱之為無效,實際上指的是「這些**在程式中起到的是很次要的作用,主要是給cpu一些空指令,當然也會起到改變**量的作用」。

led_gpio_config();      

/*usart1 config 115200 8-n-1

*/usart1_config();

/*** @brief 通過注釋掉程式,可以更改**的長度

* @param 當注釋的只剩下乙個賦值等式的時候,計時長度值是0x116638

* @retval 當注釋的剩下三個賦值等式的時候,計時長度值是0xea726

*/dma_usart1_config();

(3)與測量計時有關的**

systick_init();     

systick_time_init(&usedmatime);

systick_time_start();

systick_time_stop();

關於測量計時**的實現在隨筆stm32之系統滴答定時器中進行了詳細講解。

2、奇怪現象

dma_usart1_config是在大迴圈之前呼叫的乙個無用的函式,實際上可以稱之為空函式或者延時函式。通過注釋掉裡邊的語句可以改變排在dma_usart1_config**段之後**在flash上的位置,也可以改變整個**段的量(儘管很小)。

void dma_usart1_config(void

)

筆者發現,當這個函式完全保留三行語句的時候,while迴圈測出來的滴答計時器脈衝數是0xea726(0d960294);而當注釋掉只剩下一行語句時,脈衝數變為0x116638(0d1140280)。這中間的差距是0d179986,佔0xea726的百分比是18.7%。也就是說注釋語句後的**執行時間,比沒有注釋時的時間多了將近1/5,這值得考慮其中的原因。

三、分析與結論

1、分析

測量**段中有關led操作的**執行時間幾乎可以忽略,而佔主要執行時間的是delay函式,只要分析delay函式,就能找到其中的問題。

delay函式

static

void delay(void) //

簡單的延時函式

}

delay函式在兩種情況下的反彙編**

在完全保留**的情況下

在注釋掉部分**的情況下

可以看到delay函式的反彙編**內容沒有改變,改變的只是**在flash中的位置(當然也是程式執行時的位置)。

而後,我有試著在

dma_usart1_config**的基礎(3行語句)上不斷增加**,發現計時脈衝數週期性的在0xea726、0x116638兩個中變換。

由此可以確定,就是由於**的位置改變了程式的執行時間,也即改變了程式的執行速度。

2、結論

即使是同樣的**,通過改變**的位置可以改變**的執行時間。而最根本的原因是有些指令的週期給指令所在的flash中的位置有關。

3、還未完成的工作

但是,由於j-link硬體除錯時,單步除錯誤差太大,取得的值很有出入,難以確定究竟是delay函式中哪些指令引起時間偏差。

程式執行時間

要獲得乙個c語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock 函式,可以捕捉從程式開始執行到clock 被呼叫時所 耗費的時間。這個時間單位是clock tick,即 時鐘打點 同時還有乙個常數clk tck,給出了機器時鐘每秒所走的時鐘打點數。於是為了獲 得乙個函式f...

程式執行時間

時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 要獲得乙個c語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock 函式,可以捕捉從程式開始執行到clock 被呼叫時所 耗費的時間。這個時間單位是cloc...

程式執行時間

要獲得乙個c語言程式的執行時間,常用的方法是呼叫標頭檔案time.h,其中提供了clock 函式,可以捕捉從程式開始執行到clock 被呼叫時所 耗費的時間。這個時間單位是clock tick,即 時鐘打點 同時還有乙個常數clk tck,給出了機器時鐘每秒所走的時鐘打點數。於是為了獲 得乙個函式f...