MS-RTOS 线程

更新时间:
2023-08-09
下载文档

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错误码
  • 返回值

  • 注意事项

  • 示例

文档内容是否对您有所帮助?
有帮助
没帮助