鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

news/2024/11/24 11:46:35/

 一、鸿蒙Liteos读源码教程

鸿蒙的源码是放在openharmony文件夹下,openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。

内核是操作系统的核心部分,所以像负责:资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在kernel文件夹里看到。

进入到kernel文件夹下后会看到liteos_a和liteos_m,我们只需要知道liteos_a是针对嵌入式设备的,所以像我们实验用的开发板就是看liteos_a下的代码,而liteos_m是针对物联网设备设计的,所以我们暂时先不去看这个。

友情提示:ubuntu虚拟机是有可视化界面的,只需要在桌面上点击进入Files即可看到系统中的文件:

进入liteos_a后真正的核心代码同样是存储在kernel下的:

主要介绍3个比较重要的:

base:该文件夹包含操作系统内核的基础部分,如调度器,同步机制,内存管理等基础功能的实现。

include:该文件夹包含内核需要的所有头文件。

user:该文件夹包含一些用户级别的功能,如用户任务,用户接口等。

所以如果想查看有关内核的代码就进入base文件夹,想查看或者修改头文件就进入include文件夹。

假设我们现在进入到base文件夹:

接下来我逐一向大家简要介绍:

core:包含了内核的核心代码,比如初始化代码,启动代码等。

include:包含了base部分所有的头文件。

ipc:是inter-process communication的缩写,和进程相关,包含了实现进程间通信的代码。

mem:是内存缩写,包含了实现内存管理的代码,如内存分配、内存释放等。

misc:包含杂项代码,如工具函数,调试功能。

mp:包含多处理器相关的代码,如多核心调度,同步等。

om:包含LiteOS的运维相关代码。

sched:是调度缩写,包含了LiteOS的任务调度代码,包括任务的创建,删除,切换等。

vm:是虚拟内存的缩写,包含了实现虚拟内存管理的代码,如页表管理,地址转换等。

二、向LiteOS中添加一个简单的基于线程运行时间的短作业优先调度策略

实验要求:

短作业优先调度策略为优化LiteOS的吞吐量。该策略在将线程TCB插入就绪队列时,按照线程执行的时间长短进行排序。运行时间短的线程先运行,运行时间长的线程后运行。该Proj要完成以下内容:

第1步:修改LiteOS内核的PriQueInsert函数,在其中添加相关代码,实现按照任务运行时间的长短将任务的TCB插入就绪队列。

解析:很多同学可能并没有找到PriQueInsert函数,其实是因为韦东山老师在这里下载的是OpenHarmony的1.0版本,这个是2019年的早期版本,至今已到4.0版本:

所以我推荐下载3.2的Release版本:

repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.2-Release
repo sync -c -j8

在新版本中具有PriQueInsert函数,可以据此修改:

第2步:在短作业优先调度策略中,采用LiteOS中定义的SchedParam结构体中的timeSlice成员作为该作业的运行时间。

解析:在liteos_a/kernelbase/include下有los_task_pri.h里面定义了任务调度模块(TaskCB)的数据结构,LosTaskCB;

第3步:在用户层生成至少3个线程,通过pthread_attr_getschedparam函数pthread_attr_setschedparam函数,修改所生成线程的调度策略为“短作业优先“调度策略,并对timeSlice进行赋值,表示该线程的运行时间。验证你所编写的调度策略是正确的。线程内部可以用while语句循环timeSlice规定的时间,然后打印自己的TID后退出。例如,对这3个线程的timeSlice分别赋予1、5、9。那么这3个线程也按照这个顺序完成,即第一个线程1秒后退出,第二个线程5秒后退出,第三个线程9秒后退出。用户层采用pthread库实现,相关代码参考下面博客:

Linux线程调度策略以及优先级实验(图文)

解析:

1、包含头文件:在用户层代码中包含 LiteOS 的相关头文件。通常包括 "los_task.h" 和 "los_config.h"。

2、定义任务函数:定义至少3个任务函数,作为线程的入口点。例如,可以定义三个函数,分别为 task1、task2 和 task3。

