使用S32DS部署Tensorflow lite到S32K3
一、概述
1、本文主要介绍如何用S32DS在NXP S32K344 中部署Tensorflow;
2、示例使用了Tensorflow入门代码,主要功能是识别28 * 28 的手写图片的数字;
3、在MCU上开启DSP功能后,最终运行时间在 7ms(64神经元),准确率在 90%左右;
4、Tensorflow Lite Micro为嵌入式环境运行的设计,参考以下链接:
开始使用 TensorFlow Lite
二、资源需求
1、库文件
库文件 | 资源地址 | 说明 |
CMSIS 6 | Release CMSIS 6.1.0 · ARM-software/CMSIS_6 · GitHub | ARM提供,会使用部分头文件 |
CMSIS-NN | https://codeload.github.com/ARM-software/CMSIS-NN/zip/refs/heads/main | ARM提供ARM Cortex-M 系列微控制器设计的神经网络库 |
CMSIS-DSP | RTE_Components.h在micro_time.cpp中调用,可手动修改 https://github.com/ARM-software/CMSIS-DSP/tree/main | ARM提供,DSP运算库 |
tensorflow-lite-micro | https://codeload.github.com/tensorflow/tflite-micro/zip/refs/heads/main | Google tensorflowlite基础版,同宗永好,可以借点东西 |
tensorflow-lite-micro | https://www.keil.arm.com/packs/tensorflow-lite-micro-tensorflow/versions/ | ARM提供的tensorflowlite ARM版,我们用这个,直接解压缩使用 |
Flatbuffers | https://github.com/google/flatbuffers/tree/master | |
Gemmlowp | 头文件低精度计算 https://github.com/google/gemmlowp/tree/master | |
Ruy | instrumentation.h 需要Ruy中提供,矩阵计算 https://github.com/google/ruy |
2、软件工具
工具 | 描述 |
S32DS | 3.4版本,GCC 10.2编译 |
Python | 3.7版本 |
VS Code + copilot | 可选,测试程序由AI帮忙生成,再手动修改 |
豆包 | 遇到不会的问问他吧,比自己查资料快多了 |
Tensorflow | 2.x 机器学习模型构建 |
Netron | 可选,打开tflite文件 |
Trace32和 Lauterbach.rc | 可选,Python操作trace32,更新输入数据(原始数据28*28很大) |
三、模型制作
1、机器学习模型
参考 关于TensorFlow | TensorFlow中文官网
import tensorflow as tf
import oscurr_path = os.path.dirname(__file__)
model_path = os.path.join(curr_path, 'model.tflite')mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
first_index_data = x_train[0]# 128 = 12ms
# 64 = 7ms
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10, activation='softmax')
])model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)# 计算需要的缓存大小,main.cc 会设置
total_memory = 0
for layer in model.layers:for tensor in layer.weights:shape = tensor.shapeelement_size = tensor.dtype.sizetensor_memory = 1for dim in shape:if dim is not None:tensor_memory *= dimtensor_memory *= element_sizetotal_memory += tensor_memory
print(f"Estimated memory usage: {total_memory} bytes")# 转换模型
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()# 保存转换后的模型
with open(model_path, 'wb') as f:f.write(tflite_model)
2、转换模型
缓存区大小和转换成TFlite 模型由AI生成。
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
3、量化
生成模型数组,在嵌入式软件中调用。下列脚本保存到model.cc中。
第一种方法:
Convert.py 实现,该脚本由豆包生成
import numpy as np
import tensorflow as tf
import oscurr_path = os.path.dirname(__file__)
model_path = os.path.join(curr_path, 'model.tflite')
output_path = os.path.join(curr_path, 'model.cc')def convert_tflite_to_c_array(tflite_model_path, output_c_file_path):# Load the TFLite modelwith open(tflite_model_path, 'rb') as f:tflite_model = f.read()# Convert the model to a numpy arraymodel_array = np.frombuffer(tflite_model, dtype=np.uint8)# Create the C array as a stringc_array_str = "const unsigned char model_data[] = {\n"c_array_str += ',\n'.join(' ' + ', '.join(f'0x{byte:02x}' for byte in model_array[i:i+12]) for i in range(0, len(model_array), 12))c_array_str += "\n};\n"c_array_str += f"const unsigned int model_len = {len(model_array)};\n"# Write the C array to the output filewith open(output_c_file_path, 'w') as f:f.write(c_array_str)# Example usage
convert_tflite_to_c_array(model_path, output_path)
print(f"Model converted to C array and saved to {output_path}")
第二种方法:
许多微控制器平台没有本地文件系统的支持。从程序中使用一个模型最简单的方式是将其以一个 C 数组的形式包含并编译进你的程序。
xxd是个工具(linux/Cygwin/git等中包含)
四、嵌入式软件
1、库创建
使用tensorflow-lite-micro为基础,创建库工程(C++)。可直接使用编译号的库
已编译的库地址下载(使用以下内容,可跳过“库创建”)
【免费】S32DS编译的S32K3tensorflowlite库,o3优化,DSP开启资源-CSDN文库
A、需要的头都放进去,安装Tensorflow引用的头路径方式
使用DSP编译选项的设置,设置方式参考下一章;S32K3支持该协处理器。
B、可能的问题
库路径配置,记得是 C++ |
ethosu是平台的, AI推理,可以删除 |
schema_generated.h 屏蔽版本检查 ///static_assert(FLATBUFFERS_VERSION_MAJOR == 23 && /// FLATBUFFERS_VERSION_MINOR == 5 && /// FLATBUFFERS_VERSION_REVISION == 26, /// "Non-compatible flatbuffers version included"); |
blocking_counter.h error: 'condition_variable' in namespace 'std' does not name a type,直接屏蔽代码(这个是多线程系统时才有操作实体) |
array.h 从tflite-micro-main拷到ARM下载的中,而不是#include "flatbuffers/array.h", |
arm_nnfunctions.h 在CMSIS-NN中 |
instrumentation.h 需要Ruy中提供,矩阵计算 |
FixPonit 头文件 Gemmlowp 低精度计算 |
C、重定义问题解决
右击工程“Build configurations Explorer”,这几个文件在其他文件已经“include”了
D、库引用设置(在测试程序中配置)
路径设置:
2、测试程序
创建工程(C++)
Main.c 代码
/** main implementation: use this 'C++' sample to create your own application**/
#include "S32K344.h"
#include "tensorflow/lite/micro/micro_mutable_op_resolver.h"
#include "tensorflow/lite/micro/tflite_bridge/micro_error_reporter.h"
#include "tensorflow/lite/micro/micro_interpreter.h"
#include "tensorflow/lite/schema/schema_generated.h"// 包含模型数据
#include "model.cc"
#include "input_data.cc"volatile int predicted_class_index = 0;
float input_data[28 * 28];
volatile bool test_run = false;
const int tensor_arena_size = 40 * 1024;
uint8_t tensor_arena[tensor_arena_size];int main()
{// 定义错误报告器tflite::MicroErrorReporter micro_error_reporter;tflite::ErrorReporter* error_reporter = µ_error_reporter;// 定义操作解析器tflite::MicroMutableOpResolver<10> resolver;resolver.AddAdd();resolver.AddMul();resolver.AddSub();resolver.AddDiv();resolver.AddReshape();resolver.AddFullyConnected();resolver.AddSoftmax();resolver.AddRelu();// 定义模型const tflite::Model* tfmodel = tflite::GetModel(model_data);if (tfmodel == nullptr) {TF_LITE_REPORT_ERROR(error_reporter, "Failed to build tfmodel from buffer");while (1);}// 定义解释器tflite::MicroInterpreter interpreter = tflite::MicroInterpreter(tfmodel, resolver, tensor_arena, tensor_arena_size);// 分配张量TfLiteStatus allocate_status = interpreter.AllocateTensors();if (allocate_status != kTfLiteOk) {TF_LITE_REPORT_ERROR(error_reporter, "Tensor allocation failed");while (1);}// 初始化第一个输入张量for (int i = 0; i < 28 * 28; ++i) {input_data[i] = x_train[i];}// 准备输入数据TfLiteTensor* input_tensor = interpreter.input(0);for (;;) {// 填充输入数据for (int i = 0; i < 28 * 28; ++i) {input_tensor->data.f[i] = input_data[i];}// 运行推理TfLiteStatus invoke_status = interpreter.Invoke();if (invoke_status != kTfLiteOk) {TF_LITE_REPORT_ERROR(error_reporter, "Invoke failed");while (1);}// 获取输出结果TfLiteTensor* output_tensor = interpreter.output(0);// 处理输出数据:找到概率最大的类别索引int num_classes = output_tensor->bytes / sizeof(float);float max_prob = output_tensor->data.f[0];for (int i = 1; i < num_classes; ++i) {if (output_tensor->data.f[i] > max_prob) {max_prob = output_tensor->data.f[i];predicted_class_index = i;}}test_run = false;while(!test_run);}return 0;
}
解释器
MicroInterpreter为该示例的解释器,另外一个不使用
增加操作
resolver.AddRelu();根据Netron图中的操作或HelloAi中模型层确定
设置缓存区
uint8_t tensor_arena[tensor_arena_size];
tensor_arena_size根据Hellow.py 中的 total_memory
3、性能测试
输入 28 * 28 个数据,输出 10 个数据;该结果通过TRACE32读取。
隐藏层神经元个数 | 48MHz | 48MHz O3优化 DSP使用 | 160MHz O3优化 DSP使用 |
128 | 560ms | 32ms | 12ms |
64 | / | / | 7ms |
使用DSP编译选项的设置
五、模型预测的正确率测试
1、测试脚本(先加载训练数据,再传给TRACE32)
import lauterbach.trace32.rcl as t32rc
import tensorflow as tf
import timeif __name__ == "__main__":mnist = tf.keras.datasets.mnist(x_train, y_train),(x_test, y_test) = mnist.load_data()x_train = x_train / 255.0t32debug = t32rc.connect(node = "localhost",port = 20000,packlen = 1024)right_cnt = 0calcu_cnt = 0# input data updatei = 0for x in x_train:calcu_cnt += 1input_datas = x.flatten()varDict = {}j = 0input_checksum = 0readback_checksum = 0for input_data in input_datas:signalName = 'input_data[' + str(j) + ']' # 构建信号名input_data = float(input_data)input_checksum += input_dataj += 1t32debug.variable.write(signalName, input_data)#time.sleep(0.001)readback_checksum += t32debug.variable.read(signalName).value#t32debug.go()# model predict in mircrocontroller, wait finsht32debug.variable.write('test_run', 1)while t32debug.variable.read('test_run').value != 0:time.sleep(0.1)#0.1s#t32debug.trace32_break()# read output dataout_signalname = 'predicted_class_index'predicted_class = t32debug.variable.read(out_signalname).valueif predicted_class == y_train[i]:right_cnt += 1else:print("predict error!", 'input checksum: ', input_checksum, 'readback checksum', readback_checksum)print(right_cnt, '/', calcu_cnt, ' [predicted class]:', predicted_class, '[real class]:', y_train[i])i += 1print('Accuracy: ', right_cnt / calcu_cnt)print('Total number of test data: ', calcu_cnt)
2、加载训练数据
获取结果与实际进行对比。
3、TRACE32需要使能Port
4、TRACE32增加交互的数据
5、执行测试
运行可能不是太快
相关文章:
使用S32DS部署Tensorflow lite到S32K3
一、概述 1、本文主要介绍如何用S32DS在NXP S32K344 中部署Tensorflow; 2、示例使用了Tensorflow入门代码,主要功能是识别28 * 28 的手写图片的数字; 3、在MCU上开启DSP功能后,最终运行时间在 7ms(64神经元…...
AWS S3深度解析:十大核心应用场景与高可用架构设计实践
摘要:作为全球领先的对象存储服务,Amazon S3凭借其高扩展性、持久性和安全性,已成为企业云原生架构的核心组件。本文将深入探讨S3的典型技术场景,并揭秘其背后的架构设计逻辑。 一、AWS S3核心技术特性解析 Amazon Simple Storag…...
系统学习算法:专题十二 记忆化搜索
什么是记忆化搜索,我们先用一道经典例题来引入,斐波那契数 题目一: 相信一开始学编程语言的时候,就一定碰到过这道题,在学循环的时候,我们就用for循环来解决,然后学到了递归,我们又…...
Redis基操
redis 存储在内存中 key-value存储 主要存储热点数据(短时间大量的访客去访问) 启动命令 redis-server.exe redis.windows.conf 客户端链接redis服务器 redis-cli.exe redis-cli.exe -h localhost -p 6379 redis-cli.exe -h localhost -p 6379 -a 123456 退出 exit keys * 命…...
基于 GEE 计算并下载研究区年均叶面积指数 LAI 和光合有效辐射分量 FPAR
目录 1 完整代码 2 运行结果 1 完整代码 var table table; var collection ee.ImageCollection(MODIS/061/MOD15A2H).filterDate(2023-01-01, 2023-12-30).filterBounds(table); // LAI配色 var colorLai {min: 0,max: 100,palette: [ffffff, fde0d4, fcc4ac, faa784, f…...
软考——WWW与HTTP
1.万维网(world wide web) 是一个规模巨大的、可以资源互联的资料空间。由URL进行定位,通过HTTP协议传送给使用者,又由HTML来进行文件的展现。 它的主要组成部分是:URL、HTTP、HTML。 (1)URL…...
sqli-labs-master第46关
目录 报错注入 直接注入 数据库名 数据库中的表名 users表结构: users表数据: python脚本注入 直接注入 获取数据库名 获取表名 获取表结构 获取数据 布尔盲注 获取数据库名 获取表名 获取表结构 获取数据 报错注入 直接注入 数据库名…...
opencv交叉编译报错:undefined reference to `png_riffle_palette_neon
序偶NEON 概述 NEON(Nested Enhanced Vector Instruction Set)是 ARM 架构中的一种高级 SIMD(Single Instruction, Multiple Data,单指令多数据)扩展技术。它专为加速多媒体和信号处理任务而设计,允许在单…...
代码随想录算法训练day63---图论系列7《prim算法kruskal算法》
代码随想录算法训练 —day63 文章目录 代码随想录算法训练前言一、53. 寻宝—prim算法打印出来最小生成树的每条边 二、53. 寻宝—kruskal算法打印出来最小生成树的每条边 总结 前言 今天是算法营的第63天,希望自己能够坚持下来! 今天继续图论part&…...
算法日常刷题笔记(2)
为保持刷题的习惯 计划一天刷3-5题 然后一周总计汇总一下 这是第二篇笔记 笔记时间为2月17日到2月23日 第一天 找到初始输入字符串 找到初始输入字符串 Ihttps://leetcode.cn/problems/find-the-original-typed-string-i/ Alice 正在她的电脑上输入一个字符串。但是她打字技…...
C# httpclient 和 Flurl.Http 的测试
关于C#调用接口或Post,Flurl封装了httpclient, CSDN有哥们提供了一个公网的测试网站,可以测试Post调用,我写了2个函数,测试httpclient和Flurl使用Post: async 和 await 是成对使用的,为了接受web异步返回的数据,winfor…...
关于ES中text类型时间字段范围查询的结构化解决方案
前言 有关es中text类型的时间字段范围查询的问题,比如: {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…...
四元数 欧拉角
orientation 是表示物体在三维空间中的 旋转姿态 的数据结构。它通常使用 四元数(Quaternion) 来表示旋转。四元数是一种数学工具,用于描述三维空间中的旋转,相比欧拉角(Euler Angles)和旋转矩阵࿰…...
Linux项目自动化构建工具-make/Makefile (linux第六课)
目录 背景 介绍 依赖关系的格式 依赖方法的格式 原理 背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定…...
Java 登录框架
Java框架中常用的几种成熟的token生成框架对比 - 白露~ - 博客园 SpringBoot整合sa-token,jwt登录及拦截器鉴权Demo_只有在集成 sa-token-jwt 插件后才可以使用 extra 扩展参数-CSDN博客 推荐一款轻量级权限认证框架Sa-Token,集成JWT和Redis轻松实现认…...
人工智能、机器学习、深度学习和大语言模型之间的关系
人工智能(AI)、机器学习(ML)、深度学习(DL)和大语言模型(LLM)之间是逐层包含且技术递进的关系,具体如下: 1. 层级关系 人工智能(AI)…...
项目组合管理:优化项目选择与资源分配——从战略到实战的全流程指南
在复杂的商业环境中,企业往往需要同时推进多个项目以支撑战略目标。然而,资源有限、目标冲突、优先级模糊等问题常导致项目失败或资源浪费。项目组合管理(Project Portfolio Management, PPM) 正是解决这一痛点的系统性方法。它通…...
zabbix排障-zabbix监控的主机出现可用性灰色或者红色问题
目录 解决zabbix-agent可用性灰色的办法: 解决zabbix可用性红色的方法: 在zabbix日常的使用中 我们会遇到很多的问题 就比如今天我做好zabbix-server和zabbix-agent两台机器的配置 然后在wen页面上发现两台主机都有可用性的问题 如下图 解决zabbix-agent可用性灰色的办法: …...
C语言(13)------------>do-while循环
1.do-while循环的语法 我们知道C语言有三大结构,顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考: C语言(11)------------->while循…...
2025-spring boot 之多数据源管理
1、是使用Spring提供的AbstractRoutingDataSource抽象类 注入多个数据源。 创建 DataSourceConfig 配置类 通过spring jdbc 提供的带路由的抽象数据源 AbstractRoutingDataSource import org.springframework.beans.factory.annotation.Autowired; import org.springframew…...
自动驾驶两个传感器之间的坐标系转换
有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…...
DeepSeek 细节之 MoE
DeepSeek 细节之 MoE DeepSeek 团队通过引入 MoE(Mixture of Experts,混合专家) 机制,以“分而治之”的思想,在模型容量与推理成本之间找到了精妙的平衡点,其中的技术实现和细节值得剖思 Transformer 演变…...
SeaCMS V9海洋影视管理系统报错注入
漏洞背景 SQL 注入攻击是当前网络安全中最常见的一种攻击方式,攻击者可以利用该漏洞访问或操作数据库,造成数据泄露或破坏。通常发生在开发人员未能正确处理用户输入时。 在 SeaCMS V9 中,用户输入(如登录、评论、分页、ID 等&a…...
Cannot deserialize instance of java.lang.String out of START_ARRAY token
这个错误 Cannot deserialize instance of java.lang.String out of START_ARRAY token 表示 Jackson 正在尝试将一个 JSON 数组反序列化成一个 String 类型的字段,但是 JSON 中传递的是一个数组而不是单一的字符串。 具体来说,这段堆栈信息:…...
LeetCode 解题思路 1(Hot 100)
解题思路: 使用哈希表优化查找:利用哈希表存储已遍历元素的值及其索引,将查找时间从O(n)降至O(1)。一次遍历:遍历数组,对每个元素计算其补数(target - nums[i]),若补数存在于哈希表…...
js中的await与async的使用
以下两个方法,区别只在有没有catch,使用的时候却要注意 // 封装请求方法,同步loading状态出去 export const fetchWithLoading async (fn: Function, params: any, loading: Ref) > {loading.value true;try {return await fn(params);…...
蓝耘科技上线 DeepSeek 满血版,500万tokens免费送
🌟 嗨,我是Lethehong!🌟 🌍 立志在坚不欲说,成功在久不在速🌍 🚀 欢迎关注:👍点赞⬆️留言收藏🚀 🍀欢迎使用:小智初学…...
【入门音视频】音视频基础知识
🌈前言🌈 这个系列在我学习过程中,对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少,所以我希望通过这个音视频系列,跟大家一起学习音视频,希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…...
w~视觉~合集13
我自己的原文哦~ https://blog.51cto.com/whaosoft/13384038 #xxx w视觉合集13~17没了.... #ViTAR 作者提出了一种新颖的架构:任意分辨率的视觉 Transformer (ViTAR)。ViTAR中的自适应标记合并功能使模型能够自适应地处理可变分辨率图像…...
DeepSeek+Kimi 一键生成100种PPT
一 简介 PPT在工作中经常用到,无论是给老板汇报,还是同事、朋友之间的分享,或是去见投资人:) ,都离不开它,然而写PPT经常让人感觉不胜其烦,无论是逻辑的展开、还是页面的布局、字体、配图,都像个…...
【Qt之QQuickWidget】QML嵌入QWidget中
由于我项目开始使用Widgets,换公司后直接使用QML开发,没有了解过如何实现widget到qml过渡,恰逢面试时遇到一家公司希望从widget迁移到qml开发,询问相关实现,一时语塞,很尴尬,粗略研究并总结下。 对qwidget嵌…...
Apache Flink CDC (Change Data Capture) mysql Kafka
比如使用 Flink CDC , 监听mysql bin-log日志实现数据的实时同步, 发送到kafka springboot整合flink cdc监听数据库数据 阿里开源的神仙工具,完美实现数据同步!#程序员阿里开源的这个神器很好很强大。阿里开源的这个神器全面超越Canal,果然在…...
Week1_250217~250223_OI日志(待完善)
W1_250217~250223_OI日志 250217大致安排题目 250218大致安排题目 250219大致安排 250217 大致安排 上午讲了树上启发式合并,中午和下午补了上午的题,额外做了一道。 题目 U41492 树上数颜色 (老师自己出的,实在是太典中点了&…...
线性模型 - 学习总结
本文对前面博文中所学的机器学习的知识进行总结,以便整体上加深对机器学习的理解。 一、机器学习三要素:模型、学习准则、优化算法 机器学习是从有限的观测数据中学习(或“猜测”)出具有一般性的规律,并 可以将总结出来的规律推广应用到未观…...
IP----访问服务器流程
1.访问服务器流程 1.分层 1.更利于标准化 2.降低层次之间的关联性---每一层都只完成自身层次所执行的功能--每一层都在下层的基础上提供增值服务 1.应用层 抽象语言---编码---提供人机交互的接口 2.表示层 编码--二进制,压缩解压缩、格式转换 3.会话层 建立…...
Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南
问题描述 在 Visual Studio 中编写 C/C 代码时,使用 scanf、strcpy、fopen 等传统函数会触发以下警告: C4996: xxx: This function or variable may be unsafe. Consider using xxx_s instead. 根本原因: 这些函数缺乏缓冲区溢出检查&#…...
DeepSeek写俄罗斯方块手机小游戏
DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件: 核心功能要求 原生JavaScript实现,适配手机屏幕 …...
小程序高度问题背景scss
不同的机型,他的比例啥的都会不一样,同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…...
浅析 DeepSeek 开源的 FlashMLA 项目
浅析 DeepSeek 开源的 FlashMLA 项目 DeepSeek 开源周 Day 1(2025 年 2 月 24 日)放出的开源项目——FlashMLA,是一款针对 Hopper 架构 GPU 高效多层级注意力 (Multi-Level Attention, MLA) 解码内核,专门为处理变长序列问题而设…...
【Blender】二、建模篇--08,小狐狸角色建模
这堂课呢 我们来完成本套课程建模片的最后一个模型 小狐狸 这堂课呢 主要想让大家一起走一遍角色建模的一个基本流程 让你以后遇到类似的模型时候有一个基本的建模思路 那我们现在就开始吧 2 00:00:16,830 --> 00:00:24,390 我们还是在我们之前建模马拉松的那个文件里面继…...
【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶
本文目录 一、限流二、漏桶三、令牌桶算法四、Gin框架中实现令牌桶限流 一、限流 限流又称为流量控制,也就是流控,通常是指限制到达系统的并发请求数。 限流虽然会影响部分用户的使用体验,但是能一定程度上保证系统的稳定性,不至…...
MySQL 数据库基础
1. MySQL 数据库基础 在这一部分,我们将学习 MySQL 的基本概念和常见的数据库操作,帮助你掌握如何创建数据库、表,并进行数据的增、删、改操作。同时,我们还会探讨一些常见的错误示例及其原因,帮助你避免常见的陷阱。…...
如何查看java的字节码文件?javap?能用IDEA吗?
编译指令: javac YourProject.java 查看字节码文件的指令: javap -c -l YourProject.class 不添加-c指令就不会显示字节码文件: 不添加 -l 就不会显示源代码和字节码文件的对应关系: 添加-l之后多出来这些: IDEA不太…...
实战技巧:如何快速提高网站收录的权威性?
快速提高网站收录的权威性是一个系统性的工作,涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧,可以帮助你快速提升网站收录的权威性: 一、提升内容质量 原创性: 确保网站内容具备高质量与原创性&a…...
详解传输层协议TCP/UDP
传输层 传输层是OSI模型的第四层,主要负责端到端的数据传输,确保数据可靠、有> 序地从源设备传送到目标设备。其主要功能包括: 端到端通信:在源和目标设备之间建立连接,确保数据准确传输。数据分段与重组࿱…...
案例|某开关站室外轮式巡检机器人解决方案
随着电网规模的扩大和复杂性的增加,传统的GIS开关设备巡视工作面临着巨大的挑战。人工巡视不仅劳动强度大、效率低,而且难以保证巡视的准确性和全面性。此外,GIS设备通常位于复杂的环境中,如高海拔、高湿度、强电磁干扰等…...
穿越虚拟与现实:解密Linux进程的地址空间
在 Linux 操作系统中,每个进程都有独立的虚拟地址空间。虚拟地址空间是操作系统为每个进程提供的抽象内存模型,它使得每个进程都觉得自己拥有独立的内存,而不需要关心物理内存的具体布局。本文将深入探讨 Linux 进程的虚拟地址空间及其管理机…...
什么是MySql的主从复制(主从同步)?
主页还有其他面试题总结,有需要的可以去看一下,喜欢的就留个三连再走吧~ 1.什么是MySql的主从复制原理? 主从复制的核心就是二进制binlog(DDL(数据定义语言)语句和DML(数据操纵语言)…...
C++面向对象编程技术研究
一、引言 面向对象编程(OOP)是一种程序设计方法,它将现实世界中的实体抽象为“对象”,并通过类和对象来实现程序的设计。OOP的核心思想包括封装、继承和多态,这些特性使得程序更加模块化、易于扩展和维护。C作为一种支…...
MySQL 连表查询:原理、语法与优化
目录 引言 什么是连表查询? 连表查询的类型 1. 内连接(INNER JOIN) 2. 左连接(LEFT JOIN) 3. 右连接(RIGHT JOIN) 4. 全连接(FULL JOIN) 5. 交叉连接(…...