一、线程
1.1 线程的概念
RT-Thread 的线程调度器是抢占式的,保证最高优先级的线程执行。有一下几种抢占的情形:
- 当一个线程使比它优先级高的线程满足条件,高优先级线程会立刻执行。
- 如果这个过程发生在中断中,中断结束后高优先级线程立刻执行。
1.2 关于线程的知识点
1.2.1 线程栈
当切换线程时,当前线程上下文会被保存在线程栈中,恢复运行时从线程栈恢复上下文。
-
线程栈大小确定方法:先分配1k,运行起来后通过finsh输入list_thread查看线程栈的深度,在此基础上加上余量确定线程栈的大小。
-
线程栈的增长方向:与芯片有关,在3.1.0之前的版本,只支持高地质向低地址增长。
1.2.2 线程状态
- RT_THREAD_INIT:初始状态,线程刚创建时的状态。
- RT_THREAD_READY:就绪态,当前线程运行完让出cpu时下一个就绪态的线程开始运行。
- RT_THREAD_RUNNING:运行态,在单核系统中,rt_thread_self()函数查看当前运行的线程。
- RT_THREAD_SUSPEND:挂起态,因为得不到资源或主动延时产生挂起(也称阻塞)。
- RT_THREAD_CLOSE:结束态,线程结束。
1.2.3 线程优先级
rtthread最大支持256个线程(一般选择32个),数值越小,优先级越高,0为最高优先级,最低优先级分配给空闲线程。
1.2.4 时间片
仅对优先级相同的线程有用,用于限制线程的运行时长,单位是相同节拍。
1.2.5 入口函数
entry是线程的入口函数,是线程实现预期功能的函数,注意在无限循环线程中要有延时或挂起等操作来让出cpu使用权,否则低优先级的线程无法得到执行。
1.2.6 线程的错误码说明
#define RT_EOK 0 /* 无 错 误 */
#define RT_ERROR 1 /* 普 通 错 误 */
#define RT_ETIMEOUT 2 /* 超 时 错 误 */
#define RT_EFULL 3 /* 资 源 已 满 */
#define RT_EEMPTY 4 /* 无 资 源 */
#define RT_ENOMEM 5 /* 无 内 存 */
#define RT_ENOSYS 6 /* 系 统 不 支 持 */
#define RT_EBUSY 7 /* 系 统 忙 */
#define RT_EIO 8 /* IO 错 误 */
#define RT_EINTR 9 /* 中 断 系 统 调 用 */
#define RT_EINVAL 10 /* 非 法 参 数 */
二、线程api
//动态创建线程
/*
name:线程名称
entry:入口函数
parameter:入口函数参数
stack_size:栈大小,单位:字节
priority:优先级
tick:时间片,单位:系统节拍
*/
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);
//删除动态创建的线程
/*
thread:线程句柄
*/
rt_err_t rt_thread_delete(rt_thread_t thread);
//初始化线程
/*
thread:线程结构体指针
name:线程名称
entry:入口函数
parameter:入口函数参数
stack_start:栈起始地址
stack_size:栈大小
priority:优先级
tick:时间片
*/
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);
//初始化出来的线程的脱离
/*
thread:线程句柄
*/
rt_err_t rt_thread_detach (rt_thread_t thread);
//启动线程
/*
thread:线程句柄
*/
rt_err_t rt_thread_startup(rt_thread_t thread)
//获取当前线程
/*
返回当前线程的句柄
*/
rt_thread_t rt_thread_self(void);
//让出资源
rt_err_t rt_thread_yield(void);
//睡眠,可以让线程挂起指定的时间
/*
tick:睡眠的时间
*/
rt_err_t rt_thread_sleep(rt_tick_t tick);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
`
//线程挂起,不推荐使用
/*
thread:线程句柄
*/
rt_err_t rt_thread_suspend (rt_thread_t thread);
//恢复线程
/*
thread:线程句柄
*/
rt_err_t rt_thread_resume (rt_thread_t thread);
//控制线程
/*
thread:线程句柄
cmd:控制命令
cmd支持的命令:
RT_THREAD_CTRL_CHANGE_PRIORITY:更改线程优先级
RT_THREAD_CTRL_STARTUP:运行线程
RT_THREAD_CTRL_CLOSE:关闭线程
arg:控制参数
*/
rt_err_t rt_thread_control(rt_thread_t thread, rt_uint8_t cmd, void* arg);
``