物联网操作系统Zephyr(内核篇)之2.1 内核服务之线程(API)(2)

 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。 

k_thread_user_mode_enter

函数原型

FUNC_NORETURN void k_thread_user_mode_enter(k_thread_entry_t entry, void *p1, void *p2,
void *p3)

函数功能说明

将线程的特权永久删除到用户模式

参数说明

entry-从开始执行的函数

p1-1入口点参数

p2-2入口点参数

p3-3入口点参数

k_thread_heap_assign

函数原型

static inline void k_thread_heap_assign(struct k_thread *thread, struct k_heap *heap)

函数功能说明

将一个资源内存池分配给一个线程。

 参数说明

thread 要为资源请求分配内存池的目标线程。

heap 用于资源的堆对象,如果线程不再有内存池,则为空。

k_thread_system_pool_assign

函数原型

void k_thread_system_pool_assign(struct k_thread *thread)

 函数功能说明

将系统堆指定为线程的资源池。

参数说明

要为资源请求分配系统堆的目标线程。

k_thread_join

函数原型

int k_thread_join(struct k_thread *thread, k_timeout_t timeout)

函数功能

睡眠,直到一个线程退出。

调用这个函数的线程将休眠,直到目标线程退出,原因是中止、自我退出或发生致命错误。如果线程没有运行,此API将立即返回。

这个API只能从具有K_NO_WAIT超时的ISRs中调用,其中它可以作为一个谓词,用于检测线程何时中止。

参数说明

thread-将要退出休眠的线程
timeout- 线程将要退出时间

返回值说明

0-成功,目标线程已退出或未运行

-EBUSY-没有等待就返回了

EAGAIN-等待时间超时

EDAEALK-目标线程加入调用者,或者目标线程是调用者

k_sleep

函数原型

int32_t k_sleep(k_timeout_t timeout)

函数功能说明

使当前的线程休眠。

参数说明

timeout-期望的睡眠时间。

未完待续

猜你喜欢

转载自blog.csdn.net/dop102/article/details/124657861