1. 程式人生 > 其它 >程式碼執行時間測量結果的準確度測試

程式碼執行時間測量結果的準確度測試

技術標籤:我的小問題集keil MDK

測試硬體

  • STM32F103RC
  • 主頻24MHz

測試方法

  • 示波器測試引腳電平翻轉(100M示波器)
  • 邏輯分析儀測試引腳電平翻轉
  • Keil+J-LINK線上模擬測試
  • perf元件測試

1.測試程式碼如下:

DEBUG_GPIO_SET_H();
handle_collect_data();   
xEventGroupSetBits(get_event_group_handle(), TASK_BIT_HANDLE_DATA);
DEBUG_GPIO_SET_L();

使用示波器測得用時:8.6us

Keil+J-LINK線上模擬測得用時:8.54us

使用邏輯分析儀測得用時:8.5us(8M取樣率)、8.56us(16M取樣率)、8.58us(50M取樣率)

2.測試程式碼如下

start_cycle_counter();				//perf元件測量啟動
handle_collect_data();    
xEventGroupSetBits(get_event_group_handle(), TASK_BIT_HANDLE_DATA);
counter = stop_cycle_counter();		//perf元件測量結束
DEBUG(("%d\r\n", count));			//列印perf元件測量結果

使用perf元件測得用時:9.54us

校準perf元件後測得用時:8.83us

應該在SysTick硬體初始之後呼叫一次init_cycle_counter(true)

3.測試程式碼如下:

void vtask_handle_data(void *pvParameters)
{
    int32_t counter;
	while(1)
	{
        start_cycle_counter();				//perf元件測量啟動
        handle_collect_data(); 
        xEventGroupSetBits(get_event_group_handle(), TASK_BIT_HANDLE_DATA);
        counter = stop_cycle_counter();		//perf元件測量結束
        DEBUG
(("%d\r\n", count)); //列印perf元件測量結果 vTaskDelay(50); } }

使用邏輯分析儀(50M取樣率)配合巨集traceTASK_SWITCHED_IN()traceTASK_SWITCHED_OUT()來測量任務執行時間,測得用時:48.92us

  • 去掉DEBUG(("%d\r\n", count)),測得用時:26.38us(DEBUG語句用時22.54us)
  • 再去掉start_cycle_counter()counter = stop_cycle_counter()語句,測得用時:23.84us(perf測量元件用時2.54us)

小結:

我們以示波器為基準。

  • 邏輯分析儀和Keil+J-LINK線上模擬測試均準確,邏輯分析儀取樣頻率越高越準確;
  • perf元件測得結果準確度不如前兩者,但仍在可信範圍(相比示波器偏大0.23us),注意perf元件應在SysTick硬體初始化後校準一次;