5.2.鸿蒙LiteOS-M los_dispatch

2024-02-25 08:04
文章标签 dispatch 鸿蒙 5.2 liteos los

本文主要是介绍5.2.鸿蒙LiteOS-M los_dispatch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请添加图片描述

目录

  • 一、cortex-m4 los_dispatch.S代码分析
  • 坚持就有收获

一、cortex-m4 los_dispatch.S代码分析

.syntax unified     #.syntax [unified | divided], 指定arm 汇编语法规则
.arch armv7e-m      #指定平台, 与命令行参数-march同样的作用
.fpu fpv4-sp-d16    #指定浮点运算单元,与命令行参数-mfpu同样的作用
.thumb              # .thumb伪操作等同于.code 16, 表明使用Thumb指令# .equ 定义静态符号,把常量值设置为可以在文本段中使用的符号
.equ    OS_FPU_CPACR,                0xE000ED88
.equ    OS_FPU_CPACR_ENABLE,         0x00F00000
.equ    OS_NVIC_INT_CTRL,            0xE000ED04
.equ    OS_NVIC_SYSPRI2,             0xE000ED20
.equ    OS_NVIC_PENDSV_PRI,          0xF0F00000
.equ    OS_NVIC_PENDSVSET,           0x10000000
.equ    OS_TASK_STATUS_RUNNING,      0x0010
.equ    OS_CONTROL_FPCA_ENABLE,      0x4
.equ    OS_CONTROL_KERNEL_MODE,      0x2
#if (LOSCFG_SECURE == 1)
.equ    OS_CONTROL_USER_MODE,        0x3
.equ    OS_TASK_FLAG_USER_TASK,      0x0200
#endif.section .text      # 后面那些指令都属于.text段.thumb# .macro/.endm 定义一个宏,可以把需要重复执行的一段代码,或者是一组指令缩写成一个宏,
# 在程序调用的时候就可以直接去调用这个宏而使代码更加简洁清晰
.macro SIGNAL_CONTEXT_RESTOREpush    {r12, lr}blx     OsSignalTaskContextRestorepop     {r12, lr}cmp     r0, #0mov     r1, r0bne     SignalContextRestore
.endm.type HalStartToRun, %function  # HalStartToRun 类型为函数.global HalStartToRun           # 声明全局符号。全局符号是指在本程序外可访问的符号
HalStartToRun:                      # .fnstart                        # 函数开始.cantunwind                     # 可以被栈回溯# ldr Rt, label     从label加载一个字到寄存器Rt中# str Rt, label     从地址Rt读取一个字到label中# [Rt]表示读取地址Rt处数据ldr     r4, =OS_NVIC_SYSPRI2        # 加载OS_NVIC_SYSPRI2 符号到寄存器r4中ldr     r5, =OS_NVIC_PENDSV_PRI     # 加载OS_NVIC_PENDSV_PRI 符号到寄存器r4中str     r5, [r4]                    # 读取地址r5处一个字数据,到r4地址中# 以上3条指令等效于:*((volatile u32 *)0xE000ED20) = 0xF0F00000# 设置PENDSV优先级为最低# 给寄存器传递一个立即数,此时需要用“#”来修饰立即数,并且立即数为8位的,其值不能超过255.# 特殊寄存器必须用MRS(),MSR 指令访问# MRS <gp_reg>, <special_reg> ;读特殊功能寄存器的值到通用寄存器# MSR <special_reg>, <gp_reg> ;写通用寄存器的值到特殊功能寄存器mov     r0, #OS_CONTROL_KERNEL_MODE msr     CONTROL, r0     # 将r0数据写入CONTROL特殊寄存器中# 以上2条指令完成,sp使用进程堆栈指针ldr     r1, =g_losTask      # 将g_losTask结构体变量地址加载到r1中ldr     r0, [r1, #4]        # 将g_losTask.newTask地址加载到r1中,r1此时为newTask的TaskCB的内存地址ldr     r12, [r0]           # g_losTask->newTask->stackPointer加载到寄存器r12# g以上3条指令完成,任务上下文加载ldr.w   r1, =OS_FPU_CPACRldr     r1, [r1]and     r1, r1, #OS_FPU_CPACR_ENABLEcmp     r1, #OS_FPU_CPACR_ENABLEbne     __DisabledFPU           # if(r1 != 0) 执行__DisabledFPU符号位指令add     r12, r12, #100ldmfd   r12!, {R0-R7}add     r12, r12, #72msr     psp, r12vpush   {s0}vpop    {s0}mov     lr, r5cpsie   ibx      r6__DisabledFPU:add     r12, r12, #36       # 加载数据变为context->uwR0 = taskID;ldmfd   r12!, {r0-r7}       # 加载context->uwR0~context->uwxPSR 到 r0-r7中msr     psp, r12            # 加载r12地址中一个字到psp中mov     lr, r5              # 加载r5 context->uwLR到lr寄存器中cpsie   I                   # 开中断bx      r6                  # context->uwPC.fnend                  # HalStartToRun end.type ArchIntLock, %function.global ArchIntLock
ArchIntLock:.fnstart.cantunwindMRS R0, PRIMASKCPSID IBX LR.fnend.type ArchIntUnLock, %function.global ArchIntUnLock
ArchIntUnLock:.fnstart.cantunwindMRS R0, PRIMASKCPSIE IBX LR.fnend.type ArchIntRestore, %function.global ArchIntRestore
ArchIntRestore:.fnstart.cantunwindMSR PRIMASK, R0BX LR.fnend.type ArchTaskSchedule, %function.global ArchTaskSchedule
ArchTaskSchedule:.fnstart.cantunwindldr     r0, =OS_NVIC_INT_CTRLldr     r1, =OS_NVIC_PENDSVSETstr     r1, [r0]bx      lrdsbisb.fnend.type HalPendSV, %function.global HalPendSV
HalPendSV:.fnstart.cantunwindmrs     r12, PRIMASKcpsid   IHalTaskSwitch:SIGNAL_CONTEXT_RESTOREpush    {r12, lr}blx     OsSchedTaskSwitchpop     {r12, lr}cmp     r0, #0mov     r0, lrbne     TaskContextSwitchmsr     PRIMASK, r12bx      lrTaskContextSwitch:mov     lr, r0mrs     r0, pspstmfd   r0!, {r4-r12}ldr.w   r3, =OS_FPU_CPACRldr     r3, [r3]and     r3, r3, #OS_FPU_CPACR_ENABLEcmp     r3, #OS_FPU_CPACR_ENABLEbne     __DisabledFPU1vstmdb  r0!, {d8-d15}__DisabledFPU1:ldr     r5, =g_losTaskldr     r6, [r5]str     r0, [r6]ldr     r0, [r5, #4]str     r0, [r5]ldr     r1, [r0]SignalContextRestore:ldr.w   r3, =OS_FPU_CPACRldr     r3, [r3]and     r3, r3, #OS_FPU_CPACR_ENABLEcmp     r3, #OS_FPU_CPACR_ENABLEbne     __DisabledFPU2vldmia  r1!, {d8-d15}__DisabledFPU2:
#if (LOSCFG_SECURE == 1)ldrh    r7, [r0, #4]tst     r7, #OS_TASK_FLAG_USER_TASKite     eqmoveq   r3, #OS_CONTROL_KERNEL_MODEmovne   r3, #OS_CONTROL_USER_MODEmsr     CONTROL, r3
#endifldmfd   r1!, {r4-r12}msr     psp,  r1msr     PRIMASK, r12bx      lr.fnend

