HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理

Posted Leung_ManWah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理相关的知识,希望对你有一定的参考价值。

一、简介

  1. 从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。
  2. LiteOS的任务模块可以给用户提供多个任务,实现了任务之间的切换和通信,帮助用户管理业务程序流程。这样用户可以将更多的精力投入到业务功能的实现中。
  3. LiteOS中的任务是抢占式调度机制,高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度,同时支持时间片轮转调度方式。
  4. 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 日

• 参考:【鸿蒙2.0设备开发教程】小熊派HarmonyOS 鸿蒙·季 开发教程
    HarmonyOS内核开发—任务管理

以上是关于HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)任务管理的主要内容,如果未能解决你的问题,请参考以下文章

HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)信号量

HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)事件管理

HI3861学习笔记(10)——HarmonyOS(CMSIS-RTOS2)消息队列

HI3861学习笔记——HarmonyOS(CMSIS-RTOS2)软件定时器

HI3861学习笔记(11)——GPIO输出接口使用

HI3861学习笔记(12)——GPIO输入接口使用