Zephyr events_zephyr 事件(1)

本文详细介绍了Zephyr操作系统中的事件管理,包括k_event数据结构、初始化、事件发布、设置、清除以及等待事件的相关函数,如k_event_init、k_event_post、k_event_wait等。这些函数用于多线程安全地处理事件状态和线程同步。
摘要由CSDN通过智能技术生成

数据结构

k_event

struct k\_event {
	_wait_q_t         wait_q;
	uint32\_t          events;
	struct k\_spinlock lock;

	SYS\_PORT\_TRACING\_TRACKING\_FIELD(k_event)
};

  • 该结构体中包含2个主要成员:
    • wait_q 等待队列,当线程调用等待函数时,如果条件不满足,那么将会被添加到等待队列中。
    • events 事件的状态,已发生为1,未发生为0。
  • spinlock 是为了多线程安全操作。

event_walk_data

struct event\_walk\_data {
	struct k\_thread  \*head;
	uint32\_t events;
};

  • 其中 events 为事件发布后事件对象中 events 成员变量的值,代表当前已经发生的事件。
  • 当线程或者中断向事件对象发布事件时,因为等待事件被挂起的线程可能需要被唤醒,但是这些线程等待的事件并不相同,需要从等待队列 wait_q 中查找出满足唤醒条件的线程,并将这些线程作为节点添加到被唤醒链表中,head即为链表头。
static int event\_walk\_op(struct k\_thread \*thread, void \*data)
{
	unsigned int      wait_condition;
	struct event\_walk\_data \*event_data = data;

	wait_condition = thread->event_options & K_EVENT_WAIT_MASK;

	if (are\_wait\_conditions\_met(thread->events, event_data->events,
				    wait_condition)) {

		/\*
 \* Events create a list of threads to wake up. We do
 \* not want z\_thread\_timeout to wake these threads; they
 \* will be woken up by k\_event\_post\_internal once they
 \* have been processed.
 \*/
		thread->no_wake_on_timeout = true;

		/\*
 \* The wait conditions have been satisfied. Add this
 \* thread to the list of threads to unpend.
 \*/
		thread->next_event_link = event_data->head;
		event_data->head = thread;
		z\_abort\_timeout(&thread->base.timeout);
	}

	return 0;
}

  • 程序依次遍历wait_q 中的线程,如果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值