目录
1. 内核管理函数
1.1 osKernelInitialize
函数原型:
c
osStatus_t osKernelInitialize (void);
功能描述:
初始化RTOS内核。该函数在使用任何CMSIS-RTOS2功能之前必须被调用。
返回值:
osOK:内核初始化成功osError:内核初始化失败
说明:
- 该函数通常在系统启动时自动调用
- 在OpenHarmony轻量系统中,内核初始化由系统框架自动完成
- 应用开发者通常不需要直接调用此函数
1.2 osKernelStart
函数原型:
c
osStatus_t osKernelStart (void);
功能描述:
启动RTOS内核,开始任务调度。
返回值:
osOK:内核启动成功osError:内核启动失败
说明:
- 内核启动后,系统开始执行最高优先级的就绪任务
- 内核只能启动一次,重复调用会返回错误
- 在OpenHarmony轻量系统中,该函数由系统框架调用
1.3 osKernelGetState
函数原型:
c
osKernelState_t osKernelGetState (void);
功能描述:
获取内核当前状态。
返回值:
osKernelInactive:内核未激活osKernelReady:内核已就绪osKernelRunning:内核正在运行osKernelLocked:内核已锁定osKernelSuspended:内核已挂起osKernelError:内核异常
内核状态枚举定义:
c
typedef enum {
osKernelInactive = 0,
osKernelReady = 1,
osKernelRunning = 2,
osKernelLocked = 3,
osKernelSuspended = 4,
osKernelError = -1,
osKernelReserved = 0x7FFFFFFFU
} osKernelState_t;
1.4 osKernelGetTickCount
函数原型:
c
uint32_t osKernelGetTickCount (void);
功能描述:
获取内核当前的系统滴答计数。
返回值:
- 返回当前的系统滴答计数值(uint32_t类型)
说明:
- 系统滴答是内核的基本时间单位
- 可用于计算时间间隔
- 滴答频率由
LOSCFG_BASE_CORE_TICK_PER_SECOND配置决定
1.5 osKernelGetTickFreq
函数原型:
c
uint32_t osKernelGetTickFreq (void);
功能描述:
获取内核滴答频率(每秒的滴答数)。
返回值:
- 返回每秒的滴答数
说明:
- 典型值为100(10ms一个滴答)或1000(1ms一个滴答)
- 用于将滴答数转换为实际时间
1.6 osKernelLock
函数原型:
c
int32_t osKernelLock (void);
功能描述:
锁定内核调度,禁止任务切换。
返回值:
1:内核锁定成功0:内核已经被锁定- 负值:锁定失败
说明:
- 锁定后,当前任务不会被其他任务抢占
- 必须配对使用
osKernelUnlock解锁 - 支持嵌套锁定
1.7 osKernelUnlock
函数原型:
c
int32_t osKernelUnlock (void);
功能描述:
解锁内核调度,恢复任务切换。
返回值:
1:内核解锁成功0:内核未被锁定- 负值:解锁失败
说明:
- 必须与
osKernelLock配对使用 - 嵌套锁定时,只有最后一次解锁才会真正恢复调度
2. 任务管理函数
2.1 osThreadNew
函数原型:
c
osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);
功能描述:
创建一个新的任务并使其进入就绪状态。
参数说明:
func:任务函数指针,任务入口函数argument:传递给任务的参数指针attr:任务属性结构体指针
返回值:
- 成功:返回任务ID(osThreadId_t类型)
- 失败:返回NULL
任务属性结构体定义:
c
typedef struct {
const char *name; // 任务名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 任务控制块内存地址
uint32_t cb_size; // 任务控制块内存大小
void *stack_mem; // 栈内存地址
uint32_t stack_size; // 栈大小(字节)
osPriority_t priority; // 任务优先级
TZ_ModuleId_t tz_module; // TrustZone模块ID
uint32_t reserved; // 保留字段
} osThreadAttr_t;
任务优先级定义:
c
typedef enum {
osPriorityNone = 0,
osPriorityIdle = 1, // 空闲任务优先级
osPriorityLow = 8, // 低优先级
osPriorityLow1 = 9,
osPriorityLow2 = 10,
osPriorityLow3 = 11,
osPriorityLow4 = 12,
osPriorityLow5 = 13,
osPriorityLow6 = 14,
osPriorityLow7 = 15,
osPriorityBelowNormal = 16, // 低于正常优先级
osPriorityBelowNormal1 = 17,
osPriorityBelowNormal2 = 18,
osPriorityBelowNormal3 = 19,
osPriorityBelowNormal4 = 20,
osPriorityBelowNormal5 = 21,
osPriorityBelowNormal6 = 22,
osPriorityBelowNormal7 = 23,
osPriorityNormal = 24, // 正常优先级(推荐使用)
osPriorityNormal1 = 25,
osPriorityNormal2 = 26,
osPriorityNormal3 = 27,
osPriorityNormal4 = 28,
osPriorityNormal5 = 29,
osPriorityNormal6 = 30,
osPriorityNormal7 = 31,
osPriorityAboveNormal = 32, // 高于正常优先级
osPriorityAboveNormal1 = 33,
osPriorityAboveNormal2 = 34,
osPriorityAboveNormal3 = 35,
osPriorityAboveNormal4 = 36,
osPriorityAboveNormal5 = 37,
osPriorityAboveNormal6 = 38,
osPriorityAboveNormal7 = 39,
osPriorityHigh = 40, // 高优先级
osPriorityHigh1 = 41,
osPriorityHigh2 = 42,
osPriorityHigh3 = 43,
osPriorityHigh4 = 44,
osPriorityHigh5 = 45,
osPriorityHigh6 = 46,
osPriorityHigh7 = 47,
osPriorityRealtime = 48, // 实时优先级
osPriorityRealtime1 = 49,
osPriorityRealtime2 = 50,
osPriorityRealtime3 = 51,
osPriorityRealtime4 = 52,
osPriorityRealtime5 = 53,
osPriorityRealtime6 = 54,
osPriorityRealtime7 = 55,
osPriorityISR = 56, // ISR延迟任务优先级
osPriorityError = -1,
osPriorityReserved = 0x7FFFFFFF
} osPriority_t;
使用示例:
c
void MyTask(void *argument)
{
while (1) {
printf("Task running...\n");
sleep(1);
}
}
void create_task_example(void)
{
osThreadAttr_t attr = {0};
attr.name = "MyTask";
attr.stack_size = 1024; // 栈大小1024字节
attr.priority = osPriorityNormal; // 正常优先级
osThreadId_t task_id = osThreadNew((osThreadFunc_t)MyTask, NULL, &attr);
if (task_id != NULL) {
printf("Task created successfully, ID = %d\n", task_id);
}
}
说明:
- 优先级范围:9-38(Hi3861平台实际支持范围)
- 最大任务数由
LOSCFG_BASE_CORE_TSK_LIMIT配置决定 - 栈大小建议:简单任务1024字节,复杂任务2048-4096字节
- 任务名称用于调试和日志输出
2.2 osThreadGetName
函数原型:
c
const char *osThreadGetName (osThreadId_t thread_id);
功能描述:
获取指定任务的名称。
参数说明:
thread_id:任务ID
返回值:
- 成功:返回任务名称字符串
- 失败:返回NULL
2.3 osThreadGetId
函数原型:
c
osThreadId_t osThreadGetId (void);
功能描述:
获取当前运行任务的ID。
返回值:
- 成功:返回当前任务ID
- 失败:返回NULL
说明:
- 可在任务函数内部调用,获取自身ID
- 可用于任务间的通信和同步
2.4 osThreadGetState
函数原型:
c
osThreadState_t osThreadGetState (osThreadId_t thread_id);
功能描述:
获取指定任务的状态。
参数说明:
thread_id:任务ID
返回值:
osThreadInactive:任务未激活osThreadReady:任务就绪osThreadRunning:任务正在运行osThreadBlocked:任务被阻塞osThreadTerminated:任务已终止osThreadError:任务异常
任务状态枚举定义:
c
typedef enum {
osThreadInactive = 0,
osThreadReady = 1,
osThreadRunning = 2,
osThreadBlocked = 3,
osThreadTerminated = 4,
osThreadError = -1,
osThreadReserved = 0x7FFFFFFF
} osThreadState_t;
2.5 osThreadGetStackSize
函数原型:
c
uint32_t osThreadGetStackSize (osThreadId_t thread_id);
功能描述:
获取指定任务的栈大小。
参数说明:
thread_id:任务ID
返回值:
- 成功:返回栈大小(字节)
- 失败:返回0
2.6 osThreadSetPriority
函数原型:
c
osStatus_t osThreadSetPriority (osThreadId_t thread_id, osPriority_t priority);
功能描述:
修改指定任务的优先级。
参数说明:
thread_id:任务IDpriority:新的优先级
返回值:
osOK:优先级设置成功osErrorParameter:参数错误osErrorResource:资源错误
2.7 osThreadGetPriority
函数原型:
c
osPriority_t osThreadGetPriority (osThreadId_t thread_id);
功能描述:
获取指定任务的优先级。
参数说明:
thread_id:任务ID
返回值:
- 成功:返回任务优先级
- 失败:返回
osPriorityError
2.8 osThreadYield
函数原型:
c
osStatus_t osThreadYield (void);
功能描述:
主动让出CPU,使当前任务从运行状态切换到就绪状态。
返回值:
osOK:让出CPU成功osError:让出CPU失败
说明:
- 系统会调度同优先级的其他就绪任务运行
- 如果没有同优先级的就绪任务,当前任务继续运行
- 常用于时间片轮转或协作式调度
使用示例:
c
void CooperativeTask(void)
{
while (1) {
// 执行一些工作
do_some_work();
// 让出CPU,让其他同优先级任务运行
osThreadYield();
}
}
2.9 osThreadSuspend
函数原型:
c
osStatus_t osThreadSuspend (osThreadId_t thread_id);
功能描述:
挂起指定任务,使其进入阻塞状态。
参数说明:
thread_id:任务ID
返回值:
osOK:任务挂起成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 挂起的任务不会参与调度,直到被恢复
- 可以挂起其他任务,也可以挂起自己
- 挂起的任务需要调用
osThreadResume恢复
使用示例:
c
void Task2(void)
{
while (1) {
printf("Task 2, 开始挂起任务1\n");
osThreadSuspend(Task1_ID); // 挂起任务1
sleep(5);
printf("Task 2, 开始恢复任务1\n");
osThreadResume(Task1_ID); // 恢复任务1
sleep(5);
}
}
2.10 osThreadResume
函数原型:
c
osStatus_t osThreadResume (osThreadId_t thread_id);
功能描述:
恢复被挂起的任务,使其进入就绪状态。
参数说明:
thread_id:任务ID
返回值:
osOK:任务恢复成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 只能恢复被挂起的任务
- 恢复后,任务会根据优先级参与调度
- 如果优先级高于当前任务,会立即抢占
2.11 osThreadTerminate
函数原型:
c
osStatus_t osThreadTerminate (osThreadId_t thread_id);
功能描述:
终止指定任务,释放其占用的资源。
参数说明:
thread_id:任务ID
返回值:
osOK:任务终止成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 终止的任务不能再被恢复
- 任务占用的栈和资源会被释放
- 可以终止其他任务,也可以终止自己
2.12 osThreadGetCount
函数原型:
c
uint32_t osThreadGetCount (void);
功能描述:
获取当前系统中活跃任务的数量。
返回值:
- 成功:返回活跃任务数
- 失败:返回0
3. 消息队列函数
3.1 osMessageQueueNew
函数原型:
c
osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr);
功能描述:
创建并初始化一个消息队列。
参数说明:
msg_count:消息队列中可容纳的消息数量msg_size:每条消息的大小(字节)attr:消息队列属性结构体指针(通常为NULL)
返回值:
- 成功:返回消息队列ID
- 失败:返回NULL
消息队列属性结构体定义:
c
typedef struct {
const char *name; // 消息队列名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 控制块内存地址
uint32_t cb_size; // 控制块内存大小
void *mq_mem; // 消息存储内存地址
uint32_t mq_size; // 消息存储内存大小
} osMessageQueueAttr_t;
使用示例:
c
typedef struct {
uint8_t id;
uint8_t age;
char *name;
} msg_people_t;
osMessageQueueId_t MsgQueue_ID;
void create_message_queue(void)
{
// 创建消息队列:16条消息,每条消息大小为msg_people_t结构体大小
MsgQueue_ID = osMessageQueueNew(16, sizeof(msg_people_t), NULL);
if (MsgQueue_ID != NULL) {
printf("Message queue created successfully, ID = %d\n", MsgQueue_ID);
}
}
说明:
- 消息队列用于任务间的异步通信
- 消息按照FIFO(先进先出)原则处理
- 队列满时,发送操作会阻塞或超时
- 队列空时,接收操作会阻塞或超时
3.2 osMessageQueuePut
函数原型:
c
osStatus_t osMessageQueuePut (osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout);
功能描述:
向消息队列发送一条消息。
参数说明:
mq_id:消息队列IDmsg_ptr:指向要发送的消息数据的指针msg_prio:消息优先级(Hi3861平台未使用,设为0)timeout:超时时间(单位:滴答数)
返回值:
osOK:消息发送成功osErrorTimeout:发送超时osErrorResource:队列已满osErrorParameter:参数错误
超时时间常量:
c
#define osWaitForever 0xFFFFFFFFU // 永久等待
#define osNoWait 0x0U // 不等待
使用示例:
c
void Task1(void)
{
msg_people_t msg_people;
while (1) {
msg_people.id = 0;
msg_people.age = 16;
msg_people.name = "xiao_ming";
osStatus_t status = osMessageQueuePut(MsgQueue_ID, &msg_people, 0, osWaitForever);
if (status == osOK) {
printf("Message sent successfully\n");
}
sleep(1);
}
}
3.3 osMessageQueueGet
函数原型:
c
osStatus_t osMessageQueueGet (osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout);
功能描述:
从消息队列接收一条消息。
参数说明:
mq_id:消息队列IDmsg_ptr:指向接收消息缓冲区的指针msg_prio:接收消息优先级的指针(Hi3861平台未使用,设为NULL)timeout:超时时间(单位:滴答数)
返回值:
osOK:消息接收成功osErrorTimeout:接收超时osErrorResource:队列为空osErrorParameter:参数错误
使用示例:
c
void Task2(void)
{
msg_people_t msg_people;
while (1) {
osStatus_t status = osMessageQueueGet(MsgQueue_ID, &msg_people, NULL, osWaitForever);
if (status == osOK) {
printf("Received: id=%d, age=%d, name=%s\n",
msg_people.id, msg_people.age, msg_people.name);
}
}
}
3.4 osMessageQueueGetCapacity
函数原型:
c
uint32_t osMessageQueueGetCapacity (osMessageQueueId_t mq_id);
功能描述:
获取消息队列的最大容量(可容纳的消息数量)。
参数说明:
mq_id:消息队列ID
返回值:
- 成功:返回消息队列的最大容量
- 失败:返回0
3.5 osMessageQueueGetMsgSize
函数原型:
c
uint32_t osMessageQueueGetMsgSize (osMessageQueueId_t mq_id);
功能描述:
获取消息队列中单条消息的最大大小。
参数说明:
mq_id:消息队列ID
返回值:
- 成功:返回单条消息的最大大小
- 失败:返回0
3.6 osMessageQueueGetCount
函数原型:
c
uint32_t osMessageQueueGetCount (osMessageQueueId_t mq_id);
功能描述:
获取消息队列中当前的消息数量。
参数说明:
mq_id:消息队列ID
返回值:
- 成功:返回当前消息数量
- 失败:返回0
3.7 osMessageQueueGetSpace
函数原型:
c
uint32_t osMessageQueueGetSpace (osMessageQueueId_t mq_id);
功能描述:
获取消息队列中可用的消息槽位数量。
参数说明:
mq_id:消息队列ID
返回值:
- 成功:返回可用槽位数量
- 失败:返回0
3.8 osMessageQueueDelete
函数原型:
c
osStatus_t osMessageQueueDelete (osMessageQueueId_t mq_id);
功能描述:
删除消息队列,释放其占用的资源。
参数说明:
mq_id:消息队列ID
返回值:
osOK:删除成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 删除后,消息队列不能再被使用
- 队列中的所有消息都会被丢弃
- 正在等待该队列的任务会被唤醒并返回错误
4. 信号量函数
4.1 osSemaphoreNew
函数原型:
c
osSemaphoreId_t osSemaphoreNew (uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr);
功能描述:
创建并初始化一个信号量。
参数说明:
max_count:信号量的最大计数值initial_count:信号量的初始计数值attr:信号量属性结构体指针(通常为NULL)
返回值:
- 成功:返回信号量ID
- 失败:返回NULL
信号量属性结构体定义:
c
typedef struct {
const char *name; // 信号量名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 控制块内存地址
uint32_t cb_size; // 控制块内存大小
} osSemaphoreAttr_t;
使用示例:
c
osSemaphoreId_t Semaphore_ID;
void create_semaphore(void)
{
// 创建二值信号量:最大值1,初始值1
Semaphore_ID = osSemaphoreNew(1, 1, NULL);
if (Semaphore_ID != NULL) {
printf("Semaphore created successfully, ID = %d\n", Semaphore_ID);
}
}
说明:
- 二值信号量:max_count=1, initial_count=1
- 计数信号量:max_count>1, initial_count可自定义
- 信号量用于任务间的同步和互斥
4.2 osSemaphoreAcquire
函数原型:
c
osStatus_t osSemaphoreAcquire (osSemaphoreId_t semaphore_id, uint32_t timeout);
功能描述:
获取信号量(信号量计数值减1)。
参数说明:
semaphore_id:信号量IDtimeout:超时时间(单位:滴答数)
返回值:
osOK:获取信号量成功osErrorTimeout:获取超时osErrorResource:信号量不可用osErrorParameter:参数错误
使用示例:
c
void Task1(void)
{
while (1) {
// 请求信号量(阻塞等待)
osSemaphoreAcquire(Semaphore_ID, osWaitForever);
// 访问共享资源
printf("Task1 accessing shared resource\n");
// ... 临界区代码 ...
// 释放信号量
osSemaphoreRelease(Semaphore_ID);
sleep(1);
}
}
说明:
- 如果信号量计数值>0,立即获取成功,计数值减1
- 如果信号量计数值=0,任务阻塞等待
- 超时后,如果仍未获取成功,返回超时错误
4.3 osSemaphoreRelease
函数原型:
c
osStatus_t osSemaphoreRelease (osSemaphoreId_t semaphore_id);
功能描述:
释放信号量(信号量计数值加1)。
参数说明:
semaphore_id:信号量ID
返回值:
osOK:释放信号量成功osErrorResource:信号量已达到最大值osErrorParameter:参数错误
使用示例:
c
void Task2(void)
{
while (1) {
// 请求信号量
osSemaphoreAcquire(Semaphore_ID, osWaitForever);
// 访问共享资源
printf("Task2 accessing shared resource\n");
// ... 临界区代码 ...
// 释放信号量
osSemaphoreRelease(Semaphore_ID);
sleep(1);
}
}
说明:
- 释放信号量后,如果有任务在等待该信号量,会唤醒一个任务
- 信号量计数值不能超过max_count
- 必须与osSemaphoreAcquire配对使用
4.4 osSemaphoreGetCount
函数原型:
c
uint32_t osSemaphoreGetCount (osSemaphoreId_t semaphore_id);
功能描述:
获取信号量的当前计数值。
参数说明:
semaphore_id:信号量ID
返回值:
- 成功:返回信号量的当前计数值
- 失败:返回0
4.5 osSemaphoreDelete
函数原型:
c
osStatus_t osSemaphoreDelete (osSemaphoreId_t semaphore_id);
功能描述:
删除信号量,释放其占用的资源。
参数说明:
semaphore_id:信号量ID
返回值:
osOK:删除成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 删除后,信号量不能再被使用
- 正在等待该信号量的任务会被唤醒并返回错误
5. 互斥锁函数
5.1 osMutexNew
函数原型:
c
osMutexId_t osMutexNew (const osMutexAttr_t *attr);
功能描述:
创建并初始化一个互斥锁。
参数说明:
attr:互斥锁属性结构体指针(通常为NULL)
返回值:
- 成功:返回互斥锁ID
- 失败:返回NULL
互斥锁属性结构体定义:
c
typedef struct {
const char *name; // 互斥锁名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 控制块内存地址
uint32_t cb_size; // 控制块内存大小
} osMutexAttr_t;
互斥锁属性位定义:
c
#define osMutexRecursive 0x00000001U // 支持递归锁
#define osMutexPrioInherit 0x00000002U // 优先级继承
#define osMutexRobust 0x00000008U // 健壮锁
使用示例:
c
osMutexId_t Mutex_ID;
void create_mutex(void)
{
Mutex_ID = osMutexNew(NULL);
if (Mutex_ID != NULL) {
printf("Mutex created successfully, ID = %d\n", Mutex_ID);
}
}
说明:
- 互斥锁用于保护共享资源,确保同一时间只有一个任务访问
- 互斥锁具有所有权概念,只有获取锁的任务才能释放锁
- 支持优先级继承,防止优先级反转
5.2 osMutexAcquire
函数原型:
c
osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout);
功能描述:
获取互斥锁。
参数说明:
mutex_id:互斥锁IDtimeout:超时时间(单位:滴答数)
返回值:
osOK:获取互斥锁成功osErrorTimeout:获取超时osErrorResource:互斥锁已被其他任务持有osErrorParameter:参数错误
使用示例:
c
void Task1(void)
{
while (1) {
// 获取互斥锁
osMutexAcquire(Mutex_ID, osWaitForever);
// 访问共享资源
printf("Task1 accessing shared resource\n");
// ... 临界区代码 ...
// 释放互斥锁
osMutexRelease(Mutex_ID);
sleep(1);
}
}
说明:
- 如果互斥锁未被持有,立即获取成功
- 如果互斥锁已被其他任务持有,当前任务阻塞等待
- 如果当前任务已经持有该互斥锁(递归锁),可以重复获取
- 获取次数必须与释放次数匹配
5.3 osMutexRelease
函数原型:
c
osStatus_t osMutexRelease (osMutexId_t mutex_id);
功能描述:
释放互斥锁。
参数说明:
mutex_id:互斥锁ID
返回值:
osOK:释放互斥锁成功osErrorResource:互斥锁未被当前任务持有osErrorParameter:参数错误
使用示例:
c
void Task2(void)
{
while (1) {
// 获取互斥锁
osMutexAcquire(Mutex_ID, osWaitForever);
// 访问共享资源
printf("Task2 accessing shared resource\n");
// ... 临界区代码 ...
// 释放互斥锁
osMutexRelease(Mutex_ID);
sleep(1);
}
}
说明:
- 只有持有互斥锁的任务才能释放它
- 释放后,如果有任务在等待该互斥锁,会唤醒一个任务
- 必须与osMutexAcquire配对使用
5.4 osMutexGetOwner
函数原型:
c
osThreadId_t osMutexGetOwner (osMutexId_t mutex_id);
功能描述:
获取当前持有互斥锁的任务ID。
参数说明:
mutex_id:互斥锁ID
返回值:
- 成功:返回持有互斥锁的任务ID
- 失败:返回NULL
5.5 osMutexDelete
函数原型:
c
osStatus_t osMutexDelete (osMutexId_t mutex_id);
功能描述:
删除互斥锁,释放其占用的资源。
参数说明:
mutex_id:互斥锁ID
返回值:
osOK:删除成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 删除后,互斥锁不能再被使用
- 正在等待该互斥锁的任务会被唤醒并返回错误
6. 事件标志函数
6.1 osEventFlagsNew
函数原型:
c
osEventFlagsId_t osEventFlagsNew (const osEventFlagsAttr_t *attr);
功能描述:
创建并初始化一个事件标志对象。
参数说明:
attr:事件标志属性结构体指针(通常为NULL)
返回值:
- 成功:返回事件标志ID
- 失败:返回NULL
事件标志属性结构体定义:
c
typedef struct {
const char *name; // 事件标志名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 控制块内存地址
uint32_t cb_size; // 控制块内存大小
} osEventFlagsAttr_t;
使用示例:
c
osEventFlagsId_t EventFlags_ID;
void create_event_flags(void)
{
EventFlags_ID = osEventFlagsNew(NULL);
if (EventFlags_ID != NULL) {
printf("Event flags created successfully, ID = %d\n", EventFlags_ID);
}
}
说明:
- 事件标志用于任务间的同步
- 每个事件标志对象包含32个标志位
- 可以等待单个或多个标志位
6.2 osEventFlagsSet
函数原型:
c
uint32_t osEventFlagsSet (osEventFlagsId_t ef_id, uint32_t flags);
功能描述:
设置事件标志。
参数说明:
ef_id:事件标志IDflags:要设置的标志位(位掩码)
返回值:
- 成功:返回设置后的标志值
- 失败:返回
osFlagsErrorParameter
使用示例:
c
void Task1(void)
{
while (1) {
// 设置事件标志
osEventFlagsSet(EventFlags_ID, 0x01); // 设置第0位
sleep(1);
}
}
说明:
- 可以设置多个标志位(使用位或操作)
- 设置标志位会唤醒等待这些标志位的任务
- 标志位是累积的,不会自动清除
6.3 osEventFlagsClear
函数原型:
c
uint32_t osEventFlagsClear (osEventFlagsId_t ef_id, uint32_t flags);
功能描述:
清除事件标志。
参数说明:
ef_id:事件标志IDflags:要清除的标志位(位掩码)
返回值:
- 成功:返回清除前的标志值
- 失败:返回
osFlagsErrorParameter
使用示例:
c
void Task2(void)
{
while (1) {
// 清除事件标志
osEventFlagsClear(EventFlags_ID, 0x01); // 清除第0位
sleep(1);
}
}
说明:
- 可以清除多个标志位(使用位或操作)
- 通常在等待事件后清除标志位
- 清除操作不会影响其他任务
6.4 osEventFlagsGet
函数原型:
c
uint32_t osEventFlagsGet (osEventFlagsId_t ef_id);
功能描述:
获取当前事件标志的值。
参数说明:
ef_id:事件标志ID
返回值:
- 成功:返回当前事件标志的值
- 失败:返回0
6.5 osEventFlagsWait
函数原型:
c
uint32_t osEventFlagsWait (osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout);
功能描述:
等待事件标志。
参数说明:
ef_id:事件标志IDflags:要等待的标志位(位掩码)options:等待选项timeout:超时时间(单位:滴答数)
返回值:
- 成功:返回触发的事件标志值
- 超时:返回
osFlagsErrorTimeout - 参数错误:返回
osFlagsErrorParameter
等待选项定义:
c
#define osFlagsWaitAny 0x00000000U // 等待任意标志位
#define osFlagsWaitAll 0x00000001U // 等待所有标志位
#define osFlagsNoClear 0x00000002U // 不清除标志位
使用示例:
c
void Task3(void)
{
while (1) {
// 等待第0位标志,等待任意标志,自动清除
uint32_t flags = osEventFlagsWait(EventFlags_ID, 0x01, osFlagsWaitAny, osWaitForever);
if (flags & 0x01) {
printf("Event flag 0x01 received\n");
}
}
}
说明:
osFlagsWaitAny:任意指定的标志位被设置即返回osFlagsWaitAll:所有指定的标志位都被设置才返回osFlagsNoClear:等待后不清除标志位- 默认情况下,等待后会清除标志位
6.6 osEventFlagsDelete
函数原型:
c
osStatus_t osEventFlagsDelete (osEventFlagsId_t ef_id);
功能描述:
删除事件标志对象,释放其占用的资源。
参数说明:
ef_id:事件标志ID
返回值:
osOK:删除成功osErrorParameter:参数错误osErrorResource:资源错误
说明:
- 删除后,事件标志不能再被使用
- 正在等待该事件标志的任务会被唤醒并返回错误
7. 定时器函数
7.1 osTimerNew
函数原型:
c
osTimerId_t osTimerNew (osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr);
功能描述:
创建并初始化一个定时器。
参数说明:
func:定时器回调函数指针type:定时器类型argument:传递给回调函数的参数attr:定时器属性结构体指针(通常为NULL)
返回值:
- 成功:返回定时器ID
- 失败:返回NULL
定时器类型定义:
c
typedef enum {
osTimerOnce = 0, // 单次定时器
osTimerPeriodic = 1 // 周期定时器
} osTimerType_t;
定时器属性结构体定义:
c
typedef struct {
const char *name; // 定时器名称
uint32_t attr_bits; // 属性位
void *cb_mem; // 控制块内存地址
uint32_t cb_size; // 控制块内存大小
} osTimerAttr_t;
使用示例:
c
void TimerCallback(void *argument)
{
printf("Timer callback executed\n");
}
osTimerId_t Timer_ID;
void create_timer(void)
{
// 创建周期定时器,每1000个滴答触发一次
Timer_ID = osTimerNew(TimerCallback, osTimerPeriodic, NULL, NULL);
if (Timer_ID != NULL) {
printf("Timer created successfully, ID = %d\n", Timer_ID);
}
}
说明:
- 单次定时器:触发一次后自动停止
- 周期定时器:周期性触发,直到手动停止
- 定时器精度为1000 / LOSCFG_BASE_CORE_TICK_PER_SECOND毫秒
- 定时器回调函数在定时器任务上下文中执行
7.2 osTimerStart
函数原型:
c
osStatus_t osTimerStart (osTimerId_t timer_id, uint32_t ticks);
功能描述:
启动或重启定时器。
参数说明:
timer_id:定时器IDticks:定时器周期(单位:滴答数)
返回值:
osOK:启动成功osErrorParameter:参数错误osErrorResource:定时器正在运行
使用示例:
c
void start_timer(void)
{
// 启动定时器,周期为1000个滴答
osStatus_t status = osTimerStart(Timer_ID, 1000);
if (status == osOK) {
printf("Timer started successfully\n");
}
}
说明:
- 如果定时器正在运行,会先停止再重新启动
- 周期时间从调用时刻开始计算
- 周期定时器会周期性触发回调函数
7.3 osTimerStop
函数原型:
c
osStatus_t osTimerStop (osTimerId_t timer_id);
功能描述:
停止定时器。
参数说明:
timer_id:定时器ID
返回值:
osOK:停止成功osErrorParameter:参数错误osErrorResource:定时器未运行
使用示例:
c
void stop_timer(void)
{
osStatus_t status = osTimerStop(Timer_ID);
if (status == osOK) {
printf("Timer stopped successfully\n");
}
}
说明:
- 停止后,定时器不再触发回调函数
- 可以重新启动定时器
- 停止未运行的定时器会返回错误
7.4 osTimerIsRunning
函数原型:
c
uint32_t osTimerIsRunning (osTimerId_t timer_id);
功能描述:
检查定时器是否正在运行。
参数说明:
timer_id:定时器ID
返回值:
1:定时器正在运行0:定时器未运行
7.5 osTimerDelete
函数原型:
c
osStatus_t osTimerDelete (osTimerId_t timer_id);
功能描述:
删除定时器,释放其占用的资源。
参数说明:
timer_id:定时器ID
返回值:
osOK:删除成功osErrorParameter:参数错误osErrorResource:定时器正在运行
说明:
- 删除前必须先停止定时器
- 删除后,定时器不能再被使用
- 正在触发的回调函数会继续执行完毕
8. 实际应用示例
8.1 多任务LED闪烁示例
场景描述:
创建两个任务,一个任务控制LED闪烁,另一个任务执行其他功能。
代码示例:
c
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "bsp_led.h"
osThreadId_t LED_Task_ID;
osThreadId_t Other_Task_ID;
/* LED闪烁任务 */
void LED_Task(void)
{
led_init();
while (1) {
LED(1);
usleep(200 * 1000); // 200ms
LED(0);
usleep(200 * 1000); // 200ms
}
}
/* 其他功能任务 */
void Other_Task(void)
{
while (1) {
printf("Other task running...\n");
sleep(1);
}
}
/* 创建任务 */
void create_tasks(void)
{
osThreadAttr_t attr = {0};
// 创建LED任务
attr.name = "LEDTask";
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
LED_Task_ID = osThreadNew((osThreadFunc_t)LED_Task, NULL, &attr);
// 创建其他任务
attr.name = "OtherTask";
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
Other_Task_ID = osThreadNew((osThreadFunc_t)Other_Task, NULL, &attr);
}
8.2 任务挂起与恢复示例
场景描述:
任务2控制任务1的挂起和恢复,实现任务的动态控制。
代码示例:
c
#include "ohos_init.h"
#include "cmsis_os2.h"
osThreadId_t Task1_ID;
osThreadId_t Task2_ID;
/* 任务1 */
void Task1(void)
{
while (1) {
printf("Task 1 running...\n");
sleep(1);
}
}
/* 任务2 */
void Task2(void)
{
while (1) {
printf("Task 2: Suspending Task 1\n");
osThreadSuspend(Task1_ID);
sleep(5);
printf("Task 2: Resuming Task 1\n");
osThreadResume(Task1_ID);
sleep(5);
}
}
/* 创建任务 */
void create_tasks(void)
{
osThreadAttr_t attr = {0};
// 创建任务1
attr.name = "Task1";
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &attr);
// 创建任务2
attr.name = "Task2";
attr.stack_size = 1024;
attr.priority = osPriorityNormal1;
Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &attr);
}
8.3 消息队列通信示例
场景描述:
任务1发送消息,任务2接收消息,实现任务间的数据传递。
代码示例:
c
#include "ohos_init.h"
#include "cmsis_os2.h"
osThreadId_t Task1_ID;
osThreadId_t Task2_ID;
osMessageQueueId_t MsgQueue_ID;
typedef struct {
uint8_t id;
uint8_t age;
char *name;
} msg_people_t;
/* 任务1:发送消息 */
void Task1(void)
{
msg_people_t msg;
while (1) {
msg.id = 0;
msg.age = 16;
msg.name = "xiao_ming";
osStatus_t status = osMessageQueuePut(MsgQueue_ID, &msg, 0, osWaitForever);
if (status == osOK) {
printf("Message sent: id=%d, age=%d, name=%s\n",
msg.id, msg.age, msg.name);
}
sleep(1);
}
}
/* 任务2:接收消息 */
void Task2(void)
{
msg_people_t msg;
while (1) {
osStatus_t status = osMessageQueueGet(MsgQueue_ID, &msg, NULL, osWaitForever);
if (status == osOK) {
printf("Message received: id=%d, age=%d, name=%s\n",
msg.id, msg.age, msg.name);
}
}
}
/* 初始化 */
void init_example(void)
{
// 创建消息队列
MsgQueue_ID = osMessageQueueNew(16, sizeof(msg_people_t), NULL);
// 创建任务
osThreadAttr_t attr = {0};
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
attr.name = "Task1";
Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &attr);
attr.name = "Task2";
Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &attr);
}
8.4 信号量互斥示例
场景描述:
使用二值信号量保护共享资源,确保同一时间只有一个任务访问。
代码示例:
c
#include "ohos_init.h"
#include "cmsis_os2.h"
osThreadId_t Task1_ID;
osThreadId_t Task2_ID;
osSemaphoreId_t Semaphore_ID;
uint8_t shared_buffer[20];
/* 任务1:写数据 */
void Task1(void)
{
int i;
while (1) {
// 获取信号量
osSemaphoreAcquire(Semaphore_ID, osWaitForever);
// 写入共享数据
printf("Task1 writing data:\n");
for (i = 0; i < sizeof(shared_buffer); i++) {
shared_buffer[i] = i;
printf("%d ", shared_buffer[i]);
}
printf("\n");
// 释放信号量
osSemaphoreRelease(Semaphore_ID);
sleep(1);
}
}
/* 任务2:读数据 */
void Task2(void)
{
int i;
while (1) {
// 获取信号量
osSemaphoreAcquire(Semaphore_ID, osWaitForever);
// 读取共享数据
printf("Task2 reading data:\n");
for (i = 0; i < sizeof(shared_buffer); i++) {
printf("%d ", shared_buffer[i]);
}
printf("\n");
// 释放信号量
osSemaphoreRelease(Semaphore_ID);
sleep(1);
}
}
/* 初始化 */
void init_example(void)
{
// 创建二值信号量
Semaphore_ID = osSemaphoreNew(1, 1, NULL);
// 创建任务
osThreadAttr_t attr = {0};
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
attr.name = "Task1";
Task1_ID = osThreadNew((osThreadFunc_t)Task1, NULL, &attr);
attr.name = "Task2";
Task2_ID = osThreadNew((osThreadFunc_t)Task2, NULL, &attr);
}
8.5 定时器应用示例
场景描述:
使用周期定时器定期执行任务,实现定时功能。
代码示例:
c
#include "ohos_init.h"
#include "cmsis_os2.h"
osTimerId_t Timer_ID;
/* 定时器回调函数 */
void TimerCallback(void *argument)
{
printf("Timer callback: Periodic task executed\n");
}
/* 主任务 */
void Main_Task(void)
{
// 启动定时器,周期为1000个滴答
osTimerStart(Timer_ID, 1000);
while (1) {
printf("Main task running...\n");
sleep(5);
}
}
/* 初始化 */
void init_example(void)
{
// 创建周期定时器
Timer_ID = osTimerNew(TimerCallback, osTimerPeriodic, NULL, NULL);
// 创建主任务
osThreadAttr_t attr = {0};
attr.name = "MainTask";
attr.stack_size = 1024;
attr.priority = osPriorityNormal;
osThreadNew((osThreadFunc_t)Main_Task, NULL, &attr);
}
9. 配置参数说明
9.1 任务栈大小配置
推荐配置:
- 简单任务:1024字节
- 中等复杂任务:2048字节
- 复杂任务:4096字节
- 包含浮点运算的任务:建议增加512-1024字节
配置示例:
c
osThreadAttr_t attr = {0};
attr.stack_size = 1024; // 栈大小1024字节
9.2 任务优先级配置
优先级范围:
- Hi3861平台支持范围:9-38
- 推荐使用范围:24-32(osPriorityNormal到osPriorityAboveNormal)
优先级分配原则:
- 空闲任务:osPriorityIdle (1)
- 低优先级任务:osPriorityLow (8-15)
- 普通任务:osPriorityNormal (24-31)
- 高优先级任务:osPriorityAboveNormal (32-39)
配置示例:
c
osThreadAttr_t attr = {0};
attr.priority = osPriorityNormal; // 正常优先级
9.3 消息队列配置
配置参数:
- 消息数量:根据实际需求设置(如16、32、64)
- 消息大小:根据消息结构体大小设置
配置示例:
c
typedef struct {
uint8_t id;
uint8_t age;
char *name;
} msg_people_t;
// 创建消息队列:16条消息,每条消息大小为msg_people_t结构体大小
osMessageQueueId_t MsgQueue_ID = osMessageQueueNew(16, sizeof(msg_people_t), NULL);
9.4 信号量配置
二值信号量配置:
c
// 最大值1,初始值1
osSemaphoreId_t Semaphore_ID = osSemaphoreNew(1, 1, NULL);
计数信号量配置:
c
// 最大值10,初始值5
osSemaphoreId_t CountingSemaphore_ID = osSemaphoreNew(10, 5, NULL);
9.5 定时器配置
单次定时器配置:
c
osTimerId_t Timer_ID = osTimerNew(TimerCallback, osTimerOnce, NULL, NULL);
周期定时器配置:
c
osTimerId_t Timer_ID = osTimerNew(TimerCallback, osTimerPeriodic, NULL, NULL);
附录
A. 返回值枚举定义
c
typedef enum {
osOK = 0, // 操作成功
osError = -1, // 未指定错误
osErrorTimeout = -2, // 超时
osErrorResource = -3, // 资源错误
osErrorParameter = -4, // 参数错误
osErrorNoMemory = -5, // 内存不足
osErrorISR = -6, // ISR错误
osStatusReserved = 0x7FFFFFFF
} osStatus_t;
B. 常用宏定义
c
// 超时时间
#define osWaitForever 0xFFFFFFFFU // 永久等待
#define osNoWait 0x0U // 不等待
// 事件标志选项
#define osFlagsWaitAny 0x00000000U // 等待任意标志位
#define osFlagsWaitAll 0x00000001U // 等待所有标志位
#define osFlagsNoClear 0x00000002U // 不清除标志位
// 互斥锁属性
#define osMutexRecursive 0x00000001U // 支持递归锁
#define osMutexPrioInherit 0x00000002U // 优先级继承
#define osMutexRobust 0x00000008U // 健壮锁
--