- 博客(211)
- 资源 (10)
- 收藏
- 关注
原创 Rust 程序设计语言学习——枚举&模式匹配
假设我们要跨省出行,有多种交通工具供选择。常用的交通工具有飞机、火车、汽车和轮船。这是我们常用的跨省出行乘坐交通工具的所有形式:所以可以枚举出所有可能的值,这也正是此枚举名字的由来。可以通过在代码中定义一个 Vehicle 枚举来表现这个概念并列出可能的交通工具类型,Airplane(飞机)、Train(火车)、Car(汽车) 和 Ship(轮船)。这被称为枚举的成员Airplane,Train,Car,Ship,如果现在我们要区分汽车到底是哪一种?
2024-04-05 20:10:31 1276 1
原创 Rust 程序设计语言学习——结构体
定义结构体,需要使用struct关键字并为整个结构体提供一个名字。结构体的名字需要描述它所组合的数据的意义。接着,在大括号中,定义每一部分数据的名字和类型,我们称为 字段(field)。
2024-03-24 07:41:29 1015
原创 Rust 程序设计语言学习——基础语法
println!( “Hello World”) 中的 println 后面还有一个!符号,println 不是一个函数,而是一个宏规则。println!()和print!()。这两个"函数"都是向命令行输出字符串的方法,区别仅在于前者会在输出的最后附加输出一个换行符。当用这两个"函数"输出信息的时候,第一个参数是格式字符串,后面是一串可变参数,对应着格式字符串中的"占位符",这一点与 C 语言中的printf函数很相似。但是,Rust 中格式字符串中的占位符不是 “% + 字母” 的形式,而是一对{}
2024-01-21 11:09:12 1419 1
原创 【ARMv8 SIMD和浮点指令编程】浮点数据转换指令——数据类型互转必备
浮点数据转换指令包括不同的浮点精度数之间的转换,还包括整型和浮点数之间的转化。在了解数据转换指令前,必须学习 IEEE 754 定义的五种舍入规则。
2023-12-09 07:33:58 1189
原创 【ARMv8 SIMD和浮点指令编程】浮点加减乘除指令——四则运算
浮点指令有专门的加减乘除四则运算指令,比如 FADD、FSUB、FMUL、FDIV 等。
2023-11-05 13:56:32 744
原创 【ARMv8 SIMD和浮点指令编程】NEON 通用数据处理指令——复制、反转、提取、转置...
NEON 通用数据处理指令包括以下指令(不限于):• DUP将标量复制到向量的所有向量线。• EXT提取。反转向量中的元素。• TBL、TBX向量表查找。• TRN向量转置。• UZP、ZIP向量交叉存取和反向交叉存取。
2023-10-29 07:30:01 1091
原创 【ARMv8 SIMD和浮点指令编程】NEON 存储指令——如何将数据从寄存器存储到内存?
和加载指令一样,NEON 有一系列的存储指令。比如 ST1、ST2、ST3、ST4。
2023-10-28 14:54:47 1407
原创 【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(其它指令)?
除了基础的 LDx 指令,还有 LDP、LDR 这些指令,我们也需要关注。
2023-09-30 07:10:46 677
原创 【ARMv8 SIMD和浮点指令编程】NEON 加载指令——如何将数据从内存搬到寄存器(LDx&LDxR)?
将内存中的数据搬到 NEON 寄存器,有很多指令可以完成,熟悉这些指令是必须的。
2023-09-30 07:00:50 875
原创 【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——asimdrdm
ARMv8 有许多版本(ARMv8.1 等),它们定义了强制和可选功能。Linux 内核通过 hwcaps 公开了其中一些功能的存在。这些值显示在 /proc/cpuinfo 中。
2023-09-03 07:24:33 993
原创 【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——乘法知多少?
NEON 乘法指令包括向量乘法、向量乘加和向量乘减,还有和饱和相关的指令。总之,乘法指令是必修课,在我们的实际开发中会经常遇到。
2023-08-27 17:05:18 1038
原创 【ARMv8 SIMD和浮点指令编程】NEON 移位指令——左右移位之术
NEON 移位指令主要涉及逻辑移位、算术移位两大类,同时下面还介绍了两个移位插入指令。
2023-07-22 08:14:13 406
原创 【ARMv8 SIMD和浮点指令编程】NEON 比较指令——比较的方方面面
比较指令是常见的一类指令,NEON 中当然也排除,下面涉及比较和测试位两类指令。
2023-06-22 07:20:22 726
原创 【ARMv8 SIMD和浮点指令编程】NEON 移动指令——精通 MOV?
移动指令主要涉及 MOV 和 MVN,它们分别是移动和求反移动。如果你认为仅仅两条指令,还是太小看设计者了!
2023-06-18 07:22:32 797
原创 【ARMv8 SIMD和浮点指令编程】NEON 逻辑指令——与或非有多少?
NEON 逻辑指令主要包括与、或、异或、位清除、或非、为 False 时按位插入、为 True 时按位插入和按位选择指令。
2023-06-10 07:43:37 892
原创 【ARMv8 SIMD和浮点指令编程】NEON 通用算术指令——杂项也不少
无符号向量差值绝对值累加和差值绝对值。向量绝对值和求反。无符号向量最大值,无符号向量最小值,无符号向量按对最大值,无符号向量按对最小值,无符号跨向量最大值和跨向量最小值。向量前导符号位计数,前导零计数和设置位计数。
2023-06-10 07:28:02 626
原创 【ARMv8 SIMD和浮点指令编程】NEON 减法指令——减法也好几种
向量减法包括常见的普通加指令,还包括长减、宽减、半减、饱和减、按对减、按对加并累加、选择高半部分结果加、全部元素加等。
2023-06-04 06:43:12 385
原创 【ARMv8 SIMD和浮点指令编程】NEON 加法指令——加法都能玩出花
向量加法包括常见的普通加指令,还包括长加、宽加、半加、饱和加、按对加、按对加并累加、选择高半部分结果加、全部元素加等。如果你和我一开始以为的只有一种普通加,那就太小看设计者了!同时这么多加法指令的确会提升我们设计程序的效率,同样学习这些指令也需要花费不少精力。
2023-06-03 07:27:57 490
原创 【ARMv8 编程】A64 系统控制和其他指令
A64 指令集包含与以下相关的指令:异常处理、系统寄存器访问、调试、提示指令,在许多系统中都有电源管理应用程序。
2023-05-17 07:24:13 1059
原创 【ARMv8 编程】A64 流控制指令
A64 指令集提供了许多不同种类的分支指令。对于简单的相对分支,即那些从当前地址偏移的分支,使用 B 指令。无条件简单相对分支可以从当前程序计数器位置向后或向前分支最多 128MB。有条件的简单相对分支,其中条件代码附加到 B,具有 ±1MB 的较小范围。调用子程序时,需要将返回地址存储在链接寄存器(X30)中,使用 BL 指令。这没有条件版本。BL 的行为类似于 B 指令,具有将返回地址存储在寄存器 X30 中的附加作用,返回地址是 BL 之后指令的地址。
2023-05-17 07:18:33 532
原创 【ARMv8 编程】A64 内存访问其他指令
A64 内存访问其他指令包括浮点和 NEON 标量加载存储指令、访问多个内存位置指令、非特权访问指令、预取内存指令、非临时加载存储对指令、内存屏障和栅栏指令、同步原语等。
2023-05-13 11:02:28 1002
原创 【ARMv8 编程】A64 内存访问指令——内存存储指令
在内存加载一节中实际上已经使用了内存存储指令了,内存存储指令将寄存器的值存储到内存中。还有 unscaled-offset 偏移形式,例如STUR。程序员通常不需要明确使用 STUR 形式,因为大多数汇编器可以根据使用的偏移量选择合适的版本。要存储的大小可能小于寄存器。可以通过向 STR 添加 B 或 H 后缀来指定它。在这种情况下,存储的总是寄存器的最低有效部分。
2023-05-02 06:47:07 1254
原创 【ARMv8 编程】A64 内存访问指令——内存加载指令
与所有先前的 ARM 处理器一样,ARMv8 架构是一种加载/存储架构。这意味着没有数据处理指令直接对内存中的数据进行操作。数据必须首先被加载到寄存器中,修改,然后存储到内存中。该程序必须指定地址、要传输的数据大小以及源或目标寄存器。有额外的加载和存储指令提供更多选项,例如非临时加载/存储、加载/存储独占和获取/释放。对于加载到整数寄存器中的指令,可以选择要加载的大小。
2023-04-29 07:46:38 1523
原创 【ARMv8 编程】A64 数据处理指令——位域&字节操作指令
有些指令将字节、半字或字扩展到寄存器大小,可以是 X 或 W。这些指令存在于有符号(SXTB、SXTH、SXTW)和无符号(UXTB、UXTH)变体中,并且是适当的位域操作指令。这些指令的有符号和无符号变体都将字节、半字或字(尽管只有 SXTW 对字进行操作)扩展到寄存器大小。源始终是 W 寄存器。目标寄存器是 X 或 W 寄存器,但 SXTW 除外,它必须是 X 寄存器。—— 通过重复字节的最左边的位,将寄存器 W1 的最低有效字节从 8 位符号扩展为 64 位。
2023-04-15 13:46:48 2368
原创 【ARMv8 编程】A64 数据处理指令——移动&比较指令
移动指令主要为 MOV 以及它的各种“变体”,而比较指令主要用来进行比较并更新条件标志,用来实现条件判断等。
2023-04-08 07:20:49 2183 2
原创 【ARMv8 编程】A64 数据处理指令——逻辑&移位指令
逻辑指令包括与、或等指令,移位指令则分为逻辑移位和算术移位指令,下面则详细展开学习。
2023-04-02 15:36:23 1634
原创 【ARMv8 编程】A64 数据处理指令——算术指令
加减乘除类的指令统称为算术指令(ADD、SUB、ADC、SBC、NEG、MADD、MNEG、MSUB、MUL、SMADDL、SMNEGL、SMSUBL、SMULH、SMULL、UMADDL、UMNEGL、UMSUBL、UMULH、UMULL、SDIV、UDIV)
2023-03-26 08:21:25 1528
原创 【ARMv8 编程】ARMv8 指令集介绍
ARMv8 架构中引入的最重要的变化之一是增加了 64 位指令集。该指令集补充了现有的 32 位指令集架构。
2023-02-26 15:22:02 2059
原创 【ARMv8 SIMD和浮点指令编程】编程基础
ARM 高级 SIMD 架构、相关的实现和支持软件通常被称为 NEON 技术。AArch32(相当于 ARMv7 的 NEON 指令)和 AArch64 都有 NEON 指令集。两者都可以显著加速在大型数据集上的重复操作。这在媒体编解码器等应用中很有用。AArch64 的 NEON 架构使用 32 × 128 位寄存器,是 ARMv7 的两倍。这些寄存器与浮点指令使用的寄存器相同。
2023-02-14 08:05:12 1170
原创 FFmpeg 集成 x265 编译及解码
在编译 FFmpeg 之前需要先编译 x265,但并不是所有的版本都能直接使用,比如笔者同时编译 Android、Window 和 Linux 三个平台时,使用 Android NDK r21e 会遇到很多报错,符号缺失,无法编译 .S 文件都是可能遇到的问题。
2023-01-10 08:13:16 4084
原创 【ARMv8 SIMD和浮点指令编程】Libyuv I420 转 ARGB 流程分析
Libyuv 可以说是做图形图像相关从业者绕不开的一个常用库,它使用了单指令多数据流提升性能。以 ARM 处理为主线,通过 I420 转 ARGB 流程来分析它是如何流转的。
2023-01-01 10:03:34 1908
原创 RTSP 协议漫谈,揭秘 RTSP 协议内幕
RTP 协议是为流媒体端到端的实时传输而设计的。该协议提供了抖动补偿和数据包丢失和乱序的检测功能,这些在 IP 网络上的 UDP 传输中很常见。RTP 允许通过 IP 组播将数据传输到多个目的地。RTP 被认为是 IP 网络中音频/视频传输的主要标准,并与相关的配置文件和有效载荷格式一起使用。RTP 的设计基于被称为应用层分帧的架构原则,其中协议功能在应用程序中实现,而不是在操作系统的协议栈中实现。实时多媒体流应用要求信息的及时传递,通常可以容忍一些丢包来达到这一目的。
2022-12-09 08:21:57 1135
原创 详解 YUV,一文搞定 YUV 是什么!
YUV 是一个颜色模型,通常用作彩色图像管道的一部分。它对彩色图像或视频进行编码时考虑到了人类的感知,与“直接”的 RGB 表示相比,允许减少色度分量的带宽。
2022-11-16 07:47:01 13976 1
原创 【ARMv8 编程】寄存器
ARMv8 用于描述整体架构,包括 32 位执行和 64 位执行。它使用 64 位位宽寄存器,同时保持向后兼容 v7。
2022-08-29 08:29:03 1850
原创 基于 arm64 Linux nanosleep 系统调用流程分析
nanosleep (高分辨率睡眠)可实现纳秒级的睡眠,暂停调用线程的执行。在 Linux 内核中是如何实现的?下面基于 arm64 cpu 架构去分析。
2022-08-02 20:01:48 1346
原创 【Android 10 源码】Camera v1 startPreview 流程
Camera v1 startPreview 起点位于 android.hardware 包下的 Camera 类中,这是老版本的 Camera 预览的起点。有助于理解后续 Camera v2 API 所做的努力。
2022-07-28 07:52:49 1104
原创 从 Java sleep 来看 arm64 Linux 内核都干了些什么?
使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度器的精度和准确性。
2022-07-11 18:44:17 649
原创 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 开始录制
前面已经分析过 MediaRecorder 初始化和配置过程,接下来就可以真正进入录制流程了。现在不难得出这个结论:MediaRecorder 录制 Camera 的数据实际上是将预览数据经过 MediaCodec 硬编码后封装成对应的容器。具体到现在谈的场景实际上将渲染数据直接绘制到硬编码器 Surface 上然后去编码,编码后的数据是 H264,将 MIC 音频硬编码为 AAC,然后将它们封装成 MP4。开始捕获数据并将数据编码到使用 setOutputFile() 指定的文件中。在 prepare
2022-05-08 12:16:44 1776
Android发送邮件功能实现
2015-08-16
高仿今日头条字体渐变指示器
2015-04-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人