网站建设案例渠道,学习网站建设的是什么专业,雄安投资建设集团有限公司网站,使用免费网站制作软件一、鸿蒙Liteos读源码教程
鸿蒙的源码是放在openharmony文件夹下#xff0c;openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。
内核是操作系统的核心部分#xff0c;所以像负责#xff1a;资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在… 一、鸿蒙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在满足抢占条件时触发任务的抢占。将当前运行的任务添加回就绪队列然后进行调度切换。