ARM 算数指令
加法 ADD
减法 SUB
取负 NEG
比较 CMP
乘法 MUL
移位 LSL、LSR、ASL、ASR、ROL、ROR
加法和减法
绝大多数微处理器都实现了带进位的加法指令,能够将两个操作数和条件码寄存器中的进位位加到一起。这条指令会使字长大于计算机固有字长的链接运算更加方便。
说明了如何使用带进位的加法指令实现链式运算。如:指令ADD r2,r1,r0将源寄存器r0和r1的内容相加,将结果保存到r2中,该操作产生的进位被保存到进位位中。
假设使用32位体系结构的ARM处理器,要处理64位整数并要完成64位加法。上图(b)说明了64位算术运算中如何使用32位寄存器来传播进位。两个64位数已经保存到寄存器r1、r0和r3、r2中。
指令ADDS r4,r0,r2,完成r0+r2并将结果保存到r4中,进位输出保存到CCR中进位位中。
指令ADC r5,r1,r3将高位的两个数字相加时,进位位也被加到r1与r3的和中。助记符ADC表示带进位的加法。
ARM还提供了SBC或带借位的减法指令来支持扩展精度的减法运算。
逆减法指令RSB:减法指令SUB r1,r2,r3被定义为[r1]<-[r2] – [r3],逆减法指令RSB r1,r2,r3被定义为[r1]<-[r3]-[r2]
取负
取负就是用零减去一个数字。如r0的负数就是0 - [r0]。ARM没有这样的取负指令。可以使用逆减法来实现,因为RSB r1,r1,#0等价于NEG r1
比较
通过执行指令CMP Q,P比较P和Q时,将发生显示比较,这条指令会计算Q-P但
不会保存结果。比较操作会修改CCR的内容,后面的指令会测试CCR的值以决定
按顺序继续执行还是进行跳转。
考虑下面的例子:
CMP r1,r2 ; r1=r2?
BEQ DoThis ; 如果相等则跳转到DoThis
ADD r1,r1,#1 ; 否则r1 = r1 + 1
B Next ; 不要忘记跳过THEN部分代码
.
DoThis SUB r1,r1,#1 ; r1 = r1 -1
Next … ; 两个分叉汇聚于此
乘法
乘法运算将两个m位的操作数相乘,得到一个2m位 的积。结果的位长加倍带
来一个问题。计算机要么自动将结果截断,32位乘以32位得到一个32位结果。
要么设计一个四操作数指令:两个源操作数,两个目的操作数(分别保存结果
的高半部分和低半部分)。而且,二进制补码加减法运算能得到正确结果,但
乘除法却不一定,即对有符号和无符号数不能使用同样的乘法操作。
有些微处理器提供了有符号和无符号乘法操作,以及结果为32位的16位乘法、
结果为64位的32位乘法。
ARM乘法指令MUL Rd,Rm,Rs计算保存在32位寄存器Rm和Rs中的两个32位有符号数的积,将结果保存在32位寄存器Rd中,仅存放64位积的低32位。当然,应保证结果不超出范围。如,计算121乘96:
MOV r0,#121 ; 将121加载到r0中
MOV r1,#96 ; 将96加载到r1中
MUL r2,r0,r1 ; r2 = r0 x r1
目的寄存器Rd和源寄存器Rm不用使用相同的寄存器,因为ARM在乘法计算过程中将Rd当作临时寄存器使用,这是Arm的一个特点。
除了32位乘法指令MUL外,ARM还包括:
UMULL 无符号长整型乘法(Rm x Rd乘积为64位,存放在两个寄存器中)
UMLAL 无符号长整型乘累加
SMULL 有符号长整型乘法
SMLAL 有符号长整型乘累加
MLA
ARM乘累加指令MLA,先进行乘法,再将乘积与另一个数相加。
MLA指令采用四操作数形式:MLA Rd,Rm,Rs,Rn。RTL定义为[Rd]<-[Rm]x[Rs]+[Rn],32位数与32位数的乘积被截断为低32位结果。
内积运算
ARM乘累加操作使用一条指令完成乘法和加法运算,支持内积计算。
假设向量a有n个元素a1,a2,…,an,向量b有n个元素b1,b2,…,bn,则a与b的内积就是标量s=a x b = a1 x b1 + a2 x b2 +…+ an x bn
下面代码段展示MAL指令计算两个n元素向量Vector1和Vector2的内积:
n EQU 4
MOV r4,#n ; r4为循环计数器
MOV r3,#0 ; 将内积清零
ADR r5,Vector1 ; r5指向Vector1
ADR r6,Vector2 ; r6指向Vector2
Loop LDR r0,[r5],#4 ; REPEAT 读向量Vector1的一个元素并更新指针LDR r1,[r6],#4 ; 读取向量Vector2的相应元素MLA r3,r0,r1,r3 ; 乘累加操作r3= r3 + r0 x r1SUBS r4,r4,#1 ; 循环计数器递减(更新CCR)BNE Loop ; UNTIL所有计算完毕
位操作
逻辑操作也叫位操作,这些操作被应用到寄存器的每一位。微处理器一般只支持AND(与)、OR(或)、NOT(非)和EOR或(异或)操作。
下面说明了对r1=110010102和 r0=000011112进行的逻辑操作:
逻辑运算的典型应用就是数据合并,即把多个变量合并到一个寄存器或存储单元中。
假设寄存器r0包含8位数bbbbbbxx,寄存器r1包含8位数bbbyyybb,寄存器r2包、
含8位数zzzbbbbb,x、y、z代表需要的位,b是不需要的位。希望把这些位合并
得到最后结果zzzyyyxx。通过以下代码可以到达目的:
AND r0,r0,#2_00000011 ; 保留2位xx,其他屏蔽
AND r1,r1,#2_00011100 ; 保留3位yyy,其他屏蔽
AND r2,r2,#2_11100000 ; 保留3位zzz,其他屏蔽
OR r0,r0,r1 ; 合并r1和r0得到000yyyxx
OR r0,r0,r2 ; 合并r2和r0得到zzzyyyxx
假设有一个8位二进制串abcdefgh,需要b、d两位清零,a、e、f三位置1,h位
取反。可以通过AND、OR和EOR操作完成:
AND r0,r0,#2_10101111 ; 清除b和d位,得到a0c0efgh
OR r0,r0,#2_10001100 ; a、e、f位置1,得到10c011gh
EOR r0,r0,#2_00000001 ; b位取反,得到10c011gh(h取反)
位清楚指令BIC
ARM提供了位清除指令BIC,将第一个操作数与第二个操作数的反码进行与操作。如,IBC r0,r1,r2实现了:
如果BIC第二个操作数中某位为0,则将第一个操作数中对应的位复制到目的操作数中,如果第二个操作数中某位为1,则把目的操作数中对应的位清零。
如果r1=10101010且r2=00001111,则BIC r0,r1,r2的结果为:
可用BIC指令对寄存器的最低位字节清零。指令BIC r0,r1,#0xFF把寄存器r1中的32位复制到寄存器r0中,然后把r0中的第0~7位清零。
移位操作
移位操作就是把字中的位向左或向右移动一个或多个位置。当移位一个位串时,串的一端的位会被丢弃,并在另外一端补充新的位,如:
这里的移位是逻辑移位
所有微处理器都支持逻辑移位操作。有些支持向左或向右移动一位,其他的支持多位移位。如
果移位的位数在指令中被编码为常量,这种移位叫作静态移位,在运行时不能改变移位位数,
如果移位的位数由寄存器的值指定,则叫作动态移位,可以在程序运行时修改移位的位数。
移位的典型应用是从一个字中提取特定的位。假设有一个8位的串bxxxxbbb,x表示要提取的位,
b表示无需关心的位。下面代码提取所需要的位且将其右对齐:
LSR r0,r0,#3 ; r0右移3位,得到000bxxxx
AND r0,r0,#2_00001111 ; 屏蔽不需要的位,得到0000xxxx
ARM没有独立的移位指令,移位是作为其他指令的一部分来实现的。ARM允许对寄存器-寄存
器型指令的第二个操作数进行移位。如,指令ADD r0,r1,r2,LSL #4,先寄存器r2逻辑左移4位,
然后将移位结果与寄存器r1相加。
算术移位
算术移位将操作数视作一个有符号二进制补码。可以用来完成除以2(右移一
位)或乘以2(左移一位)等运算。算术移位的目的是在进行移
位运算时保留二进制补码数的符号,移位运算代表乘以或除以2的幂。
算术左移与逻辑左移是等价的。算术右移会保留符号位,每次右移后符号位会
自动复制。
例如,如果将8位数11001110算术左移一位,得到10011100(最低位补0),而
算术右移一位得到11100111(符号位被复制)。一个整数算术左移m位相当于
乘以2m,而算术右移m位相当于除以2m。
循环移位
循环移位操作把寄存器的内容看作一个LSB(最低位)和MSB(最高位)相邻的环。如上图
(c),进行移位操作时,从一端移出的位会从另一端进来。与逻辑移位和算术移位相比,循
环移位不会丢失位。
例如,如果将8位数11001110循环左移一位,得到10011101,移出的位也被复制到进位寄存器。
有些处理器实现了另一种循环操作,叫作扩展循环移位或带进位的循环移位。这种操作与循环
移位一样,只不过循环时包含了进位位。
如下图,移出的位被复制到进位位,原来的进位位变成了被移出的位:
ARM移位操作的实现
ARM没有独立的移位操作。实际上,移位操作与其他数据处理操作组合到一起,可以在使用第
二个操作数之前将其移位。
下图描述了ARM的移位机制,在第二个源操作数的数据通路上增加了一个桶形移位器:
考虑第二个源操作数被移位的ADD操作的例子:
将r2与r1相加之前,先将r2的内容逻辑左移一位,因此该操作等价于
如果仅希望对寄存器进行移位操作,而不需要进行其他数据处理,可以使用下面指令:
MOV r3,r3, LSL #1
由于可以完成动态移位,也可使用指令MOV r4,r3,LSL r1,以r1为移位位数对r3
进行移位,结果送入r4。
假设r0中的数为0.00000010101111….,希望规格化为0.101…,如果用寄存器r1
表示指数,则执行MOV r0,r0,LSL r1可以在一个周期内完成规格化操作。
除了仅允许移动一位RRX指令外,ARM支持静态和动态移位。静态移位在编程
时就已经确定了移位的位数,而动态移位允许在执行代码时改变移位位数。如,
指令MOV r3,r3,LSL r2以r2的值为移位位数对r3进行逻辑左移。r2的值被看作模
32的数,因为移位不能超过32次。
ARM仅实现了以下5种移位操作
LSL 逻辑左移
LSR 逻辑右移
ASR 算术右移
ROR 循环右移
RRX 带进位的循环右移(移位一次)
尽管没有循环左移操作,可以借助循环右移实现。
下面说了4位二进制数的循环左移和循环右移。经过4次循环移位,操作数没有
变化。循环左移和循环右移是对称的。对于32位数,循环左移n位等价于循环
右移32-n位。
循环右移 循环左移
1101 开始 1101 开始
1110 循环右移1次 1011 循环左移1次
0111 循环右移2次 0111 循环左移2次
1011 循环右移3次 1110 循环左移3次
1101 循环右移4次 1101 循环左移4次
ARM没有实现带进位的循环左移操作,通过指令ADCS r0,r0,r0可以实现带进位
的循环左移,因为它把r0与r0以及进位位一起相加,并将结果保存在r0中(即
结果为2 x [r0] + C),左移等价于乘以2,把进位位移动到最低位等价于加上进
位位,得到2 x [r0] + C,指令后添加S会强制更新CCR,确保进位输出被加载到C
位。因此ADCS r0,r0,r0与RXL r0等价。
指令编码——洞察ARM体系结构
简单的看一下ARM的移位操作是如何编码的,下图给出了ARM数据处理指令的二进制编码,遵循RISC体系结构 的一般模式:包括一个操作数、两个寄存器操作数以及第三个多目的操作数。寄存器操作数r源和r目的定义了第一个源操作数和目的寄存器。0~11位是第二个源操作数的编码:
相关文章:
ARM 算数指令
加法 ADD 减法 SUB 取负 NEG 比较 CMP 乘法 MUL 移位 LSL、LSR、ASL、ASR、ROL、ROR加法和减法 绝大多数微处理器都实现了带进位的加法指令,能够将两个操作数和条件码寄存器中的进位位加到一起。这条指令会使字长大于计算机固有字长的链接运算更加方便。 说明了如何…...
普通IT的股票交易成长史--20250502 突破(2)
声明:本文章的内容只是自己学习的总结,不构成投资建议。文中观点基本来自yt站方方土priceaction,综合自己的观点得出。感谢他们的无私分享。 送给自己的话: 仓位就是生命,绝对不能满仓!!&#…...
什么是 Redis?
什么是 Redis? Redis(全称是 Remote Dictionary Server,远程字典服务器)是一个非常快的开源内存数据库,它主要用来存储“键-值”对类型的数据。与传统的数据库不太一样,Redis的数据主要存放在内存中,所以它读写速度特别快。 通俗比喻: 想象你有一个小仓库,里面放了…...
IEEE LaTeX会议模板作者对齐、部门长名称换行
第二行作者对齐 参考链接: https://tex.stackexchange.com/questions/458204/ieeetran-document-class-how-to-align-five-authors-properly/458208#458208https://tex.stackexchange.com/questions/582487/how-to-align-four-author-names-in-the-ieee-conferenc…...
前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件
目录 一、依赖注入 1、 依赖注入是什么? 2、最基础的使用 3、为什么使用依赖注入? 4、 使用 Symbol 作注入名 二、异步组件 1、什么是异步组件? 2、最基础用法:defineAsyncComponent 3、在模板中使用异步组件 4、配置加载状态…...
Manus联合创始人:公司产品基于Claude和阿里千问大模型开发
3月11日消息,日前,Manus官方在社交平台转发了公司联合创始人、首席科学家季逸超对Manus的技术解读,季逸超在评论区回复网友关于“Manus使用了哪一个基础大模型”这一问题时回复称,“我们用过Claude,也用过不同版本的Qw…...
华为云Flexus+DeepSeek征文|快速搭建Dify LLM应用开发平台教程
目录 部署Dify-LLM应用开发平台开始使用一键卸载注意事项 部署Dify-LLM应用开发平台 1、首先需要访问快速搭建Dify-LLM应用开发平台-华为云 2、使用"一键部署"功能快速搭建Dify平台快速搭建Dify LLM应用开发平台-云社区-华为云,本文在这里选择一键部署&…...
简介QML中的Canvas
2025年5月3日,周六晚上 QML中的Canvas是一个强大的绘图组件,允许开发者通过JavaScript在界面上进行动态的2D图形绘制。它类似于HTML5的<canvas>元素,适用于实现自定义图形、动画、游戏开发以及图表绘制等场景。 核心特性 绘图能力 • …...
装饰器@wraps(func)详解
1. wraps(func) 的核心作用 wraps 是 Python 标准库 functools 提供的装饰器,用于保留被装饰函数的原始元信息。 它通过将原函数的 __name__、__doc__、__module__ 等属性复制到装饰器内部的包装函数中,避免装饰器对函数身份信息的“掩盖”。 2. 元信息…...
vue的diff算法是什么、比较方式,原理分析、示例解释讲解
Vue Diff算法概述 Vue 的 Diff 算法是一种高效的虚拟 DOM 更新机制,用于最小化真实 DOM 的操作开销。它通过比较新旧 Virtual DOM 树中的差异,仅更新那些实际发生改变的部分,从而提升性能。 定义 Diff 算法的核心目标是在 MVVM 开发模式下…...
Day04 新增套餐
###今天的任务主要是自主完成套餐管理的模块### 1.新增套餐 在前端页面接口中我们可以看到在新增套餐的时候需要选择添加到菜单中的菜品 因此我们需要设计一个接口可以通过根据分类id(category_id)来查询该分类下的菜品 1.1根据分类id查询分类下的菜…...
WEB前端小练习——记事本
一、登陆页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本登录注册</title><link…...
在多线程环境下如何设计共享数据结构保证原子操作与数据一致性
在多线程环境下如何设计共享数据结构保证原子操作与数据一致性 1. 引言 在现代软件开发中,多线程编程是提升程序性能和响应速度的重要手段。然而,多线程环境下的 共享数据管理 极具挑战性,若处理不当,可能引发 竞争条件(Race Conditions)、数据不一致(Data Inconsiste…...
洛谷 P1850 [NOIP 2016 提高组] 换教室
题目传送门 前言 终于自己想出概率期望 d p dp dp 的状态了,但是依旧没能相对转移方程。(招笑) 暴力 这题部分分和特殊情况分给的挺多的,所以先拿部分分。 一、思路 先跑一边 F l o y d Floyd Floyd 最短路求出两点间最短距…...
1penl配置
好的,根据您提供的 1pctl 命令输出信息,我们来重新依次回答您的所有问题: 第一:1Panel 怎么设置 IP 地址? 根据您提供的 user-info 输出: 面板地址: http://$LOCAL_IP:34523/93d8d2d705 这里的 $LOCAL_I…...
Windows下调试WebRTC源码
一、引言 《Windows下编译WebRTC源码》讲述了Windows下编译WebRTC源码的方法。本文在其基础之上,讲述使用Visual Studio调试WebRTC源码的方法。 二、生成Visual Studio工程文件 按照 《Windows下编译WebRTC源码》编译出webrtc.lib 后,执行下面的命令生…...
基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目标与内容 二、大模型技术原理与应用概述 2.1 大模型的基本原理 2.2 大模型在医疗领域的应用进展 2.3 适用于肾结石预测的大模型选择与依据 三、术前风险预测与准备 3.1 患者身体状况评估 3.2 结石情…...
《ATPL地面培训教材13:飞行原理》——第5章:升力
翻译:刘远贺;工具:Cursor & Claude 3.7;过程稿 第5章:升力 目录 空气动力系数基本升力方程回顾升力曲线升力曲线的解释速度-动压关系密度高度翼型剖面升力特性阻力特性简介升阻比飞机重量对最小飞行速度的影响表…...
STM32部分:2、环境搭建
飞书文档https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于编写代码,编译代码芯片支持包,用于支持某类芯片编程支持STM32CubeMX用于自动生成工程,减少手动重复工作 STM32F1系列芯片支持包 软件下载 直接下载&am…...
STL之list容器
list的介绍 1.list的底层是双向链表结构,双向链表中的每个元素在互不相关的独立结点中,在结点中通过指针指向前一个元素和后一个元素 2.list是可以在常数范围内在任意位置的插入和删除的序列式容器,并且该容器可以前后双向迭代 3.vector的…...
DNS 域名解析
DNS(Domain Name System) 是一个将域名转换为IP地址的系统。它的主要功能是使用户能够通过易于记忆的域名访问互联网资源,而不是记住复杂的IP地址。DNS类似于“互联网的电话簿”,帮助计算机找到彼此的位置。 一、DNS的基本概念 …...
我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具
Linux 系统的设计中,继承了 Unix “一切皆文件” (Everything is a file) 的思想,系统中的众多对象,都可以表示为文件,可以对它们执行文件操作,如 read()、write()、mmap()、ioctl()、close() 和 poll() 等。Linux 系统…...
QML图像提供器 (Image Provider)
QML 中的图像提供器是一种自定义图像加载机制,允许你从非文件源(如数据库、网络或程序生成的内容)提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …...
【Java学习】通配符?
面向对象系列八:泛型(二) 一、通配符? 二、泛型符<> 1.泛型类里 2.泛型类外 2.1使用过程中 2.2使用最后末 三、限制 1.泛型类里的限制 2.延申处的限制 2.1extend限制上界 2.1.1返回值接 2.1.2形参传 2.2super限制下界 2.2.1形参传 2.2.2返回值…...
安卓基础(悬浮窗和摄像)
ACTION_MANAGE_OVERLAY_PERMISSION 的作用就是 打开系统设置的「悬浮窗权限管理页面」 Intent intent new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" getPackageName()) ); startActivity(intent); 直接跳转目标应用的权限…...
一种实波束前视扫描雷达目标二维定位方法——论文阅读
一种实波束前视扫描雷达目标二维定位方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 运动平台几何建模与回波信号构建2.1.1 距离历史建模2.1.2 回波信号模型2.2 距离向运动补偿技术2.2.1 匹配滤波与距离压缩2.3 加权最小二乘目标函数2.3.1 方位向信号…...
基于springboot的金院银行厅预约系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息技术在管理上越来越深入而广泛的应用,信息管理系统的实施在技术上已逐步成熟。信息管理系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的…...
AVFormatContext 再分析零
随着对于AVFormatContext 各个参数的学习,逐渐可以从 整体架构上 再认识一下 AVFormatContext 了。 还是从解封装的第一步开始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 实际上…...
【学习心得】魔塔(ModelScope)和抱抱脸(Hugging Face)下载模型小细节
介绍常用的两种在模型社区如魔塔(ModelScope)和抱抱脸(Hugging Face),下载预训练模型的方法,然后说明各种方法里面的小细节。 一、SDK下载 对于希望直接通过编程方式集成模型下载功能到自己的项目中的开发…...
嵌入式硬件篇---STM32 系列单片机型号命名规则
文章目录 前言一、STM32 型号命名规则二、具体型号解析1. STM32F103C8T6F103:C:8:T6:典型应用2. STM32F103RCT6F103:R:C:T6:典型应用三、命名规则扩展1. 引脚数与封装代码2. Flash 容量代码3. 温度范围代码四、快速识别技巧性能定位:F1/F4后缀差异硬件设计参考:引脚数…...
关于算法设计与分析——拆分表交换问题
题目: 用蛮力法设计一个算法,将A{a1, a2, ..., an}拆成B和C两个表,使A中值大于等于0的元素存入表B,值小于0的元素存入表C,要求表B和C不另外设置存储空间而利用表A的空间。 1)问题分析 题目要求设计一个算…...
在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)
今天写个小代码,用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图: 安装后使用…...
c++回调函数
函数指针 //函数 bool lengthCompare(const string&, const string&); //pf为指针,指向一个函数,函数的类型为:bool (const string&, const string&) bool (*pf)(const string&, const string&); //函数࿰…...
mysql主从复制搭建,并基于Keepalived + VIP实现高可用
以下是基于 Keepalived VIP 实现 MySQL 主从复制高可用的详细步骤,涵盖主从复制搭建与故障自动切换: 一、MySQL 主从复制搭建(基础步骤回顾) 1. 主库(Master)配置 修改配置文件 /etc/my.cnf&…...
时间交织(TIADC)的失配误差校正处理(以4片1GSPS采样率的12bitADC交织为例讲解)
待写…有空再写,有需要的留言。 存在失配误差的4GSPS交织 校正完成后的4GSPS交织...
K8S自动弹性伸缩机制详解
Kubernetes (K8S) 自动弹性伸缩机制详解 Kubernetes 通过多种控制器和指标系统实现 自动弹性伸缩,主要包括 Pod水平伸缩(HPA)、垂直伸缩(VPA)、集群节点伸缩(CA) 三种方式。以下是核心机制和实…...
C++模版结构体的使用
1. convert_pointer 结构体模板 template<typename _SourceIterator, typename _DestT> struct convert_pointer {typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type; };作用 这是一个递归模板,用于处理 _Sou…...
WebRTC 服务器之Janus架构分析
1. Webrtc三种类型通信架构 1.1 1 对 1 通信 1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联,这样即可以节省服务器的资源,⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信,如果⽆法直接…...
音视频开发成长之路与音视频知识总结
音视频开发曾经是一个富有挑战性和技术深度的领域。我来分享整理音视频开发的成长路径和知识体系: 音视频开发成长路线图 1. 基础阶段(1-3个月) 计算机基础:C/C、数据结构、操作系统音视频基础概念:采样率、比特率、…...
batch normalization和layer normalization区别
Normalization无非就是这样一个操作: 其中x是输入数据,维度为(B,T,C),其中B是batchsize,T是序列长度,C是embedding维度;括号内是标准化操作,γ和…...
Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)
Android Compose 层叠布局(ZStack、Surface)源码深度剖析 一、引言 在 Android 应用开发领域,用户界面(UI)的设计与实现一直是至关重要的环节。随着技术的不断演进,Android Compose 作为一种全新的声明式…...
数据仓库方法论书籍及其阅读建议
A、关于数据仓库方法论的各书籍详细分析及汇总 1. 《Building the Data Warehouse (Third Edition)》 by W.H. Inmon 核心观点 企业级数据仓库(EDW):自上而下的架构,采用第三范式(3NF)模型&…...
数据库 1.0
数据库就是放数据的地方 程序里面的数据就是暂时性的 要是想把数据永久性的储存 MySQL是典型的C / S架构 Client 云端 Sever 服务端 数据库服务的开启和关闭 可以在这里选择关闭开启,关闭之后就无法通过终端再连接mysql了 通过命令行的方式开启和关闭mysql&…...
给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放
实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6...
计算机系统结构 第二章 :缓存优化
零-1:复习cache的基础知识: 一、映像方式 直接映射 原理:主存被分成若干区,每个区大小与 Cache 相同,区内再分块,主存每个区中块的大小和 Cache 中块大小相等,且每个区包含的块数也与 Cache 中块数相等。主存中任意…...
软件工程实践
例一 用例文档 UC1注册 执行者 潜在会员 前置条件 潜在会员访问系统 后置条件 系统已记录注册信息 涉众利益 潜在会员——希望注册尽量简单,希望自己的信息不会泄露 商店——希望获得尽可能多的未来客户信息,特别是联系方法 基本路径 1.潜在会员请求注册…...
将Airtable导入NocoDB
将Airtable导入NocoDB 0. 前提条件1. 详细步骤 NocoDB提供了一种简化流程,可在几分钟内将您的Airtable数据库无缝转移到各种数据库管理系统,包括MySQL、Postgres和SQLite。此功能特别适合希望将Airtable数据库迁移到更强大且可扩展的数据库管理系统中的用…...
【云备份】服务端数据管理模块设计与实现
目录 一、要管理的数据 二、如何管理数据 三.数据管理类的设计 3.1.数据信息结构体的设计 3.2.数据管理类的设计 四.数据管理类实现 4.1.数据信息结构体的数据填充 4.2.数据管理类的实现 五. 源代码测试 数据管理模块:需要管理的数据有哪些,而…...
Qt开发:按钮类的介绍和使用
文章目录 一、命令按钮类 (QPushButton)1.1 基本功能介绍1.2 常用构造函数1.3 常用方法1.4 信号与槽使用示例1.5 开关按钮(Checkable)1.6 创建出菜单按钮(Menu Button) 二、工具按钮类 (QToolBu…...
Clickhouse基于breakpad生成minidump文件,方便问题定位
背景 breakpad能够在程序崩溃的时候自动生成一个mini的core文件,能够帮助进行问题定位,但是clickhouse对于集成breappad的难度较大 查看github发现之前有大佬基于以前的分支有个MR,但是一直没有合并到社区,想来是有什么其他的原因…...