Zephyr物联网操作系统专栏汇总
k_thread_foreach
函数原型:
void k_thread_foreach(k_thread_user_cb_t user_cb, void *user_data)
函数功能说明:
遍历系统中的所有线程。
这个例程遍历系统中的所有线程,并为每个线程调用user_cb函数。
注意:必须设置CONFIG_THREAD_MONITOR才能使此函数有效。
注意:这个API使用k_spin_lock来保护_kernel.threads列表,这意味着创建新的线程和现有线程的终止将被阻止,直到这个API返回为止。
参数说明
user_cb-指向用户回调函数的指针
user_data-指向用户数据的指针。
k_thread_foreach_unlocked
函数原型
void k_thread_foreach_unlocked(k_thread_user_cb_t user_cb, void *user_data)
函数功能说明
锁定系统中的所有线程。
这个例程的工作原理与k_thread_foreach完全相同,但在执行user_cb时解锁中断。
注意:必须设置CONFIG_THREAD_MONITOR才能使此函数有效。
注意:此API仅在访问_内核时使用k_spin_lock。线程对元素进行排队。它在用户回调函数处理期间解锁。如果在执行此foreach函数时创建了新任务,则添加的新任务将不包括在枚举中。如果在此枚举过程中中止了某个任务,则此处将存在竞争,并且此中止的任务可能会包含在枚举中。
注意:如果任务被中止,并且在k_thread_foreach_unlocked进行时k_thread结构占用的内存被重用,甚至可能导致系统行为不稳定。这个函数可能永远不会返回,因为它会跟随下一个任务指针处理给定的指针作为指向k_thread结构的指针,而它现在是不同的。如果在任何上下文中调用该函数后它被中止,请不要重用中止任务的k_thread结构所占用的内存。
参数说明
user_cb-指向用户回调函数的指针。
user_data-指向用户数据的指针
k_thread_create
函数原型
k_tid_t k_thread_create(struct k_thread *new_thread, k_thread_stack_t *stack, size_t
stack_size, k_thread_entry_t entry, void *p1, void *p2, void *p3, int
prio, uint32_t options, k_timeout_t delay)
函数功能说明
创建线程。
这个例程初始化一个线程,然后安排它来执行。
新线程可能被计划立即执行或延迟启动。如果新生成的线程没有延迟启动,那么内核调度程序可能会优先使用当前线程来允许执行新线程。
线程选项是特定于架构的,可以包括K_ESSENTIAL、K_FP_REGS和K_SSE_REGS。可以通过使用“|”(逻辑OR运算符)来分离它们来指定多个选项。
传递给这个函数的堆栈对象最初必须用这些宏来定义,才能被移植:
- K_THREAD_STACK_DEFINE()——用于可能支持用户或主管线程的堆栈。
- K_KERNEL_STACK_DEFINE()-对于可能仅支持主管线程的堆栈。如果启用了CONFIG_USERSPACE,这些堆栈使用的内存就会更少。
stack_size参数带有约束条件。它必须是:
- 传递给K_THREAD_STACK_DEFINE()或K_KERNEL_STACK_DEFINE()的原始大小值
- 如果堆栈是用K_THREAD_STACK_DEFINE()定义的,则K_THREAD_STACK_SIZEOF(堆栈)的返回值
- 如果堆栈是用K_KERNEL_STACK_DEFINE()定义,则K_KERNEL_STACK_SIZEOF(堆栈)的返回值。
使用其他值或大小(堆栈)可能会产生未定义的行为。
参数说明
new_thread-指向未初始化的结构体k_thread的指针
stack-指向堆栈空间的指针。
stack_size-以字节表示的堆栈大小。
entry-线程输入功能
p1-第1个指针输入参数。
p2-第二指针输入参数。
p3-第三个指针输入参数。
prio-任务优先级
options-线程选项。
delay-计划延迟,或K_NO_WAIT(对于无延迟)
返回值
返回新线程的ID。