




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于OpenHarmony的嵌入式开发
第二章OpenHarmony的内核基础大连理工大学-朱明安全边距2.1芯片适配类型[2.1]OpenHarmony芯片类型适配问题:OpenHarmony设备分类的依据是什么?哪三种设备分类?三种分类的内核是什么?分别有哪些特性?
LiteOS面向IoT领域构建的轻量级物联网操作系统内核面向智能家居、个人穿戴、车联网、城市公共服务、制造业等领域;
内核轻快易用、实时性好、稳定性高、内核体积小、功耗低等特点;
具备有进程和线程调度、内存管理、IPC机制、Timer管理等功能;
支持ARM64、ARMCortex-A、ARMCortex-M0,Cortex-M3,Cortex-M4和Cortex-M7等芯片架构;
LiteOS也支持UP与SMP模式,在单核或者多核的环境上运行。基于OpenHarmony的嵌入式开发2[2.1]关于HarmonyOS的LitOS内核安全边距2.1芯片适配类型基于OpenHarmony的嵌入式开发3①基础内核:包括不可裁剪的极小内核和可裁剪的其他模块。极小内核包含有任务管理、内存管理、中断管理、异常管理和系统时钟等。可裁剪的模块包括信号量、互斥锁、队列管理、事件管理、软件定时器等。②内核增强:在内核基础功能之上,进一步提供增强功能,包括C++支持和调测组件等。调测组件提供了强大的问题定位及调测能力,包括shell命令、Trace事件跟踪、获取CPU占用率和LMS等。③文件系统:提供一套轻量级的文件系统接口以支持文件系统的基本功能,支持的文件系统类型包括vfs、ramfs、fatfs等。④系统库接口:提供一系列系统库接口,提升操作系统的可移植性及兼容性,包括Libc/Libm/POSIX以及CMSIS适配层等接口。安全边距2.1芯片适配类型基于OpenHarmony的嵌入式开发4[2.1]关于HarmonyOS的LitOS内核⑤网络协议栈:提供丰富的网络协议栈以支持多种网络功能。包括资源受限的Web传输协议(CoAP,ConstrainedApplicationProtocol)、轻量级物联网设备管理协议(LwM2M,LightweightM2M)、消息队列遥测传输协议(MQTT,MessageQueuingTelemetryTransport)、数据报传输层安全协议(DTLS,DatagramTransportLayerSecurity)和轻量级IP协议(LwIP,LightWeightInternetProtocol)等。⑥业务组件:构建于上述组件之上的一系列业务组件或框架,以支持更丰富的用户场景,包括OTA、GUI、AI和传感框架等。⑦IDE(HuaweiLiteOSStudio):基于LiteOS操作系统定制开发的工具,提供了界面化的代码编辑、编译、烧录、调试等功能。安全边距2.2LiteOS-M内核基于OpenHarmony的嵌入式开发5[2.2]面向IoT领域的轻量级物联网操作系统内核①内核特性上接近RTOS,对标FreeFTOS、RT-Thread和uc/OS操作系统,。②目前只能运行在Cortex-M3、Cortex-M33、Cortex-M4、Cortex-M55、Cortex-M7、RISC-V、XtensaLX6和CSKYv2芯片和架构上。③上述处理器都属于MCU,不支持MMU。④内核空间和APP空间不能隔离,APP一旦出错会导致整个系统就会崩溃。硬件相关层提供统一的HAL接口,提升硬件易适配性安全边距2.3LiteOS-A内核基于OpenHarmony的嵌入式开发6[2.3]
构建小体积、低功耗、高性能的统一生态框架更丰富的内核机制,更加全面的POSIX标准接口以及统一驱动框架HDF(OpenHarmonyDriverFoundation)等特性。
①支持MMU,实现内核态和用户态分离,支持虚拟内存等;②支持独立进程,调度对象为进程和线程,更好的兼容软件和开发者体验,新增支持多进程,使得应用之间内存隔离、相互不影响,提升系统的健壮性;③支持文件系统,包括虚拟文件系统和块设备等;④支持复杂的IPC,包括LiteIPC和VDSO(VirtualDynamically-linkedSharedObject)等;安全边距2.3LiteOS-A内核基于OpenHarmony的嵌入式开发7[2.3]
构建小体积、低功耗、高性能的统一生态框架更丰富的内核机制,更加全面的POSIX标准接口以及统一驱动框架HDF(OpenHarmonyDriverFoundation)等特性。
⑤支持多核调度,支持双核微处理器和双核调度;⑥支持POSIX接口,支持超过1200个标准POSIX接口,更加全面的支持POSIX标准接口,使得应用软件易于开发和移植;⑦引入统一驱动框架HDF,为设备厂商提供了更统一的接入方式,使驱动更加容易移植。安全边距2.3LiteOS-A内核基于OpenHarmony的嵌入式开发8[表2.1]
LiteOS-M和LiteOS-A的对比特性LiteOS-MLiteOS-A处理器类型Cortex-M、RISC-V等,单核Cortex-A,多核RAM容量128KB~1MB1MB~128MB任务调度抢占式多任务调度抢占式多进程、多线程调度,支持轮询调度和FIFO调度虚拟内存不支持支持内存加载bestfitbestfit和bestfit_littleIPC通信类型事件、互斥锁、信号量、队列事件、互斥锁、信号量、队列、信号、用户态快速互斥锁、自旋锁、轻量级进程间通信VFS不支持支持Shell不支持支持标准库类型不支持支持安全边距2.4内核抽象层KAL基于OpenHarmony的嵌入式开发9[2.4]
构建小体积、低功耗、高性能的统一生态框架问题:OpenHarmony的技术架构,按照功能进行分层,有哪些层?LiteOS-M所基于的Cortex-M和RISCV等构架的微处理器提供的IPC等接口并不相同,为了屏蔽硬件差异,实现对外统一的IPC等接口。LiteOS-M内核中构建了KAL(内核抽象层),对外提供统一CMSIS和部分的POSIX接口,规范与内核的对接,如CMSIS采用的就是CMSIS-RTOSv2规范来约束的,而部分标准的POSIX接口则是基于musllibc库以及自研接口实现的。LiteOS-M所支持的硬件设备较为简单,集中于UART、I2C和GPIO等功能简单的功能模块,其驱动和功能简单,无需复杂的初始化和驱动设定,不需要动态加载卸载驱动。Cortex-M和RISCV等构架的微处理器性能不强,也难以支持上述高级功能的实现。因此,只需要使用KAL屏蔽硬件差异即可。LiteOS-A内核则直接通过musllibc库实现了更为完整的POSIX接口。LiteOS-A为了实现硬件设备驱动程序的动态加载和卸载功能,使用了HDF等功能替代了KAL,在性能强大的处理器的支持下,可以实现更丰富的内核功能。安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发10[2.5.1]中断的基本概念CPU执行主程序低级中断请求响应低级中断请求响应高级中断请求高级中断请求CPU执行低级中断服务程序CPU执行高级中断服务程序返回低级中断请求返回主程序解释:
指在程序运行过程中,出现需要由微处理器中的CPU立即处理的事务时,CPU需要暂停执行当前程序,转而执行新程序,以及在新程序执行完,返回继续执行原有程序的过程。目标:避免CPU把大量时间耗费在等待和查询外设状态的操作上,大大提高系统实时性以及执行效率,且中断是可以有条件嵌套的。场景:通过中断机制,外部设备在不需要CPU介入时,CPU可以执行其它任务;当外设需要CPU处理外设数据或者其他请求时,就会产生中断信号,CPU会根据当前任务情况,响应外设的中断请求。安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发11[2.5.1]中断的基本概念CPU执行主程序低级中断请求响应低级中断请求响应高级中断请求高级中断请求CPU执行低级中断服务程序CPU执行高级中断服务程序返回低级中断请求返回主程序中断的请求和处理过程,主要涉及到的概念包括:①中断号。中断号是中断请求信号特定的标志,CPU根据中断号判断才能够判定出是哪个设备提出的中断请求;②中断请求。中断请求实际上是一类特定的信号,是外设由于特定事件向CPU发送的信号。该信号将请求CPU中断当前任务,需要CPU处理该外设事件,这一过程称为中断请求;③中断优先级。当外设所产生的中断,是可能会发生叠加的,新产生的中断能够打断正在处理的中断事件是一个重要问题。为使系统能够及时响应并合理处理所有的中断事件,系统需要根据中断事件的重要性和紧迫程度,将中断源分为若干个级别,这种中断响应的级别称为是中断优先级。在微处理器内部,中断请求并非直接发送给CPU,而是发送给中断控制器的,由中断控制器对中断请求进行预处理后,再发送给CPU;安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发12[2.5.1]中断的基本概念CPU执行主程序低级中断请求响应低级中断请求响应高级中断请求高级中断请求CPU执行低级中断服务程序CPU执行高级中断服务程序返回低级中断请求返回主程序中断的请求和处理过程,主要涉及到的概念包括:④中断处理程序,又称中断服务程序。当外设发出中断请求后,CPU暂停当前的任务,转而去响应中断请求。这种响应就是通过执行中断处理程序实现的,产生中断的每个外设都必须有唯一对应的中断处理程序;⑤中断触发。中断源向中断控制器发送中断信号,中断控制器对中断进行仲裁,确定优先级,将中断信号发送给CPU。中断源产生中断信号的时候,会将中断触发器的对应位置位,表明该中断源产生了中断。CPU在响应该中断后,会自动或在中断处理程序中将该位复位;⑥中断向量。中断处理程序的入口地址;⑦中断向量表。存储中断向量的内存区域,某个外设的中断向量与其中断号必须是一一对应的,中断向量在中断向量表中按照中断号的顺序进行存储。安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发13[2.5.1]中断的基本概念CPU执行主程序低级中断请求响应低级中断请求响应高级中断请求高级中断请求CPU执行低级中断服务程序CPU执行高级中断服务程序返回低级中断请求返回主程序普适问题:从用户角度使用需要控制中断的哪些功能?①创建中断(Create);②删除中断(Delete);③打开中断(Unlock);④关闭中断(Lock);⑤使能中断(Enable);⑥禁用中断(Disable);⑦设置中断的优先级(SetPriority);⑧触发中断(Trigger);⑨清除中断(Clear);⑩其他相关控制功能或高阶控制功能。LiteOS-M和LiteOS-A由于系统性能和硬件构架不同,中断的执行也有所不同对硬件的初始化,必须要充分考虑初始化成功之后的后果,防止未知状态的发生安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发14[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/打开/关闭/禁用/使能/触发/清除中断+设置优先级LOS_HwiCreate()ArchHwiCreate()
/arch/arm/cortex-m7/gcc/los_interrupt.c实现:LITE_OS_SEC_TEXT_INITUINT32ArchHwiCreate(HWI_HANDLE_ThwiNum,HWI_PRIOR_ThwiPrio,HWI_MODE_ThwiMode,HWI_PROC_FUNChwiHandler,HwiIrqParam*irqParam)hwiNum:硬件的中断号;hwiPrio:硬件的中断优先级;hwiMode:硬件的中断模式,暂时没有功能;hwiHandler:要注册的中断处理程序;irqParam:传递给中断处理程序的参数。/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiCreateArchHwiCreate
必要的安全检查hwiHandler
==
NULLhwiNum>=OS_HWI_MAX_NUMhwiPrio>OS_HWI_PRIO_LOWESTg_hwiForm[hwiNum+OS_SYS_VECTOR_CNT]!=(HWI_PROC_FUNC)HalHwiDefaultHandler安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发15[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/打开/关闭/禁用/使能/触发/清除中断+设置优先级LOS_HwiCreate()ArchHwiCreate()
必要的安全检查intSave=LOS_IntLock()OsSetVector()if(irqParam!=NULL){OsSetVector(hwiNum,hwiHandler,irqParam->pDevId);}else{OsSetVector(hwiNum,hwiHandler,NULL);}VOIDOsSetVector(UINT32num,HWI_PROC_FUNCvector)
{if((num+OS_SYS_VECTOR_CNT)<OS_VECTOR_CNT){
g_hwiForm[num+OS_SYS_VECTOR_CNT]=HalInterrupt;
g_hwiHandlerForm[num+OS_SYS_VECTOR_CNT]=vector;}}//CountofM-Coresysteminterruptvector.#defineOS_SYS_VECTOR_CNT16#defineOS_VECTOR_CNT
(OS_SYS_VECTOR_CNT+OS_HWI_MAX_NUM)安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发16[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/打开/关闭/禁用/使能/触发/清除中断+设置优先级LOS_HwiCreate()ArchHwiCreate()
必要的安全检查intSave=LOS_IntLock()OsSetVector()①g_hwiForm,中断向量表,定义如下:STATICHWI_PROC_FUNC…
g_hwiForm[OS_VECTOR_CNT]={0};-5和16,系统的向下减,用户的向上增对于中断号hwiNum,g_hwiForm[hwiNum]表示该中断对应的中断入口程序安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发17[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/打开/关闭/禁用/使能/触发/清除中断+设置优先级LOS_HwiCreate()ArchHwiCreate()
必要的安全检查intSave=LOS_IntLock()OsSetVector()②g_hwiHandlerForm,中断处理程序,定义如下:STATIC
…
g_hwiHandlerForm[OS_VECTOR_CNT]={{0,0}};HwiUnmask()设定中断屏蔽触发器HwiUnmask()
->NVIC_EnableIRQ((IRQn_Type)hwiNum)Description:EnableInterruptinNVICInterruptController.Parameter:IRQn_TypeIRQnspecifiesthepositiveinterruptnumber.Itcannotbesystemexception.
Return:NoneHwiSetPriority()HwiSetPriority((IRQn_Type)hwiNum,hwiPrio);
-> NVIC_SetPriority((IRQn_Type)hwiNum,priority);Description:SetthePriorityGroupinginNVICInterruptController.Parameter:Priority_groupingisprioritygroupingfield
Return:NoneLOS_IntRestore(intSave)保存恢复returnLOS_OK恢复到LOS_Lock之前的状态安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发18[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/打开/关闭/禁用/使能/触发/清除中断+设置优先级LOS_HwiDelete()ArchHwiDelete()
/arch/arm/cortex-m7/gcc/los_interrupt.c实现:LITE_OS_SEC_TEXT_INITUINT32ArchHwiDelete(HWI_HANDLE_ThwiNum,HwiIrqParam*irqParam)hwiNum:硬件的中断号;irqParam:传递给中断处理程序的参数。/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiDeleteArchHwiDelete必要的安全检查hwiNum>=OS_HWI_MAX_NUMNVIC_DisableIRQ()NVIC_DisableIRQ((IRQn_Type)hwiNum);Description:DisableInterruptinNVICInterruptController.Parameter:IRQn_TypeIRQnisthepositivenumberoftheexternalinterrupt.Itcannotbesystemexception.
Return:Noneg_hwiForm[hwiNum+OS_SYS_VECTOR_CNT]=(HWI_PROC_FUNC)HalHwiDefaultHandler;intSave=LOS_IntLock()…恢复到默认的中断处理程序安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发19[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_IntLock()ArchIntLock()
/arch/arm/cortex-m7/gcc/los_dispatch.S实现:/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_IntLockArchIntLockArchIntUnLock:.fnstart.cantunwindMRSR0,PRIMASK
CPSIDIBXLR.fnendMarksthestartofafunctionwithanunwindtableentry.Preventsunwindingthroughthecurrentfunction.读取PRIMASK到R0,R0为返回值。PRIMASK是单一比特寄存器PRIMASK=1时屏蔽所有可屏蔽(NMI和硬fault之外)的异常(中断)函数返回:通过BL调用子程序时,硬件将返回地址保存在R14(LR)中CPSID:ChangeProcessorState
InterruptorabortDisable.I:EnablesordisablesIRQinterrupts.F:EnablesordisablesFIQinterrupts.安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发20[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_IntUnLock()ArchIntUnLock()
/arch/arm/cortex-m7/gcc/los_dispatch.S实现:/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_IntUnLockArchIntUnLockArchIntUnLock:.fnstart.cantunwindMRSR0,PRIMASK
CPSIEIBXLR.fnendMarksthestartofafunctionwithanunwindtableentry.Preventsunwindingthroughthecurrentfunction.读取PRIMASK到R0,R0为返回值。PRIMASK是单一比特寄存器PRIMASK=1时屏蔽所有可屏蔽(NMI和硬fault之外)的异常(中断)函数返回:通过BL调用子程序时,硬件将返回地址保存在R14(LR)中CPSIE:ChangeProcessorState
InterruptorabortEnable.I:EnablesordisablesIRQinterrupts.F:EnablesordisablesFIQinterrupts.安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发21[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级intSave=LOS_IntLock()LOS_IntRestore(intSave)实际中,与LOS_IntLock()对应的是LOS_IntRestore()?ArchIntRestore()
ArchIntRestore:.fnstart.cantunwindMSRPRIMASK,R0BXLR.fnend/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_IntRestoreArchIntRestore读取R0到PRIMASK。PRIMASK是单一比特寄存器PRIMASK=1时屏蔽所有可屏蔽(NMI和硬fault之外)的异常(中断)/arch/arm/cortex-m7/gcc/los_dispatch.S实现:函数返回:通过BL调用子程序时,硬件将返回地址保存在R14(LR)中安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发22[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_HwiDisable()ArchIntDisable()
/arch/arm/cortex-m7/gcc/los_interrupt.c实现:STATICINLINEUINT32ArchIntDisable(HWI_HANDLE_ThwiNum){if(g_archHwiOps.disableIrq==NULL){returnLOS_NOK;}returng_archHwiOps.disableIrq(hwiNum);}/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiDisableArchIntDisableHwiControllerOpsg_archHwiOps={.enableIrq=HwiUnmask,.disableIrq=HwiMask,.setIrqPriority=HwiSetPriority,……,};NVIC_DisableIRQ()…HwiMask()
安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发23[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_HwiEnable()ArchIntEnable()
/arch/arm/cortex-m7/gcc/los_interrupt.c实现:STATICINLINEUINT32ArchIntEnable(HWI_HANDLE_ThwiNum){if(g_archHwiOps.enableIrq==NULL){returnLOS_NOK;}returng_archHwiOps.enableIrq(hwiNum);}/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiEnableArchIntEnableHwiControllerOpsg_archHwiOps={.enableIrq=HwiUnmask,.disableIrq=HwiMask,.setIrqPriority=HwiSetPriority,……,};NVIC_EnableIRQ()…HwiUnmask()
安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发24[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_HwiSetPriority()ArchIntSetPriority()
/arch/arm/cortex-m7/gcc/los_interrupt.c实现:STATICINLINEUINT32ArchIntSetPriority(HWI_HANDLE_ThwiNum,HWI_PRIOR_Tpriority)
{if(g_archHwiOps.setIrqPriority==NULL){returnLOS_NOK;}returng_archHwiOps.setIrqPriority(hwiNum,priority);}/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiSetPriorityArchIntSetPriorityHwiControllerOpsg_archHwiOps={.enableIrq=HwiUnmask,.disableIrq=HwiMask,.setIrqPriority=HwiSetPriority,……,};NVIC_SetPriority()…HwiSetPriority()
安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发25[2.5.2]
LiteOS-M内核中断(以Cortex-M7为例)
创建/删除/关闭/打开/禁用/使能/触发/清除中断+设置优先级LOS_HwiTrigger()ArchIntTrigger()
HwiClear()HwiPending()
LOS_HwiClear()ArchIntClear()
/kernel/liteos_m/arch/include/los_interrupt.h文件中:#defineLOS_HwiTriggerArchIntTrigger#defineLOS_HwiClear
ArchIntClearHwiControllerOpsg_archHwiOps={
……,
.triggerIrq=HwiPending,.clearIrq=HwiClear,};NVIC_SetPendingIRQ()
NVIC_ClearPendingIRQ()
……注意:此处的中断功能是以Cortex-M7为例的,最终调用的除了汇编指令外,NVIC_xxx函数都属于CMSIS提供的接口。不同处理器构架提供的接口不同,如RISC-V则只有ArchHwiCreate和ArchHwiDelete等,不再详述。安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发26[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建/删除/关闭/打开……,这些功能上接近,但是LiteOS-A平台性能更高,功能也更丰富、更复杂。LOS_HwiCreate()/kernel/liteos_a/arch/arm/src/los_hwi.c实现:LITE_OS_SEC_TEXT_INITUINT32LOS_HwiCreate(HWI_HANDLE_ThwiNum,HWI_PRIOR_ThwiPrio,HWI_MODE_ThwiMode,HWI_PROC_FUNChwiHandler,HwiIrqParam*irqParam)hwiNum:硬件的中断号;hwiPrio:硬件的中断优先级;hwiMode:硬件的中断模式;hwiHandler:要注册的中断处理程序;irqParam:传递给中断处理程序的参数。必要的安全检查#ifdefLOSCFG_NO_SHARED_IRQret=OsHwiCreateNoShared(hwiNum,hwiMode,hwiHandler,irqParam);#elseret=OsHwiCreateShared(hwiNum,hwiMode,hwiHandler,irqParam);#endifOsHwiCreateNoSharedOsHwiCreateSharedLOSCFG_NO_SHARED_IRQYN没有hwiPrio安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发27[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建非共享中断:在不支持共享模式下创建中断/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码):HWI_LOCK(intSave);if(g_hwiForm[hwiNum].pfnHook==NULL){g_hwiForm[hwiNum].pfnHook=hwiHandler;retParam=OsHwiCpIrqParam(irqParam);if(retParam==LOS_NOK){HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_NO_MEMORY;}g_hwiForm[hwiNum].uwParam=retParam;}else{HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_ALREADY_CREATED;}HWI_UNLOCK(intSave);OsHwiCreateNoShared关中断(略不同)申请内存并复制中断参数,失败则返回错误,成功则设置参数该中断号是否已经指定中断处理程序,否则指定为hwiHandler,是则意味着中断已经创建,返回错误开中断(略不同)安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发28[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建共享中断:在支持共享模式下创建中断/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码1):HWI_LOCK(intSave);hwiForm=&g_hwiForm[hwiNum];if((hwiForm->pstNext!=NULL)&&((modeResult==0)||(!(hwiForm->uwParam&IRQF_SHARED)))){HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_SHARED_ERROR;}while(hwiForm->pstNext!=NULL){hwiForm=hwiForm->pstNext;hwiParam=(HwiIrqParam*)(hwiForm->uwParam);if(hwiParam->pDevId==irqParam->pDevId){HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_ALREADY_CREATED;}}OsHwiCreateShared关中断(略不同)判断该设备是否已经注册了中断号,已注册则返回错误中断号已经被其他设备占用,且不可共享开中断(略不同)modeResult=hwiMode&IRQF_SHARED;#defineIRQF_SHARED0x8000U安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发29[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建共享中断:在支持共享模式下创建中断/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码2):hwiFormNode=(HwiHandleForm*)LOS_MemAlloc(m_aucSysMem0,sizeof(HwiHandleForm));if(hwiFormNode==NULL){HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_NO_MEMORY;}hwiFormNode->uwParam=OsHwiCpIrqParam(irqParam);if(hwiFormNode->uwParam==LOS_NOK){HWI_UNLOCK(intSave);(VOID)LOS_MemFree(m_aucSysMem0,hwiFormNode);returnOS_ERRNO_HWI_NO_MEMORY;}hwiFormNode->pfnHook=hwiHandler;hwiFormNode->pstNext=(structtagHwiHandleForm*)NULL;hwiForm->pstNext=hwiFormNode;OsHwiCreateShared创建中断处理节点hwiFormNode,创建失败则返回错误绑定中断处理函数;指定最后的中断项;加入共享中断。(单链表)申请内存空间保存中断参数,
失败则释放hwiFormNode内存并返回错误安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发30[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
非共享中断和共享中断:重要的数据结构HwiHandleFormg_hwiForm[OS_HWI_MAX_NUM];HwiHandleForm*hwiForm=NULL;hwiForm=&g_hwiForm[hwiNum];typedefstructtagHwiHandleForm{HWI_PROC_FUNC pfnHook;HWI_ARG_T uwParam;structtagHwiHandleForm *pstNext;}HwiHandleForm;中断处理程序中断处理程序的参数非共享中断不涉及该项共享的指向下一个节点hwiFormNode=(HwiHandleForm*)LOS_MemAlloc(m_aucSysMem0,sizeof(HwiHandleForm));问题:结合OsHwiCreateShared函数,思考函数实现共享中断的方法,找出你认为关键的函数安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发31[2.5.3]
LiteOS-A内核中断(Cortex-A系列)删除非共享中断:过程简单,中断之间无关联性/kernel/liteos_a/arch/arm/arm/src/los_hiw.c实现(部分源码):HWI_LOCK(intSave);g_hwiForm[hwiNum].pfnHook=NULL;if(g_hwiForm[hwiNum].uwParam){(VOID)LOS_MemFree(m_aucSysMem0,(VOID*)g_hwiForm[hwiNum].uwParam);}g_hwiForm[hwiNum].uwParam=0;HWI_UNLOCK(intSave);LOS_HwiDelete()必要的安全检查OsHwiDelNoSharedOsHwiDelSharedLOSCFG_NO_SHARED_IRQYN/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码):#ifdefLOSCFG_NO_SHARED_IRQret=OsHwiDelNoShared(hwiNum);#elseret=OsHwiDelShared(hwiNum,irqParam);#endif安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发32[2.5.3]
LiteOS-A内核中断(Cortex-A系列)删除共享中断:过程复杂,共享中断之间有关联/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码1):if((hwiForm->pstNext!=NULL)&&
!(hwiForm->uwParam&IRQF_SHARED)){
hwiForm=hwiForm->pstNext;if(hwiForm->uwParam){(VOID)LOS_MemFree(m_aucSysMem0,
(VOID*)hwiForm->uwParam);}(VOID)LOS_MemFree(m_aucSysMem0,hwiForm);hwiFormtmp->pstNext=NULL;g_hwiFormName[hwiNum]=NULL;HWI_UNLOCK(intSave);returnLOS_OK;}OsHwiDelShared必要的安全检查是否共享,且设备ID或参数不都空直接处理,释放有子节点且非共享释放参数占用的内存释放节点占用的内存head->next置空处理成功,返回安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发33[2.5.3]
LiteOS-A内核中断(Cortex-A系列)删除共享中断:过程复杂,共享中断之间有关联/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码2):hwiForm=hwiForm->pstNext;while(hwiForm!=NULL){if(((HwiIrqParam*)
(hwiForm->uwParam))->pDevId!=irqParam->pDevId){hwiFormtmp=hwiForm;hwiForm=hwiForm->pstNext;}else{hwiFormtmp->pstNext=hwiForm->pstNext;(VOID)LOS_MemFree(m_aucSysMem0,
(VOID*)hwiForm->uwParam);(VOID)LOS_MemFree(m_aucSysMem0,hwiForm);
hwiValid=TRUE;break;}}OsHwiDelShared必要的安全检查是否共享,且设备ID或参数不都空直接处理,释放有子节点且非共享删除共享中断循环遍历中断程序信息链表上的设备节点非匹配设备下一个节点释放参数的内存、释放设备节点内存设置找到的标志、跳出循环安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发34[2.5.3]
LiteOS-A内核中断(Cortex-A系列)删除共享中断:过程复杂,共享中断之间有关联/kernel/liteos_a/arch/arm/src/los_hiw.c实现(部分源码3):if(hwiValid!=TRUE){HWI_UNLOCK(intSave);returnOS_ERRNO_HWI_HWINUM_UNCREATE;}if(g_hwiForm[hwiNum].pstNext==NULL){g_hwiForm[hwiNum].uwParam=0;g_hwiFormName[hwiNum]=NULL;}HWI_UNLOCK(intSave);returnLOS_OK;OsHwiDelShared必要的安全检查是否共享,且设备ID或参数不都空直接处理,释放有子节点且非共享删除共享中断收尾处理工作没有匹配到设备节点,则返回错误唯一节点,改为非共享处理成功,返回安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发35[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建/删除/关闭/打开LOS_IntLock()ArchIntLock()
/kernel/liteos_a/arch/arm/include/los_hw_cpu.h实现:/kernel/liteos_a/arch/arm/src/los_hwi.h文件中:STATICINLINEUINT32LOS_IntLock(VOID)
{returnArchIntLock();}#ifLOSCFG_ARM_ARCH>=6……UINT32intSave;__asm____volatile__("mrs%0,cpsr\n""cpsieif":"=r"(intSave)::"memory");returnintSave;asm:内嵌汇编语言;volatile:不进行代码优化;指令之间需要换行符隔开“\n"或分号"
;
"%0:首个参数;cpsr:程序状态寄存器;mrs:读cpsr指令“=r”(intSave):将变量intSave绑定某个寄存器,只写属性Memory
Clobber,确保汇编语句完成后使用的数据是有效的CPSID:ChangeProcessorState
Interruptorabortdisable.I:EnablesordisablesIRQinterrupts.F:EnablesordisablesFIQinterrupts.安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发36[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建/删除/关闭/打开LOS_IntUnLock()ArchIntUnlock()
/kernel/liteos_a/arch/arm/include/los_hw_cpu.h实现:/kernel/liteos_a/arch/arm/src/los_hwi.h文件中:STATICINLINEUINT32LOS_IntUnLock(VOID){returnArchIntUnlock();}#ifLOSCFG_ARM_ARCH>=6……UINT32intSave;__asm____volatile__("mrs%0,cpsr\n""cpsieif":"=r"(intSave)::"memory");returnintSave;asm:内嵌汇编语言;volatile:不进行代码优化;指令之间需要换行符隔开“\n"或分号"
;
"%0:首个参数;cpsr:程序状态寄存器;mrs:读cpsr指令“=r”(intSave):将变量intSave绑定某个寄存器,只写属性Memory
Clobber,确保汇编语句完成后使用的数据是有效的CPSIE:ChangeProcessorState
Interruptorabortenable.I:EnablesordisablesIRQinterrupts.F:EnablesordisablesFIQinterrupts.安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发37[2.5.3]
LiteOS-A内核中断(Cortex-A系列)
创建/删除/关闭/打开LOS_IntRestore()ArchIntRestore()
/kernel/liteos_a/arch/arm/include/los_hw_cpu.h实现:/kernel/liteos_a/arch/arm/src/los_hwi.h文件中:STATICINLINEVOIDLOS_IntRestore(UINT32intSave)
{ArchIntRestore(intSave);
}#ifLOSCFG_ARM_ARCH>=6……__asm____volatile__("msrcpsr_c,%0"::"r"(intSave):"memory");asm:内嵌汇编语言;volatile:不进行代码优化;指令之间需要换行符隔开“\n"或分号"
;
"%0:首个参数;cpsr:程序状态寄存器;mrs:读cpsr指令“r”(intSave):将变量intSave绑定某个寄存器,只读属性Memory
Clobber,确保汇编语句完成后使用的数据是有效的安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发38[2.5.3]
LiteOS-A内核中断(Cortex-A系列)示例(官网文档)#include"los_hwi.h”STATICVOIDHwiUsrIrq(VOID)
{
PRINK("inthefuncHwiUsrIrq\n");}UINT32ret;HWI_HANDLE_ThwiNum=7;HWI_PRIOR_ThwiPrio=3HWI_MODE_Tmode=0;HWI_ARG_Targ=0;ret=LOS_HwiCreate(
hwiNum,hwiPrio,mode,
(HWI_PROC_FUNC)HwiUsrIrq,
(HwiIrqParam*)arg);if(ret==LOS_OK){PRINK("Hwicreatesuccess!\n");}
else
{PRINK("Hwicreatefailed!\n");returnLOS_NOK;}LOS_TaskDelay(50);ret=LOS_HwiDelete(hwiNum,(HwiIrqParam*)arg);if(ret==LOS_OK){PRINK("Hwideletesuccess!\n");}else{PRINK("Hwideletefailed!\n");returnLOS_NOK;}中断处理函数变量等创建中断删除中断Hwicreatesuccess!Hwideletesuccess!运行结果安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发39[2.5.4]
LiteOS的异常处理异常:处理与微处理器相关的指令错误等,可看作是一类特殊的中断。
LiteOS-M的异常处理函数编号异常名异常处理函数功能1ResetReset_Handler复位2NMIHalExcNMI不可屏蔽中断3HardFaultHalExcHardFault硬件异常4MemorymanagementfaultHalExcMemFault内存管理异常5BusfaultHalExcBusFault总线异常6UsagefaultHalExcUsageFault指令异常7~10Reserved-
11SVCallHalExcSvcCall系统服务调用异常12~13Reserved-
14PendSVHalPendSV进程调度使用异常15SystickSysTick_HandlerOsTickHandler安全边距2.5中断与异常处理机制基于OpenHarmony的嵌入式开发40[2.5.4]
LiteOS的异常处理异常:处理与微处理器相关的指令错误等,可看作是一类特殊的中断。
LiteOS-A中Cortex-A处理器的异常/中断向量表定义编号异常名LiteOS-A异常处理函数功能1Resetreset_vector复位2UndefinedInstruction_osExceptUndefInstrHdl非法指令3SoftwareInterrupt_osExceptSwiHdl系统服务异常/软中断4PrefetchAbort_osExceptPrefetchAbortHdl指令预读取异常5DataAbort_osExceptDataAbortHdl数据访问异常6AddressAbort_osExceptAddrAbortHdl地址访问异常7IRQOsIrqHandler外部硬件中断8FIQ_osExceptFiqHdl外部快速中断安全边距2.6启动与时间管理基于OpenHarmony的嵌入式开发41[2.6.1]
LiteOS-M的启动过程例:CMSIS源码中的”startup.S”文件ENTRY(Reset_Handler)Reset_HandlerPROCEXPORTReset_Handler[WEAK]IMPORTSystemInitIMPORT__mainLDRR0,=SystemInitBLXR0LDRR0,=__mainBXR0ENDPCortex-M7中断向量表的基地址的设定、协处理器访问控制的设定、除数为零和未对齐内存访问触发HardFault异常的设定,系统频率变量设定/Device/ARM/ARMCM7/Source/GCC/startup_ARMCM7.S文件/Device/ARM/ARMCM7/Source/GCC/gcc_arm.ld文件/Device/ARM/ARMCM7/Source/startup_ARMCM7.c文件与平台和用户需求密切相关安全边距2.6启动与时间管理基于OpenHarmony的嵌入式开发42[2.6.1]
LiteOS-M的启动过程例:用户或厂商自定义的”main.c”文件/device/qemu/arm_mps3_an547main.c文件(Contex-M55
)main()EPUInit()UartInit()LOS_KernelInit()Uart0RxIrqRegister()LosShellInit()LosAppInit()LOS_Start()__asmvolatile("wfi")①EPUInit():EnablingtheFPU;②UartInit():初始化UART0,8N1,115200;③LOS_KernelInit():初始化LiteOS-M内核,OsMemSystemInit()、OsTickTimerInit()、OsTaskInit()和OsIdleTaskCreate()等;④Uart0RxIrqRegister():允许UART0接收数据产生中断,LOS_HwiCreate创建中断;⑤LosShellInit():创建Shell任务;⑥LosAppInit():创建了两个示例任务;⑦LOS_Start():调用ArchStartSchedule()函数,开启任务调度。⑧
__asmvolatile(“wfi”):进入低功耗状态Reset_Handler和main()函数,与处理器和系统硬件功能和软件需求密切相关。安全边距2.6启动与时间管理基于OpenHarmony的嵌入式开发43[2.6.2]
LiteOS-A的启动过程分块了解LiteOS-A内核系统的启动过程Bootloader跳转CPU初始设置关闭dcache/icache关闭MMU设置MMU设置虚实地址映射设置系统栈清理汇编语言启动阶段mainOsMain开始调度C语言启动阶段启动完成OsMain()设置当前Task信息EarliestInit()LOS_INIT_LEVEL_EARLIEST内核Trace模块初始化……时钟初始化、中断初始化ArchEarlyInit()LOS_INIT_LEVEL_ARCH_EARLY初始化UARTPlatformEarlyInit()LOS_INIT_LEVEL_PLATFORM_EARLYTask基础功能初始化OsTaskInit()LOS_INIT_LEVEL_KMOD_PREVM基础内存初始化OsSysMemInit()2.6启动与时间管理基于OpenHarmony的嵌入式开发44OsMain()设置当前Task信息EarliestInit()LOS_INIT_LEVEL_EARLIEST内核Trace模块初始化……时钟初始化、中断初始化ArchEarlyInit()LOS_INIT_LEVEL_ARCH_EARLYTask基础功能初始化OsTaskInit()LOS_INIT_LEVEL_KMOD_PREVM基础内存初始化OsSysMemInit()LOS_INIT_LEVEL_VM_COMPLETE共享内存初始化IPC初始化OsIpcInit()LOS_INIT_LEVEL_ARCH系统进程初始化OsSystemProcessCreate()处理器核心MMC初始化ArchInit()初始化UARTPlatformEarlyInit()LOS_INIT_LEVEL_PLATFORM_EARLY平台初始化,暂无用PlatformInit()LOS_INIT_LEVEL_PLATFORM驱动内核抽象层初始化MMC、MTD、……软件定时器初始化KModInit()LOS_INIT_LEVEL_KMOD_BASICVFS初始化OS_INIT_LEVEL_KMOD_EXTENDED系统调用初始化、ProcFS初始化、Futex初始化、HiLog初始化、LiteIPC初始化、……LOS_INIT_LEVEL_KMOD_TASK资源回收任务创建SystemInit任务创建、……多核平台初始化(SMP有效)OsSmpInit()OsMain()结束安全边距2.6启动与时间管理基于OpenHarmony的嵌入式开发45[2.6.2]
LiteOS-A的启动过程分块了解LiteOS-A内核系统的启动过程:汇编阶段/kernel/liteos_a/arch/arm/arm/src/startup/reset_vector_up.S(单核处理器)文件或reset_vector_mp.S(多核处理器)文件/ke
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年银行从业资格证考试考试技巧试题及答案
- 2025年注册会计师考试的整体布局分析与试题及答案
- 宁夏石嘴山市本年度(2025)小学一年级数学统编版专题练习(下学期)试卷及答案
- 考生访谈2025年证券从业资格证考试试题及答案
- 编辑教授教你证券从业资格证试题及答案
- 项目延误的原因及对策试题及答案
- 2025年财务战略评估试题及答案
- 2025年注册会计师考试考场技巧试题及答案
- 有效提高微生物检验效率的措施试题及答案
- 项目管理考试的案例分析分享试题及答案
- 消防重点单位档案十八张表格doc-消防安全重点单位档案
- YY 9706.240-2021医用电气设备第2-40部分:肌电及诱发反应设备的基本安全和基本性能专用要求
- GB/T 1094.7-2008电力变压器第7部分:油浸式电力变压器负载导则
- GB 12048-1989数字网内时钟和同步设备的进网要求
- 2022餐桌礼仪培训PPT餐桌礼仪培训课件模板
- 小学四年级地方课程安全教育教案泰山出版社
- 化学性及药物性颌骨骨髓炎
- 神奇的植物王国课件
- 员工岗位技能考核评定表
- 项目部安全生产事故应急预案
- 垂体瘤-PPT课件
评论
0/150
提交评论