Part 1
요약·해설
전체 교체인 set과 bitwise merge인 post, any/all wait와 multi-waiter reset 위험을 구분합니다.
32 event bits
set · post
any · all
Part 2
접을 수 있는 영어 원문 전체
영어 원문 전체 펼치기
4A4105D96B20CDCABBC677B9F4BC0A0E2AAD61C6F8C0ADE403B36B570D3BCB12
.. _events:
Events
######
An :dfn:`event object` is a kernel object that implements traditional events.
.. contents::
:local:
:depth: 2
Concepts
********
Any number of event objects can be defined (limited only by available RAM). Each
event object is referenced by its memory address. One or more threads may wait
on an event object until the desired set of events has been delivered to the
event object. When new events are delivered to the event object, all threads
whose wait conditions have been satisfied become ready simultaneously.
An event object has the following key properties:
* A 32-bit value that tracks which events have been delivered to it.
An event object must be initialized before it can be used.
Events may be **delivered** by a thread or an ISR. When delivering events, the
events may either overwrite the existing set of events or add to them in
a bitwise fashion. When overwriting the existing set of events, this is referred
to as setting. When adding to them in a bitwise fashion, this is referred to as
posting. Both posting and setting events have the potential to fulfill match
conditions of multiple threads waiting on the event object. All threads whose
match conditions have been met are made active at the same time.
Threads may wait on one or more events. They may either wait for all of the
requested events, or for any of them. Furthermore, threads making a wait request
have the option of resetting the current set of events tracked by the event
object prior to waiting. Care must be taken with this option when multiple
threads wait on the same event object.
.. note::
The kernel does allow an ISR to query an event object, however the ISR must
not attempt to wait for the events.
Implementation
**************
Defining an Event Object
========================
An event object is defined using a variable of type :c:struct:`k_event`.
It must then be initialized by calling :c:func:`k_event_init`.
The following code defines an event object.
.. code-block:: c
struct k_event my_event;
k_event_init(&my_event);
Alternatively, an event object can be defined and initialized at compile time
by calling :c:macro:`K_EVENT_DEFINE`.
The following code has the same effect as the code segment above.
.. code-block:: c
K_EVENT_DEFINE(my_event);
Setting Events
==============
Events in an event object are set by calling :c:func:`k_event_set`.
The following code builds on the example above, and sets the events tracked by
the event object to 0x001.
.. code-block:: c
void input_available_interrupt_handler(void *arg)
{
/* notify threads that data is available */
k_event_set(&my_event, 0x001);
...
}
Posting Events
==============
Events are posted to an event object by calling :c:func:`k_event_post`.
The following code builds on the example above, and posts a set of events to
the event object.
.. code-block:: c
void input_available_interrupt_handler(void *arg)
{
...
/* notify threads that more data is available */
k_event_post(&my_event, 0x120);
...
}
Waiting for Events
==================
Threads wait for events by calling :c:func:`k_event_wait`.
The following code builds on the example above, and waits up to 50 milliseconds
for any of the specified events to be posted. A warning is issued if none
of the events are posted in time.
.. code-block:: c
void consumer_thread(void)
{
uint32_t events;
events = k_event_wait(&my_event, 0xFFF, false, K_MSEC(50));
if (events == 0) {
printk("No input devices are available!");
} else {
/* Access the desired input device(s) */
...
}
...
}
Alternatively, the consumer thread may desire to wait for all the events
before continuing.
.. code-block:: c
void consumer_thread(void)
{
uint32_t events;
events = k_event_wait_all(&my_event, 0x121, false, K_MSEC(50));
if (events == 0) {
printk("At least one input device is not available!");
} else {
/* Access the desired input devices */
...
}
...
}
Suggested Uses
**************
Use events to indicate that a set of conditions have occurred.
Use events to pass small amounts of data to multiple threads at once.
Configuration Options
*********************
Related configuration options:
* :kconfig:option:`CONFIG_EVENTS`
API Reference
**************
.. doxygengroup:: event_apis
Part 3
한국어 전문 번역
Event object는 전통적인 event mechanism을 구현하는 kernel object입니다. RAM이 허용하는 만큼 정의하고 memory address로 참조합니다.
개념
한 개 이상의 thread가 원하는 event set이 전달될 때까지 같은 object에서 기다릴 수 있습니다. 새 event가 전달되면 wait condition이 충족된 모든 thread가 동시에 ready가 됩니다. Object는 전달된 event를 추적하는 32-bit 값을 가지며 사용 전 초기화해야 합니다.
Thread와 ISR 모두 event를 전달할 수 있습니다. Set은 기존 event set 전체를 새 값으로 덮어쓰고, post는 bitwise 방식으로 기존 값에 추가합니다. 두 operation 모두 여러 waiting thread의 match condition을 동시에 충족할 수 있습니다.
Thread는 여러 event 중 any 또는 all을 기다릴 수 있고, wait 직전에 object의 current set을 reset할 수도 있습니다. 같은 object에 여러 thread가 기다리면 한 thread의 reset이 다른 thread가 볼 state까지 바꾸므로 주의해야 합니다.
구현
Event object 정의
k_event type variable을 선언하고 k_event_init()으로 초기화합니다.
struct k_event my_event;
k_event_init(&my_event);K_EVENT_DEFINE()를 사용하면 compile time에 정의와 초기화를 함께 수행합니다.
K_EVENT_DEFINE(my_event);Event set
k_event_set()은 object가 추적하는 event를 새 값으로 교체합니다. 다음 ISR은 값을 0x001로 설정합니다.
void input_available_interrupt_handler(void *arg)
{
/* notify threads that data is available */
k_event_set(&my_event, 0x001);
...
}Event post
k_event_post()는 기존 set에 event bit를 추가합니다. 다음 ISR은 0x120을 post합니다.
void input_available_interrupt_handler(void *arg)
{
...
/* notify threads that more data is available */
k_event_post(&my_event, 0x120);
...
}Event 대기
k_event_wait()은 지정 event 중 하나를 기다립니다. 다음 consumer는 0xFFF 범위의 event 중 하나를 최대 50ms 기다리고 timeout이면 warning을 출력합니다.
void consumer_thread(void)
{
uint32_t events;
events = k_event_wait(&my_event, 0xFFF, false, K_MSEC(50));
if (events == 0) {
printk("No input devices are available!");
} else {
/* Access the desired input device(s) */
...
}
...
}모든 event가 필요하면 k_event_wait_all()을 사용합니다. 다음 예제는 0x121의 모든 bit가 전달되기를 최대 50ms 기다립니다.
void consumer_thread(void)
{
uint32_t events;
events = k_event_wait_all(&my_event, 0x121, false, K_MSEC(50));
if (events == 0) {
printk("At least one input device is not available!");
} else {
/* Access the desired input devices */
...
}
...
}권장 용도
여러 condition이 발생했음을 나타내거나 작은 양의 data를 여러 thread에 한꺼번에 전달할 때 event를 사용합니다.
설정 옵션
관련 Kconfig option은 CONFIG_EVENTS입니다.
API 참고: event_apis
다른 module에서 static event object를 참조하는 declaration입니다.
extern struct k_event <name>;K_EVENT_DEFINE(name)Event object를 static하게 정의하고 초기화합니다. 다른 module에서는 extern struct k_event
으로 접근할 수 있습니다. 매개변수
name: event object 이름
k_event_init(event)첫 사용 전에 event object를 초기화합니다.
매개변수
event: event object 주소
k_event_post(event, events)하나 이상의 event bit를 기존 32-bit event set에 OR해 추가하고, condition이 충족된 모든 waiting task를 즉시 unpend합니다. 기존 값을 대체하는 set과 달리 현재 값에 merge합니다.
매개변수
event: event object 주소events: post할 event set
반환값
uint32_t: 변경 전 event 값
k_event_set(event, events)Event object의 전체 event set을 지정 값으로 교체하고 condition이 충족된 모든 waiting task를 즉시 unpend합니다.
매개변수
event: event object 주소events: 설정할 event set
반환값
uint32_t: 변경 전 event 값
k_event_set_masked(event, events, events_mask)Mask가 지정한 bit만 events 값에 따라 set 또는 clear하고 condition이 충족된 waiting task를 unpend합니다.
매개변수
event: event object 주소events: set/clear할 값events_mask: 적용할 bit mask
반환값
uint32_t: events_mask 범위의 변경 전 값
k_event_clear(event, events)지정한 event bit를 clear(reset)합니다.
매개변수
event: event object 주소events: clear할 event set
반환값
uint32_t: 변경 전 event 값
k_event_wait(event, events, reset, timeout)요청한 event 중 하나라도 전달되거나 timeout이 만료될 때까지 기다립니다. 한 32-bit word의 bit로 최대 32개 event를 구분할 수 있습니다.
매개변수
event: event object 주소events: 기다릴 event setreset: true면 대기 전에 object의 current event set을 clear하고 false면 유지timeout: 대기 시간 또는 K_NO_WAIT/K_FOREVER
반환값
matching bit set: 성공 시 일치한 event0: 지정 시간에 일치 event를 받지 못함
k_event_wait_all(event, events, reset, timeout)요청한 event가 모두 전달되거나 timeout이 만료될 때까지 기다립니다. 최대 32개 event를 bit로 표현합니다.
매개변수
event: event object 주소events: 모두 기다릴 event setreset: true면 대기 전에 current set을 clear하고 false면 유지timeout: 대기 시간 또는 K_NO_WAIT/K_FOREVER
반환값
matching bit set: 성공 시 일치한 event0: 지정 시간에 모든 event를 받지 못함
k_event_test(event, events_mask)현재 event object가 추적하는 event 가운데 mask 범위를 검사합니다.
매개변수
event: event object 주소events_mask: 검사할 event set
반환값
uint32_t: events_mask 범위의 current event 값
k_event32-bit event set과 waiting thread state를 담는 Event Structure이며 include 경로는 kernel.h입니다.
Source
출처
영어 원문에는 문단, 문서 지시문, 표, 코드, 코드 심벌, 경로를 그대로 보존했습니다.