1.鸿蒙轻内核M核源码分析:中断Hwi
2.用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》
3.基于恒玄BES2600的鸿b鸿轻量级鸿蒙操作系统AIOT开发平台解析之SDK下载和编译
4.鸿蒙轻内核M核的故障管家:Fault异常处理
5.双向循环链表:鸿蒙轻内核中数据的“驿站”
鸿蒙轻内核M核源码分析:中断Hwi
在鸿蒙轻内核源码分析系列中,本文将深入探讨中断模块,蒙源码g蒙源旨在帮助读者理解中断相关概念、代码鸿蒙轻内核中断模块的鸿b鸿源代码实现。本文所涉及源码基于OpenHarmony LiteOS-M内核,蒙源码g蒙源读者可通过开源站点 gitee.com/openharmony/k... 获取。代码圣诞树 源码中断概念介绍
中断机制允许CPU在特定事件发生时暂停当前执行的鸿b鸿任务,转而处理该事件。蒙源码g蒙源这些事件通常由外部设备触发,代码通过中断信号通知CPU。鸿b鸿中断涉及硬件设备、蒙源码g蒙源中断控制器和CPU三部分:设备产生中断信号;中断控制器接收信号并发出中断请求给CPU;CPU响应中断,代码执行中断处理程序。鸿b鸿中断相关的蒙源码g蒙源硬件介绍
硬件层面,中断源分为设备、代码中断控制器和CPU。设备产生中断信号;中断控制器接收并转发这些信号至CPU;CPU在接收到中断请求后,暂停当前任务,转而执行中断处理程序。中断相关的概念
每个中断信号都附带中断号,用于识别中断源。中断优先级根据事件的重要性和紧迫性进行划分。当设备触发中断后,CPU中断当前任务,执行中断处理程序。拼图网站源码中断处理程序由设备特定,且通常以中断向量表中的地址作为入口点。中断向量表按中断号排序,存储中断处理程序的地址。鸿蒙轻内核中断源代码
中断相关的声明和定义
在文件 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中定义了结构体、全局变量和内联函数。关键变量 g_intCount 记录当前正在处理的中断数量,内联函数 HalIsIntActive() 用于检查是否正在处理中断。中断向量表在中断初始化过程中设置,用于映射中断号到相应的中断处理程序。中断初始化 HalHwiInit()
系统启动时,在 kernel\src\los_init.c 中初始化中断。HalHwiInit() 函数在 kernel\arch\arm\cortex-m7\gcc\los_interrupt.c 中实现,负责设置中断向量表和优先级组,配置中断源,如系统中断和定时器中断。创建中断 HalHwiCreate()
开发者可通过 HalHwiCreate() 函数注册中断处理程序,传入中断号、优先级和中断模式。函数内部验证参数,设置中断处理程序,最终通过调用 CMSIS 函数完成中断创建。删除中断 HalHwiDelete()
中断删除操作通过 HalHwiDelete() 实现,接收中断号作为参数,信誉担保源码调用 CMSIS 函数失能中断,设置默认中断处理程序,完成中断删除。中断处理执行入口程序
默认的中断处理程序 HalHwiDefaultHandler() 仅用于打印中断号后进行死循环。HalInterrupt() 是中断处理执行入口程序的核心,它包含中断数量计数、中断号获取、中断前后的操作以及调用中断处理程序的逻辑。开关中断
开关中断用于控制CPU是否响应外部中断。通过宏 LOS_IntLock() 关闭中断, LOS_IntRestore() 恢复中断状态, LOS_IntUnLock() 使能中断。这组宏对应汇编函数,使用寄存器 PRIMASK 控制中断状态。小结
本文详细解析了鸿蒙轻内核中断模块的源代码,涵盖了中断概念、初始化、创建、删除以及开关操作。后续文章将带来更多深入技术分享。欢迎在 gitee.com/openharmony/k... 分享学习心得、提出问题或建议。关注、点赞、javafx 程序源码Star 和 Fork 到个人账户,便于获取更多资源。用鸿蒙OS在蜂鸣器上播放一曲《两只老虎》
本文介绍在HiSpark Wi-Fi IoT套件上使用Harmony OS IoT硬件子系统的PWM接口驱动蜂鸣器播放《两只老虎》的实现方法。Harmony系统提供了PWM相关接口,具体位于wifiiot_pwm.h文件中。通过PwmStart接口,我们可以输出方波,其频率由freq参数控制,实际输出频率为PWM时钟源频率除以分频倍数。duty参数则用于设定输出方波的占空比,占空比值等于duty除以freq。音符与频率存在对应关系,音高每升高一个八度,频率翻倍,此规律在liam.page////pi...中有所体现。开发板最低可输出频率取决于时钟源频率和PWM的默认设置,通过hi_pwm_set_clock接口可以修改时钟源,从而调整输出频率的范围。通过实验发现,修改时钟源至晶体时钟后,最低可输出频率约为.Hz,可覆盖E5及以上的音符。
为了实现《两只老虎》曲谱的播放,首先需准备简谱。psd图像源码简谱中包含了一些特定符号,比如左上角的1=C表示调式(无需关注)和音名;4/4表示四四拍;竖线表示小节分隔符;“跑得快”一句中的横线代表延时一拍,点表示顺延半拍,下划线代表音符时长。接下来,编写代码实现曲谱播放。在谱子中,发现最后两个5存在错误,应改为低八度的5,即在5下加点。修改代码后,整个曲子播放将更加自然。完整代码可见于gitee.com/hihopeorg/Har...。
基于恒玄BES的轻量级鸿蒙操作系统AIOT开发平台解析之SDK下载和编译
一 鸿蒙系统
华为鸿蒙系统作为一款面向全场景的分布式操作系统,旨在构建一个互联世界,通过智能设备间的无缝连接和资源分享,优化用户的全场景生活体验。此系统具有高开源性,兼容多芯片平台,在产业发展中快速推进。
二 恒玄BES
BES芯片由恒玄科技推出,集WiFi和蓝牙功能于一体,具备轻量级和强大资源的特点,特别适用于以音频为中心的高端物联网应用。
三 代码下载和编译
1 源码在Gitee平台上开放,下载地址如下:
gitee.com/openharmony/d...
具体下载步骤如下:
mkdir openharmony_bestechnic
cd openharmony_bestechnic
repo init -u gitee.com/openharmony/m... --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
2 使用的是arm-gcc编译器,与鸿蒙系统进行封装和映射,编译命令示例如下:
hb set -root .
hb set -p bestechnic > display_demo iotlink_demo xts_demo
选择display_demo
hb build -f
编译完成会显示:
四 下载和运行
已包含下载指南。编译后的文件会与下载软件和bin文件捆绑,只需将文件复制到Windows环境并按照指示操作即可完成运行。
鸿蒙轻内核M核的故障管家:Fault异常处理
摘要:本文简要介绍了Fault异常类型、向量表及其代码,以及异常处理的C语言程序,随后详细分析了异常处理汇编函数的实现代码。
本文内容来源于华为云社区《鸿蒙轻内核M核源码分析系列十八 Fault异常处理》,作者:zhushy。
Fault异常处理模块与OpenHarmony LiteOS-M内核芯片架构紧密相关,它能够处理HardFault、MemManage、BusFault、UsageFault等故障异常。关于Cortex-M芯片的相关知识,不在本文的讨论范围内,读者可参考《Cortex™-M7 Devices Generic User Guide》等官方资料。本文所涉及的源码以OpenHarmony LiteOS-M内核为例,可在开源站点gitee.com/openharmony/k...获取。
1、Fault Type异常类型
Fault类型表格显示了各种故障及其处理机制、Bit Name标记、Fault status register故障状态寄存器。该表格摘自《Cortex™-M7 Devices Generic User Guide》。
2、Vector table向量表
向量表包含栈指针的复位值和开始地址,也称为异常向量。异常可以看作特殊的中断,本文主要关注NMI、HardFault、Memory management fault、Bus fault、Usage fault、SVCall等异常。
在中断初始化时,会初始化该异常向量表,代码位于kernel\arch\arm\cortex-m7\gcc\los_interrupt.c。本文主要分析这些汇编函数的代码。
3、HalExcHandleEntry异常处理C程序入口
HalExcHandleEntry异常处理函数是汇编异常函数跳转到C语言程序的入口,定义在文件kernel\arch\arm\cortex-m7\gcc\los_interrupt.c,被kernel\arch\arm\cortex-m7\gcc\los_exc.S文件中的汇编函数调用。函数参数由汇编程序中的R0-R3寄存器传值进来。
4、Los_Exc异常处理汇编函数
上文介绍了Vector table向量表,已经提到了在文件kernel\arch\arm\cortex-m7\gcc\los_exc.S中定义的异常处理函数。当发生Fault故障异常时,会调度执行这些异常处理函数,本文会详细分析函数的源代码来掌握内核如何处理这些发生的异常。
本文介绍了Fault异常类型、向量表及其代码,异常处理C语言程序,异常处理汇编函数实现代码。感谢阅读,如有任何问题、建议,都可以在博客下留言给我,谢谢。
双向循环链表:鸿蒙轻内核中数据的“驿站”
摘要:双向循环链表Doubly Linked List在鸿蒙轻内核中扮演重要角色,广泛应用于各个模块。本文旨在深入解析双向循环链表在源代码中的应用,帮助读者理解和学习其在鸿蒙轻内核中的使用方法。以OpenHarmony LiteOS-M内核为例,通过详细讲解数据结构、初始化、判断、插入、删除、获取及遍历操作,本文将提供全面的双向循环链表操作指南。本文内容基于开源站点gitee.com/openharmony/k...
1 双向循环链表
双向循环链表的结构体LOS_DL_LIST在utils/los_list.h头文件中定义。它包含前驱和后继两个节点指针,用于实现环状数据结构。双向链表不存储业务数据,通常与业务数据结构结合使用。
双向链表的节点间操作方便,便于查找、插入和删除。通过定义一个LOS_DL_LIST类型的头结点,业务结构体的链表成员依次挂载,从而实现遍历。例如,互斥锁结构体LosMuxCB中,双向链表LOS_DL_LIST muxList与互斥锁业务信息成员协同工作。
初始化双向链表,可使用LOS_ListInit()函数为链表节点申请内存并链接环状。通过LOS_DL_LIST_HEAD()宏定义也可以直接初始化链表。
判断链表是否为空,使用LOS_ListEmpty()函数检查前驱和后继节点是否均为自身。
插入双向链表节点,提供三种方法:在指定节点后、尾部或头部插入。使用LOS_ListAdd()、LOS_ListTailInsert()和LOS_ListHeadInsert()内联函数分别实现。
删除双向链表节点,可使用LOS_ListDelete()函数移除指定节点,或使用LOS_ListDelInit()重置节点为新链表。
获取双向链表节点,可通过LOS_DL_LIST_LAST()和LOS_DL_LIST_FIRST()获取前驱和后继节点。
遍历双向循环链表节点,使用LOS_DL_LIST_FOR_EACH()、LOS_DL_LIST_FOR_EACH_SAFE()和LOS_DL_LIST_FOR_EACH_ENTRY()等宏定义,实现节点的遍历。
获取链表节点所在结构体,利用LOS_OFF_SET_OF()和LOS_DL_LIST_ENTRY()宏定义,计算结构体内存地址。
基于以上操作,双向循环链表在鸿蒙轻内核中提供了高效、灵活的数据结构支持,是实现模块间高效数据传递和管理的关键。