事件
事件对象是实现传统事件的内核对象。
概念
可以定义任意数量的事件对象(仅受可用RAM的限制)。每个事件对象都由其内存地址引用。一个或多个线程可能等待事件对象,直到所需的事件集传递到事件对象。当新事件传递到事件对象时,满足等待条件的所有线程将同时准备就绪。
事件对象具有以下关键属性:
一个32位的值,用来跟踪传递给它的事件。
事件对象必须初始化才能使用。
事件可以通过一个线程或一个ISR来传递。在传递事件时,事件可以覆盖现有的事件集或以位方式添加到它们。当覆盖现有的事件集时,这被称为设置。当以一种按位排列的方式添加到它们中时,这被称为发布。发布和设置事件都有可能满足等待事件对象上的多个线程的匹配条件。已满足匹配条件的所有线程都将同时被激活。
线程可能会等待一个或多个事件。它们可以等待所有被请求的事件,也可以等待其中的任何一个事件。此外,发出等待请求的线程可以选择在等待之前重置事件对象跟踪的当前事件集。当多个线程在同一事件对象上等待时,必须注意此选项。
注意:
内核确实允许ISR查询事件对象,但是ISR不能尝试等待事件。
实现
定义事件对象
使用k_event
类型的变量定义了一个事件对象。然后,必须通过调用k_event_init()
来初始化它。
下面的代码定义了一个事件对象。
struct k_event my_event;
k_event_init(&my_event);