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_RESTORE
    push    {r12, lr}
    blx     OsSignalTaskContextRestore
    pop     {r12, lr}
    cmp     r0, #0
    mov     r1, r0
    bne     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_CPACR
    ldr     r1, [r1]
    and     r1, r1, #OS_FPU_CPACR_ENABLE
    cmp     r1, #OS_FPU_CPACR_ENABLE
    bne     __DisabledFPU           # if(r1 != 0) 执行__DisabledFPU符号位指令
    add     r12, r12, #100

    ldmfd   r12!, {R0-R7}
    add     r12, r12, #72
    msr     psp, r12
    vpush   {s0}
    vpop    {s0}
    mov     lr, r5
    cpsie   i
    bx      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
    .cantunwind

    MRS R0, PRIMASK
    CPSID I
    BX LR
    .fnend

    .type ArchIntUnLock, %function
    .global ArchIntUnLock
ArchIntUnLock:
    .fnstart
    .cantunwind

    MRS R0, PRIMASK
    CPSIE I
    BX LR
    .fnend

    .type ArchIntRestore, %function
    .global ArchIntRestore
ArchIntRestore:
    .fnstart
    .cantunwind

    MSR PRIMASK, R0
    BX LR
    .fnend

    .type ArchTaskSchedule, %function
    .global ArchTaskSchedule
ArchTaskSchedule:
    .fnstart
    .cantunwind

    ldr     r0, =OS_NVIC_INT_CTRL
    ldr     r1, =OS_NVIC_PENDSVSET
    str     r1, [r0]
    bx      lr
    dsb
    isb
    .fnend

    .type HalPendSV, %function
    .global HalPendSV
HalPendSV:
    .fnstart
    .cantunwind

    mrs     r12, PRIMASK
    cpsid   I

HalTaskSwitch:
    SIGNAL_CONTEXT_RESTORE

    push    {r12, lr}
    blx     OsSchedTaskSwitch
    pop     {r12, lr}
    cmp     r0, #0
    mov     r0, lr
    bne     TaskContextSwitch
    msr     PRIMASK, r12
    bx      lr

TaskContextSwitch:
    mov     lr, r0
    mrs     r0, psp

    stmfd   r0!, {r4-r12}
    ldr.w   r3, =OS_FPU_CPACR
    ldr     r3, [r3]
    and     r3, r3, #OS_FPU_CPACR_ENABLE
    cmp     r3, #OS_FPU_CPACR_ENABLE
    bne     __DisabledFPU1
    vstmdb  r0!, {d8-d15}

