当前位置: 首页 > news >正文

01:C语言的本质

C语言的本质

  • 1、ARM架构与汇编
  • 2、局部变量初始化与空间分配
    • 2.1、局部变量的初始化
    • 2.1、局部变量数组初始化
  • 3、全局变量/静态变量初始化化与空间分配
  • 4、堆空间
  • 5、函数

1、ARM架构与汇编

ARM简要架构如下:CPU,ARM(能读能写),Flash(能读,写比较麻烦)。
在这里插入图片描述
①CPU由计算单元和寄存器所组成,其中SP,LR,PC为3个特殊的寄存器。
②RAM为存储区域:由栈区+全局变量/静态变量存储区域 + 堆区所组成。堆区由用户自己定义,可以是ZI段区域,也可以是除了栈区的其他空闲区域。
③Flash由代码段和数据段组成,代码段存储的是编译器将c语言编译的机器码,数据段存储的是全局变量所初始化的值。

2、局部变量初始化与空间分配

2.1、局部变量的初始化

CPU寄存器如下
在这里插入图片描述
CPU中的特殊寄存器
SP:栈空间地址指针
LR:保存正在执行的函数返回地址,一般是BL指令的下一条指令的地址
PC:保存Flash的代码段的机器码地址,保存CPU正在执行的机器码地址。

执行如下代码时,单片机内部是怎样执行操作的?

int main()
{volatile int a = 10;volatile int b = 20;a = a+b;return 0;
}

C语言代码被编译为单片机能识别的机器码后,烧录进入单片机的Flash的代码段
       在这里插入图片描述

如下为c代码转换的汇编码和机器码

