鸿蒙OpenHarmony【小型系统基础内核(进程管理任务)】子系统开发

任务

基本概念

从系统的角度看,任务Task是竞争系统资源的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。

OpenHarmony 内核中使用一个任务表示一个线程。

OpenHarmony 内核中同优先级进程内的任务统一调度、运行。

OpenHarmony 内核中的任务采用抢占式调度机制,同时支持时间片轮转调度和FIFO调度方式。

OpenHarmony 内核的任务一共有32个优先级(0-31),最高优先级为0,最低优先级为31。

当前进程内, 高优先级的任务可抢占低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。

任务状态说明

  • 初始化(Init):任务正在被创建。

  • 就绪(Ready):任务在就绪列表中,等待CPU调度。

  • 运行(Running):任务正在运行。

  • 阻塞(Blocked):任务被阻塞挂起。Blocked状态包括:pending(因为锁、事件、信号量等阻塞)、suspended(主动pend)、delay(延时阻塞)、pendtime(因为锁、事件、信号量时间等超时等待)。

  • 退出(Exit):任务运行结束,等待父任务回收其控制块资源。

    图1 任务状态迁移示意图

    1

任务状态迁移说明:

  • Init→Ready: 任务创建拿到控制块后为初始化阶段(Init状态),当任务初始化完成将任务插入调度队列,此时任务进入就绪状态。
  • Ready→Running: 任务创建后进入就绪态,发生任务切换时,就绪列表中最高优先级的任务被执行,从而进入运行态,此刻该任务从就绪列表中删除。
  • Running→Blocked: 正在运行的任务发生阻塞(挂起、延时、读信号量等)时,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中剩余最高优先级任务。
  • Blocked→Ready : 阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪列表,从而由阻塞态变成就绪态。
  • Ready→Blocked: 任务也有可能在就绪态时被阻塞(挂起),此时任务状态会由就绪态转变为阻塞态,该任务从就绪列表中删除,不会参与任务调度,直到该任务被恢复。
  • Running→Ready: 有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪列表中最高优先级任务变为运行态,那么原先运行的任务由运行态变为就绪态,并加入就绪列表中。
  • Running→Exit: 运行中的任务运行结束,任务状态由运行态变为退出态。若为设置了分离属性( 由头文件 los_task.h 中的宏定义 LOS_TASK_STATUS_DETACHED 设置)的任务,运行结束后将直接销毁。

运行机制

OpenHarmony 任务管理模块提供任务创建、任务延时、任务挂起和任务恢复、锁任务调度和解锁任务调度、根据ID查询任务控制块信息功能。

用户创建任务时,系统会将任务栈进行初始化,预置上下文。此外,系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时,将会执行任务入口函数。

开发指导

接口说明

表1 任务的创建和删除
接口名接口描述
LOS_TaskCreate创建任务,若所创建任务的优先级比当前的运行的任务优先级高且任务调度没有锁定, 则该任务将被调度进入运行态
LOS_TaskCreateOnly创建任务并阻塞,任务恢复前不会将其加入就绪队列中
LOS_TaskDelete删除指定的任务,回收其任务控制块和任务栈所消耗的资源
表2 任务的状态控制
接口名接口描述
LOS_TaskResume恢复挂起的任务
LOS_TaskSuspend挂起指定的任务,该任务将从就绪任务队列中移除
LOS_TaskJoin阻塞当前任务,等待指定任务运行结束并回收其资源
LOS_TaskDetach修改任务的 joinable 属性为 detach 属性,detach 属性的任务运行结束会自动回收任务控制块资源
LOS_TaskDelay延迟当前任务的执行,在延后指定的时间(tick数)后可以被调度
LOS_TaskYield将当前任务从具有相同优先级的任务队列,移动到就绪任务队列的末尾
表3 任务调度
接口名接口描述
LOS_TaskLock锁定任务调度,阻止任务切换
LOS_TaskUnlock解锁任务调度。通过该接口可以使任务锁数量减1,若任务多次加锁,那么 任务调度在锁数量减为0时才会完全解锁
LOS_GetTaskScheduler获取指定任务的调度策略
LOS_SetTaskScheduler设置指定任务的调度参数,包括优先级和调度策略
LOS_Schedule触发主动的任务调度
表4 任务相关信息获取
接口名接口描述
LOS_CurTaskIDGet获取当前任务的ID
LOS_TaskInfoGet获取指定任务的信息
LOS_GetSystemTaskMaximum获取系统支持的最大任务数
表5 任务优先级
接口名接口描述
LOS_CurTaskPriSet设置当前正在运行的任务的优先级
LOS_TaskPriSet设置指定任务的优先级
LOS_TaskPriGet获取指定任务的优先级
表6 任务绑核操作
接口名接口描述
LOS_TaskCpuAffiSet绑定指定任务到指定CPU上运行,仅在多核下使用
LOS_TaskCpuAffiGet获取指定任务的绑核信息,仅在多核下使用

