HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理
Posted Leung_ManWah
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理相关的知识,希望对你有一定的参考价值。
一、简介
- 从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
- LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。
- LiteOS中的任务是抢占式调度机制,高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度,同时支持时间片轮转调度方式。
- LiteOS的任务默认有32个优先级(0-31),最高优先级为0,最低优先级为31。
- 任务状态
任务状态通常分为以下四种:- 就绪(Ready): 该任务在就绪列表中,只等待CPU。
- 运行(Running): 该任务正在执行。
- 阻塞(Blocked): 该任务不在就绪列表中。包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。
- 退出态(Dead): 该任务运行结束,等待系统回收资源。
- 任务ID: 在任务创建时通过参数返回给用户,作为任务的一个非常重要的标识。
- 任务优先级: 优先级表示任务执行的优先顺序。
- 任务入口函数: 每个新任务得到调度后将执行的函数。
- 任务控制块TCB: 每一个任务都含有一个任务控制块(TCB)。TCB包含了任务上下文栈指针(stack pointer)、任务状态、任务优先级、任务ID、任务名、任务栈大小等信息。TCB可以反映出每个任务运行情况。
- 任务栈: 每一个任务都拥有一个独立的栈空间,我们称为任务栈。
- 任务上下文: 任务在运行过程中使用到的一些资源,如寄存器等,我们称为任务上下文。LiteOS在任务挂起的时候会将本任务的任务上下文信息,保存在自己的任务栈里面,以便任务恢复后,从栈空间中恢复挂起时的上下文信息,从而继续执行被挂起时被打断的代码。
- 任务切换: 任务切换包含获取就绪列表中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作。
二、API说明
以下任务管理接口位于 kernel/liteos_m/components/cmsis/2.0/cmsis_os2.h。
业务BUILD.gn中包含路径
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
]
2.1 osThreadNew
功能 | 创建任务,不能在中断服务调用该函数 |
---|---|
函数定义 | osThreadId_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) |
参数 | func:任务函数 argument:作为启动参数传递给任务函数的指针 attr:任务入口函数的参数列表 |
返回 | 任务ID |
2.2 osThreadTerminate
功能 | 删除某个任务(一般是对非自任务操作) |
---|---|
函数定义 | osStatus_t osThreadTerminate (osThreadId_t thread_id) |
参数 | thread_id:任务ID |
返回 | 0 - 成功,非0 - 失败 |
2.3 osThreadSuspend
功能 | 任务挂起 |
---|---|
函数定义 | osStatus_t osThreadSuspend (osThreadId_t thread_id) |
参数 | thread_id:任务ID |
返回 | 0 - 成功,非0 - 失败 |
2.4 osThreadResume
功能 | 任务恢复 |
---|---|
函数定义 | osStatus_t osThreadResume (osThreadId_t thread_id) |
参数 | thread_id:任务ID |
返回 | 0 - 成功,非0 - 失败 |
三、创建任务
编译时在业务BUILD.gn中包含路径
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
]
/*
* Copyright (c) 2020 Nanjing Xiaoxiongpai Intelligent Technology Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
/*****任务一*****/
void thread1(void)
{
int sum = 0;
while (1)
{
printf("This is BearPi Harmony Thread1----%d\\r\\n", sum++);
usleep(1000000);//1s
}
}
/*****任务二*****/
void thread2(void)
{
int sum = 0;
while (1)
{
printf("This is BearPi Harmony Thread2----%d\\r\\n", sum++);
usleep(500000);//500ms
}
}
/*****任务创建*****/
static void Thread_example(void)
{
osThreadAttr_t attr;
attr.name = "thread1";//任务名称
attr.attr_bits = 0U;//属性位用于设置cmsis_os2.h中的osStatus_t osThreadJoin (osThreadId_t thread_id);函数是否能使用,默认为0
attr.cb_mem = NULL;//控制块的指针,不操作设置为NULL
attr.cb_size = 0U;//控制块的指针大小,0
attr.stack_mem = NULL;//任务栈指针,不操作设置为NULL
attr.stack_size = 1024 * 4;//任务栈大小:8字节对齐的大小
attr.priority = 25;//任务的优先级:25
if (osThreadNew((osThreadFunc_t)thread1, NULL, &attr) == NULL)//通过osThreadNew函数传递参数设置任务函数,创建任务1
{
printf("Falied to create thread1!\\n");
}
attr.name = "thread2";//重新赋值任务名
if (osThreadNew((osThreadFunc_t)thread2, NULL, &attr) == NULL)
{
printf("Falied to create thread2!\\n");
}
}
APP_FEATURE_INIT(Thread_example);
查看打印:
thread1任务每1秒打印1次,thread2任务每500毫秒打印1次。
• 由 Leung 写于 2021 年 6 月 6 日
以上是关于HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理的主要内容,如果未能解决你的问题,请参考以下文章
HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)信号量
HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)事件管理
HI3861学习笔记(10)——HarmonyOS(CMSIS-RTOS2)消息队列