__DisabledFPU1:
    ldr     r5, =g_losTask
    ldr     r6, [r5]
    str     r0, [r6]

    ldr     r0, [r5, #4]
    str     r0, [r5]
    ldr     r1, [r0]

SignalContextRestore:
    ldr.w   r3, =OS_FPU_CPACR
    ldr     r3, [r3]
    and     r3, r3, #OS_FPU_CPACR_ENABLE
    cmp     r3, #OS_FPU_CPACR_ENABLE
    bne     __DisabledFPU2
    vldmia  r1!, {d8-d15}

__DisabledFPU2:
#if (LOSCFG_SECURE == 1)
    ldrh    r7, [r0, #4]
    tst     r7, #OS_TASK_FLAG_USER_TASK
    ite     eq
    moveq   r3, #OS_CONTROL_KERNEL_MODE
    movne   r3, #OS_CONTROL_USER_MODE
    msr     CONTROL, r3
#endif
    ldmfd   r1!, {r4-r12}
    msr     psp,  r1

    msr     PRIMASK, r12

    bx      lr
    .fnend

坚持就有收获

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第九篇【传奇开心果系列】python文本和语音相互转换库技术点案例示例:SpeechRecognitio库开发会议记录和转录工具经典案例

传奇开心果博文系列 系列博文目录python文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、SpeechRecognition库多种语音识别引擎支持示例代码四、SpeechRecognition库实时语音转录示例代码五、SpeechRecognitio库转录文本中提取关键词…

GPT Pilot - 编写 95% 代码的开发工具!

在这篇博客介绍了GPT-pilot的研发细节&#xff0c;原作者将探讨GPT Pilot的技术内核 —— 一款基于GPT-4编写的开发工具&#xff0c;可以生成生产使用代码的应用。 你有没有想过&#xff0c;95%的应用代码&#xff0c;可以由AI编写&#xff0c;就像《钢铁侠》里的贾维斯一样&a…

DAY30--learning English

一、积累 1.budget 2.fabulous 3.strait 4.jut 5.grater 6.fillet 7.fin 8.decay 9.cartilage 10.gill 11.convex 12.concave 13.tender 14.trim 15.workload 16.knuckle 17.crevice 18.skew 19.membrane 20.delicate 二、练习 1.牛津原译 Budget /ˈbʌdʒɪt/ 1.[ CU]the…

一流的财务:搞数据!!!(干货)

“三流财务给数据&#xff0c;二流财务给分析报告&#xff0c;一流财务给....&#xff08;解决方案&#xff09;“这些文章应该很多人都看到过&#xff0c;这个口号粗看好像很有道理&#xff0c;但笔者并不认同&#xff0c;因为大家都忽略了一个重要的概念&#xff1a;数据&…

CrossOver2024国产版虚拟机软件有哪些功能呢?

除了办公应用场景&#xff0c;CrossOver虚拟机软件还可以在以下场景中使用&#xff1a; 设计与开发&#xff1a;对于设计师和开发人员来说&#xff0c;某些特定的Windows设计和开发工具可能在Mac或Linux上没有完美的替代品。此时&#xff0c;他们可以使用CrossOver来运行这些工…

SQL 中如何实现多表关联查询?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在SQL中&#xff0c;多表关联查询是通过使用JOIN操作来实现的&#xff0c;它允许你从两个或多个表中根据相关列的值来检索数据。以下是几种常见的JOIN类型&#xff1a; …

wpf 3d 后台加载模型和调整参数

下载了一个代码&#xff0c;加载obj模型&#xff1b;它的参数在xaml里&#xff0c;模型加载出来刚好&#xff1b; 然后加载另一个obj模型&#xff1b;加载出来之后大&#xff0c;偏到很高和左的位置&#xff1b; 它之前的摄像机位置&#xff0c; Position"9.94759830064…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

Canvas学习笔记02:canvas的路径扫盲,附代码案例

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas的路径知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 一、什么是canvas路径 Canvas…

滑动窗口刷题(三)

1. 找到字符串中所有字母异位词 1.题目解析 比较易懂&#xff0c;不做解析。 2.算法思路 哈希表滑动窗口有效字符个数优化 创建两个哈希表&#xff0c;将p字符串存入哈希表2。 定义cnt存放有效字符个数。 进窗口&#xff1a;存入哈希表1&#xff0c;如果该元素在哈希1中的…

嵌入式中常见语言对内存管理基本方法

大家好&#xff0c;今天给大家分享一下&#xff0c;从语言角度来讲:对比常见的几种语言对内存的管理方法​。 (1&#xff09;汇编语言:根本没有任何内存管理&#xff0c;内存管理全靠程序员自己&#xff0c;汇编中操作内存时直接使用内存地址&#xff08;譬如0xd0020010 )&…

前端工程化面试题 | 17.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

python:读 Freeplane.mm文件,使用 xml.etree 生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xf…

提升代码能力:程序员的进阶之路

提升代码能力&#xff1a;程序员的进阶之路 在当今日益发展的技术领域&#xff0c;程序员的代码能力对于个人职业发展至关重要。优秀的代码能力不仅能提高开发效率&#xff0c;还能产生高质量的软件和解决方案。然而&#xff0c;提升代码能力是一个不断学习和成长的过程。本文将…

人工智能何时会拥有自由意志?

一、自由意志的来源 人类的自由意志是一个复杂而深奥的概念&#xff0c;它涉及到哲学、心理学、神经科学等多个学科领域。目前并没有一个统一且被广泛接受的答案来完全解释自由意志如何形成&#xff0c;但可以从多个角度探讨其可能性和相关理论&#xff1a; 1. **哲学视角**&…

python项目的容器化部署

python项目的容器化部署 参考链接编辑Dockerfile文件构建镜像打包镜像加载镜像创建并启动容器 参考链接 链接1 链接2 编辑Dockerfile文件 下方代码是Dockerfile文件的内容&#xff1a; FROM continuumio/miniconda3 WORKDIR .COPY table_handle/ ./table_handle/COPY requi…

零基础学编程,编程简单学,中文编程工具下载及工具箱进度条构件的用法

一、前言 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 进度条 进度…

注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构等

注入工具SQLMAP教程&#xff1a;Tamper编写;指纹修改;高权限操作;目录架构 #知识点&#xff1a; 1、SQLMAP-常规猜解&字典配置 2、SQLMAP-权限操作&文件命令 3、SQLMAP-Tamper&使用&开发 4、SQLMAP-调试指纹&风险等级 #参考文章&#xff1a; https://w…

【Android】View 与 ViewGroup

View 是 Android 所有控件的基类&#xff0c;我们平常所用的 TextView 和 ImageView 都是继承自 View 的&#xff0c;源码如下&#xff1a; public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {... }public class ImageView extends View {.…