3、配置任务参数:通过pthread_attr_getschedparam函数和pthread_attr_setschedparam函数,修改所生成线程的调度策略为“短作业优先“调度策略,并对timeSlice进行赋值,表示该线程的运行时间。

4、创建线程:使用Los_TaskCreate来创建线程。最后LOS_Start()来启动调度。

通过下面的while循环来控制退出的时间:

while (count < timeSlice){// 线程2的代码count++;
}

通过下面语句打印TID: 

 printf("Thread 2, TID: %d\n", LOS_CurTaskID());

最后删除: 

LOS_TaskDelete(LOS_CurTaskID());

实验准备:

pthread_after_getschedparam函数:

pthread_attr_setschedparam函数:

OsPriQueueInit初始化优先级队列,创建一个优先级队列数组,并将每个队列初始化为空。

OsPriQueueTop获取指定优先级队列中的头节点。

OsPriQueueEnqueueHead将节点插入指定优先级队列的头部。

OsPriQueueEnqueue将节点插入指定优先级队列的尾部。

OsPriQueueDequeue从指定优先级队列中删除节点。

OsPriQueueProcessDequeue从进程优先级队列中删除节点。

OsPriQueueProcessSize获取进程优先级队列中指定优先级的节点数量。

OsPriQueueSize获取指定优先级队列中的节点数量。

OsSchedSwitchProcess在进程切换时,将当前运行的进程切换到新的进程。这个函数会处理进程的状态、运行任务数量以及虚拟内存的切换等操作。

OsSchedResched触发调度器重新调度任务。根据当前运行的任务和获取的最高优先级任务,进行任务切换。

OsSchedPreempt在满足抢占条件时,触发任务的抢占。将当前运行的任务添加回就绪队列,然后进行调度切换。


http://www.ppmy.cn/news/1196928.html

相关文章

竞赛 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

数字处理-第10届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第3讲。 数字处理&#xff…

线性代数 第六章 二次型

一、矩阵表示 称为二次型的秩。只含有变量的平方项&#xff0c;所有混合项系数全是零&#xff0c;称为标准形&#xff1b;平方项的系数为1、-1或0&#xff0c;称为规范形。 二次型的标准形不唯一&#xff0c;可以用不用的坐标变换化二次型为标准形&#xff1b;二次型的规范形唯…

小程序如何设置用户同意服务协议并上传头像和昵称

为了保护用户权益和提供更好的用户体验&#xff0c;设置一些必填项和必读协议是非常必要的。首先&#xff0c;用户必须阅读服务协议。服务协议是明确规定用户和商家之间权益和义务的文件。通过要求用户在下单前必须同意协议&#xff0c;可以确保用户在使用服务之前了解并同意相…

6 MySQL常用的数据类型

1、整型 -- TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间&#xff0c;一般情况下越小的列越好;2、浮点数 -- 1.FLOAT 和 DOUBLE 为浮点类型&#xff0c;DECIMAL 为高精度小数类型。CPU 原生支持浮点运算&#xff0c;但是不支持 DECIMAl…

服务器有哪些用途呢

服务器可以用于许多行业&#xff0c;包括但不限于以下几个领域&#xff1a; 企业&#xff1a;服务器可以用于企业的数据存储、应用程序和网站托管、电子邮件和协作工具、数据库管理等。 金融&#xff1a;服务器可用于高频交易、投资组合优化、风险管理和分析。 零售和电子商务…

深度学习_9_图片分类数据集

散装代码&#xff1a; import matplotlib.pyplot as plt import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2ld2l.use_svg_display()# 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式…

Go 方法集合与选择receiver类型

Go 方法集合与选择receiver类型 文章目录 Go 方法集合与选择receiver类型一、receiver 参数类型对 Go 方法的影响二、选择 receiver 参数类型原则2.1 选择 receiver 参数类型的第一个原则2.2 选择 receiver 参数类型的第二个原则 三、方法集合&#xff08;Method Set&#xff0…