鸿蒙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.mzph.cn/web/53565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 map 文件浅析

目录 一、概述二、Section Cross References三、Removing Unused input sections from the image四、Memory Map of the image1、Local Symbols2、全局符号(Global Symbols) 五、Image Symbol Table六、Image component sizes 一、概述 .map 文件是编译…

【质优价廉】GAP9 AI算力处理器赋能智能可听耳机,超低功耗畅享未来音频体验!

当今世界,智能可听设备已经成为了流行趋势。随后耳机市场的不断成长起来,消费者又对AI-ANC,AI-ENC(环境噪音消除)降噪的需求逐年增加,但是,用户对于产品体验的需求也从简单的需求,升…

半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型

半导体器件制造行业作为高科技领域的核心驱动力,正积极探索和实践以5G智能工厂数字孪生平台为核心的新型制造模式。这一创新不仅极大地提升了生产效率与质量,更为制造业的未来发展绘制了一幅智能化、网络化的宏伟蓝图。 在半导体器件制造5G智能工厂中&a…

Java笔试面试题AI答之设计模式(1)

文章目录 1. 简述什么是设计模式 ?2. 叙述常见Java设计模式分类 ?3. Java 设计模式的六大原则 ?4. 简述对 MVC 的理解, MVC 有什么优缺点?MVC 的三个核心部分:MVC 的优点:MVC 的缺点&#xff1a…

巨潮股票爬虫逆向

目标网站 aHR0cDovL3dlYmFwaS5jbmluZm8uY29tLmNuLyMvSVBPTGlzdD9tYXJrZXQ9c3o 一、抓包分析 请求头参数加密 二、逆向分析 下xhr断点 参数生成位置 发现是AES加密,不过是混淆的,但并不影响咱们扣代码 文章仅提供技术交流学习,不可对目标服…

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键,特别是在处理大数据或高频率信号时,优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register(移位寄存器) 是 LabVIE…

前缀和问题

洛谷题面 这个其实可以当模板了。 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e510; int sum[N]; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n,m,x;cin>>n;for(int i1;i<n;i){cin>>x;sum[i]sum[i…

《微信小程序实战(4) · 地图导航功能》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

240924-通过服务器代理ip地址及port端口wget等下载文件

A. 如何下载 在服务器上设置了代理 IP 和端口后&#xff0c;可以使用以下命令行格式通过 wget 下载文件&#xff1a; wget -e use_proxyyes -e http_proxyhttp://代理IP:端口号 目标文件URL或者&#xff0c;如果你使用 HTTPS 协议&#xff0c;可以使用以下命令&#xff1a; …

数据结构应试-1

1. 好像是错的 2. n个元素&#xff0c;插入的可能有n1个位置&#xff0c;所以n&#xff08;n1&#xff09;/2*(n1)2/n 3. 4. 5. 6. 假设我们有一个循环队列&#xff0c;数组的长度为 n 10&#xff0c;并且当前队头指针 f 的位置是 2&#xff0c;队尾指针 r 的位置是 8。我们需…

【开源免费】基于SpringBoot+Vue.JS墙绘产品展示交易平台(JAVA毕业设计)

本文项目编号 T 049 &#xff0c;文末自助获取源码 \color{red}{T049&#xff0c;文末自助获取源码} T049&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上&#xff0c;观测云又一次迎来了全面革新。携手SelectDB&#xff0c;实现了技术的飞跃&#xff0c;这不仅彰显了观测云在监控观测领域的技术实力&#xff0c;也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…

Golang | Leetcode Golang题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; func eraseOverlapIntervals(intervals [][]int) int {n : len(intervals)if n 0 {return 0}sort.Slice(intervals, func(i, j int) bool { return intervals[i][1] < intervals[j][1] })ans, right : 1, intervals[0][1]for _, p : ra…

【计算机视觉】YoloV8-训练与测试教程

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山冈&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; 制作数据集 Labelme 数据集 数据集选用自己标注的&#xff0c;可参考以下&#xff1a…

面经 | css

CSS CSSpositiondisplayflex: 1元素居中flexalign-itemjustify-contentabsolutemargin:auto align-item vs vertical-align CSS position static: 默认。就是自然顺序&#xff0c;从上到下&#xff0c;从左到右&#xff0c;爱着你排列&#xff1b;absolute&#xff1a;绝对。…

如何备份SqlServer数据库

第一步&#xff1a;登录你要备份的服务器数据库ssms 第二步&#xff1a;选择你要备份的数据库 此处已PZ-SJCS 数据库为例 右键该数据库-->任务-->备份 第三步&#xff1a;选择你备份的类型备份组件等&#xff0c;目标磁盘 &#xff0c;点击添加选择将你备份的文件备份那…

数据结构~二叉搜索树

文章目录 一、二叉树搜索的概念二、二叉树搜索的结构二叉树搜索的性能分析二叉树搜索的插入二叉树搜索的查找二叉树搜索的删除 三、二叉搜索树key和key/value使用场景四、二叉树搜索的练习将二叉搜索树就地转化为已排序的双向循环链表从前序与中序遍历序列构造二叉树二叉树的前…

茶思屋直播|TinyEngine+AI:聚焦主航道,在实践中探索低代码技术黑土地

低代码引擎使能开发者定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低代码平台。适用于多场景的低代码平台开发&#xff…

GIS开发常用的开源地图数据框架有哪些?

学完Web前端开发&#xff0c;还需要掌握哪些内容&#xff1f;本篇文章再给大家主要讲讲针对WebGIS开发的地图和可视化数据库。 Echarts ECharts是一个使用 JavaScript 实现的开源可视化库。它可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;…

LTE SSS产生过程中z序列的介绍和MATLAB以及C语言实现

参考3GPP 36.211 6.11章节 接上期介绍完LTE SSS产生过程中加扰序列c的产生和代码实现&#xff0c;本期介绍一下LTE SSS产生过程中加扰序列z的原理和MATLAB以及C语言的实现。 SSS产生过程中用到的加扰Z1序列有两个&#xff0c;一个是 另一个是 两个序列是由一个m序列z移位而来…