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

坚持就有收获

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果分拣检测YOLOV8NANO

苹果分拣&#xff0c;可以检测成熟、切片、损坏、不成熟四种类型&#xff0c;YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;支持C,PYTHON 苹果分拣检测YOLOV8NANO&#xff0c;检测四种类型苹果

C++ 学习之函数对象

C++ 函数对象基本概念 在C++中,函数对象(Function Objects)是一种类或结构体,它重载了函数调用运算符operator(),因此可以像函数一样被调用。函数对象有时也被称为仿函数(Functor)。 以下是关于C++函数对象的基本概念: 使用函数对象:函数对象可以像普通函数一样被调…

【Flink精讲】Flink 内存管理

面临的问题 目前&#xff0c; 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的&#xff0c;例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理&#xff0c;但同样会面临一个问题&…

从零开始学习Netty - 学习笔记 -Netty入门-EventLoop

5.Neety入门 什么是Netty Netty是一个基于Java NIO的异步事件驱动的网络应用框架。它被广泛用于开发高性能、高可靠性的网络通信程序&#xff0c;特别是服务器端和客户端程序。Netty提供了简洁而强大的API&#xff0c;使得开发者能够轻松地构建各种网络应用&#xff0c;包括实…

LiveQing视频点播流媒体RTMP推流服务功能-支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务

LiveQing视频点播流媒体RTMP推流服务功能支持配置开启 HTTPS 服务什么时候需要开启HTTPS服务 1、配置开启HTTPS1.1、准备https证书1.1.1、选择Nginx类型证书下载 1.2、配置 开启 HTTPS1.2.1 web页面配置1.2.2 配置文件配置 2、验证HTTPS服务3、为什么要开启HTTPS3.1、安全性要求…

Mysql运维篇(四) MHA

大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用&#xff08;MHA&#xff09; - 知乎 一、MHA简介&#xff1a; MHA&#xff08;Master High Availability&#xff09;目前在MySQL高可用方面是一个相对成熟的解决方案&#xff0c;它由日本DeNA公司y…

freeswitch 权威指南 --- 高级篇

官网文档&#xff1a;https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/ 关于 freeswitch 的公开教程&#xff1a;https://zhuanlan.zhihu.com/p/451981734 内容来自 《FreeSWITCH 权威指南》&#xff1a;目录&#xff1a;https://juejin.cn/post/702058079…

人力资源管理信息化系统如何支持企业开展管理诊断

人力资源顾问有限公司致力于帮助企业开展人力资源管理方面的各项提升改进工作&#xff0c;在长期的咨询工作中&#xff0c;最常听到企业提到的问题莫过于管理诊断方面的问题&#xff0c;事实上&#xff0c;很多企业在日常工作中&#xff0c;都意识到企业内部存在管理方面的问题…

vue3+js 实现记住密码功能

常见的几种实现方式 1 基于spring security 的remember me 功能 ​​​​​​​ localStorage 除非主动清除localStorage 里的信息 &#xff0c;不然永远存在&#xff0c;关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…

第11章 互连网络体系结构

之前&#xff0c;我们尚未讨论如何可靠、快速地将消息从一个节点发送到另一个节点。本章目的是讨论多个处理器互连的结构。互连网络最重要的两个性能指标是延迟和带宽。 基于共享存储多处理器的几个通信特性&#xff0c;与诸如局域网或因特网等其他网络系统相比&#xff0c;共…

react hook使用UEditor引入秀米图文排版

里面坑比较多&#xff0c;细节也比较多 以下使用的是react 18 ice3.0&#xff0c;使用其他react脚手架的配置基本相同&#xff0c;例如umi4 1.下载UEditor 进入UEditor仓库&#xff0c;找到版本v1.4.3.3&#xff0c;点击进去 接着下载ueditor1_4_3_3-utf8-jsp.zip版本 下载好…

CentOS 7 定时任务 + Shell 脚本自动备份 MySQL 数据库(一次 Halo 建站数据库丢失的教训)

文章目录 前置条件创建备份脚本设置 Cron 任务测试备份脚本备份安全和维护一键恢复自动清除备份文件常见问题总结 TIP&#xff1a; 原文链接阅读体验更佳&#xff1a;CentOS 7 自动备份 MySQL 数据库 最近抽空简单搭了一个博客&#xff0c;目前内容较少&#xff0c;后续陆续发…

Supermaven惊艳亮相:300,000个Tokens的超大上下文窗口,能否超越Copilot成为代码补全新王者?

当我看到GitHub宣布Copilot的年经常性收入突破1亿美元时&#xff0c;我意识到代码补全技术已经迈入了新的时代。 大型模型的崛起使得这些工具变得更加智能和实用&#xff0c;吸引了越来越多的开发者加入AI编码的行列。 在这个背景下&#xff0c;Supermaven发布了。这是第一个…

TikTok直播网络不稳定是什么原因

在当今社交媒体平台中&#xff0c;TikTok以其独特的视频内容和社交互动功能而备受欢迎。然而&#xff0c;尽管TikTok为用户提供了直播功能&#xff0c;但一些用户可能会遇到TikTok直播网络不稳定的问题。那么&#xff0c;TikTok直播网络不稳定的原因是什么呢&#xff1f;以下是…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第11章 项目成本管理(五)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

关于Arrays类中asList(T... a)泛型参数辨析

前提 我们需要知道两点 &#xff08;1&#xff09;T指的是泛型类型&#xff0c;它只能是引用类型&#xff0c;何为引用类型&#xff1f;在java中除了基本数据类型&#xff08;如byte、short、int、long、float、double、boolean、char&#xff09;之外的所有类型都是引用类型…

车载电子测试学习内容

搜集了一些车载测试的学习内容&#xff0c;大家可以参考。

从ChatGPT到Sora,来了解大模型训练中的存储

1 从chatGPT到Sora 2022年底&#xff0c;OpenAI推出人工智能聊天机器人ChatGPT&#xff0c;开启了大模型领域的“竞速跑”模式。2024年2月15日&#xff0c;随着视频生成模型Sora的横空出世&#xff0c;OpenAI再度掀起热潮。 Sora将视频生成内容拉到了一个全新的高度&#xff0c…

osmnx笔记:从OpenStreetMap中提取点和边的shp文件(FMM文件准备内容)

1 导入库 import osmnx as ox import time from shapely.geometry import Polygon import os import numpy as np 2 提取Openstreetmap 的graph Gox.graph_from_place(Huangpu,Shanghai,China,network_typedrive,simplifyTrue) ox.plot_graph(G) 3 提取graph中的点和边 gdf…

冯诺依曼体系结构 计算机组成的金字塔

01 冯诺依曼体系结构&#xff1a;计算机组成的金字塔 学习计算机组成原理&#xff0c;到底是在学些什么呢&#xff1f;这个事儿&#xff0c;一两句话还真说不清楚。不过没关系&#xff0c;我们先从“装电脑”这个看起来没有什么技术含量的事情说起&#xff0c;来弄清楚计算机到…