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

二、LOS_KernelInit代码分析

/*****************************************************************************Function    : LOS_KernelInitDescription : System kernel initialization function, configure all system modulesInput       : NoneOutput      : NoneReturn      : LOS_OK on success or error code on failure*****************************************************************************/
LITE_OS_SEC_TEXT_INIT UINT32 LOS_KernelInit(VOID)
{UINT32 ret;PRINTK("entering kernel init...\n");#if (LOSCFG_BACKTRACE_TYPE != 0)                        //LOSCFG_XXX 宏定义为make menuconfig生成的宏OsBackTraceInit();  //函数目前用于初始化内存泄漏检查钩子
#endif#ifdef LOSCFG_KERNEL_LMSOsLmsInit();    //初始化 LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具
#endifret = OsMemSystemInit();if (ret != LOS_OK) {PRINT_ERR("OsMemSystemInit error %d\n", ret);return ret;}ArchInit();ret = OsTickTimerInit();if (ret != LOS_OK) {PRINT_ERR("OsTickTimerInit error! 0x%x\n", ret);return ret;}ret = OsTaskInit();if (ret != LOS_OK) {PRINT_ERR("OsTaskInit error\n");return ret;}#if (LOSCFG_BASE_CORE_TSK_MONITOR == 1)OsTaskMonInit();
#endif#if (LOSCFG_BASE_CORE_CPUP == 1)ret = OsCpupInit();if (ret != LOS_OK) {PRINT_ERR("OsCpupInit error\n");return ret;}
#endif#if (LOSCFG_BASE_IPC_SEM == 1)ret = OsSemInit();if (ret != LOS_OK) {return ret;}
#endif#if (LOSCFG_BASE_IPC_MUX == 1)ret = OsMuxInit();if (ret != LOS_OK) {return ret;}
#endif#if (LOSCFG_BASE_IPC_QUEUE == 1)ret = OsQueueInit();if (ret != LOS_OK) {PRINT_ERR("OsQueueInit error\n");return ret;}
#endif#if (LOSCFG_BASE_CORE_SWTMR == 1)ret = OsSwtmrInit();if (ret != LOS_OK) {PRINT_ERR("OsSwtmrInit error\n");return ret;}
#endif#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)ret = OsCpupDaemonInit();if (ret != LOS_OK) {PRINT_ERR("OsCpupDaemonInit error\n");return ret;}
#endif#if (LOSCFG_FS_VFS == 1)ret = OsVfsInit();if (ret != LOS_OK) {PRINT_ERR("OsVfsInit error\n");return ret;}
#endifret = OsIdleTaskCreate();if (ret != LOS_OK) {return ret;}#if (LOSCFG_KERNEL_TRACE == 1)ret = OsTraceInit();if (ret != LOS_OK) {PRINT_ERR("OsTraceInit error\n");return ret;}
#endif#if (LOSCFG_KERNEL_PM == 1)ret = OsPmInit();if (ret != LOS_OK) {PRINT_ERR("Pm init failed!\n");return ret;}
#endif#if (LOSCFG_KERNEL_LMK == 1)OsLmkInit();
#endif#if (LOSCFG_PLATFORM_EXC == 1)OsExcMsgDumpInit();
#endif#if (LOSCFG_DYNLINK == 1)ret = LOS_DynlinkInit();if (ret != LOS_OK) {return ret;}
#endif#if (LOSCFG_POSIX_PIPE_API == 1)ret = OsPipeInit();if (ret != LOS_OK) {PRINT_ERR("Pipe init failed!\n");return ret;}
#endif#if (LOSCFG_KERNEL_SIGNAL == 1)ret = OsSignalInit();if (ret != LOS_OK) {PRINT_ERR("Signal init failed!\n");return ret;}
#endif#if (LOSCFG_SECURE == 1)OsSyscallHandleInit();LOS_BoxStart();
#endifreturn LOS_OK;
}

坚持就有收获

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

七.把opencv库集成到QT5创建的窗体项目中

1.安装opencv 命令&#xff1a;mingw32-make install 2.新建项目 opencvDemo1 然后点击【下一步】&#xff0c;选择qmake&#xff0c;完成工程的创建 3.添加opencv 库文件 在pro工程文件中加入如下库文件路径

Python爬虫-报错requests.exceptions.SSLError: HTTPSConnectionPool

在学习python爬虫&#xff0c;在公司运行代码没有问题&#xff0c;但是下班回来把代码拉下来运行&#xff0c;却出现问题。 问题&#xff1a; requests.exceptions.SSLError: HTTPSConnectionPool(host‘campusgateway.51job.com’, port443): Max retries exceeded with url…

C++的map/multimap容器->基本概念、构造和赋值、大小和交换、插入和删除、查找和统计、容器排序

#include<iostream> using namespace std; #include <map> //map容器 构造和赋值 void printMap(map<int,int>&m) { for (map<int, int>::iterator it m.begin(); it ! m.end(); it) { cout << "key " <&l…

Vue2响应式原理分析(数据代理与数据劫持)

