
嵌入式硬件
文章平均质量分 86
普通网友
这个作者很懒,什么都没留下…
展开
-
【鸿蒙OH实战开发】LiteOS-A内核之基础硬件——中断控制器GIC400
OpenAtom OpenHarmony(以下简称“OpenHarmony”)采用多内核架构,支持Linux内核的标准系统、LiteOS-A的小型系统、LiteOS-M的轻量系统。其中LiteOS-A要求设备具备一定的处理能力,对比LiteOS-M,LiteOS-A支持以下特性:(1)MMU支持:通过MMU支持内核态和用户态分离,支持虚拟单元;(2)支持独立进程:调度对象分别为进程、线程;(3)支持文件系统:包括虚拟文件和块设备等;(4)支持更复杂的IPC:包括LiteIPC等;原创 2025-01-21 14:11:04 · 1195 阅读 · 0 评论 -
【鸿蒙OH实战开发】轻量系统中内核资源主要管理方式
轻量系统中内核资源多采用数组与空闲链表相结合的方式。除了OpenHarmony轻量系统,其他嵌入式系统中这类的数据存储方式也比较常见。这种方式有如下几个突出的优点● 简单易懂● 读写效率高● 代码紧凑。原创 2025-01-20 21:41:06 · 1006 阅读 · 0 评论 -
【鸿蒙OH实战开发】4步成功将三方库——speexdsp移植到OpenHarmony
/build.sh --product-name rk3568 --ccache --build-target=移植的三方库名称 --target-cpu arm64(ohos更新到3.2版本后,支持64位系统的编译,默认情况下编译的都是32位系统,在编译命令中添加–target-cpu arm64即可构建64位系统)③定义目标并加入组件:在编写gn文的时候,我们定义的动态库以及测试可执行程序都是我们的目标模块,在每个目标模块中添加对应的组件名后即将我们的目标模块加入该组件中。原创 2025-01-19 19:07:40 · 787 阅读 · 0 评论 -
【鸿蒙OH实战开发】内核IPC机制数据结构解析
OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。作为面向全场景、全连接、全智能的分布式泛终端操作系统,OpenHarmony通过将各类不同终端设备的能力进行整合,实现硬件互助、资源共享,为用户提供流畅的全场景体验。原创 2025-01-18 19:17:52 · 666 阅读 · 0 评论 -
【鸿蒙OH实战开发】有氧拳击之设备端开发
在一个风和日丽,阳光明媚的下午,码农们都像往常一样正在专注地码代码。突然前面的小哥哥站起来,手握开发板,来回出拳。这是怎么回事?原来这是一款拳击互动游戏,本文将带你一同解开其中的奥秘。开发者从中不仅能体验到学习知识的愉悦,还能享受到健身的乐趣。依托OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.2 Beta1操作系统,样例分为应用端和设备端两部分。本文主要介绍设备端的实现,后续会分享应用端的开发。设备端:采用Hi3861开发板,处理加速度计传感器数据。原创 2025-01-17 14:50:56 · 664 阅读 · 0 评论 -
【鸿蒙OH实战开发】轻量设备Hi3861芯片开发板启动流程分析
Boot是操作系统启动之前的软件,通用叫法是bootloader,Hi3861的boot分为4部分:RomBoot、FlashBoot、LoaderBoot、 CommonBoot,如图2-1所示。图2-1 Hi3861 Boot启动流程● RomBoot功能包括:加载LoaderBoot到RAM,进一步利用LoaderBoot下载镜像到Flash、烧写 EFUSE, 校验并引导FlashBoot。原创 2025-01-16 21:43:47 · 1149 阅读 · 0 评论 -
【鸿蒙OH实战开发】littlefs文件系统存储结构与IO性能优化分析
通过本文的讲解,相信大家对于littlefs文件系统有了较为全面的了解。总的来说,littlefs是一种极简的文件系统,实现了文件系统基本的数据缓存、掉电恢复、磨损均衡等功能,在资源相对富裕的环境中,开发者们可以对其运行机制甚至存储结构进行“使用空间换时间”的优化策略,提升读写的IO性能。学会有效地利用文件系统往往能起到事半功倍的作用,希望开发者能够将所学知识有效应用到未来的开发工作中,从而提高开发工作的效率。原创 2025-01-16 17:34:02 · 680 阅读 · 0 评论 -
【鸿蒙OH实战开发】智能指南针
关于 x 轴方向,生产传感器芯片的厂商会预定义好传感器的 x 轴、y 轴及 z 轴方向(通常垂直芯片表面的为 z 轴)。同时,还配备了自测功能。磁力计数据通过滤波后得到 x y z 三个轴方向的磁力分量,计算出 x 和 y轴的 tan 值,再通过反正切计算出角度,角度经过滑动平均得到最终需要显示出来的指南针角度值,计算过程见如下代码。Geek_Lite_Board 开发板通过 IIC 接口与 AK8963 三轴磁力计通信,读取三轴方向的磁场数据,通过磁场数据计算后得到指南针的方位数据。原创 2025-01-16 13:58:48 · 927 阅读 · 0 评论 -
【鸿蒙OH实战开发】多模输入事件分发机制详解
多模输入服务旨在支撑开发者面向用户提供丰富多样的人机交互方式,在持续完善支持传统输入的基础上,多模输入还会发挥 OpenAtom OpenHarmony(以下简称“OpenHarmony”)的分布式优势,提升跨设备交互体验,面向新场景、新业务提供系统级支撑能力。多模输入 Input 部件是 OpenHarmony 系统级输入事件管理框架;南向对接多种输入设备,汇聚多种输入事件(按键、触摸),通过归一/标准化处理后,分发给消费者(系统服务、应用)。原创 2025-01-15 21:36:31 · 844 阅读 · 0 评论 -
【鸿蒙OH实战开发】分布式DeviceProfile
超级终端中的设备之间如何能实现取长补短、相互帮助?首先,就必须知道每个设备的能力,以及设备是否在线。对此,OpenHarmony 提出了“设备画像”,也就是通过 DeviceProfile 来记录设备的能力和状态等信息。DeviceProfile 是设备硬件能力和系统软件特征的管理器,记录的典型设备信息有设备类型、设备名称、存储容量、是否折叠屏、有无屏幕、分辨率、设备安全等级、设备 OS 类型、OS 版本号等。原创 2025-01-15 13:46:32 · 587 阅读 · 0 评论 -
【鸿蒙OH实战开发】图形框架解析
下面先为大家介绍一下 OpenHarmony 图形栈的架构。原创 2025-01-14 15:14:45 · 724 阅读 · 0 评论 -
【鸿蒙OH实战开发】如何提升CMA利用率?
CMA 全称是 Contiguous Memory Allocator(连续内存分配器)。顾名思义它是一种内存分配器,提供了分配、释放物理连续内存的功能。原创 2025-01-13 16:24:47 · 1046 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析 (内核启动篇) | 从汇编到 main ()
主要目的是为了建立虚拟地址和物理地址的映射关系,因为在 MMU启动之后,运行地址(PC寄存器指向的地址)将变成虚拟地址,使用虚拟地址就离不开映射表,所以两个地址的映射关系需要在MMU启动前就创建好,而有了偏移量就可以创建映射表。,通过一个变量在链接时将其链接地址变成变量的内容 ,无论中间怎么加载变量的内容是不会变的,而获取运行地址是很容易获取的,其实就是PC寄存器的地址,二者一减,加载偏了多少不就出来了。两个地址往往不一样,而内核设计者希望它们是一样的,那有没有办法检测二者是否一样呢?原创 2025-01-13 14:14:39 · 1036 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析 (静态分配篇) | 很简单的一位小朋友
因代码量不大,但很精彩,看这种代码是种享受,本篇详细列出静态内存代码层面的实现,关键处已添加注释。关于软定时器可以查看系列相关篇,请想想为何软件定时器会使用静态内存。相比动态分配,静态内存池的分配就是个小弟弟,非常的简单,鸿蒙内核目前只有软时钟处理使用了静态内存池,直接上代码。原创 2025-01-12 22:11:44 · 250 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析 (编码方式篇) | 机器指令是如何编码的?
它们的取值组合在一起,决定指令所属的分类(Instruction Class),其值对应的关系如下。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行!指令是如何被编码的,机器指令由哪些部分构成,指令有哪些类型,每种类型的语法又是怎样的?为加载指令,但是加载到内存还是寄存器,这该怎么记?操作域是因类型变化而变化的二级格式 ,作用于保留位。说明都属于这类指令,完成对内存的读写,包括。为条件域,每一条可条件执行的条件指令都有。,加载有进来的意思,将内容加载至寄存器中。原创 2025-01-12 20:31:33 · 1066 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(读写锁) | 内核如何实现多读单写
通常释放操作很简单 ,不会特书大书 ,但读写锁不一样,释放操作反而是精彩部分,因为释放就意味着等这把锁的任务有机会运行了,这些任务需要被唤醒 ,而读模式下能同时进行读操作,意味着内核要连续的唤醒等待读操作的任务。写操作会改变数据结构,数据之间须同步,修改注定是排他的,所以也称为排它锁/互斥锁,读写锁很好的解决了这种读写不对称的业务场景。读操作可并发重入,写操作是互斥的。本篇详细解剖鸿蒙是如何实现读写锁的,代码部分均有注释,尤其释放锁部分的实现很精彩,让人有种酣畅淋漓的感觉。原创 2025-01-10 22:13:26 · 884 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式
看到这里你应该不会问共享内存的作用和为啥它是最快的进程间通讯方式了,如果还有这两个问题说明还要再看一遍 😛 ,另外细心的话会发现共享内存会有个小缺点,就是同时访问的问题,所以需要使用互斥锁来保证同时只有一个进程在使用,和在以上的四个步骤中都有出现。//互斥锁,共享内存本身并不保证操作的同步性,所以需用互斥锁#define SYSV_SHM_LOCK() (VOID)LOS_MuxLock(&g_sysvShmMux, LOS_WAIT_FOREVER) //申请永久等待锁。原创 2025-01-10 13:47:39 · 645 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人
每个人都有上门做客的经历,抖音也一直在教我们做人,做客不要空手去,总得带点东西,而对中国人你就不能送钟,不能送梨,最好也别送鞋,因他们与终 离 邪谐音,犯忌讳. 这是人情世故,叫礼仪,是中华文明圈的共识,是相互交流信任的基础.那互联网圈有没有这种共识呢?当然有,互联网世界的人情世故就是协议, 种种协议映射到人类社会来说就是种种礼仪,协议有TCPHTTPSSHTelnet等等,就如同礼仪分商业礼仪,外交礼仪,校园礼仪,家庭礼仪等等. 孔圣人不也说不学礼,无以立。原创 2025-01-09 21:37:14 · 667 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(控制台篇) | 一个让很多人模糊的概念
终端和控制台的界限也慢慢模糊了,复杂了,甚至控制台也变成了终端, 现在要怎么理解它们,推荐一篇文章,请自行前往搜看.吓倒,认为内核会卡死在这里玩不下去,那是应用程序员看待死循环的视角,其实在内核当等待的事件没有到来的时,这个任务并不会往下执行,而是处于挂起状态,当事件到来时才会切换回来继续往下走,那如何知道事件到来了呢?是用户空间进程, 负责解析和执行用户输入的命令. 但前提是得先拿到用户的输入数据. 不管数据是从串口进来,还是远程登录进来,必须得先经过内核, 而控制台的作用就是帮你拿到数据再交给。原创 2025-01-09 20:22:23 · 900 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(Shell解析篇) | 应用窥视内核的窗口
是如何实现的在链接阶段的注册,请自行翻看 (内联汇编篇) ,有详细说明实现细节.编辑部分由客户端任务完成,后两个部分由服务端任务完成,命令全局注册由内核完成。鸿蒙对命令的注册用了三个结构体,个人感觉前两个可以合成一个,降低代码阅读难度.你能看明白这些命令的底层实现吗?其中有网络的,进程的,任务的,内存的 等等,此处列出几个常用的。,因任务负责命令的解析和执行,所以需要更大的内核空间.需在链接选项中添加链接该新增命令项参数,具体在。拿到所有通过静态方式注册的命令.进程都会再创建两个任务。原创 2025-01-09 16:47:22 · 621 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(管道文件篇) | 如何降低数据流动成本
管道 | pipes 最早最清晰的陈述来源于McIlroy由1964年写的一份内部文件.这份文件提出像花园的水管那样把程序连接在一起.文档全文内容如下:switching.Unix的缔造者肯.汤普森只花了一个小时就在操作系统中实现了管道的系统调用.他自己说这是简直小菜一碟,因为I/O的重定向机制是管道的实现基础,但效果确是很震撼.管道的本质是I/O的重定向,是对数据的不断编辑,不断流动,只有这样的数据才有价值.在文件概念篇中提到过,Unix。原创 2025-01-09 13:47:18 · 904 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄?
只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大象装冰箱分几步一样.先得把冰箱门打开,再把大象放进去,再关上冰箱门.其中最重要的一个参数就是。去申请这个编号,内核会创建文件相关的一系列对象,返回编号,后续通过编号就可以操作这些对象.原理就是这么的简单,本篇将从。,即最多可打开256个文件.文件也是资源的一种,系列篇多次说过进程是管理资源的,所以在进程控制块中能看到文件的影子。的成员,负责记录所有进程文件句柄的信息,个人觉得鸿蒙这块的实现有点乱,没有封装好.原创 2025-01-08 21:43:15 · 976 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(挂载目录篇) | 为何文件系统需要挂载
关于文件系统的介绍已经写了三篇,但才刚刚开始,其中的 [文件系统篇] 一定要阅读,用生活中的场景去解释计算机各模块设计的原理和运行机制是整个系列篇最大的特点,计算机文件系统相关概念是非常的多的,若不还原其本质,不跳出这些概念去看问题是很难理解它为什么要弄这么些东东出来让你头大. 反之,如果搞明白了这些概念背后的真相你想忘记它们都很难,问题是经不起追问的, 多追问几个为什么就会离本源越来越近.上面提到 挂载就需要一个已经存在的文件系统提供目录,也就是根文件系统,但根文件系统又是怎么来的呢?原创 2025-01-08 13:47:39 · 625 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(索引节点篇) | 谁是文件系统最重要的概念
先看大佬们对其的定义vnode 是内核内存中的一个对象,它使用 UNIX 文件接口(打开、读取、写入、关闭、readdir 等)。Vnodes 可以代表文件、目录、管道、套接字、块设备、字符设备。vnode – 文件或目录的内部表示. vnode 是 UNIX 中所有文件活动的焦点。vnode 由 struct vnode 描述。为每个活动文件、每个当前目录、每个挂载文件、文本文件和根分配了一个唯一的 vnode。原创 2025-01-07 22:05:45 · 1066 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(文件系统篇) | 用图书管理说文件系统
完全可以把索引表看成是一本书,书的内容是一页一页的索引页,每一页记录一本书的索引信息,1000页就可以记录1000本书的索引信息,这本书也是要装到格子里的.装这本书的单元格叫索引表块. 如果按1000万本书计算 就会生成1000万张索引页, 每个格子1000页,那么 1000万/1000 = 1万 ,也就是说 索引表这本书,需要1万个单元格来存放. 索引页也有全局唯一且统一的编号,注意这个编号和单元格的编号是两码事,这是很多人搞不明白文件系统的关键所在,二者编号范围在统计区有保存.答案是: 建相同的格子。原创 2025-01-07 20:33:05 · 578 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件
不说清楚什么是文件就说不清楚文件系统,更说不清楚内核是如何管理和为什么要这么来管理文件的。现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,将文件抽象成一个宽泛的概念,把文档、目录(文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚拟终端,还有进程间通信(IPC)和网络通信等输入/输出资源都看成文件来统一操作.因为它们都具有共同的读和写共性,一旦具有普适性,可以抽象出理想的模型,通过这个模型,设计工作就会变得简单而有序,API的设计可以化繁为简。原创 2025-01-07 16:33:49 · 667 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(gn应用篇)
提供了很多内置函数,使用偏傻瓜式,若构建不复杂的系统,熟悉这些内置函数,选择填空就可以交作业了,如果想高阶点,想自己定义函数怎么办?是私有链接依赖关系,最终会形成一颗依赖树.gn会根据这些依赖关系生成最终的.ninja文件.有大量的内置变量和库函数,熟悉这些库函数基本就知道gn能干什么,gn的官方文档很齐全.是如何编译成最终的库和可执行文件的,将在后续篇中详细介绍其语法和应用.时觉得太麻烦,不高效,所以设计了一套更简单,更高效新的构建工具。明白了模板的使用,阅读鸿蒙gn代码就不会有太大的障碍.原创 2025-01-07 13:58:27 · 937 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(构建工具篇)
构建工具重要性不言而喻,它描述了整个工程的如何编译、连接,打包等规则,其中包括:工程中的哪些源文件需要编译以及如何编译、需要创建那些库文件以及如何创建这些库文件、如何最后输出我们想要的文件。建议大家去调试下源码,非常有意思,能看清楚所有的细节.本篇将编译工具中重要代码都加上了注解.具体gn是如何生成.ninja文件的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.具体ninja是如何运行的,后续有篇幅详细介绍其语法及在鸿蒙中的使用.,调试时建议在这里打断点,顺瓜摸藤,跟踪相关函数的实现细节.原创 2025-01-06 21:42:13 · 765 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单
个人喜欢做一劳永逸的事,如果有试过手动去安装鸿蒙开发环境,下载源码,确保编译成功其实是件非常麻烦的事情, 在虚拟机和WSL2上都跑通之后,发现其中的坑不少,这些坑本身没有技术含量,知道了也就知道了,但它们却跟牛皮癣一样,遇到了就不容易好老复发真烦人. 如何防止得牛皮癣的最好办法不是去治疗牛皮癣,而是不得牛皮癣,打上牛皮癣的疫苗. 这是本篇存在的意义,让整个过程简单,舒适,一气呵成.脚本获取方式: 1.直接下载 2.本篇内容 ctrl+c/v。原创 2025-01-06 20:29:33 · 783 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程
GCC(GNU Compiler Collection,GNU编译器套件),官网: https://gcc.gnu.org/ ,是由 GNU 开发的编程语言编译器。这个过程是整个程序构建的核心部分,也是最复杂的部分之一。编译过程要经过:源文件 --> 预处理 --> 编译(cc1) --> 汇编器(as) --> 链接器(ld) --> 可执行文件(PE/ELF)main.o的内容为机器码,不能以文本形式方便的呈现,不过可以利用 objdump -S file 查看源码反汇编。细心的可能会发现了一个问题,原创 2025-01-06 20:28:04 · 785 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(重定位篇) | 与国际接轨
重定位就是把程序的逻辑地址空间变换成内存中的实际物理地址空间的过程。它是实现多道程序在内存中同时运行的基础。重定位有两种,分别是动态重定位与静态重定位。1.静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。也就是在生成可执行/共享目标文件的同时已完成地址的静态定位,它解决了可执行文件/共享目标文件的内部矛盾.原创 2025-01-06 14:05:29 · 706 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(ELF解析篇) | 内核加载
这俩宝贝长的很像,但仔细看中间参数是大S和小s,说到大S小s又有点意思了,这姐妹俩上了点年纪的码农都应该不陌生,据说是性格完全不同.个人喜欢大的,甜美安静,小的太聒噪,受不了,码农最需要安静了。在构建可执行程序时,链接器(linker)可能需要把一些独立的目标文件和库文件链接在一起,在这个过程中,链接器要解析各个文件中的相互引用,调整某些目标文件中的绝对引用,并重定位指令码。ELF,它实在是太重要了,内核加载的就是它,不说清楚它怎么去说清楚应用程序运行的过程呢.看到下面这一坨一坨的,除了。原创 2025-01-05 21:06:13 · 1045 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南
因为代码量很大,加上网速,gitee仓库本身原因第一种方式存在失败概率,浪费时间,这种没技术含量的折腾没啥意义,本篇采用直接站点下载方式,请对照着前往下载。本篇主要采用 windows + docker 方式编译鸿蒙. 记录编译鸿蒙的过程,以备后续不用再去一大堆无效的误导式软文中搜寻芝麻大点有用的信息,那样真挺费时费心力.要有编译环境,编译环境是个很头痛的事情,自己装太麻烦,也容易出错,但 docker真的很香,官方也帮我们解决了这个问题。本篇详细说清楚这两个版本的编译过程。目录下,并创建好两个空目录,原创 2025-01-05 20:15:23 · 404 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行
从栈中弹出赋给寄存器.才真正完成了内核栈到用户栈的切换.回到了user.source()继续运行.本篇有相当的难度,涉及用户栈和内核栈的两轮切换,CPU四次换栈,寄存器改值,将围绕下图来说明.注意这里还不是真正的切换上下文,只是改变内核栈中现有的数据.这些数据将还原给寄存器.系统调用号长这样,是不是看到一些很熟悉的函数.有了上面的铺垫,就不难理解这个函数的作用.指向的是用户栈的位置.一旦。原创 2025-01-05 19:10:00 · 742 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(信号生产篇) | 注意结构体的名字和作用.
信号为系统提供了一种进程间异步通讯的方式,一个进程不必通过任何操作来等待信号的到达。事实上,进程也不可能知道信号到底什么时候到达。一般来说,只需用户进程提供信号处理函数,内核会想方设法调用信号处理函数,网上查阅了很多的关于信号的资料.个人想换个视角去看信号.把异步过程理解为生产者(安装和发送信号)和消费者(捕捉和处理信号)两个过程原创 2025-01-04 21:47:09 · 592 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(Fork篇) | 一次调用,两次返回
fork函数的特点概括起来就是“调用一次,返回两次”,在父进程中调用一次,在父进程和子进程中各返回一次。从上图可以看出,一开始是一个控制流程,调用fork之后发生了分叉,变成两个控制流程,这也就是“fork”(分叉)这个名字的由来了。原创 2025-01-04 19:16:14 · 1053 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(中断管理篇)
中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念.可前往查看.此字段标识相应的中断是边缘触发的还是电平触发的。看这种代码因为涉及硬件部分,需要对照 ARM中断控制器 gic_v2.pdf 文档看.可前往地址下载查看.用自下而上的方式,从中断源头纯汇编代码往上跟踪代码细节.说清楚保存和恢复中断现场。,剖析鸿蒙内核实现中断的过程,很像设计模式中的观察者模式.函数,到消费中断函数的。例如:时钟节拍处理函数。原创 2025-01-03 21:48:46 · 626 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(中断概念篇)
中断是指出现需要时,CPU暂停执行当前程序,转而执行新程序的过程。即在程序运行过程中,出现了一个必须由CPU立即处理的事务。此时,CPU暂时中止当前程序的执行转而处理这个事务,这个过程就叫做中断。如图:外设可以在没有CPU介入的情况下完成一定的工作,但某些情况下也需要CPU为其执行一定的工作。通过中断机制,在外设不需要CPU介入时,CPU可以执行其它任务,而当外设需要CPU时,将通过产生中断信号使CPU立即中断当前任务来响应中断请求。原创 2025-01-03 20:22:05 · 938 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射
中断概念很多,比如中断控制器,中断源,中断向量,中断共享,中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念.来看,不然100%懵逼.结合看就秒懂,代码都已经注释,不再做解释,注解中提到的 翻看287行 是指源码的第287行,请对照注解源码看理解会更透彻.在中断环境下,从当前线程切换到目标线程,这种方式也称为硬切换.它们通常由硬件产生或是软件发生异常时的被动式切换.哪些情况下会出现硬切换呢?,剖析鸿蒙内核实现中断的过程,很像设计模式中的观察者模式.原创 2025-01-03 16:19:31 · 574 阅读 · 0 评论 -
【鸿蒙OH实战开发】鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务
ARM有7种工作模式,到了进程层面只需要考虑内核模式和用户模式两种,对应到任务会有内核态栈空间和用户态栈空间.内核模式的任务只有内核态的栈空间,用户模式任务二者都有.栈空间是在初始化一个任务时就分配指定好的.以下是两种栈空间的初始化过程.为了精练省去了部分代码,留下了核心部分.才恍然大悟,因为三级流水线的原因,LR和PC寄存器之间是差了一条指令的,LR指向了处于译码阶段指令,而PC指向了取指阶段的指令,所以此处做了两次LR入栈,其实是保存了未执行的译码指令地址,确保执行不会丢失一条指令.原创 2025-01-03 14:57:51 · 574 阅读 · 0 评论