开发流程

任务的典型开发流程:

  1. 通过LOS_TaskCreate创建一个任务。

    • 指定任务的执行入口函数
    • 指定任务名
    • 指定任务的栈大小
    • 指定任务的优先级
    • 指定任务的属性,LOS_TASK_ATTR_JOINABLE和LOS_TASK_STATUS_DETACHED属性
    • 多核运行时,可以选择设置任务的绑核属性
  2. 任务参与调度运行,执行用户指定的业务代码。

  3. 任务执行结束,如果设置了 LOS_TASK_STATUS_DETACHED 属性,则自动回收任务资源,如果任务设置了 LOS_TASK_ATTR_JOINABLE 属性,则需要调用LOS_TaskJoin 回收任务资源,默认为 LOS_TASK_STATUS_DETACHED 属性。

说明:

  • 内核态具有最高权限,可以操作任意进程内的任务。
  • 用户态进程通过系统调用进入内核态后创建的任务属于KProcess, 不属于当前用户态进程。

编程实例

代码实现如下(该示例代码的测试函数可以加在 kernel /liteos_a/testsuites /kernel /src /osTest.c 中的 TestTaskEntry 中进行测试。):

UINT32 g_taskLoID;
UINT32 g_taskHiID;
#define TSK_PRIOR_HI 4
#define TSK_PRIOR_LO 5
UINT32 ExampleTaskHi(VOID)
{UINT32 ret;PRINTK("Enter TaskHi Handler.\n");/* 延时2个Tick,延时后该任务会挂起,执行剩余任务中最高优先级的任务(g_taskLoID任务) */ret = LOS_TaskDelay(2);if (ret != LOS_OK) {PRINTK("Delay Task Failed.\n");return LOS_NOK;}/* 2个Tick时间到了后,该任务恢复,继续执行 */PRINTK("TaskHi LOS_TaskDelay Done.\n");/* 挂起自身任务 */ret = LOS_TaskSuspend(g_taskHiID);if (ret != LOS_OK) {PRINTK("Suspend TaskHi Failed.\n");return LOS_NOK;}PRINTK("TaskHi LOS_TaskResume Success.\n");return LOS_OK;
}/* 低优先级任务入口函数 */
UINT32 ExampleTaskLo(VOID)
{UINT32 ret;PRINTK("Enter TaskLo Handler.\n");/* 延时2个Tick,延时后该任务会挂起,执行剩余任务中就高优先级的任务(背景任务) */ret = LOS_TaskDelay(2);if (ret != LOS_OK) {PRINTK("Delay TaskLo Failed.\n");return LOS_NOK;}PRINTK("TaskHi LOS_TaskSuspend Success.\n");/* 恢复被挂起的任务g_taskHiID */ret = LOS_TaskResume(g_taskHiID);if (ret != LOS_OK) {PRINTK("Resume TaskHi Failed.\n");return LOS_NOK;}PRINTK("TaskHi LOS_TaskDelete Success.\n");return LOS_OK;
}
/* 任务测试入口函数,在里面创建优先级不一样的两个任务 */
UINT32 ExampleTaskCaseEntry(VOID)
{UINT32 ret;TSK_INIT_PARAM_S initParam = {0};/* 锁任务调度 */LOS_TaskLock();PRINTK("LOS_TaskLock() Success!\n");/* 高优先级任务的初始化参数,其资源回收需要其他任务调用 LOS_TaskJoin */initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskHi;initParam.usTaskPrio = TSK_PRIOR_HI;initParam.pcName = "HIGH_NAME";initParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE;initParam.uwResved   = LOS_TASK_ATTR_JOINABLE;/* 创建高优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */ret = LOS_TaskCreate(&g_taskHiID, &initParam);if (ret != LOS_OK) {LOS_TaskUnlock();PRINTK("ExampleTaskHi create Failed! ret=%d\n", ret);return LOS_NOK;}PRINTK("ExampleTaskHi create Success!\n");/* 低优先级任务的初始化参数,任务结束后会自行结束销毁 */initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleTaskLo;initParam.usTaskPrio = TSK_PRIOR_LO;initParam.pcName = "LOW_NAME";initParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE;initParam.uwResved   = LOS_TASK_STATUS_DETACHED;/* 创建低优先级任务,由于锁任务调度,任务创建成功后不会马上执行 */ret = LOS_TaskCreate(&g_taskLoID, &initParam);if (ret!= LOS_OK) {LOS_TaskUnlock();PRINTK("ExampleTaskLo create Failed!\n");return LOS_NOK;}PRINTK("ExampleTaskLo create Success!\n");/* 解锁任务调度,此时会发生任务调度,执行就绪列表中最高优先级任务 */LOS_TaskUnlock();ret = LOS_TaskJoin(g_taskHiID, NULL);if (ret != LOS_OK) {PRINTK("Join ExampleTaskHi Failed!\n");} else {PRINTK("Join ExampleTaskHi Success!\n");}while(1){};return LOS_OK;
}
c