综述&#xff1a; 我们都知道&#xff0c;每个Vue的应用都是通过new一个Vue构造函数从而创造出来一个vm实例对象&#xff0c;el&#xff08;elect&#xff09;配置项为通过id选择器#root选择index页面中的根dom元素进行绑定&#xff0c;data配置项则为vue模板中用到的源数据。 …

C语言-数组指针与指针数组

一、简介 对于使用C语言开发的人来说&#xff0c;指针&#xff0c;大家都是非常熟悉的。数组&#xff0c;大家也同样熟悉。但是这两个组合到一起的话&#xff0c;很多人就开始蒙圈了。这篇文章&#xff0c;就详细的介绍一下这两个概念。 指针数组和数组指针&#xff0c;听起来非…

【服务器数据恢复】通过reed-solomon算法恢复raid6数据的案例

服务器数据恢复环境&#xff1a; 一台网站服务器中有一组由6块磁盘组建的RAID6磁盘阵列&#xff0c;操作系统层面运行MySQL数据库和存放一些其他类型文件。 服务器故障&#xff1a; 该服务器在工作过程中&#xff0c;raid6磁盘阵列中有两块磁盘先后离线&#xff0c;不知道是管理…

在Linux操作系统的ECS实例上安装hadoop

目录 1. java(jdk)2. Hadoop3. 配置文件4. 启动Hadoop服务&#xff08;搭建伪分布式环境&#xff09; 1. java(jdk) yum list java* &#xff1a;列出所有名称中包含“java”字样的软件包yum install java-1.8.0-openjdk.x86_64&#xff1a;选择自己想要的版本。这里我选择jav…

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win版

JetBrains DataGrip 2023是一款功能强大的数据库IDE&#xff0c;专为数据库开发和管理而设计。通过DataGrip&#xff0c;您可以连接到各种关系型数据库管理系统(RDBMS)&#xff0c;并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023 软件获取 DataGrip 2…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方&#xff0c;通过互联网和现代通讯技术进行协作和沟通&#xff0c;以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源&#xff0c;降低团队的管理和协作成本&#xff0…

【Ubuntu】使用WSL安装Ubuntu

WSL 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Windows 计算机上运行 Linux 环境&#xff0c;而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。安装 Linux 发行版时&#xff0c…

云HIS系统源码,基于云计算技术的B/S架构的云HIS系统,二甲医院信息管理系统

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能…

vscode + wsl2 + xmake快速构建c语言编译调试环境

前言 使用这一套是我觉得最方便的&#xff0c;wsl2使得我可以不用脱离windows&#xff0c;且无需安装庞大且臃肿虚拟机。vscode让我可以更加方便快捷的编辑代码&#xff0c;而xmake是一站式的工程构建工具且作者就是中国人文档啥的群啥的都是中文&#xff0c;比起cmake makefi…

python统计分析——线性模型的预测和评估

参考资料&#xff1a;用python动手学统计学 1、导入库 # 导入库 # 导入数据处理的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 导入绘图的库 from matplotlib import pyplot as plt import seaborn as sns sns.set() # 导入估计…

BERT学习笔记

论文&#xff1a;《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》&#xff0c;2019 代码&#xff1a;[tensorflow]&#xff0c;[pytorch] 来源&#xff1a;李沐精度BERT 0、摘要 与之前模型的区别&#xff1a; GPT考虑的是一个单向…

OLTP、OLAP与HTAP、HSAP详解

HTAP、HSAP是OLAP与OLTP综合需求驱动下的新的数据库系统&#xff0c;既满足事务处理&#xff0c;又满足大规模分析查询&#xff0c;并且是基于一套系统下实现。 本节首先我们要了解服务于分析的区别。相当多从应用角度对数据处理分类的划分&#xff0c;大致可以分为Transactio…

计算机网络-网络互联与互联网(一)

1.常用网络互联设备&#xff1a; 1层物理层&#xff1a;中继器、集线器2层链路层&#xff1a;网桥、交换机3层网络层&#xff1a;路由器、三层交换机4层以上高层&#xff1a;网关 2.网络互联设备&#xff1a; 中继器Repeater、集线器Hub&#xff08;又叫多端口中继器&#xf…

PyTorch概述(二)---MNIST

NIST Special Database3 具体指的是一个更大的特殊数据库3&#xff1b;该数据库的内容为手写数字黑白图片&#xff1b;该数据库由美国人口普查局的雇员手写 NIST Special Database1 特殊数据库1&#xff1b;该数据库的内容为手写数字黑白图片&#xff1b;该数据库的图片由高…

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…

学校档案室管理制度内容

学校档案室管理制度是指对学校档案室进行管理的规定和流程。以下是一个示例的学校档案室管理制度的内容&#xff1a; 1.档案室的管理部门和责任人员&#xff1a; 学校档案室由学校行政部门负责管理&#xff0c;行政部门指定专门的档案管理员负责档案室的日常管理工作。 2.档案室…

ElasticSearch之单值多字段查询以及dis max query

写在前面 在查询中经常有这样的查询场景&#xff0c;我们只有一个输入框&#xff0c;但是输入的值需要同时对多个字段进行查询&#xff0c;这就是单值多字段的查询&#xff0c;像下图&#xff1a; 1&#xff1a;例子 首先来准备测试数据&#xff1a; DELETE blogs PUT /bl…