$darkmode
RuiChing API 参考手册
V0.9.1
线程管理

线程控制模块提供线程生命周期管理和调度控制功能 更多...

结构体

struct  rt_thread
 线程控制块结构体 更多...
 

类型定义

typedef struct rt_threadrt_thread_t
 线程指针类型定义
 

函数

rt_err_t rt_thread_init (struct rt_thread *thread, const char *name, void(*entry)(void *parameter), void *parameter, void *stack_start, rt_uint32_t stack_size, rt_uint8_t priority, rt_uint32_t tick)
 初始化线程对象 更多...
 
rt_err_t rt_thread_detach (rt_thread_t thread)
 脱离线程 更多...
 
rt_thread_t rt_thread_create (const char *name, void(*entry)(void *parameter), void *parameter, rt_uint32_t stack_size, rt_uint8_t priority, rt_uint32_t tick)
 动态创建线程 更多...
 
rt_err_t rt_thread_delete (rt_thread_t thread)
 删除动态线程对象 更多...
 
rt_err_t rt_thread_close (rt_thread_t thread)
 关闭线程 更多...
 
rt_thread_t rt_thread_self (void)
 获取当前正在运行的线程对象 更多...
 
rt_thread_t rt_thread_find (char *name)
 查找指定名称的线程对象 更多...
 
rt_err_t rt_thread_startup (rt_thread_t thread)
 将线程加入就绪队列中启动 更多...
 
rt_err_t rt_thread_yield (void)
 使当前线程主动让出处理器 更多...
 
rt_err_t rt_thread_delay (rt_tick_t tick)
 当前线程延时指定的系统节拍数 更多...
 
rt_err_t rt_thread_delay_until (rt_tick_t *tick, rt_tick_t inc_tick)
 使当前线程延迟直到 (*tick + inc_tick) 指定的系统节拍时间点 更多...
 
rt_err_t rt_thread_mdelay (rt_int32_t ms)
 当前线程延迟指定的毫秒数 更多...
 
rt_err_t rt_thread_control (rt_thread_t thread, int cmd, void *arg)
 控制线程行为 更多...
 
rt_err_t rt_thread_suspend (rt_thread_t thread)
 挂起指定线程 更多...
 
rt_err_t rt_thread_suspend_with_flag (rt_thread_t thread, int suspend_flag)
 挂起指定线程并设置挂起标志 更多...
 
rt_err_t rt_thread_resume (rt_thread_t thread)
 恢复指定线程的执行 更多...
 
rt_err_t rt_thread_get_name (rt_thread_t thread, char *name, rt_uint8_t name_size)
 获取指定线程的名称 更多...
 
rt_err_t rt_thread_idle_sethook (void(*hook)(void))
 设置空闲线程钩子函数 更多...
 
rt_err_t rt_thread_idle_delhook (void(*hook)(void))
 删除指定的空闲线程钩子函数 更多...
 

详细描述

线程控制模块提供线程生命周期管理和调度控制功能

函数说明

◆ rt_thread_init()

rt_err_t rt_thread_init ( struct rt_thread thread,
const char *  name,
void(*)(void *parameter)  entry,
void *  parameter,
void *  stack_start,
rt_uint32_t  stack_size,
rt_uint8_t  priority,
rt_uint32_t  tick 
)

初始化线程对象

初始化线程,静态线程的线程句柄(或者说线程控制块指针)、线程栈由用户提供。 静态线程是指线程控制块、线程运行栈一般都设置为全局变量,在编译时就被确定、 被分配处理,内核不负责动态分配内存空间

参数
[in]thread线程控制块指针
[in]name线程名称
[in]entry线程入口函数
[in]parameter入口函数参数
[in]stack_start栈起始地址
[in]stack_size线程栈大小,单位是字节
[in]priority线程的优先级,数值越小优先级越高,0 代表最高优先级
[in]tick线程的时间片 tick 大小
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 用户提供的栈首地址需做架构要求对齐,例如 ARM 上需要做 4 字节对齐
注解
  • 线程名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定, 多余部分会被自动截掉
  • 优先级范围根据系统配置由 rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 宏定义, 如果支持的是256 级优先级,那么范围是从 0 ~ 255

