嵌入式养成计划-51----ARM--ARM汇编指令--内存读写指令--程序状态寄存器传输指令--软中断指令--混合编程
一百二十七、内存读写指令
- 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据
127.1 单寄存器内存读写指令
- 将一个寄存器中的数值写入到内存,或者从内存中读取数据放在某一个指定寄存器中
127.1.1 指令码和功能
1. 向内存中写:
str{条件码} 目标寄存器,[目标地址] : 将目标寄存器的4字节数值写入到目标地址为首地址的空间中
strh{条件码} 目标寄存器,[目标地址] : 将目标寄存器的2字节数值写入到目标地址为首地址的空间中
strb{条件码} 目标寄存器,[目标地址] : 将目标寄存器的1字节数值写入到目标地址为首地址的空间中2. 从内存中读:
ldr{条件码} 目标寄存器,[目标地址] : 从目标地址为首地址的空间中读取4字节数据存放在目标寄存器中
ldrh{条件码} 目标寄存器,[目标地址] : 从目标地址为首地址的空间中读取2字节数据存放在目标寄存器中
ldrb{条件码} 目标寄存器,[目标地址] : 从目标地址为首地址的空间中读取1字节数据存放在目标寄存器中
127.1.2 示例
.text
.global start
_start:mov r0,#0XFFFFFFFEmov r1,#0X40000000 @R1保存内存地址@将r0的值写入到r1对应的地址空间str r0,[r1]@从r1对应的地址空间中读取数据保存在r2中ldr r2,[r1]
wh: b wh
.end
127.1.3 单寄存器内存索引方式
- 前索引方式
str{条件码} 目标寄存器,[目标地址,#立即数]//将目标寄存器的数据保存在目标地址+8为起始地址的内存中 ldr{条件码} 目标寄存器,[目标地址,#立即数]//从目标地址+8为起始地址的内存中读取数据保存在目标寄存器
- 后索引方式
str{条件码} 目标寄存器,[目标地址],#立即数//将目标寄存器的数据保存在目标地址为起始地址的内存中,接着目标地址自加立即数大小 ldr{条件码} 目标寄存器,[目标地址],#立即数//从目标地址为起始地址的内存中读取数据保存在目标寄存器,接着目标地址自加立即数大小
- 自动索引方式
str{条件码} 目标寄存器,[目标地址,#立即数]!//将目标寄存器的数据保存在目标地址+立即数为起始地址的内存中,接着目标地址自加立即数大小 ldr{条件码} 目标寄存器,[目标地址,#立即数]!//从目标地址+立即数大小为起始地址的内存中读取数据保存在目标寄存器,接着目标地址自加立即数大小
127.2 批量寄存器的内存读写方式
- 将多个寄存器的数据存放在内存中以及从内存中取出数据保存在多个寄存器中
127.2.1 指令码以及格式
向内存写:stm 目标地址,{目标寄存器列表}将列表中各个寄存器的数值保存在目标地址对应的地址空间中
从内存读:ldm 目标地址,{目标寄存器列表}从目标地址对应的地址空间中拿数据保存到寄存器列表中各个寄存器中注意:
1. 寄存器列表中每一个寄存器之间用','分隔,如果寄存器列表中寄存器的编号连续,那么可以用-表示一定范围内的寄存器,比如 {r1-r5}
2. 无论寄存器列表中的寄存器表现形式如何,在存取数据时始终是小编号寄存器对应低地址
127.2.2 示例
.text
.global start
_start:mov r0,#0X40000000mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5@向内存中写@stm r0,{r2,r1,r4,r3,r5}stm r0,{r1-r5}@从内存中读取数据ldm r0,{r6-r10}
wh: b wh
.end
127.2.3 批量寄存器的地址增长方式
- 每次向寄存器保存的地址对应的地址空间中写入一个数据,这个寄存器保存的地址会发生相应的增长变化,这就是批量寄存器的地址增长方式
.text .global start _start:mov r0,#0X40000000mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5@向内存中写stm r0!,{r1-r5} wh: b wh .end
- 内存读写命令后加ia后缀
先向 R0 寄存器存放的地址指向的内存空间中保存一个数据,然后 R0 寄存器指向的地址往高地址方向增长 - 内存读写命令后加ib后缀
先 R0 寄存器指向的地址往高地址方向增长,然后向 R0 寄存器存放的地址指向的内存空间中保存一个数据 - 内存读写命令后加da后缀
先向 R0 寄存器存放的地址指向的内存空间中保存一个数据,然后 R0 寄存器指向的地址往低地址方向增长 - 内存读写命令后加db后缀
先 R0 寄存器指向的地址往低地址方向增长,然后向 R0 寄存器存放的地址指向的内存空间中保存一个数据
127.3 栈内存的读写
- 栈指针寄存器:SP/R13 保存栈顶的地址
- 栈:本质上就是一段内存。在内存中选取一段内存作为栈内存,可以用于保存临时数据。
127.3.1 栈内存的读写
增栈 : 每次压栈结束,SP保存的栈顶地址往高地址方向增栈
减栈 : 每次压栈结束,SP保存的栈顶地址往低地址方向增栈空栈 : 压栈结束后,SP保存的栈顶空间中没有有效数据
满栈 : 压栈结束后,SP保存的栈顶空间中有有效数据其本质就是先改变指向还是先存放数据空增栈(EA)/空减栈(ED)/满增栈(FA)/满减栈(FD)
E : empty 空 F : full 满
A : addition 增加 D : delete 减少当前ARM处理器使用的是哪种栈?满减栈
127.3.2 满减栈压栈出栈操作
- push {寄存器列表}@压栈
pop {寄存器列表}@出栈 -
.text .global start _start:@初始化栈ldr SP,=0X40000020mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5@压栈stmdb sp!,{r1-r5}@出栈ldmia sp!,{r6-r10} wh: b wh .end
-
.text .global start _start:@初始化栈ldr SP,=0X40000020mov r1,#1mov r2,#2mov r3,#3mov r4,#4mov r5,#5@压栈stmfd sp!,{r1-r5}@出栈ldmfd sp!,{r6-r10} wh: b wh .end
127.3.3 栈的应用实例—叶子函数调用过程
- 当我们在主函数中调用一个函数,被调用的这个函数中没有别的函数调用,那么 这个函数就叫做叶子函数
如:
.text
.global _start
_start:@初始化栈ldr SP,=0X40000020b main
main:mov r1,#3mov r2,#4bl fun1add r3,r1,r2b main
fun1:@压栈保护现场stmfd sp!,{r1,r2}mov r1,#7mov r2,#9sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr @程序返回
.end
127.3.4 栈的应用实例—非叶子函数调用过程
- 当我们在主函数中调用一个函数,被调用的这个函数中存在别的函数调用,那么 这个函数就叫做非叶子函数
.text
.global _start
_start:@初始化栈ldr SP,=0X40000020b main
main:mov r1,#3mov r2,#4bl fun1add r3,r1,r2b main
fun1:@压栈保护现场stmfd sp!,{r1,r2,lr}mov r1,#7mov r2,#9bl fun2sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2,lr}mov pc,lr @程序返回
fun2:stmfd sp!,{r1,r2}mov r1,#4mov r2,#8mul r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lr @程序返回
.end
一百二十八、程序状态寄存器传输指令
- 指令的作用实现CPSR寄存器数值的读取以及数值的修改
128.1 指令码以及格式
格式:
msr CPSR,第一操作数将第一操作数的数值写入到CPSR寄存器中
mrs 目标寄存器,CPSR读取CPSR数值保存到目标寄存器中
128.2 实例
.text
.global _start
_start:mrs r1,CPSR @读取CPSR数值@切换到USR模式,取消FIQ和IRQ禁止msr CPSR,#0x10
.end 注意:
user模式是ARM处理器工作模式中唯一的非特权模式,
这种模式下无法通过手动修改CPSR数值切换到特权模式,
只有发生对应的异常后才可以切换到异常模式
一百二十九、软中断指令
129.1 软中断概念
- 软中断是从软件层次上模拟的硬件中断,原理和硬件中断一样。
- 软中断触发之后CPU进行异常模式的切换(SVC),紧接着执行软中断对应的异常处理程序。
129.2 软中断指令码以及使用
- swi 中断号
- 注意:中断号是一个由24位二进制数组成的一个整数,用于区分不同的中断
129.3 异常处理过程分析
129.3.1 异常模式和异常源的对应关系
-
5种异常模式对应7种异常源
异常模式 异常源 解释 FIQ FIQ类型异常源 一些硬件发生了FIQ异常事件进入FIQ模型 IRQ IRQ类型异常源 一些硬件发生了IRQ异常事件进入IRQ模型 SVC 复位信号 按键复位/上电复位时产生 swi软中断指令 执行swi指令 undef 未定义异常源 译码器在翻译指令时,遇到无法翻译的指令,指令未定义 abort data abort 取数据发生异常时 prefetch abort 取指令发生异常时
129.3.2 异常的处理过程分析(面试重点)
- 异常的处理过程
当一个异常源产生之后CPU会进行一些工作用于程序的跳转以及异常模式的切换,这个过程分为四大步三小步1. 保存发生异常之前的CPSR的值到对应异常模式下的SPSR寄存器中 2. 修改CPSR的数值2.1 根据实际情况设置FIQ和IRQ中断禁止 CPSR[7:6]2.2 修改处理器工作状态为ARM状态 CPSR[5]2.3 修改处理器的工作模式为对应的异常模式 CPSR[4:0] 3. 保存主程序的返回地址到对应模式下的LR寄存器中 4. PC的值到对应异常模式下的异常向量表中
- 处理完异常之后现场的恢复过程
1. 恢复CPSR寄存器的值为未发生异常之前的状态 2. 修改PC的值为未发生异常之前的下一条指令地址 PC=LR
129.3.3 异常向量表
- 异常向量表是内存空间中的一段内存。
这段内存占据了32字节,被平分为8等份,一份是4字节。
每一份内存对应一种异常源,有一份保留,在异常向量表内存里存放的是当前异常源对应的异常处理程序的跳转指令。
当发生异常之后,CPU会修改PC的值为对应异常源在异常向量中的位置,执行这个位置中的跳转指令,去处理异常处理程序。 - 每一种异常源在异常向量表中的位置是固定,不能随便修改。
- 只要设置了异常向量表的基地址,就可以根据不同异常在一场向量表中的位置找到对应异常的跳转指令。
129.4 软中断异常处理实例
.text
.global _start
_start:@初始化异常向量表b mainb .b do_swib .b .b .b .b .
main:@初始化栈mov sp,#0X40000020@切换到USER模式MSR CPSR,#0X10MOV R1,#1MOV R2,#2@触发软中断SWI 1add r3,r1,r2b main@异常处理
do_swi: @保护现场stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4mul r4,r1,r2@恢复现场ldmfd sp!,{r1,r2,pc}^ @ ^的作用是修改PC的值的同时将SPSR的值赋值给CPSR
.end
一百三十、混合编程
130.1 混合编程的意义
- 所谓的混合编程就是c语言资源和汇编资源的相互调用
- 一般工程会有汇编启动程序,启动程序完成堆栈的相关初始化,完毕之后才跳转到c语言的main函数
- c语言中几乎不可以直接操作寄存器,但是有些特定场景下需要c中操作寄存器,这时候就需要c语言中嵌套汇编的语法
130.2 混合编程概述
-
要想实现C和汇编的混合编程必须遵循ATPCS规范。
-
ATPCS : ARM-Thumb Procedure Call Standard
int add(int i,int j) {return i+j; }
-
将汇编的标签当作C语言的函数使用
-
将C语言的函数当作汇编的标签使用
-
函数参数的传递采用R0-R3进行传递,如果参数的个数大于4个通过压栈的方式进行传递
-
函数的返回值通过R0返回,如果函数的返回值大于4个字节通过r0-r1返回。
-
ATPCS规范中规定ARM采用满减栈。
130.3 汇编调用C语言的函数
- 将C语言的函数当作汇编的标签使用
示例:
- 汇编文件
.text .global _start _start: @ 1. 初始化栈指针,C代码运行必须有栈ldr sp, =0x40000820@ 2. 汇编调用c函数 @ 2.1 给C的函数传递实参值mov r0, #3 @ a = 3mov r1, #4 @ b = 4mov r2, #5 @ c = 5mov r3, #6 @ d = 6@ 2.2 汇编调用c的函数bl add_func@ 2.3 函数的返回通过r0返回,查看r0寄存器中的值 loop: b loop .end
- c文件
// c代码的函数是一个全局的函数 int add_func(int a, int b, int c, int d) {return (a+b+c+d); }
130.4 c语言调用汇编标签
- 将汇编的标签当作c语言的函数
示例:
- 起始汇编文件
.text .globl _start _start: @ 1. 初始化栈指针,C代码运行必须有栈ldr sp, =0x40000820@ 2. 汇编调用c,跳转到main函数b main .end
- c文件
// 使用extern对函数进行声明 extern int add_func(int a, int b, int c, int d);int sum = 0; int main() {// 在c代码中调用汇编代码sum = add_func(1,2,3,4);while(1);return 0; }
- 汇编文件
.text .global add_func @ 将add_func函数声明为全局add_func:add r0, r0, r1add r0, r0, r2add r0, r0, r3mov pc, lr .end
130.5 c语言内联汇编
- 在某一些特定的场景下需要在c语言中直接使用汇编的语法,此时需要内联汇编。内联汇编的实现需要通过asm关键字进行修饰
130.5.1 格式
asm volatile("汇编指令模板\n\t" //"\n\t"表示一条指令的结束.....:输出列表 //指令结果的输出值:输入列表 //指令的数据输入:破坏列表 //破坏列表指定我们当前可用的寄存器
);
130.5.2 实例
- 汇编启动文件
.text .globl _start _start: @ 1. 初始化栈指针,C代码运行必须有栈ldr sp, =0x40000820@ 2. 汇编调用c,跳转到main函数b main .end
- c语言文件
// 内联汇编 int add_func2(int a, int b, int c, int d) {int sum = 0;// 使用汇编实现求和asm volatile( "add r0, r0, r1\n\t" "add r0, r0, r2\n\t" "add r0, r0, r3\n\t" :"=r"(sum) :"r"(a),"r"(b),"r"(c),"r"(d) :"memory" );return sum; }//"=r"(sum)表示输出从寄存器中放到变量sum中// "r"(a) 指定输入从变量a中获取放到通用寄存器//"memory"声明使用内存// 使用extern对函数进行声明 extern int add_func(int a, int b, int c, int d);int sum = 0;int main() {// 调用内联汇编的函数 sum = add_func2(5,6,7,8);// 在c代码中调用汇编代码sum = add_func(1,2,3,4);while(1);return 0; }
- 汇编文件
.text .global add_func @ 将add_func函数声明为全局add_func:add r0, r0, r1add r0, r0, r2add r0, r0, r3mov pc, lr .end
相关文章:

嵌入式养成计划-51----ARM--ARM汇编指令--内存读写指令--程序状态寄存器传输指令--软中断指令--混合编程
一百二十七、内存读写指令 通过内存读写指令可以实现向内存中写入指定数据或者读取指定内存地址的数据 127.1 单寄存器内存读写指令 将一个寄存器中的数值写入到内存,或者从内存中读取数据放在某一个指定寄存器中 127.1.1 指令码和功能 1. 向内存中写ÿ…...

RSA 2048位算法的主要参数N,E,P,Q,DP,DQ,Qinv,D分别是什么意思 哪个是通常所说的公钥与私钥 -安全行业基础篇5
非对称加密算法RSA 在RSA 2048位算法中,常见的参数N、E、P、Q、DP、DQ、Qinv和D代表以下含义: N(Modulus):模数,是两个大素数P和Q的乘积。N的长度决定了RSA算法的安全性。 E(Public Exponent&a…...

开发知识点-stm32/ESP32/Mega2560嵌入式设计
嵌入式设计 STM32四轴飞行器原理图解析小马哥 DragonFly四轴软件开发 13 STM32 SPI总线通讯SPI 总线协议简介SPI 物理层SPI 协议层SPI 通信时序 STM32硬件SPI接口简介SPI接口 利用库函数初始化配置 ESP32 “F:\res\marlin-2.0.x” “F:\res\Marlin-2.1.2” STM32四轴飞行器 小…...

亚马逊云科技海外服务器初体验
目录 前言亚马逊云科技海外服务器概述注册使用流程实例创建性能表现用户体验服务支持初体验总结 前言 随着云原生技术的飞速发展,越来越多的企业和开发者选择云服务器来作为自己的使用工具,云原生技术的发展也促进了云服务厂商的产品发展,所…...
外贸出口游戏设备亚马逊CE认证电磁兼容性(EMC)测试解析
游戏设备上架亚马逊出口欧盟需办理CE认证电磁兼容性(EMC)测试。 CE认证,作为欧盟的一项标准,成为了游戏设备行业中最为重要的认证之一。CE认证不仅是游戏设备进入欧洲市场的必要条件,也是保证产品符合欧洲市场标准的重…...
设计模式——组合模式(Composite Pattern)+ Spring相关源码
文章目录 一、组合模式定义二、例子2.1 菜鸟教程例子2.1.1 创建 Employee 类,该类带有 Employee 对象的列表。2.1.2 使用 Employee 类来创建和打印员工的层次结构。 2.2 JDK源码——java.awt.Container2.3 Spring源码——CompositeCacheManager 三、其他设计模式 一…...
大语言模型-LLM简介
大语言模型如此火爆,查了些资料整理一下,做个初步的了解。 语言模型的发展从开始的统计方法到使用神经网络,再到现在通过使用Transformer架构的模型训练大量数据,理解文本规则和模式,同时随着训练数据和模型的扩大&…...

创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()
【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建多层级行索引, 创建多层级行索引的DataFrame MultiIndex.from_product() [太阳]选择题 使用pd.MultiIndex.from_product(),下列输出正确的是: import pandas as pd…...
用尽可能简单易懂的代码做个时间轴(时间线)
用尽可能简单的代码,做个时间线或者时间轴展示功能,效果如图: 特点:纯DIVCSS构建,需要展示到什么进度,直接加active属性就行了。 还贴心给配了个setProgress(step)函数,功能太简单,…...

STM32笔记—定时器
目录 一、TIM简介 二、基本定时器(TIM6和TIM7) 1. TIM6和TIM7简介 2. TIM6和TIM7的主要特性 3. TIM6和TIM7的功能 3.1 时基单元 3.2 计数模式 3.3 时钟源 三、通用定时器 1. TIMx(2、3、4、5)简介 2. TIMx主要功能 3. 时钟选择 4. 影子寄存…...

【力扣:1504】统计全1子矩阵
统计全1子矩阵个数 思路1:首先考虑深度优先模拟,从【0,0】出发向下、右扩展,符合条件res,最后输出res,比较直观,但重复进行了大量节点遍历操作,时间复杂度较高,数据量大时…...

排序算法之-选择
算法原理 在未排序的数列中找出最大(或最小)的元素,然后将其存入到已排序的数列起始位置,紧接着在剩余的未排序数列中继续查找最大(或最小)的元素,并将其放入到已排序的数列末尾,依…...

机器学习模板代码(期末考试复习)自用存档
机器学习复习代码 利用sklearn实现knn import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCVdef model_selection(x_train, y_train):## 第一个是网格搜索## p是选择查找方式:1是欧…...

使用sizeof()和strlen()去计算【数组】和【指针】的大小
文章目录 一、知识回顾1、回顾sizeof()、strlen的作用:2、数组和指针3、数组名 二、sizeof()、strlen()的使用区别1、注意区别:2、一维数组与一级指针3、二维数组与二级指针 三、总结回顾 一、知识回顾 1、回顾sizeof()、strlen的作用: siz…...

viple进阶4:打印空心三角形
题目:根据用户输入的行数n打印空心三角形,下图分别为n3、n4、n5和n10的效果图 第一步:观察效果图 输入的行数为3,打印结果就有3行;输入的行数为4,则打印结果就有4行;以此类推,输入的…...
Oauth2.0的内容
OAuth 2.0是一个授权协议,用于允许第三方应用程序访问用户在另一个应用程序上存储的受保护资源,而不需要将用户名或密码公开给第三方应用程序。 OAuth2.0基于客户端-服务器模型,通常需要三个主体:客户端、资源所有者和授权服务器…...

npm 下载包失败解决方案
1.【问题描述】使用 npm 下载vue项目依赖包时失败,版本不一致。 【解决方法】使用 npm install --force npm install --force 是一个命令行指令,用于在 Node.js 环境中使用 npm(Node Package Manager)安装包或模块。–force 参数表…...

C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍
文章目录 插入排序希尔排序冒泡排序选择排序快速排序 本文主要介绍用C语言实现的一些排序方法,有插入排序、希尔排序、冒泡排序、选择排序和快速排序,文章中给出的例子都是按照升序排列的。 插入排序 若数组只有一个元素,自然不用排序&#…...
撸视频号收益这个副业靠谱吗?
我是卢松松,点点上面的头像,欢迎关注我哦! 昨天有个人问我说做视频号能月入过万吗? 我的回复是:99%的人不能。 但为什么会经常有人这么问呢,松松思考了一下,原因是最近很多人在晒视频号撸收益的项目&am…...
2、数组、Map+HashMap、Set+Hashset、Char和Character类、String类和Char类、Math类
数组 \\一个普通的长度为1的整数数组 Integer[] arr new Integer[1];\\一个普通长度为1的同时元素初始化为1的整数数组。 Integer[] arr new Integer[]{1};\\一个长度为0的空数组 Integer[] arr new Integer[0];Map 常见方法 void clear( ) 从此映射中移除所有映射关系&#…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...