kernel/timing_functions/index.html · kernel/timing_functions/index.rst 공식 원문 ↗

Zephyr 3.7.0 · Kernel · Timing Functions

Executing Time Functions

Code section 전후 counter를 읽고 rollover와 platform scaling을 보정해 cycle과 nanosecond 실행 시간을 얻습니다.

Official pathkernel/timing_functions/index.html
Source filekernel/timing_functions/index.rst
Source versionZephyr 3.7.0
TranslationFull · reviewed

본문 기준: Zephyr 3.7.0 LTS3 · 이후 유지보수 패치는 별도입니다.

Part 1

요약·해설

Default kernel timer와 다를 수 있는 measurement timer의 초기화·수집·conversion 및 backend 계층을 설명합니다.

Measure

start · counter · end

Normalize

rollover · scaling

Backends

arch · SoC · board

Part 2

접을 수 있는 영어 원문 전체

영어 원문 전체 펼치기
원문 SHA-256 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를 활성화합니다.

사용 순서

  1. timing_init()으로 timer를 초기화합니다.
  2. timing_start()로 수집 시작을 알리고 보통 timer를 시작합니다.
  3. 측정할 code 앞에서 timing_counter_get()으로 start를 읽습니다.
  4. Code 뒤에서 다시 counter를 읽어 end를 기록합니다.
  5. timing_cycles_get()으로 start와 end 사이 cycle을 계산합니다.
  6. timing_cycles_to_ns()로 total cycle을 nanosecond로 변환합니다.
  7. 다른 block은 counter read부터 반복합니다.
  8. timing_stop()으로 수집 종료를 알리고 보통 timer를 멈춥니다.
Execution-time measurement pipeline
Initialize

timing_init

Enable

timing_start

Start sample

timing_counter_get

Execute

측정할 code

End sample

timing_counter_get

Normalize

cycles_get · rollover/scaling

Convert

cycles_to_ns

Stop

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 pointer
  • end: 종료 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 cycles
  • count: 누적 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 pointer
  • end: 종료 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 cycles
  • count: 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 pointer
  • end: 종료 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 cycles
  • count: 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 pointer
  • end: 종료 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 cycles
  • count: measurement 수

반환값

  • uint64_t: average nanoseconds
board_timing_freq_get_mhz()

Board timing counter frequency를 MHz로 반환합니다.

반환값

  • uint32_t: counter MHz

Source

출처

영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.