0x08000138 B50C      PUSH     {r2-r3,lr}5:     volatile int a = 10; 
0x0800013A 200A      MOVS     r0,#0x0A
0x0800013C 9001      STR      r0,[sp,#0x04]6:     volatile int b = 20; 
0x0800013E 2014      MOVS     r0,#0x14
0x08000140 9000      STR      r0,[sp,#0x00]7:     a = a+b; 
0x08000142 E9DD1000  LDRD     r1,r0,[sp,#0]
0x08000146 4408      ADD      r0,r0,r1
0x08000148 9001      STR      r0,[sp,#0x04]8:         return 0; 
0x0800014A 2000      MOVS     r0,#0x009: } 
0x0800014C BD0C      POP      {r2-r3,pc}
常见的汇编指令:
PUSH:压栈,一般情况将CPU的寄存器压入RAM栈空间例如:PUSH  {r2-r3,lr}。表示将lr,r3,r2压入栈空间
MOVS:赋值,给CPU的寄存器赋值例如:MOVS  r0,#0x0A。表示给r0寄存器赋值0x0A
STR:写入数据4个字节,将CPU的寄存器数据写入栈空间里面例如:STR   r0,[sp,#0x00]。表示将r0的数据写入地址为sp + 0x00的空间
STRB:写入数据1个字节
STRH:写入数据2个字节
LDRD:读取8个字节数据,将栈空间的数据读取到CPU的寄存器里面例如:LDRD  r1,r0,[sp,#0]。表示将sp+0x00地址的数据读取到r0,将sp+0x04地址数据读取到r1
LDR:读取4个字节的数据
LDRB:读取1个字节的数据
LDRH:读取2个字节的数据
ADD:做加法, 例如:ADD   r0,r0,r1。表示将r0 = r0 + r1
SUB:做减法例如:SUB   sp,sp,#0x68。表示将sp = sp - 0x68
POP:出栈,将CPU的寄存器退出栈空间,用于栈空间的释放。例如:POP {r2-r3,pc}。表示将r2,r3,pc对应的栈空间释放。
B:直接跳转,一般用于函数的调用
BL:先把返回地址保存到LR寄存器里面,然后在跳转。

PUSH {r2-r3,lr}。表示依次将寄存器lr,r3,r2中的数据压入栈的空间里面。而压栈的同时,sp也会随着压栈而改变。
在这里插入图片描述

【注】lr寄存器里面的是机器码地址,即在执行main函数之前,将ENDP对应的机器码的地址保存在lr中。
在这里插入图片描述
如图:PUSH {r2-r3,lr}此汇编对应的机器码为0x08000014 B50C,当单片机执行完此机器码后,lr,r3,r2的寄存器的值被保存到RAM的栈区空间里面。而sp(栈空间地址光标)会指向地址0x2000 FFF4。
【注】此时的r2和r3寄存器的值为空。
在这里插入图片描述

volatile int a = 10对应的汇编:MOVS r0, #0x0A。表示将0x0A移入r0寄存器
                 STR r0, [sp,#0x04]。表示将r0的数据写入(sp + 0x04)的地址存储空间。sp = 0x2000 FFF4,则sp + 4 = 0x2000 FFF8。所以将r0的数据写入到栈空间的r3的位置。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

【注】0x2000 FFF8为什么代表r3的位置,而不是代表r2的位置喃?一般情况下一个存储空间是以较小的那个地址表示的
在这里插入图片描述

在这里插入图片描述


volatile int b = 20对应的汇编:MOVS r0, #0x14。表示将0x0A移入r0寄存器
                 STR r0, [sp,#0x00]。表示将r0的数据写入(sp + 0x00)的地址存储空间。sp = 0x2000 FFF4,则sp + 0 = 0x2000 FFF4。所以将r0的数据写入到栈空间的r2的位置。
在这里插入图片描述

在这里插入图片描述在这里插入图片描述


a = a + b对应的汇编:LDRD r1, r0, [sp,#0]。从栈区读取2个数据到r0,r1寄存器中。读取的起始地址为sp + 0 = 0x2000 FFF4。(r0接收地址sp + 0x00空间的数据,r1接收地址sp + 0x04空间的数据)即将b/0x14读取到r0,将a/0x0A读取到r1。
             ADD r0, r0, r1。表示将r1的数据加上r0的数据赋值r0。即r0 = 0x14 + 0x0A = 0x1E
            STR r0, [sp,#0x04]。表示将r0的数据写入(sp + 0x04)的地址存储空间。sp = 0x2000 FFF4,则sp + 0x04 = 0x2000 FFF8。所以将r0的数据写入到栈空间的r3的位置。

在这里插入图片描述

在这里插入图片描述
最终调试结果如下:
在这里插入图片描述



return 0;对应的汇编:MOVS r0,#0x00。表示将r0寄存器的数据清零。

栈的回收对应的汇编:POP {r2-r3,pc}。从栈中恢复寄存器 r2、r3 和 pc所对应栈空间的值,并且会自动调整栈指针 sp。最终sp指向0x20010000。表示之前使用的栈空间被回收。
【注】①低标号寄存器在栈空间对应低地址。进栈出栈都是。所以r2在栈空间的下面。②压栈时,先压进去sp在向下移动;出栈时,先出栈,sp在向上移动。

综上:c语言的代码本质就是被编译器转换后的机器码(指令),然后存储在Flash的代码段里面。一个机器码占用2/4个字节的空间。上面的main函数的代码转换为机器码占用空间地址为:0x08000138(PUSH开始) ~0x0800014C(POP结束),共占用22字节。main函数的地址就是机器码的首地址:0x08000138
在这里插入图片描述

2.1、局部变量数组初始化

执行如下代码时,单片机内部是怎样执行操作的?

int main()
{volatile int a = 10;volatile char b[100];b[99] = 20;return 0;
}

如下为c代码转换的汇编码和机器码

0x08000014 B09A      SUB      sp,sp,#0x6817:     volatile int a = 10; 18:     volatile char b[100]; 
0x08000016 200A      MOVS     r0,#0x0A
0x08000018 9019      STR      r0,[sp,#0x64]19:     b[99] = 20; 
0x0800001A 2014      MOVS     r0,#0x14
0x0800001C F88D0063  STRB     r0,[sp,#0x63]20:         return 0; 
0x08000020 2000      MOVS     r0,#0x00

SUB sp,sp,#0x68。表示sp = sp - 0x68。则sp = 0x2000 FFFC - 0x68 = 0x2000 FF98。其中0x68 = 104。则表示在栈区开辟了104个字节
在这里插入图片描述
在这里插入图片描述

3、全局变量/静态变量初始化化与空间分配

#include "main.h"volatile int g_a = 123;//全局变量
int main()
{static volatile int g_b = 321;//静态变量volatile int a = 10;volatile int b = 20;a = a+b;g_b = g_a + g_b;return 0;
}

如上代码包含g_a全局变量,g_b静态变量。如下为c代码转换的汇编码和机器码

0x08000154 B50C      PUSH     {r2-r3,lr}7:     volatile int a = 10; 
0x08000156 200A      MOVS     r0,#0x0A
0x08000158 9001      STR      r0,[sp,#0x04]8:     volatile int b = 20; 
0x0800015A 2014      MOVS     r0,#0x14
0x0800015C 9000      STR      r0,[sp,#0x00]9:     a = a+b; 
0x0800015E E9DD1000  LDRD     r1,r0,[sp,#0]
0x08000162 4408      ADD      r0,r0,r1
0x08000164 9001      STR      r0,[sp,#0x04]10:     g_b = g_a + g_b; 
0x08000166 4804      LDR      r0,[pc,#16]  ; @0x08000178
0x08000168 6800      LDR      r0,[r0,#0x00]
0x0800016A 4904      LDR      r1,[pc,#16]  ; @0x0800017C
0x0800016C 6809      LDR      r1,[r1,#0x00]
0x0800016E 4408      ADD      r0,r0,r1
0x08000170 4902      LDR      r1,[pc,#8]  ; @0x0800017C
0x08000172 6008      STR      r0,[r1,#0x00]11:         return 0; 
0x08000174 2000      MOVS     r0,#0x0012: } 
0x08000176 BD0C      POP      {r2-r3,pc}

综上:并未有机器码和汇编代码来初始化全局变量和静态变量。那么在内存中他们是怎样被初始化赋值的喃?
答案:将全局变量和局部变量需要被初始化的值保存在Flash的数据段里面。有多少个数据,在数据段里面就有多少个数据
在这里插入图片描述
有了数据,那全局变量和局部变量的内存又在哪里喃?又怎样将数据给到全局变量和局部变量喃?

答案:全局变量和静态变量依旧保存在RAM的里面,但不在是栈区。全局变量/静态变量由编译器分配的存储空间,不再是像局部变量由代码指令分配。如下图所示:Linker(链接器):将0x0800 0000的空间与0x2000 0000的空间链接在一起。

在这里插入图片描述
如上图:R/O base:0x0800 0000。表示的是Flash的数据段的起始地址。
在这里插入图片描述

R/W base:0x0200 0000。表示的是RAM中保存全局变量和静态变量的起始地址。
在这里插入图片描述
综上:
①全局变量/局部静态变量赋值和栈里面的局部变量不同,全局变量是先占用低地址空间,而局部变量是先占用高地址空间。

②全局变量是通过copy函数,将Flash里面的数据复制到全局变量和静态变量的内存里面。
③当 main 函数执行完毕时,虽然栈上的局部变量会被销毁,但是全局变量不会受到影响。全局变量在整个程序运行期间都存在,直到程序退出时才会被操作系统回收

【注】copy函数在启动文件里面,由程序员编写,且在调用main函数之前。调用完copy函数后在执行main函数。全局变量在程序启动时分配内存和初始化值,并在整个程序运行期间都保持有效。
在这里插入图片描述

综上为有初始值的全局变量和静态变量的内存分配情况(简称为:RW段),那若没有初始值/初始化为0的全局变量。依然会在Flash的数据段将数据0保存起来吗?显然浪费内存空间。

答案:没有初始值和初始值为0的全局变量,在Flash的数据段里面并未保存数据。但是编译器会在RAM里面给这些变量分配存储空间(简称:ZI段)。在调用main函数之间,调用memset函数将这些变量的存储空间清零。

4、堆空间

综上:①RAM中存在栈区:用于存储局部变量、函数参数、返回地址等。栈内存是自动管理的,随着函数调用和返回而分配和释放。②RAM也存在全局变量/静态局部变量区域。③RAM还存在堆区:堆区由用户调用mallo函数分配和管理,调用free函数进行释放。
在这里插入图片描述
堆区的空间不能在栈区里面分配。因为栈区空间会随着函数的结束而释放,是用户不可控制的。而堆区是不会随着函数的结束而释放。除非main函数终止。

而堆空间可以是全局变量区域。因为都是不会随着函数的结束而释放。除非main函数终止。

在这里插入图片描述

5、函数

综上:c语言的代码本质就是被编译器转换后的机器码(指令),然后存储在Flash的代码段里面。一个机器码占用2/4个字节的空间。上面的main函数的代码转换为机器码占用空间地址为:0x08000138(PUSH开始) ~0x0800014C(POP结束),共占用22字节。main函数的地址就是机器码的首地址:0x08000138

接下来继续分析如下的代码:

int add_value(volatile int b)
{volatile int c = 20;return c + b;
}int main()
{volatile int a = 10;add_value(a);return 0;
}

生成的机器码和汇编代码如下:

0x08000138 B501      PUSH     {r0,lr}
0x0800013A B081      SUB      sp,sp,#0x045:     volatile int c = 20; 
0x0800013C 2014      MOVS     r0,#0x14
0x0800013E 9000      STR      r0,[sp,#0x00]6:     return c + b; 
0x08000140 E9DD0100  LDRD     r0,r1,[sp,#0]
0x08000144 4408      ADD      r0,r0,r17: } 8:  9: int main() 
0x08000146 BD0C      POP      {r2-r3,pc}10: { 
0x08000148 B508      PUSH     {r3,lr}11:     volatile int a = 10; 
0x0800014A 200A      MOVS     r0,#0x0A
0x0800014C 9000      STR      r0,[sp,#0x00]12:     add_value(a); 
0x0800014E 9800      LDR      r0,[sp,#0x00]
0x08000150 F7FFFFF2  BL.W     0x08000138 add_value13:         return 0; 
0x08000154 2000      MOVS     r0,#0x0014: } 
0x08000156 BD08      POP      {r3,pc}

在这里插入图片描述

其中BL.W 0x08000138 add_value。表示①先把返回地址保存在LR寄存器里面。返回地址 = 0x0800 0154(即:MOVS r0,#0x00指令的地址)。②然后在跳转去执行地址为0x0800 0138地址的指令。

在这里插入图片描述

综上:main函数的机器码地址0x08000148(PUSH) ~ 0x08000156(POP) 。add_value函数的机器码地址0x08000138(PUSH) ~ 0x08000146(POP)。即:main函数的地址为0x08000148 ,add_value函数的地址为0x08000138 。

在这里插入图片描述

相关文章:

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间5、函数 1、ARM架构与汇编 ARM简要架构如下:CPU,ARM(能读能写),Flash&#xff08…...

Jmeter进阶篇(32)Jmeter 在 MySQL 数据库压测中的应用

一、引言 在当今数字化时代,数据库性能的优化对于企业的发展至关重要。随着业务量的不断增长,数据库需要承受越来越大的压力。MySQL作为一种广泛使用的开源数据库,其性能和稳定性备受关注。为了确保数据库在高负载情况下能够正常运行,进行压测是必不可少的环节。Jmeter作为…...

TCPDump参数详解及示例

TCPDump参数详解及示例 TCPDump参数详解TCPDump -G的示例TCPDump -i any -s 2048 -G 600 -p udp -Z root -n -X -tt -w %Y_%m%d_%H%M_%S.pcap &的含义TCPDump是一款强大的网络数据包截获分析工具,可以将网络中传送的数据包的完全截获下来提供分析。它支持针对网络层、协议…...

Protocol Buffer

1、什么是 Protocol Buffers? Protocol Buffers (protobuf) 是一种序列化结构化数据的方法,由 Google 开发。它们提供了一种与语言无关、与平台无关且可扩展的机制,用于高效序列化结构化数据。 Protocol Buffers 中的…...

高等数学学习笔记 ☞ 连续与间断

1. 连续 1. 点连续定义: 设函数在点的某邻域内有定义,取附近的点,对应的函数值分别和, 令,当时,若,则称函数在点处连续。 记作。 此式为增量形式。 又知,则可改写为:。 …...

【three.js】Shader着色器

原始着色器材质RawShaderMaterial 两种着色器材质的 RawShaderMaterial 和 ShaderMaterial 的区别和用法 区别: ShaderMaterial 会自动将一些初始化着色器的参数添加到代码中(内置 attributes 和 uniforms) RawShaderMaterial 则什么都不会添…...

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称...

创建并配置华为云虚拟私有云

目录 私有云 创建虚拟私有云 私有云 私有云是一种云计算模式,它将云服务部署在企业或组织内部的私有基础设施上,仅供该企业或组织内部使用,不对外提供服务.私有云的主要特点包括: 私密性:私有云的资源(如…...

Spark是什么?Flink和Spark区别

Spark是什么?Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架,主要用于大规模数据处理和分析。它支持多种数据处理模式,包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...

代码随想录 day 25

第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解:https://www.bilibili.com/…...

数据仓库中的指标体系模型介绍

数据仓库中的指标体系介绍 文章目录 数据仓库中的指标体系介绍前言什么是指标体系指标体系设计有哪些模型?1. 指标分层模型2. 维度模型3. 指标树模型4. KPI(关键绩效指标)模型5. 主题域模型6.平衡计分卡(BSC)模型7.数据指标框架模…...

xr-frame 通过shader去除视频背景色,加载透明视频

目录 前言 实现思路 获取 XR 框架系统: 注册自定义效果 创建效果对象 渲染通道配置 着色器代码 顶点着色器 片元着色器(颜色分量g达到条件的片元将被透透明) effect-removeBlack 完整代码 wxml中使用 前言 实现了一个用于注册自定…...

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…...

Kraft模式安装Kafka(含常规、容器两种安装方式)

一、#创作灵感# 公司使用Kafka的软件项目较多,故写技术笔记巩固知识要点 二、软件环境 - Kafka 3.9.0 官方下载地址:Kafka 3.9.0 - Docker Desktop 4.37 容器图形化工具 官方下载地址:Docker Desktop 4.37 特别说明 - Docker Desktop…...

旷视科技C++面试题及参考答案

在 Linux 系统下常用的命令有哪些? 在 Linux 系统中有许多常用命令。首先是文件和目录操作相关的命令。“ls” 命令用于列出目录的内容,它有很多选项,比如 “ls -l” 可以以长格式显示文件和目录的详细信息,包括文件权限、所有者、大小、修改时间等;“ls -a” 则会显示所有…...

IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)

时序预测 | MATLAB实现IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元) 目录 时序预测 | MATLAB实现IWOA-GRU和GRU时间序列预测(改进的鲸鱼算法优化门控循环单元)预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现IWOA-GRU和GRU时间序列预测…...

edeg插件/扩展推荐:助力生活工作

WeTab 此插件在我看来有2个作用 1.改变edeg的主页布局和样式,使其更加精简,无广告 2.提供付费webtab Ai(底层是chatGpt) 沉浸式翻译 此插件可翻译网页的内容 假设我们浏览github 翻译前 翻译后 Better Ruler 可以对网页的距离进行测量 适合写前端的小伙伴 用法示例:...

TPS和QPS的区别

TPS全称(Transactions Per Second)QPS全称(Queries Per Second)它们都是衡量系统性能的指标,都是表示单位时间内处理的事务或者查询的数量 TPS 定义:TPS指的是系统每秒可以处理的事务数量,一个…...

鸿蒙HarmonyOS开发:拨打电话、短信服务、网络搜索、蜂窝数据、SIM卡管理、observer订阅管理

文章目录 一、call模块(拨打电话)1、使用makeCall拨打电话2、获取当前通话状态3、判断是否存在通话4、检查当前设备是否具备语音通话能力 二、sms模块(短信服务)1、创建短信2、发送短信 三、radio模块(网络搜索&#x…...

如何处理 JavaScript 中的函数防抖问题?

在 JavaScript 中,函数防抖(Debouncing)是一种控制函数执行频率的技术,通常用于处理用户输入事件(例如键盘输入、滚动事件等)。防抖的核心思想是:在连续触发某个事件时,只有在事件停…...

sql server期末复习

表操作 创建create 删除drop 修改alter 数据操作 查询 select from <tableName> 插入 insert into <tableName> values 修改 update <tableName> set 删除 delete from <tableName> 授权与收回对数据的操作权限 授予 grant <权…...

初学STM32 --- 外部SRAM

目录 SRAM简介 SRAM特性: XM8A51216 功能框图 8080并口读时序​编辑 8080并口写时序 SRAM 读写操作步骤 FSMC介绍 FSMC时序介绍 FSMC控制器对内核地址映射​编辑 FSMC HAL库相关驱动 SRAM驱动步骤 SRAM简介 静态随机存取存储器&#xff08;Static Random-Access Memory&am…...

XXX公司面试真题

一、一面问题 1.线程池的主要参数 核心线程数最大线程数空闲线程存活时间存活时间单位任务队列线程工厂拒绝策略允许核心线程超时 2. 线程的状态 新建状态就绪状态运行状态阻塞状态死亡状态 补充&#xff1a;线程阻塞的原因 线程调用sleep()方法进入睡眠状态 线程得到一个…...

MySQL 01 02 章——数据库概述与MySQL安装篇

一、数据库概述 &#xff08;1&#xff09;为什么要使用数据库 数据库可以实现持久化&#xff0c;什么是持久化&#xff1a;数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是&#xff1a;将内存中的数据存储在关系型数据库中&#xff0c;当然也可以…...

[读书日志]8051软核处理器设计实战(基于FPGA)第四篇:verilog语法特性

第一篇https://blog.csdn.net/m0_74021449/article/details/144796689 第二篇https://blog.csdn.net/m0_74021449/article/details/144813103 第三篇https://blog.csdn.net/m0_74021449/article/details/144834117 4.verilog硬件描述语言基础 这部分主要讲述verilog基础语法…...

大模型高效推理综述

大模型高效推理综述 1 Introduction2 Preliminaries2.1 transformer架构的LLM2.2 大模型推理过程2.3 推理效率分析 3 TAXONOMY(分类)4.数据级别优化4.1输入压缩4.1.1 提示词裁剪&#xff08;prompt pruning&#xff09;4.1.2 提示词总结&#xff08;prompt summary&#xff09;…...

HTML5实现好看的博客网站、通用大作业网页模板源码

HTML5实现好看的博客网站、通用大作业网页模板源码 前言一、设计来源1.1 主界面1.2 列表界面1.3 文章界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的博客网站、通用大作业网页模板源码&#xff0c;博客网站源码&#xff0c;HTML模板源码&#xff0…...

在Microsoft Windows上安装MySQL

MySQL仅适用于Microsoft Windows 64位操作系统&#xff0c;在Microsoft Windows上安装MySQL有不同的方法&#xff1a;MSI、包含您解压缩的所有必要文件的标准二进制版本&#xff08;打包为压缩文件&#xff09;以及自己编译MySQL源文件。 注意&#xff1a;MySQL8.4服务器需要在…...

adaface人脸特征提取之ncnn推理

目录 1. 背景2. 准备工作2.1 ncnn库下载2.2 adaface模型下载2.3 模型转换 3. 代码实现4. 模型量化 1. 背景 最近项目要求Android端使用adaface做人脸特征提取&#xff0c;最终选择ncnn作为推理框架 2. 准备工作 2.1 ncnn库下载 https://github.com/Tencent/ncnn/tree/maste…...

iOS 逆向学习 - iOS Security Features:硬件与软件多重防护体系

iOS 逆向学习 - iOS Security Features&#xff1a;硬件与软件多重防护体系 iOS 安全特性全面解析&#xff1a;构筑多层次防御体系一、iOS 的硬件安全特性1. Secure Enclave&#xff08;安全隔区&#xff09;2. Hardware Root of Trust&#xff08;硬件信任根&#xff09;3. De…...

纯前端实现将pdf转为图片(插件pdfjs)

需求来源 预览简历功能在移动端&#xff0c;由于用了一层iframe把这个功能嵌套在了app端&#xff0c;再用一个iframe来预览&#xff0c;只有ios能看到&#xff0c;安卓就不支持&#xff0c;查了很多资料和插件&#xff0c;原理基本上都是用iframe实现的。最终转换思路&#xf…...

stm32HAL库使LED闪烁

PC13引脚为开漏接法 生成代码时设置为out put open drain gpio out put level 设置为high 1表示熄灭 我们将pa9引脚连接为推挽接法 生成代码时设置为 out put push pull Gpio out put level 设置为low 0 表示熄灭 代码使其亮起再延时0.5秒再熄灭再延时0.5秒...

《数据结构》期末考试测试题【中】

《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为&#xff1f;22. 单链表的存储密度比1&#xff1f;23.单链表的那些操作的效率受链表长度的影响&#xff1f;24.顺序表中某元素的地址为&#xff1f;25.m叉树第K层的结点数为&#xff1f;26. 在双向循环链表某节点…...

【Vue3项目实战系列一】—— 全局样式处理,导入view-ui-plus组件库,定制个性主题

&#x1f609; 你好呀&#xff0c;我是爱编程的Sherry&#xff0c;很高兴在这里遇见你&#xff01;我是一名拥有十多年开发经验的前端工程师。这一路走来&#xff0c;面对困难时也曾感到迷茫&#xff0c;凭借不懈的努力和坚持&#xff0c;重新找到了前进的方向。我的人生格言是…...

ChatGPT 主流模型GPT-4/GPT-4o mini的参数规模是多大?

微软论文又把 OpenAI 的机密泄露了&#xff1f;&#xff1f;在论文中明晃晃写着&#xff1a; o1-preview 约 300B&#xff1b;o1-mini 约 100BGPT-4o 约 200B&#xff1b;GPT-4o-mini 约 8BClaude 3.5 Sonnet 2024-10-22 版本约 175B微软自己的 Phi-3-7B&#xff0c;这个不用约…...

初学stm32 --- RTC实时时钟

目录 RTC简介 常用的RTC方案 STM32 F1 RTC框图介绍 后备寄存器和RTC寄存器特性&#xff08;F1&#xff09; F1 RTC相关寄存器介绍 RCC_APB1ENR寄存器​编辑 PWR_CR寄存器 RCC_BDCR寄存器 RTC_CRL寄存器 RTC_CRH寄存器 RTC_PRLH寄存器 RTC_PRLL寄存器 RTC_CNTH寄存器 …...

Qt之屏幕录制设计(十六)

Qt开发 系列文章 - screencap&#xff08;十六&#xff09; 目录 前言 一、实现原理 二、实现方式 1.创建录屏窗口 2.录屏窗口类定义 3.自建容器对象定义 4.用户使用 5.效果演示 总结 前言 利用Qt实现屏幕录制设计&#xff0c;可以通过使用Qt自带的类QScreen、QPixma…...

25年1月更新。Windows 上搭建 Python 开发环境:Python + PyCharm 安装全攻略(文中有安装包不用官网下载)

引言 随着 Python 在数据科学、Web 开发、自动化脚本等多个领域的广泛应用&#xff0c;越来越多的开发者选择它作为首选编程语言。而 PyCharm 作为一个功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为 Python 开发者提供了极大的便利。本文将详细介绍如何在 …...

CTF杂项——[LitCTF 2024]涐贪恋和伱、甾―⑺dé毎兮毎秒

得到一张图片 有两种方式可以得到flag 第一种&#xff1a;LSB 第二种&#xff1a;zsteg...

从零开始手写缓存之如何实现固定缓存大小

cache 发展之路 1、HashMap或者ConcurrentHashMap public class CustomerService {private HashMap<String,String> hashMap new HashMap<>();private CustomerMapper customerMapper;public String getCustomer(String name){String customer hashMap.get(nam…...

Kubernetes——part4-1 Kubernetes集群 服务暴露 Nginx Ingress Controller

Kubernetes集群 服务暴露 Nginx Ingress Controller 一、ingress控制器 1.1 ingress控制器作用 &#xff08;类似于slb&#xff0c;做代理服务&#xff09; ingress controller可以为kubernetes 集群外用户访问Kubernetes集群内部pod提供代理服务。 提供全局访问代理访问流程…...

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

《机器学习》——线性回归模型

文章目录 线性回归模型简介一元线性回归模型多元线性回归模型误差项分析一元线性模型实例完整代码 多元线性模型实例完整代码 线性回归模型简介 线性回归是利用数理统计中回归分析&#xff0c;来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 相关关系&…...

测试用例颗粒度说明

当我们在编写测试用例时&#xff0c;总是会遇到一个问题&#xff1a;如何确定测试用例的颗粒度&#xff1f;测试用例过于粗糙&#xff0c;可能无法全面覆盖系统的细节&#xff1b;而颗粒度过细&#xff0c;又会导致测试重复、冗余。掌握合适的颗粒度&#xff0c;不仅可以提高测…...

Kali 离线安装 ipmitool 笔记

在Kali Linux上离线安装 ipmitool 的步骤如下&#xff1a; 一、获取 ipmitool 的安装包和依赖 由于是离线安装&#xff0c;您需要先在一台可以联网的机器上下载 ipmitool 及其所有依赖包。 方法一&#xff1a;使用 apt 下载包 在联网的机器上&#xff0c;运行以下命令以准备…...

基于word2vec的文本大数据分析

基于word2vec的文本大数据分析 效果: 一、简介 Word2Vec是一种词向量表示方法,是在自然语言处理领域(NLP)的神经网络模型,是一种无监督学习,包含两种模型架构:CBOW模型与Skip-Gram模型。 常用于:相似度计算、词类聚类、文本分类、句子和文档表示、搜索引擎优化、情…...

BGP基础配置实验

一、实验拓补 二、实验要求及分析 实验要求&#xff1a; 1&#xff0c;R1为AS 100区域&#xff1b;R2、R3、R4为AS 200区域且属于OSPF协议&#xff1b;R5为AS 300区域&#xff1b; 2&#xff0c;每个设备上都有环回&#xff0c;且通过环回可以使设备互通&#xff1b; 实验分…...

Maven核心与单元测试

目录 一. Maven概述二. IDEA集成Maven2.1 创建Maven项目2.2 Maven坐标2.3 导入Maven项目 三. 依赖管理四. Maven的生命周期五. 单元测试5.1 快速入门5.2 断言5.3 常见注解5.4 依赖范围 六. Maven常见问题 \quad 一. Maven概述 \quad \quad 二. IDEA集成Maven \quad 2.1 创建Mav…...

Go语言的 的继承(Inheritance)基础知识

Go语言的继承&#xff08;Inheritance&#xff09;基础知识 引言 在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;继承是一个重要的概念&#xff0c;它允许一个类&#xff08;子类&#xff09;继承另一个类&#xff08;父类&#xff09;的属性和方法。这种机制在许…...

常见的框架漏洞复现

1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&#xff0c;通过覆盖类的核心属性filter导致rce&#xff0c;其攻击点较为多&…...