openharmony用ubuntu编写线程
第一部分:代码结构
软件部分目录结构
thread_demo
├─ BUILD.gn
├─ thread_basic.c
└─ thread.c
我们打开文件
代码打开thread_basic.c
编译后会看到效果
可以看到是一直增加的
主要函数
头文件
// POSIX标准接口
#include <unistd.h>
// 用于初始化服务(services)和功能(features)
#include "ohos_init.h"
// CMSIS-RTOS API V2
// 是OpenHarmony的LiteOS_m内核与应用程序之间的抽象层。(LiteOS_m内核基于Cortex M系列芯片)
// 提供标准接口,便于应用程序移植来OpenHarmony,或者移植到其他支持CMSIS-RTOS API V2的系统。
// 头文件:kernel/liteos_m/kal/cmsis/cmsis_os2.h
// 源文件:kernel/liteos_m/kal/cmsis/cmsis_liteos2.c
#include "cmsis_os2.h"
创建一个线程,并将其加入活跃线程组中
osThreadNew((osThreadFunc_t)threadMain, NULL, &attr)
osThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)
// func 线程要运行的函数
// argument 指针,指向传递给线程函数的参数(可以是”xxxx”的形式)
// attr 线程属性(使用结构体)
// 注意:不能在中断服务调用该函数
//关于attr结构体
// 定义线程属性
osThreadAttr_t attr;
// 线程名
attr.name = "rtosv2_thread_main";
// 线程属性位
attr.attr_bits = 0U;
// 线程控制块的内存初始地址,默认为系统自动分配
attr.cb_mem = NULL;
// 线程控制块的内存大小
attr.cb_size = 0U;
// 线程栈的内存初始地址,默认为系统自动分配
attr.stack_mem = NULL;
// 线程栈的内存大小
attr.stack_size = 1024;
// 线程优先级,9(highest) - 38(lowest priority),默认为osPriorityNormal
// 位置:kernel\liteos_m\kal\cmsis\cmsis_os2.h
attr.priority = osPriorityNormal;
如果osThreadNew((osThreadFunc_t)threadMain, NULL, &attr)==NULL说明函数运行失败
读取当前线程ID
osThreadGetId();
参考用法
osThreadId_t tid = osThreadGetId();
printf("thread id: %p\r\n", tid);
读取当前线程名字
osThreadGetName(tid)
tid为线程ID
可以用上面的方法获取ID
得到线程的状态
osThreadGetState(tid)
tid为线程ID
可以用上面的方法获取ID
设置线程的优先级
osThreadSetPriority(tid, osPriorityNormal4);
tid为线程ID
可以用上面的方法获取ID
osPriorityNormal4为优先级
优先级有
osPriorityNormal = 24,
osPriorityNormal1 = 24+1,
osPriorityNormal2 = 24+2,
osPriorityNormal3 = 24+3,
osPriorityNormal4 = 24+4,
osPriorityNormal5 = 24+5,
osPriorityNormal6 = 24+6,
osPriorityNormal7 = 24+7,
读取线程的优先级
osThreadGetPriority(tid);
tid为线程ID
可以用上面的方法获取ID
挂起线程
osThreadSuspend(tid);
也可以读取挂起情况
恢复线程
osThreadResume(tid);
得到线程的栈空间大小
osThreadGetStackSize(tid);
得到线程的未使用的栈空间大小
osThreadGetStackSpace(tid);
获取活跃线程数
osThreadGetCount();
终止线程
osThreadTerminate(tid);