◆ rt_thread_detach()

rt_err_t rt_thread_detach ( rt_thread_t  thread)

脱离线程

对于用 rt_thread_init() 初始化的线程,使用 rt_thread_detach() 将使线程对象 在线程队列和内核对象管理器中被脱离

参数
[in]thread线程句柄
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 需要脱离的线程必须是由 rt_thread_init() 初始化
  • 线程本身不应调用这个接口脱离线程本身

◆ rt_thread_create()

rt_thread_t rt_thread_create ( const char *  name,
void(*)(void *parameter)  entry,
void *  parameter,
rt_uint32_t  stack_size,
rt_uint8_t  priority,
rt_uint32_t  tick 
)

动态创建线程

使用该函数创建的线程属于动态线程,线程控制块和栈空间均由系统在堆中自动分配。 创建完成后线程处于初始化状态

参数
[in]name线程名称
[in]entry线程入口函数
[in]parameter入口函数参数
[in]stack_size线程栈大小,单位是字节
[in]priority线程的优先级,数值越小优先级越高,0 代表最高优先级
[in]tick线程的时间片 tick 大小
返回值
!RT_NULL成功
RT_NULL失败
注解
  • 线程名称的最大长度由 rtconfig.h 中定义的 RT_NAME_MAX 宏指定, 多余部分会被自动截掉。
  • 优先级范围根据系统配置由 rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 宏定义, 如果支持的是 256 级优先级,那么范围是从 0 ~ 255

◆ rt_thread_delete()

rt_err_t rt_thread_delete ( rt_thread_t  thread)

删除动态线程对象

使用该函数删除通过 rt_thread_create() 创建的线程。线程将从调度队列中移除, 并由空闲线程回收其占用的内存资源

参数
[in]thread要删除的线程句柄
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 需要删除的线程必须是由 rt_thread_create() 创建
  • rt_thread_delete() 函数删除线程接口,仅仅是把相应的线程状态更改为 RT_THREAD_CLOSE 状态,然后放入到 rt_thread_defunct 队列中,而真正的 删除动作(释放线程控制块和释放线程栈)需要到下一次执行 idle 线程时, 由 idle 线程完成最后的线程删除动作,所以请保证 idle 线程有机会得到执行

◆ rt_thread_close()

rt_err_t rt_thread_close ( rt_thread_t  thread)

关闭线程

线程对象将从线程队列中移除,并从系统对象管理中分离、删除。与 rt_thread_delete()rt_thread_detach() 不同的是,该函数不会 将关闭的线程排入清理队列

参数
[in]thread要关闭的线程句柄
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 如果要关闭当前线程必须加锁调度器或进入临界区

◆ rt_thread_self()

rt_thread_t rt_thread_self ( void  )

获取当前正在运行的线程对象

此函数用于返回当前 CPU 正在执行的线程对象指针,通常用于线程内部获取自身句柄, 可用于线程自管理、调试或日志标识用途

返回值
线程指针成功
RT_NULL当前无线程在运行
警告
  • 请不要在中断服务程序中调用此函数,中断环境下它并不能准确获得当前的执行线程
注解
  • 当调度器未启动时,这个接口返回 RT_NULL

◆ rt_thread_find()

rt_thread_t rt_thread_find ( char *  name)

查找指定名称的线程对象

该函数在系统对象管理中搜索具有指定名称的线程对象,并返回其线程控制块指针。 可用于运行时动态获取线程句柄,用于调试、控制或跨模块访问线程。搜索过程中 对比线程名时会自动处理 RT_NAME_MAX 限制

参数
[in]name需要查找的线程名称
返回值
线程指针成功
RT_NULL未找到对应名称的线程对象
警告
  • 请不要在中断上下文中调用此函数
