程式碼執行時間測量結果的準確度測試
阿新 • • 發佈:2021-01-14
測試硬體
- 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硬體初始化後校準一次;