编译运行得到的结果为:

LOS_TaskLock() Success!
ExampleTaskHi create Success!
ExampleTaskLo create Success!
Enter TaskHi Handler.
Enter TaskLo Handler.
TaskHi LOS_TaskDelay Done.
TaskHi LOS_TaskSuspend Success.
TaskHi LOS_TaskResume Success.
TaskHi LOS_TaskDelete Success.
Join ExampleTaskHi Success!

以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
1

除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下

内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!

鸿蒙【北向应用开发+南向系统层开发】文档

鸿蒙【基础+实战项目】视频

鸿蒙面经

2

为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544812.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

14.第二阶段x86游戏实战2-C++语言开发环境搭建-VisualStudio2017

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

复制他人 CSDN 文章到自己的博客

文章目录 0.前言步骤 0.前言 在复制别人文章发布时,记得表明转载哦 步骤 在需要复制的csdn 文章页面,打开浏览器开发者工具(F12)Ctrl F 查找"article_content"标签头 右键“Copy”->“Copy element”新建一个 tx…

【直线 / B】

题目 代码&#xff08;巨复杂&#xff0c;跑了我十几分钟&#xff09; #include <bits/stdc.h> using namespace std; const double eps 1e-6; const int N 18e6; #define x first #define y second typedef pair<int, int> PII; int line; PII p1[N]; PII p2[N…

React开发环境搭建以及常见错误解决

‌React开发环境搭建主要包括Node.js安装、编辑器选择、创建React项目等步骤‌。 Node.js安装‌ 从Node.js官网下载并安装最新版本的Node.js&#xff0c;安装过程中npm会自动安装。安装完成后&#xff0c;通过命令行输入node -v和npm -v检查安装是否成功。 carawang%node -v…

transformer模型写诗词

加入会员社群&#xff0c;免费获取本项目数据集和代码&#xff1a;点击进入>> 1. 项目简介 该项目是基于A035-transformer模型的诗词生成系统&#xff0c;旨在通过深度学习技术实现古诗词的自动化创作。项目的背景源自当前自然语言处理领域的迅速发展&#xff0c;特别是…

C++【类和对象】(构造函数与析构函数)

文章目录 1. 类的默认成员函数2. 构造函数析构函数的特点3. 析构函数析构函数的特点 结语 1. 类的默认成员函数 默认成员对象就是我们没有显示的写&#xff0c;但是编译器会自动生成的成员函数。一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个成员函数&#xff0…

解决Nodify框架因自带放大缩小、平移功能导致拖拽添加的控件无法准确在鼠标放下的位置显示控件

ViewModel中写具体关键的几段代码&#xff1a; var editor sender as NodifyEditor; Point p e.GetPosition(editor);//放大缩小比例double scale editor.ViewportZoom;//经过放大缩小、平移后获得坐标点位置p new Point(Math.Round((p.X - editor.ViewportT…

响应式布局-媒体查询父级布局容器