注解
  • 查找的线程名称最长不超过 RT_NAME_MAX

◆ rt_thread_startup()

rt_err_t rt_thread_startup ( rt_thread_t  thread)

将线程加入就绪队列中启动

此函数用于启动一个已初始化的线程对象(使用 rt_thread_init()rt_thread_create() 创建),并将其状态置为就绪,等待调度器调度执行

参数
[in]thread要启动的线程句柄
返回值
RT_EOK启动成功,线程已加入调度队列
-RT_ERROR启动失败
注解
  • 线程只允许启动一次,重复调用将返回错误

◆ rt_thread_yield()

rt_err_t rt_thread_yield ( void  )

使当前线程主动让出处理器

该函数会使当前线程让出处理器资源,它将不再占有处理器,调度器会选择满足 运行条件下一个线程执行。线程调用这个接口后,这个线程仍然在就绪队列中

返回值
RT_EOK成功
!RT_EOK失败
警告
  • 非必要请应用开发者不要使用该接口进行功能开发

◆ rt_thread_delay()

rt_err_t rt_thread_delay ( rt_tick_t  tick)

当前线程延时指定的系统节拍数

当前线程调用该函数后将进入挂起状态,直到延时时间到达再次进入就绪状态。 延时时间以操作系统的节拍(tick)为单位。适用于线程主动等待某段时间再 继续运行的场景

参数
[in]tick延时的系统节拍数
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 本函数仅适用于线程上下文,且不能在中断服务例程中调用

◆ rt_thread_delay_until()

rt_err_t rt_thread_delay_until ( rt_tick_t *  tick,
rt_tick_t  inc_tick 
)

使当前线程延迟直到 (*tick + inc_tick) 指定的系统节拍时间点

该函数常用于周期性线程任务中,通过传入上次唤醒时间 tick 和周期增量 inc_tick,来实现相对于固定时间基准的精确延时调度。调用成功后,*tick 将被更新为新的目标唤醒时间点。当线程运行慢于目标周期时将不会延时, 线程将立即返回

参数
[IN,OUT]tick 传入上次唤醒时间,返回更新后的当前唤醒时间
[in]inc_tick本次延迟周期,单位为系统节拍(tick)
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 本函数仅适用于线程上下文,且不能在中断服务例程中调用

◆ rt_thread_mdelay()

rt_err_t rt_thread_mdelay ( rt_int32_t  ms)

当前线程延迟指定的毫秒数

该函数将毫秒数 ms 转换为系统节拍(tick),并使当前线程进入延迟状态, 在此期间线程将被挂起,由调度器切换其他线程运行。延迟时间受系统 tick 精度影响,实际延迟时间可能略大于指定毫秒数。

参数
[in]ms延迟的时间,单位为毫秒
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 本函数仅适用于线程上下文,且不能在中断服务例程中调用

◆ rt_thread_control()

rt_err_t rt_thread_control ( rt_thread_t  thread,
int  cmd,
void *  arg 
)

控制线程行为

该函数用于根据传入的控制命令 cmd 控制指定线程的行为,不同的命令会触发不 同的操作:

  • RT_THREAD_CTRL_CHANGE_PRIORITY: 修改线程优先级,arg 为指向新优先级值的指针
  • RT_THREAD_CTRL_STARTUP: 启动线程,相当于调用 rt_thread_startup()
  • RT_THREAD_CTRL_CLOSE: 删除线程,相当于调用 rt_thread_detach() / rt_thread_delete()
  • RT_THREAD_CTRL_BIND_CPU: 绑定线程至指定 CPU,arg 为目标 CPU 编号的指针
参数
[in]thread指定要控制的线程句柄
[in]cmd控制命令
[in]arg控制命令参数,根据不同命令传入不同类型指针
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 非必要请应用开发者不要使用该接口进行功能开发

◆ rt_thread_suspend()

rt_err_t rt_thread_suspend ( rt_thread_t  thread)

挂起指定线程