坚持就有收获

请添加图片描述

这篇关于5.2.鸿蒙LiteOS-M los_dispatch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744868

相关文章

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

鸿蒙开发中实现自定义弹窗 (CustomDialog)

效果图 #思路 创建带有 @CustomDialog 修饰的组件 ,并且在组件内部定义controller: CustomDialogController 实例化CustomDialogController,加载组件,open()-> 打开对话框 , close() -> 关闭对话框 #定义弹窗 (CustomDialog)是什么? CustomDialog是自定义弹窗,可用于广告、中

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、页面之间相互传参 说明: 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到U

鸿蒙开发5.0【Picker的受限权限适配方案】

Picker由系统独立进程实现,应用可以通过拉起Picker组件,用户在Picker上选择对应的资源(如图片、文档等),应用可以获取Picker返回的结果。 类型受限权限使用的picker音频ohos.permission.READ_AUDIO,ohos.permission.WRITE_AUDIOAudioViewPicker文件ohos.permission.READ_DOCUMENT,oh

鸿蒙自动化发布测试版本app

创建API客户端 API客户端是AppGallery Connect用于管理用户访问AppGallery Connect API的身份凭据,您可以给不同角色创建不同的API客户端,使不同角色可以访问对应权限的AppGallery Connect API。在访问某个API前,必须创建有权访问该API的API客户端。 1.登录AppGallery Connect网站,选择“用户与访问”。选择左侧

鸿蒙开发入门day06-ArkUI简介

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 ArkUI简介 基本概念 两种开发范式 不同应用类型支持的开发范式 UI开发(ArkTS声明式开发范式)概述 特点 整体架构 开发布局 布局结构 布局元素的组成 布局位置 对子元素的约束 ArkUI简介 ArkUI(方舟UI框架)为应用

三文带你轻松上手鸿蒙的AI语音03-文本合成声音

三文带你轻松上手鸿蒙的AI语音03-文本合成声音 前言 接上文 三文带你轻松上手鸿蒙的AI语音02-声音文件转文本 HarmonyOS NEXT 提供的AI 文本合并语音功能,可以将一段不超过10000字符的文本合成为语音并进行播报。 场景举例 手机在无网状态下,系统应用无障碍(屏幕朗读)接入文本转语音能力,为视障人士提供播报能力。类似微信读书,可以实现将文章内容通过语音朗读,可以

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染

【鸿蒙HarmonyOS NEXT】调用后台接口及List组件渲染 一、环境说明二、调用后台接口及List组件渲染三、总结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、调用后台接口及List组件渲染 后台接口及返回数据分析 JSON数据格式如下: {"code": 0,"data": {"total": 6,"pageSize"

从应用内跳转至外部浏览器 - 鸿蒙 HarmonyOS Next

从应用内跳转至外部浏览器,基于 Want 来实现,同时也可以通过其方式尝试跳转至其它系统模块,具体可参考如下 code : 方法调用 // 调用pushOutsideWeb(controller, url) 方法实现 import { common, contextConstant, Want } from '@kit.AbilityKit';import { HintMessage

鸿蒙(API 12 Beta6版)超帧功能开发【顶点标记】

超帧提供两种运动估计模式供开发者选择:分别为基础模式和增强模式。其中增强模式需要对绘制顶点的Draw Call命令进行额外的标记,在相机和物体快速运动的游戏场景超帧效果较基础模式更优,能够有效改善拖影问题。本章主要介绍增强模式的运动估计原理及顶点标记方法。 说明 Draw Call:指图形驱动库(OpenGL ES)中进行绘制的命令,例如glDrawElements、glDrawArrays、