1.响应式布局容器 父局作为布局容器&#xff0c;配合自己元素实现变化效果&#xff0c;原理&#xff1a;在不通过屏幕下面吗&#xff0c;通过媒体查询来改变子元素的排列方式和大小&#xff0c;从而实现不同尺寸屏幕下看到不同的效果。 2.响应尺寸布局容器常见宽度划分 手机-…

【Python】工具使用

pycharm Jupyter Notebook 参考文献 详解Jupyter Notebook (qq.com) python专业集成开发环境pycharm安装使用 (qq.com)

自动化学习3:日志记录及测试报告的生成--自动化框架搭建

一.日志记录 1.配置文件pytest.ini&#xff1a;将日志写入文件方便日后查询或查看执行信息。 需要将文件处理器&#xff08;文件存放位置/时间/格式等等&#xff09;添加到配置文件中的【日志记录器】 # pytest.ini [pytest] # ---------------日志文件&#xff0c;需要配合…

并发编程。

进程 1.什么是进程&#xff1f; 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的 独立单位。进程是可与其他程序并发执行的程序&#xff0c;在一个数据集合上的运行过程。它是系统进行 资源分配和调度的一个独立单位。 2.进…

日丰卫浴启动国货好物节,以“焕新+公益+体验”筑国民美好生活

在当下卫浴行业面临转型升级的大背景下&#xff0c;宏观政策持续推动以旧换新和消费升级&#xff0c;为市场注入了新的活力。随着中秋国庆双节的临近&#xff0c;卫浴消费逐步进入传统旺季&#xff0c;叠加利好政策&#xff0c;市场需求进一步活跃&#xff0c;日丰卫浴借此契机…

常见统计量与其抽样分布

什么是统计量 我们首先给出统计量的定义:设 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​ 为来自于总体X的一个样本&#xff0c; g ( X 1 , X 2 , ⋯ , X n ) g(X_1,X_2,\cdots,X_n) g(X1​,X2​,⋯,Xn​) 为关于 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X…

【2024W37】肖恩技术周刊(第 15 期):中秋节快乐

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

微服务——配置管理

1.配置管理 微服务配置管理是指对微服务架构中各个服务的配置信息进行管理、更新、查询和审计等操作&#xff0c;以确保系统的正常运行和高效管理。例如&#xff0c;网关路由或某些业务配置在配置文件中写死了&#xff0c;每次修改都要重启服务。每个微服务都有很多重复的配置&…

同等学力英语历年真题有必要做吗

同等学力申硕历年真题是考生备考期间最重要的参考资料&#xff0c;在做真题的时候对那些经常出现的词汇要进行汇总整理&#xff0c;记忆高频词汇。 当你在阅读文章的时候发现不认识的单词或者一个熟悉的单词但是放在句子当中却读不通顺的这类单词的时候&#xff0c;一定要做好标…

WinCC中VB脚本和C脚本到底怎么选?

很多人认为VB脚本比C脚本慢&#xff0c;所以在WinCC中要尽量使用C脚本&#xff0c;以便提高性能&#xff0c;事实真是这样吗&#xff1f;工控人加入PLC工业自动化精英社群 先说结论&#xff1a;并非如此。在一个复杂的应用中&#xff0c;混合使用VB脚本和C脚本&#xff0c;对提…

mes系统在中小企业智能制造作用

MES系统&#xff08;制造执行系统&#xff09;在中小企业智能制造中扮演着至关重要的角色&#xff0c;其作用主要体现在以下几个方面&#xff1a; 1. 提升生产效率与质量 实时监控与数据采集&#xff1a;MES系统能够实时采集生产现场的各项数据&#xff0c;如设备状态、生产进…

Maya学习笔记:软选择

文章目录 打开软选择调整软选择范围衰减模式 软选择可以很好的进行渐变修改 打开软选择 方法1&#xff1a; 进入点线面模式&#xff0c;按B键进入软选择模式&#xff0c;再按B取消 方法2&#xff1a;双击左侧的选择按钮打开选择面板&#xff0c;勾选软选择 调整软选择范围 …

input文本框随其中内容而变化长

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><title>input文本框随其中内容而变化长</title><style>.input-length {border: 1px solid #ccc;padding: 5px;min-width: 10px;width: auto;}.in…