该函数会将指定线程从就绪队列中移除并将其状态设置为挂起,被挂起的线程不 会被调度执行,直到被显式唤醒为止(如调用 rt_thread_resume() 函数)

参数
[in]thread要挂起的线程句柄
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 非必要请应用开发者不要使用该接口进行功能开发
  • 不建议线程本身挂起自己,如果确实需要采用 rt_thread_suspend() 挂起当前任务, 需要在调用rt_thread_suspend()函数后立刻调用 rt_schedule() 函数进行手动的 线程上下文切换

◆ rt_thread_suspend_with_flag()

rt_err_t rt_thread_suspend_with_flag ( rt_thread_t  thread,
int  suspend_flag 
)

挂起指定线程并设置挂起标志

此函数将指定线程设置为挂起状态,并通过 suspend_flag 标识线程被挂起的原因 该函数只能用于挂起当前线程自身,如调用方式:

  • rt_thread_suspend_with_flag(rt_thread_self(), flag); 不建议用于挂起其他线程,因为无法保证其所处的执行上下文,若该线程正在占 用共享资源,将导致资源长期占用甚至死锁等问题
参数
[in]thread要挂起的线程句柄(应为当前线程)
[in]suspend_flag挂起状态标志,用于标识线程被挂起的原因
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 非必要请应用开发者不要使用该接口进行功能开发
  • 该函数应仅在当前线程中调用,不可挂起其他线程

◆ rt_thread_resume()

rt_err_t rt_thread_resume ( rt_thread_t  thread)

恢复指定线程的执行

此函数将挂起状态的线程恢复至就绪状态,并将其加入就绪队列中,等待系统调度器 调度执行。通常用于解除线程因等待资源而挂起的状态

参数
[in]thread要恢复的线程句柄
返回值
RT_EOK成功
!RT_EOK失败
警告
  • 非必要请应用开发者不要使用该接口进行功能开发

◆ rt_thread_get_name()

rt_err_t rt_thread_get_name ( rt_thread_t  thread,
char *  name,
rt_uint8_t  name_size 
)

获取指定线程的名称

此函数用于获取线程的名称字符串,并将其复制到用户提供的缓冲区中。 通常用于调试或日志记录等场景,用于识别线程

参数
[in]thread要获取名称的线程句柄
[out]name存储线程名称的缓冲区指针
[in]name_size缓冲区大小
返回值
RT_EOK成功
-RT_EINVAL参数无效或获取失败
警告
  • 不可在中断上下文中调用该函数
注解
  • 获取线程名称时应确保传入的缓冲区具有足够的空间,需要包括结尾的 '\0'

◆ rt_thread_idle_sethook()

rt_err_t rt_thread_idle_sethook ( void(*)(void)  hook)

设置空闲线程钩子函数

当空闲线程运行时会自动执行设置的钩子函数,由于空闲线程具有系统的最低优先级, 所以只有在空闲的时候才会执行此钩子函数。空闲线程是一个线程状态永远为 就绪态的线程,因此设置的钩子函数必须保证空闲线程在任何时刻都不会处于 挂起状态,例如:rt_thread_delay(),rt_sem_take() 等可能会导致线程挂起的函数 都不能使用

参数
[in]hook指向空闲线程钩子函数的函数指针
返回值
RT_EOK成功
-RT_EFULL钩子列表已满,无法设置更多钩子
警告
  • 钩子函数必须尽量简单,且不能包含任何阻塞或挂起的操作,否则可能影响 系统的实时性

◆ rt_thread_idle_delhook()

rt_err_t rt_thread_idle_delhook ( void(*)(void)  hook)

删除指定的空闲线程钩子函数

此函数用于从空闲线程钩子函数列表中删除指定的钩子函数,一旦删除成功 空闲线程将不再调用该钩子。

参数
[in]hook要删除的空闲线程钩子函数指针
返回值
RT_EOK成功
-RT_ENOSYS指定的钩子函数未找到
注解