MS-RTOS 线程
本章将介绍 MS-RTOS 线程相关接口的使用。
线程相关数据类型
类型 | 描述 |
---|---|
ms_thread_opt_t | 线程选项类型 |
ms_thread_status_t | 线程运行状态类型 |
ms_thread_entry_t | 线程入口函数类型 |
ms_thread_stat_t | 线程状态信息结构类型 |
ms_thread_opt_t
线程的选项为以下宏的组合:
宏 | 含义 |
---|---|
MS_THREAD_OPT_SUPER | 特权态的线程 |
MS_THREAD_OPT_USER | 用户态的线程 |
MS_THREAD_OPT_FPU_EN | 线程使能 FPU |
MS_THREAD_OPT_REENT_EN | 线程使能 C 库可重入结构 |
MS_THREAD_OPT_SUPER 与 MS_THREAD_OPT_USER 互斥使用
ms_thread_status_t
线程的运行状态为以下的宏:
宏 | 描述 |
---|---|
MS_THREAD_STATUS_INVALID | 无效的状态 |
MS_THREAD_STATUS_DEAD | 僵死态 |
MS_THREAD_STATUS_READY | 就绪态 |
MS_THREAD_STATUS_SUSPEND | 挂起态 |
MS_THREAD_STATUS_SLEEP | 休眠态 |
MS_THREAD_STATUS_WAIT_SEMC | 等待计数信号量状态 |
MS_THREAD_STATUS_WAIT_MUTEX | 等待互斥量状态 |
MS_THREAD_STATUS_WAIT_MQUEUE | 等待消息队列状态 |
MS_THREAD_STATUS_WAIT_MEMPOOL | 等待内存池状态 |
MS_THREAD_STATUS_WAIT_EVENTSET | 等待事件标志组状态 |
MS_THREAD_STATUS_WAIT_COND | 等待条件变量状态 |
MS_THREAD_STATUS_WAIT_RWLOCK_R | 等待读写锁可读状态 |
MS_THREAD_STATUS_WAIT_RWLOCK_W | 等待读写锁可写状态 |
如果线程以超时的方式等待一个线程间通信 IPC 对象,则线程的运行状态为 MS_THREAD_STATUS_WAIT_??? | MS_THREAD_STATUS_SLEEP
ms_thread_entry_t
线程入口函数类型无返回值,有一个 ms_ptr_t
类型参数:
typedef void (*ms_thread_entry_t)(ms_ptr_t arg);
以下是一个线程的入口函数定义的示例:
static void xxx_thread(ms_ptr_t arg)
{
// do some thing
}
ms_thread_stat_t
线程的状态信息结构类型:
typedef struct {
const char * name;
ms_thread_status_t status;
ms_time_slice_t time_slice;
ms_prio_t prio;
} ms_thread_stat_t;
参数 | 说明 |
---|---|
name | 线程的名字 |
status | 线程的运行状态 |
time_slice | 线程的时间片(创建时指定的值) |
prio | 线程的优先级 |
线程相关 API
下表展示了线程相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_thread_create | ● | ● |
ms_thread_init | ● | ● |
ms_thread_self | ● | ● |
ms_thread_kill | ● | ● |
ms_thread_exit | ● | ● |
ms_thread_suspend | ● | ● |
ms_thread_resume | ● | ● |
ms_thread_yield | ● | ● |
ms_thread_sleep | ● | ● |
ms_thread_sleep_ms | ● | ● |
ms_thread_sleep_s | ● | ● |
ms_thread_sleep_hms | ● | ● |
ms_thread_stat | ● | ● |
ms_thread_errno_ptr | ● | ● |
ms_thread_get_errno | ● | ● |
ms_thread_set_errno | ● | ● |
ms_thread_create()
描述 创建一个就绪态的线程
函数原型
ms_err_t ms_thread_create(const char *name, ms_thread_entry_t entry, ms_ptr_t arg,
ms_size_t stk_size, ms_prio_t prio, ms_time_slice_t time_slice,
ms_thread_opt_t opt, ms_handle_t *tid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 线程的名字,不能为空指针 |
[in] | entry | 线程的进入点函数 |
[in] | arg | 线程的进入点函数的参数 |
[in] | stk_size | 线程的堆栈空间大小 |
[in] | prio | 线程的优先级 |
[in] | time_slice | 线程的时间片 |
[in] | opt | 线程的选项 |
[out] | tid | 线程的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核锁定期间调用。 如果一个线程创建时没有指定使用 FPU,但运行过程中去执行 FPU 指令,将产生异常。 用户空间创建线程时将自动加入
MS_THREAD_OPT_USER
选项。示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
// do some thing
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1);
return 0;
}
ms_thread_init()
描述 创建一个暂停态的线程
函数原型
ms_err_t ms_thread_init(const char *name, ms_thread_entry_t entry, ms_ptr_t arg,
ms_size_t stk_size, ms_prio_t prio, ms_time_slice_t time_slice,
ms_thread_opt_t opt, ms_handle_t *tid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 线程的名字,不能为空指针 |
[in] | entry | 线程的进入点函数 |
[in] | arg | 线程的进入点函数的参数 |
[in] | stk_size | 线程的堆栈空间大小 |
[in] | prio | 线程的优先级 |
[in] | time_slice | 线程的时间片 |
[in] | opt | 线程的选项 |
[out] | tid | 线程的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
// do some thing
}
int main(int argc, char *argv[])
{
ms_thread_init("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
// do some thing
return 0;
}
ms_thread_self()
描述 获得当前线程的 ID
函数原型
ms_handle_t ms_thread_self(void);
参数 无
返回值 当前线程的 ID
注意事项 不能在中断中调用,不能在内核启动前调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_handle_t tid = ms_thread_self();
// do some thing
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1);
return 0;
}
ms_thread_kill()
描述 杀死一个线程
函数原型
ms_err_t ms_thread_kill(ms_handle_t tid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | tid | 线程的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test0_tid, test1_tid;
static void test0_thread(void *arg)
{
ms_thread_sleep_s(1);
ms_thread_kill(test1_tid);
}
static void test1_thread(void *arg)
{
ms_thread_sleep_s(2);
}
int main(int argc, char *argv[])
{
ms_thread_create("test0", test0_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test0_tid);
ms_thread_create("test1", test1_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test1_tid);
ms_thread_sleep_s(3);
return 0;
}
ms_thread_exit()
描述 当前线程主动退出(结束运行)
函数原型
ms_err_t ms_thread_exit(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_exit();
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1);
return 0;
}
ms_thread_suspend()
描述 暂停一个线程的运行
函数原型
ms_err_t ms_thread_suspend(ms_handle_t tid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | tid | 线程的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t test0_tid, test1_tid;
static void test0_thread(void *arg)
{
ms_thread_sleep_s(1);
ms_thread_suspend(test1_tid);
}
static void test1_thread(void *arg)
{
while (1) {
// do some thing
}
}
int main(int argc, char *argv[])
{
ms_thread_create("test0", test0_thread, MS_NULL,
4096U, 15U, 0U,
MS_THREAD_OPT_USER, &test0_tid);
ms_thread_create("test1", test1_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test1_tid);
ms_thread_sleep_s(3);
return 0;
}
ms_thread_resume()
描述 恢复一个线程的运行
函数原型
ms_err_t ms_thread_resume(ms_handle_t tid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | tid | 线程的 ID |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t test0_tid, test1_tid;
static void test0_thread(void *arg)
{
ms_thread_sleep_s(1);
ms_thread_resume(test1_tid);
}
static void test1_thread(void *arg)
{
ms_thread_sleep_s(1);
}
int main(int argc, char *argv[])
{
ms_thread_create("test0", test0_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test0_tid);
ms_thread_init("test1", test1_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test1_tid);
ms_thread_sleep_s(3);
return 0;
}
ms_thread_yield()
描述 当前线程让出 CPU 使用权
函数原型
ms_err_t ms_thread_yield(void);
参数 无
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_yield();
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1);
return 0;
}
ms_thread_sleep()
描述 当前线程休眠指定的嘀嗒数
函数原型
ms_err_t ms_thread_sleep(ms_tick_t tick);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | tick | 休眠的嘀嗒数 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_sleep(10U);
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
while (1) {
ms_thread_suspend(ms_thread_self());
}
return 0;
}
ms_thread_sleep_ms()
描述 当前线程休眠指定的毫秒数
函数原型
ms_err_t ms_thread_sleep_ms(ms_uint32_t ms);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | ms | 休眠的毫秒数 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_sleep_ms(10U);
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
while (1) {
ms_thread_suspend(ms_thread_self());
}
return 0;
}
ms_thread_sleep_s()
描述 当前线程休眠指定的秒数
函数原型
ms_err_t ms_thread_sleep_s(ms_uint32_t sec);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | s | 休眠的秒数 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_sleep_s(1U);
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
while (1) {
ms_thread_suspend(ms_thread_self());
}
return 0;
}
ms_thread_sleep_hms()
描述 当前线程休眠指定的时分秒数
函数原型
ms_err_t ms_thread_sleep_hms(ms_uint32_t hour, ms_uint32_t min, ms_uint32_t sec);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | hour | 休眠的小时数 |
[in] | min | 休眠的分钟数 |
[in] | sec | 休眠的秒数 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,不能在内核锁定期间调用
示例
static ms_handle_t test_tid;
static void test_thread(void *arg)
{
ms_thread_sleep_hms(1U, 0U, 0U);
}
int main(int argc, char *argv[])
{
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
while (1) {
ms_thread_suspend(ms_thread_self());
}
return 0;
}
ms_thread_stat()
描述 获得指定线程的状态信息
函数原型
ms_err_t ms_thread_stat(ms_handle_t tid, ms_thread_stat_t *stat);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | tid | 线程的 ID |
[out] | stat | 线程的状态信息 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t test0_tid, test1_tid;
static void test0_thread(void *arg)
{
ms_thread_stat_t stat;
ms_thread_stat(test1_tid, &stat);
// do some thing
}
static void test1_thread(void *arg)
{
while (1) {
// do some thing
}
}
int main(int argc, char *argv[])
{
ms_thread_create("test0", test0_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test0_tid);
ms_thread_init("test1", test1_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test1_tid);
while (1) {
ms_thread_suspend(ms_thread_self());
}
return 0;
}
ms_thread_errno_ptr()
描述 获得当前线程 errno 的指针
函数原型
int *ms_thread_errno_ptr(void);
参数 无
返回值 当前线程 errno 的指针
注意事项 无
示例 无
ms_thread_get_errno()
描述 获得当前线程的 errno
函数原型
int ms_thread_get_errno(void);
参数 无
返回值 当前线程的 errno
注意事项 无
示例 无
ms_thread_set_errno()
描述 设置当前线程的 errno
函数原型
void ms_thread_set_errno(int _errno);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | _errno | 错误码 |
返回值 无
注意事项 无
示例 无