Part 1
요약·해설
Default kernel timer와 다를 수 있는 measurement timer의 초기화·수집·conversion 및 backend 계층을 설명합니다.
start · counter · end
rollover · scaling
arch · SoC · board
Part 2
접을 수 있는 영어 원문 전체
영어 원문 전체 펼치기
7423AD83AB9C77D4F0CABFD97B728EBAC30D52F3BF73473EADFA64C54159E408
.. _timing_functions:
Executing Time Functions
########################
The timing functions can be used to obtain execution time of
a section of code to aid in analysis and optimization.
Please note that the timing functions may use a different timer
than the default kernel timer, where the timer being used is
specified by architecture, SoC or board configuration.
Configuration
*************
To allow using the timing functions, :kconfig:option:`CONFIG_TIMING_FUNCTIONS`
needs to be enabled.
Usage
*****
To gather timing information:
1. Call :c:func:`timing_init` to initialize the timer.
2. Call :c:func:`timing_start` to signal the start of gathering of
timing information. This usually starts the timer.
3. Call :c:func:`timing_counter_get` to mark the start of code
execution.
4. Call :c:func:`timing_counter_get` to mark the end of code
execution.
5. Call :c:func:`timing_cycles_get` to get the number of timer cycles
between start and end of code execution.
6. Call :c:func:`timing_cycles_to_ns` with total number of cycles
to convert number of cycles to nanoseconds.
7. Repeat from step 3 to gather timing information for other
blocks of code.
8. Call :c:func:`timing_stop` to signal the end of gathering of
timing information. This usually stops the timer.
Example
-------
This shows an example on how to use the timing functions:
.. code-block:: c
#include <zephyr/timing/timing.h>
void gather_timing(void)
{
timing_t start_time, end_time;
uint64_t total_cycles;
uint64_t total_ns;
timing_init();
timing_start();
start_time = timing_counter_get();
code_execution_to_be_measured();
end_time = timing_counter_get();
total_cycles = timing_cycles_get(&start_time, &end_time);
total_ns = timing_cycles_to_ns(total_cycles);
timing_stop();
}
API documentation
*****************
.. doxygengroup:: timing_api
.. doxygengroup:: timing_api_arch
.. doxygengroup:: timing_api_soc
.. doxygengroup:: timing_api_board
Part 3
한국어 전문 번역
Timing function은 특정 code section의 execution time을 측정해 분석과 최적화를 돕습니다.
설정
Timing function을 사용하려면 CONFIG_TIMING_FUNCTIONS를 활성화합니다.
사용 순서
timing_init()으로 timer를 초기화합니다.timing_start()로 수집 시작을 알리고 보통 timer를 시작합니다.- 측정할 code 앞에서
timing_counter_get()으로 start를 읽습니다. - Code 뒤에서 다시 counter를 읽어 end를 기록합니다.
timing_cycles_get()으로 start와 end 사이 cycle을 계산합니다.timing_cycles_to_ns()로 total cycle을 nanosecond로 변환합니다.- 다른 block은 counter read부터 반복합니다.
timing_stop()으로 수집 종료를 알리고 보통 timer를 멈춥니다.
timing_init
timing_start
timing_counter_get
측정할 code
timing_counter_get
cycles_get · rollover/scaling
cycles_to_ns
timing_stop
예제
다음 예제는 counter 두 값을 읽고 실제 cycle interval을 계산한 뒤 nanosecond로 변환합니다.
#include <zephyr/timing/timing.h>
void gather_timing(void)
{
timing_t start_time, end_time;
uint64_t total_cycles;
uint64_t total_ns;
timing_init();
timing_start();
start_time = timing_counter_get();
code_execution_to_be_measured();
end_time = timing_counter_get();
total_cycles = timing_cycles_get(&start_time, &end_time);
total_ns = timing_cycles_to_ns(total_cycles);
timing_stop();
}API 문서
Generic timing_api
timing_init()Timing subsystem을 사용하기 위한 initialization step을 수행합니다.
timing_start()이 시점부터 timing information을 수집한다고 subsystem에 알리며 보통 timer를 시작합니다.
timing_stop()이 시점부터 timing information 수집을 끝낸다고 알리며 보통 timer를 멈춥니다.
timing_counter_get()Current timing counter를 읽습니다.
반환값
timing_t: timing counter
timing_cycles_get(start, end)두 counter 사이 actual cycle 수를 계산합니다. 일부 architecture·SoC는 raw counter를 scale해야 실제 cycle이 됩니다.
매개변수
start: measured execution 시작 counter pointerend: 종료 counter pointer
반환값
uint64_t: start와 end 사이 cycles
timing_freq_get()Timing에 쓰는 counter frequency를 Hz로 반환합니다.
반환값
uint64_t: counter Hz
timing_cycles_to_ns(cycles)Cycle 수를 nanosecond elapsed time으로 변환합니다.
매개변수
cycles: cycle count
반환값
uint64_t: nanoseconds
timing_cycles_to_ns_avg(cycles, count)여러 measurement에서 누적한 cycle을 count로 average해 nanosecond로 변환합니다.
매개변수
cycles: accumulated cyclescount: 누적 measurement 수
반환값
uint64_t: average nanoseconds
timing_freq_get_mhz()Timing counter frequency를 MHz로 반환합니다.
반환값
uint32_t: counter MHz
Architecture timing_api_arch
arch_timing_init()Architecture timing subsystem을 초기화합니다. Generic timing_init()의 backend입니다.
arch_timing_start()Architecture timing 정보 수집을 시작합니다. 이 호출과 stop 사이 counter read는 같은 CPU core에서 해야 합니다.
arch_timing_stop()Architecture timing 정보 수집을 끝냅니다. Start 이후 counter read와 stop은 같은 CPU core에서 해야 합니다.
arch_timing_counter_get()Architecture raw timing counter를 반환합니다. 모든 counter가 64-bit precision인 것은 아니어서 internal rollover 시 값이 뒤로 가는 것처럼 보일 수 있습니다. platform-dependent code로 subtraction 전 uint32_t cast를 하거나 rollover를 이해하는 arch_timing_cycles_get()을 사용합니다. Start·stop 사이 같은 CPU core에서 호출해야 합니다.
반환값
timing_t: raw counter
arch_timing_cycles_get(start, end)Architecture raw counter의 scaling과 internal rollover를 처리해 positive-definite cycle interval을 계산합니다.
매개변수
start: 시작 counter pointerend: 종료 counter pointer
반환값
uint64_t: actual cycles
arch_timing_freq_get()Architecture timing counter frequency를 Hz로 반환합니다.
반환값
uint64_t: counter Hz
arch_timing_cycles_to_ns(cycles)Architecture cycle 수를 nanosecond로 변환합니다.
매개변수
cycles: cycle count
반환값
uint64_t: nanoseconds
arch_timing_cycles_to_ns_avg(cycles, count)Architecture 누적 cycle을 count로 average해 nanosecond로 변환합니다.
매개변수
cycles: accumulated cyclescount: measurement 수
반환값
uint64_t: average nanoseconds
arch_timing_freq_get_mhz()Architecture timing counter frequency를 MHz로 반환합니다.
반환값
uint32_t: counter MHz
SoC timing_api_soc
soc_timing_init()SoC timing subsystem을 초기화합니다. Generic timing_init()의 backend입니다.
soc_timing_start()SoC timing 정보 수집을 시작합니다.
soc_timing_stop()SoC timing 정보 수집을 끝냅니다.
soc_timing_counter_get()SoC raw timing counter를 반환합니다. 모든 counter가 64-bit precision인 것은 아니어서 internal rollover 시 값이 뒤로 가는 것처럼 보일 수 있습니다. SoC-dependent code로 subtraction 전 uint32_t cast를 하거나 rollover를 이해하는 soc_timing_cycles_get()을 사용합니다.
반환값
timing_t: raw counter
soc_timing_cycles_get(start, end)SoC raw counter의 scaling과 internal rollover를 처리해 positive-definite cycle interval을 계산합니다.
매개변수
start: 시작 counter pointerend: 종료 counter pointer
반환값
uint64_t: actual cycles
soc_timing_freq_get()SoC timing counter frequency를 Hz로 반환합니다.
반환값
uint64_t: counter Hz
soc_timing_cycles_to_ns(cycles)SoC cycle 수를 nanosecond로 변환합니다.
매개변수
cycles: cycle count
반환값
uint64_t: nanoseconds
soc_timing_cycles_to_ns_avg(cycles, count)SoC 누적 cycle을 count로 average해 nanosecond로 변환합니다.
매개변수
cycles: accumulated cyclescount: measurement 수
반환값
uint64_t: average nanoseconds
soc_timing_freq_get_mhz()SoC timing counter frequency를 MHz로 반환합니다.
반환값
uint32_t: counter MHz
Board timing_api_board
board_timing_init()Board timing subsystem을 초기화합니다. Generic timing_init()의 backend입니다.
board_timing_start()Board timing 정보 수집을 시작합니다.
board_timing_stop()Board timing 정보 수집을 끝냅니다.
board_timing_counter_get()Board raw timing counter를 반환합니다. 모든 counter가 64-bit precision인 것은 아니어서 internal rollover 시 값이 뒤로 가는 것처럼 보일 수 있습니다. board-dependent code로 subtraction 전 uint32_t cast를 하거나 rollover를 이해하는 board_timing_cycles_get()을 사용합니다.
반환값
timing_t: raw counter
board_timing_cycles_get(start, end)Board raw counter의 scaling과 internal rollover를 처리해 positive-definite cycle interval을 계산합니다.
매개변수
start: 시작 counter pointerend: 종료 counter pointer
반환값
uint64_t: actual cycles
board_timing_freq_get()Board timing counter frequency를 Hz로 반환합니다.
반환값
uint64_t: counter Hz
board_timing_cycles_to_ns(cycles)Board cycle 수를 nanosecond로 변환합니다.
매개변수
cycles: cycle count
반환값
uint64_t: nanoseconds
board_timing_cycles_to_ns_avg(cycles, count)Board 누적 cycle을 count로 average해 nanosecond로 변환합니다.
매개변수
cycles: accumulated cyclescount: measurement 수
반환값
uint64_t: average nanoseconds
board_timing_freq_get_mhz()Board timing counter frequency를 MHz로 반환합니다.
반환값
uint32_t: counter MHz
Source
출처
영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.