在飞腾E2000Q开发板上,基于RT-Thread操作系统,实现DeepSeek语音交互
目录
一 ,简介
二 ,流程与结果分享
1. Phytium E2000q demo开发板连接
2. RT-Thread Kconfig 配置选择
(1)驱动
(2)软件包
3. 主要代码
(1)录音功能,将录音结果保存为PCM文件
(2)使用百度AI进行语音识别
(3)将识别内容上传至DeepSeek,并显示返回打印
4. 结果展示
一 ,简介
DeepSeek是由深度求索团队开发的大语言模型,本实验将基于DeepSeek-R1模型。结合百度AI语音识别,在嵌入式设备上实现实时聊天功能。
- 使用Rt-Thread的Phytium E2000Q demo开发板
- 插入SD卡,挂载RT-Thread DFS-V2 elm FatFs文件系统
- 安装Rt-Thread支持的webclient,mbedtls,cJSON,llm-chat软件包
- 使用Audio组件,实现实时录音功能,将录音内容以PCM格式存入文件系统
- 使用webclient将PCM文件上传到百度语音识别AI服务端,识别后返回Json
- 将识别内容通过Webclient + mbedtls 上传至Deep-Seek服务端,使用llm-chat + cJson分析返回内容,在输出界面上实时打印返回内容。
二 ,流程与结果分享
1. Phytium E2000q demo开发板连接
按照官方指南,搭载RT-Thread运行环境
2. RT-Thread Kconfig 配置选择
(1)驱动
E2000Q demo自带的ES8336驱动需要I2C支持,I2C设备也需要勾选
勾选I2S设备,并按下图配置采样率和采样位数
(2)软件包
WebClient,并支持MbedTLS
cJSON支持,用于分析返回json
llm 用于创建与DeepSeek的连接,若无配置选项,可下载后放置于bsp\phytium\aarch64\packages下,开源仓库:https://github.com/Rbb666/llm_chat
3. 主要代码
(1)录音功能,将录音结果保存为PCM文件
/* pcm_record.c */
#include <rtthread.h>
#include <rtdevice.h>
#include <dfs_posix.h>#define RECORD_TIME_MS 5000
#define RT_I2S_SAMPLERATE 8000
#define RECORD_CHANNEL 2
#define RECORD_CHUNK_SZ ((RT_I2S_SAMPLERATE * RECORD_CHANNEL * 2) * 20 / 1000)#define SOUND_DEVICE_NAME "I2S0" /* Audio 设备名称 */
static rt_device_t mic_dev; /* Audio 设备句柄 */int pcm_record()
{int fd = -1;uint8_t *buffer = NULL;int length, total_length = 0;fd = open("file.pcm", O_WRONLY | O_CREAT);if (fd < 0){rt_kprintf("open file for recording failed!\n");return -1;}buffer = rt_malloc(RECORD_CHUNK_SZ);if (buffer == RT_NULL)goto __exit;mic_dev = rt_device_find(SOUND_DEVICE_NAME);if (mic_dev == RT_NULL)goto __exit;rt_device_open(mic_dev, RT_DEVICE_OFLAG_RDONLY);while (1){length = rt_device_read(mic_dev, 0, buffer, RECORD_CHUNK_SZ);if (length){write(fd, buffer, length);total_length += length;}if ((total_length / RECORD_CHUNK_SZ) > (RECORD_TIME_MS / 20))break;}close(fd);rt_device_close(mic_dev);__exit:if (fd >= 0)close(fd);if (buffer)rt_free(buffer);return 0;
}
MSH_CMD_EXPORT(pcm_record, record voice to a pcm file); // 修改命令描述
(2)使用百度AI进行语音识别
使用百度语音之前,需要在百度AI官网上获取token,请按照官方教程获取百度AI开放平台-全球领先的人工智能服务平台
以短语音识别模型为例,其中get_llm_answer(item->valuestring)函数用于获取自然语言模型的输出结果并打印。
#include <rtthread.h>
#include <sys/socket.h>
#include <webclient.h>
#include <dfs_posix.h>
#include <cJSON.h> /* 使用外设需要的头文件 */
#include <rtdevice.h>
#include <board.h>#define RES_BUFFER_SIZE 4096 //数据接收数组大小
#define HEADER_BUFFER_SIZE 2048 //最大支持的头部长度/* URL 请在**处自己填写主要参数cuid, token */
#define POST_FILE_URL "http://vop.baidu.com/server_api?dev_pid=1537&cuid=**&token=**"
/*采样率与文件格式选择如下*/
char *form_data = "audio/pcm;rate=16000";
void baidu_voice_recignition()
{ char *filename = NULL;unsigned char *buffer = RT_NULL;int content_length = -1, bytes_read = 0;int content_pos = 0;int ret = 0;/* 获取pcm音频文件名 */filename = "file.pcm";/* 以只读方式打开音频文件 */int fd = open(filename, O_RDONLY, 0);if(fd < 0){rt_kprintf("open %d fail!\r\n", filename);goto __exit;}/* 获取pcm音频文件大小 */size_t length = lseek(fd, 0, SEEK_END);lseek(fd, 0, SEEK_SET);/* 创建响应数据接收数据 */buffer = (unsigned char *) web_malloc(RES_BUFFER_SIZE);if(buffer == RT_NULL){rt_kprintf("no memory for receive response buffer.\n");ret = -RT_ENOMEM;goto __exit;}/* 创建会话 */struct webclient_session *session = webclient_session_create(HEADER_BUFFER_SIZE);if(session == RT_NULL){ret = -RT_ENOMEM;goto __exit;}/* 拼接头部数据 */webclient_header_fields_add(session, "Content-Length: %d\r\n", length);webclient_header_fields_add(session, "Content-Type: %s\r\n", form_data);/* 发送POST请求 */int rc = webclient_post(session, POST_FILE_URL, NULL, 100);if(rc < 0){rt_kprintf("webclient post data error!\n");goto __exit;}else if (rc == 0){rt_kprintf("webclient connected !\n");}else{rt_kprintf("rc code: %d!\n", rc);}while(1){rt_memset(buffer, 0, RES_BUFFER_SIZE);length = read(fd, buffer, RES_BUFFER_SIZE);if(length <= 0){break;}ret = webclient_write(session, buffer, length);if(ret < 0){rt_kprintf("webclient write error!\r\n");break;} rt_thread_mdelay(100);}close(fd);rt_kprintf("Please wait ... \r\n");if(webclient_handle_response(session) != 200){rt_kprintf("get handle resposne error!");goto __exit;} /* 获取接收的响应数据长度 */content_length = webclient_content_length_get(session);rt_thread_delay(100);do{bytes_read = webclient_read(session, buffer, 1024);if (bytes_read <= 0){break;}for(int index = 0; index < bytes_read; index++){rt_kprintf("%c", buffer[index]);}content_pos += bytes_read;}while(content_pos < content_length); /* 解析json数据 */bd_data_parse(buffer);__exit:if(fd >= 0)close(fd);if(session != NULL)webclient_close(session);if(buffer != NULL)web_free(buffer);return;
}/*JSON数据分析*/
void bd_data_parse(uint8_t *data)
{cJSON *root = RT_NULL, *object = RT_NULL, *item =RT_NULL;root = cJSON_Parse((const char *)data);if (!root){rt_kprintf("No memory for cJSON root!\n");return;}object = cJSON_GetObjectItem(root, "result");item = object->child;rt_kprintf("\nQuestion :%s \r\n", item->valuestring);/*获取自然语言模型输出结果并打印*/get_llm_answer(item->valuestring);if (root != RT_NULL)cJSON_Delete(root);
}/*导出指令,便于阶段性测试*/
MSH_CMD_EXPORT(baidu_voice_recignition, webclient post file);
(3)将识别内容上传至DeepSeek,并显示返回打印
可以按照DeepSeek官方教程注册API_Key,但当前使用DeepSeekAPI可能会出现服务器崩溃,网络异常问题。因此建议使用火山引擎的DeepSeek模型。
创建API_Key
创建API_Key后,在在线推理栏中接入Deep-Seek模型,一般新创建的账号会提供免费的使用次数。
以上步骤Ok后,修改"llm_chat/ports/chat/port/chat_port.c"文件中的LLM_API_KEY ,LLM_API_URL, LLM_MODEL_NAME.
/** Copyright (c) 2006-2025, RT-Thread Development Team** SPDX-License-Identifier: MIT** Change Logs:* Date Author Notes* 2025/02/01 Rbb666 Add license info* 2025/02/03 Rbb666 Unified Adaptive Interface* 2025/02/06 Rbb666 Add http stream support*/
#include "llm.h"
#include "webclient.h"
#include <cJSON.h>#define LLM_API_KEY ""
#define LLM_API_URL ""#define LLM_MODEL_NAME ""
#define WEB_SOCKET_BUF_SIZE 80960static char authHeader[128] = {0};
static char responseBuffer[WEB_SOCKET_BUF_SIZE] = {0};
static char contentBuffer[WEB_SOCKET_BUF_SIZE] = {0};char *get_llm_answer(const char *inputText)
{struct webclient_session *webSession = NULL;char *allContent = NULL;int bytesRead, responseStatus;cJSON *responseRoot = NULL;// Create web sessionwebSession = webclient_session_create(WEB_SOCKET_BUF_SIZE);if (webSession == NULL){rt_kprintf("Failed to create webclient session.\n");goto cleanup;}// Create JSON payloadcJSON *requestRoot = cJSON_CreateObject();cJSON *model = cJSON_CreateString(LLM_MODEL_NAME);cJSON *messages = cJSON_CreateArray();cJSON *systemMessage = cJSON_CreateObject();cJSON *userMessage = cJSON_CreateObject();cJSON_AddItemToObject(requestRoot, "model", model);cJSON_AddItemToObject(requestRoot, "messages", messages);
// #ifdef PKG_LLMCHAT_STREAMcJSON_AddBoolToObject(requestRoot, "stream", RT_TRUE);
// #else// cJSON_AddBoolToObject(requestRoot, "stream", RT_FALSE);
// #endifcJSON_AddItemToArray(messages, systemMessage);cJSON_AddItemToArray(messages, userMessage);cJSON_AddStringToObject(systemMessage, "role", "system");cJSON_AddStringToObject(systemMessage, "content", "");cJSON_AddStringToObject(userMessage, "role", "user");cJSON_AddStringToObject(userMessage, "content", inputText);char *payload = cJSON_PrintUnformatted(requestRoot);if (payload == NULL){rt_kprintf("Failed to create JSON payload.\n");goto cleanup;}// Prepare authorization headerrt_snprintf(authHeader, sizeof(authHeader), "Authorization: Bearer %s\r\n", LLM_API_KEY);// Add headerswebclient_header_fields_add(webSession, "Content-Type: application/json\r\n");webclient_header_fields_add(webSession, authHeader);webclient_header_fields_add(webSession, "Content-Length: %d\r\n", rt_strlen(payload));// LLM_DBG("HTTP Header: %s\n", webSession->header->buffer);// LLM_DBG("HTTP Payload: %s\n", payload);// Send POST requestresponseStatus = webclient_post(webSession, LLM_API_URL, payload, rt_strlen(payload));if (responseStatus != 200){rt_kprintf("Webclient POST request failed, response status: %d\n", responseStatus);goto cleanup;}// Read and process responsewhile ((bytesRead = webclient_read(webSession, responseBuffer, WEB_SOCKET_BUF_SIZE)) > 0){// printf("bytesRead == %d\n", bytesRead);int inContent = 0;for (int i = 0; i < bytesRead; i++){if (inContent){if (responseBuffer[i] == '"'){inContent = 0;// Append content to allContentchar *oldAllContent = allContent;size_t oldLen = oldAllContent ? rt_strlen(oldAllContent) : 0;size_t newLen = rt_strlen(contentBuffer);size_t totalLen = oldLen + newLen + 1;char *newAllContent = (char *)web_malloc(totalLen);if (newAllContent){newAllContent[0] = '\0';if (oldAllContent){rt_strcpy(newAllContent, oldAllContent);}strcat(newAllContent, contentBuffer);allContent = newAllContent;for (int i = 0; contentBuffer[i] != '\0'; i++) {// 当遇到 \n 时,替换为换行符if (contentBuffer[i] == '\\' && contentBuffer[i + 1] == 'n') {rt_kprintf("\r\n"); // 输出真正的换行符i++; // 跳过下一个字符 'n'} else {rt_kprintf("%c", contentBuffer[i]);}}rt_free(oldAllContent);}else{rt_kprintf("Memory allocation failed, content truncated!\n");}contentBuffer[0] = '\0'; // Reset content buffer}else{strncat(contentBuffer, &responseBuffer[i], 1);}}else if (responseBuffer[i] == '"' && i > 8 &&rt_strncmp(&responseBuffer[i - 10], "\"content\":\"", 10) == 0){inContent = 1;}}}rt_kprintf("\n");cleanup:// Cleanup resourcesif (webSession)webclient_close(webSession);if (requestRoot)cJSON_Delete(requestRoot);if (responseRoot)cJSON_Delete(responseRoot);if (payload)cJSON_free(payload);return allContent;
}
将之前的代码创建线程进行串联,请在合适位置执行voice_recignition()初始化线程
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <dfs_posix.h>
#include <string.h>/* 函数声明 */
extern int pcm_record();
extern void baidu_voice_recignition();/* 线程参数 */
#define THREAD_PRIORITY 25 //优先级
#define THREAD_STACK_SIZE 40096 //线程栈大小
#define THREAD_TIMESLICE 10 //时间片/* 线程句柄 */
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;/* 指向信号量的指针 */
static rt_sem_t start_record_sem = RT_NULL;
static rt_sem_t voice_recignition_sem = RT_NULL;/* 录音线程入口函数 */
static void record_entry(void *parameter)
{static rt_err_t result;while(1){result = rt_sem_take(start_record_sem, RT_WAITING_FOREVER);if (result != RT_EOK){rt_kprintf("take a dynamic semaphore, failed.\n");rt_sem_delete(start_record_sem);return;}else{rt_kprintf("take a dynamic semaphore, successfully.creat pcm file\n");pcm_record(); //获取到信号量,开始录音,生成pcm文件rt_sem_release(voice_recignition_sem); }rt_thread_mdelay(100);}
}/* 语音识别线程入口函数 */
static void voice_recignition_entry(void *parameter)
{while (1){if (rt_sem_take(voice_recignition_sem, RT_WAITING_FOREVER) == RT_EOK){baidu_voice_recignition(); //收到邮件,进行语音识别rt_thread_mdelay(100);}}
}/* start_record 函数 */
static void start_record(void *parameter)
{rt_kprintf("release a start_record_sem semaphore.\n");rt_sem_release(start_record_sem);
}MSH_CMD_EXPORT(start_record, record voice to a pcm file and uplode to deepseek);int voice_recignition(void)
{start_record_sem = rt_sem_create("start_record_sem", 0, RT_IPC_FLAG_FIFO);if (start_record_sem == RT_NULL){rt_kprintf("create dynamic semaphore failed.\n");return -1;}voice_recignition_sem = rt_sem_create("voice_recignition_sem", 0, RT_IPC_FLAG_FIFO);if (voice_recignition_sem == RT_NULL){rt_kprintf("create dynamic semaphore failed.\n");return -1;}/* 创建线程 */ tid1 = rt_thread_create("thread1",record_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (tid1 != RT_NULL)rt_thread_startup(tid1);tid2 = rt_thread_create("thread2",voice_recignition_entry, RT_NULL,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (tid2 != RT_NULL)rt_thread_startup(tid2);return 0;
}
4. 结果展示
以下是语音交谈的结果
以下是直接键入汉字的交流结果
参考文章:
软件包应用分享|基于RT-Thread的百度语音识别(一)_wx60dac676d6910的技术博客_51CTO博客
Deepseek上单片机?RT-Thread上跑通大语言模型-电子发烧友网
相关文章:
在飞腾E2000Q开发板上,基于RT-Thread操作系统,实现DeepSeek语音交互
目录 一 ,简介 二 ,流程与结果分享 1. Phytium E2000q demo开发板连接 2. RT-Thread Kconfig 配置选择 (1)驱动 (2)软件包 3. 主要代码 (1)录音功能,将录音结果保存…...
navicat导出postgresql的数据库结构、字段名、备注等等
1、执行sql语句 SELECT A.attnum AS "序号",C.relname AS "表名",CAST ( obj_description ( relfilenode, pg_class ) AS VARCHAR ) AS "表名描述",A.attname AS "字段名称",A.attnotnull as "是否不为null",(case when A…...
K8s 1.27.1 实战系列(三)安装网络插件
Kubernetes 的网络插件常见的有 Flannel 和 Calico ,这是两种主流的 CNI(容器网络接口)解决方案,它们在设计理念、实现方式、性能特征及适用场景上有显著差异。以下是两者的综合对比分析: 一、Flannel 和 Calico 1. 技术基础与网络实现 Flannel 核心机制:基于 Overlay …...
Python实现鼠标点击获取窗口进程信息
最近遇到挺无解的一个问题:电脑上莫名其妙出现一个白色小方块,点击没有反应,关也关不掉,想知道它和哪个软件有关还是显卡出了问题,也找不到思路,就想着要不获取一下它的进程号看看。 于是写了一个Python脚本…...
文件解析:doc、docx、pdf
1.doc解析 ubuntu/debian系统应先安装工具 apt-get install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr \ flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig pip install textract解析: import te…...
JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术 一、JDBC 是什么?为什么它如此重要? JDBC(Java Database Connectivity)是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...
【STM32】STM32系列产品以及新手入门的STM32F103
📢 STM32F103xC/D/E 系列是一款高性能、低功耗的 32 位 MCU,适用于工业、汽车、消费电子等领域;基于 ARM Cortex-M3,主频最高 72MHz,支持 512KB Flash、64KB SRAM,适合复杂嵌入式应用,提供丰富的…...
esp32驱动带字库芯片TFT屏幕
前言 学习esp32单片机开发,前段时间在网上买了一块2.0寸TFT屏幕。 长这个样子,这个屏幕带汉字字库的硬件模块。我仔细看了一下这个字库模块上面写的字是25Q32FVSIG 1336 文档 卖家也发来了开发文档,是个doc文档,张这个样子。 开…...
[Python入门学习记录(小甲鱼)]第5章 列表 元组 字符串
第5章 列表 元组 字符串 5.1 列表 一个类似数组的东西 5.1.1 创建列表 一个中括号[ ] 把数据包起来就是创建了 number [1,2,3,4,5] print(type(number)) #返回 list 类型 for each in number:print(each) #输出 1 2 3 4 5#列表里不要求都是一个数据类型 mix [213,"…...
网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析
在网络安全日益重要的今天,各国纷纷出台相关政策法规,以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0,分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…...
由麻省理工学院计算机科学与人工智能实验室等机构创建低成本、高效率的物理驱动数据生成框架,助力接触丰富的机器人操作任务
2025-02-28,由麻省理工学院计算机科学与人工智能实验室(CSAIL)和机器人与人工智能研究所的研究团队创建了一种低成本的数据生成框架,通过结合物理模拟、人类演示和基于模型的规划,高效生成大规模、高质量的接触丰富型机…...
leetcode15 三数之和
1.哈希法 为了避免重复 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> temple;//使用 set 来存储符合条件的三元组,避免重复vector<vector<int>> out;//存放最终输…...
5c/c++内存管理
1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…...
蓝桥备赛(11)- 数据结构、算法与STL
一、数据结构 1.1 什么是数据结构? 在计算机科学中,数据结构是一种 数据组织、管理和存储的格式。它是相互之间存在一种 或多种特定关系的数据元素的集合。 ---> 通俗点,数据结构就是数据的组织形式 , 研究数据是用什么方…...
C++ 二叉搜索树代码
C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...
Flask 打包为exe 文件
进入虚拟环境 激活虚拟环境 .venv\Scripts\activatepython build.py 完成标识图片 已经完成打包了,完成,下边是我自己记录的 这时候,我自己数据库文件夹下是没有sql 脚本的,要自己拷贝下这个路径下的文件 E:\开源文件\python-wi…...
JavaWeb-idea配置smart tomcat
一,安装smart tomcat插件 在插件市场搜索smart tomcat 点击安装,我已经安装成功。 二,web项目配置tomcat 点击这里,选择edit 进来之后,选加号 然后选tomcat 在这里,配置完毕后,点apply&…...
DELETE/ UPDATE/ INSERT 语句会自动加锁
在数据库系统中,DELETE、UPDATE 和 INSERT 语句通常会自动加锁,以确保数据的一致性和并发控制。具体的锁类型和效果取决于数据库的实现(如 MySQL、PostgreSQL 等)以及事务的隔离级别。以下是这些操作通常加锁的行为和效果…...
docker本地部署ollama
启动ollama容器 1.使用该命令启动CPU版运行本地AI模型 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 2.此命令用于启动GPU版本运行AI模型 前提是笔记本已配置NVIDIA的GPU驱动,可在shell中输入nvidia-smi查看详细情况…...
Linux线程机制
Linux 操作系统中的线程机制是基于 POSIX 线程(Pthreads) 标准实现的,通常称为 pthread。Linux 内核通过Native POSIX Thread Library提供了对多线程的支持。 1. 线程的基本概念 线程是进程中的一个执行单元,是 CPU 调度的基本单…...
LeetCode热题100JS(44/100)第八天|二叉树的直径|二叉树的层序遍历|将有序数组转换为二叉搜索树|验证二叉树搜索树|二叉搜索树中第K小的元素
543. 二叉树的直径 题目链接:543. 二叉树的直径 难度:简单 刷题状态:1刷 新知识: 解题过程 思考 示例 1: 输入:root [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或…...
Java与数据库
目录 一.本文焦点: 二.数据库常用数据类型 三.对数据库操作 四.对数据库中的表操作 五.条件表达 六. 表查询操作进阶 1.多表连接查询 1)交叉连接查询 2)内连接(取两表交集) 3)外连接 4)…...
MySQL表中数据基本操作
1.表中数据的插入: 1.insert insert [into] table_name [(column [,column]...)] values (value_list) [,(value_list)] ... 创建一张学生表: 1.1单行指定列插入: insert into student (name,qq) values (‘张三’,’1234455’); values左…...
基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中,地理信息系统(…...
蓝桥与力扣刷题(蓝桥 数字三角形)
题目: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述…...
6. PromQL的metric name(在node exporter复制下来交给AI解释的)
目录 前言: Go 运行时指标: Go 内存统计指标: CPU 指标: 内存指标: 磁盘指标: 网络指标: 系统指标: 前言: 写这个得目的是为了后续方便查询,因为在pro…...
Windows设置目录及子目录大小写不敏感暨git克隆报错同名文件已存在的解决办法
在Windows系统中设置目录及其子目录为大小写不敏感,可以通过以下步骤完成: 步骤说明: 以管理员身份运行命令提示符或PowerShell 右键点击“开始”菜单,选择“命令提示符(管理员)”或“Windows PowerShell&…...
关于tresos Studio(EB)的MCAL配置之GPT
概念 GPT,全称General Purpose Timer,就是个通用定时器,取的名字奇怪了点。定时器是一定要的,要么提供给BSW去使用,要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…...
VScode 中文符号出现黄色方框的解决方法
VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…...
WordPress使用(3)
前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置,本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...
Shell编程概述与Shell变量
目录 一、Shell编程基础 1.1、Shell脚本使用场景 1.2、Shell脚本的格式 1.3、Shell脚本的执行 1.4、Shell脚本错误调试 二、 重定向与管道符 2.1、重定向 2.2、管道符 三、Shell变量 3.1、变量分类 3.2、特殊符号 3.3、整数运算 3.4、read 3.5、局部变量与全局变量…...
使用QT + 文件IO + 鼠标拖拽事件 + 线程 ,实现大文件的传输
第一题、使用qss,通过线程,使进度条自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H#include <QObject> #include <QThread> #include <QDebug>class mythread : public QThread {Q_OBJECT public:mythread(QObject* …...
【电路笔记】-时序逻辑电路
时序逻辑电路 文章目录 时序逻辑电路1、概述2、时序逻辑的分类3、时序逻辑SR触发器4、NAND门SR触发器5、正NAND门SR触发器6、NOR门SR触发器7、时序逻辑作为开关去抖电路8、门控或时钟SR触发器时序逻辑电路使用触发器作为存储元件,其输出取决于输入状态。 1、概述 与组合逻辑电…...
随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…...
【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...
探索.NET 10 的新特性,开发效率再升级!
前言 最近,.NET 10 发布啦,作为长期支持(LTS)版本,接下来的 3 年里它会给开发者们稳稳的幸福。今天咱就来唠唠它都带来了哪些超实用的新特性。可在指定链接下载。 新特性 下面将介绍了.NET 10的新特性,其…...
< 自用文儿 > CertBot 申请 SSL 证书 使用 challenge 模式 避开防火墙的阻挡
环境: 腾讯 VPS 腾讯会向你销售 SSL , 这个本是免费的。CertBot 默认申请证书要用到 80 端口,会蹭边什么什么条款,备案法律来阻止80端口的通讯,没有网站也一样被阻拦。 通过腾讯买的域名: bestherbs.cn …...
系统架构评估方法-ATAM方法
架构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM) 是在SAAM的基础上 发展起来的,主要针对性能、实用性、安全性和可修改性,在系统开发之前,对这些质量属性 进行评价和折中。 (1)特定目标。 ATAM的目标是在考虑多个相互影响的质…...
deepseek在pycharm 中的配置和简单应用
对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…...
硬通货用Deekseek做一个Vue.js组件开发的教程
安装 Node.js 与 Vue CLI npm install -g vue/cli vue create my-vue-project cd my-vue-project npm run serve 通过 Vue CLI 可快速生成项目骨架,默认配置适合新手快速上手 目录结构 src/ ├── components/ # 存放组件文件 │ └── …...
类、方法和变量可使用的访问控制符和修饰符的表格展示
1. 类的修饰符 修饰符类别修饰符说明访问控制符public顶级类使用时,对所有包可见。嵌套类也可以使用。默认没有写访问修饰符时,仅在同一包内可见。protected (仅嵌套类)同一包内以及不同包的子类可见。private (仅嵌套类)仅在外部类内部可见。非访问修饰…...
FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
1. FreeRTOS 任务相关 API 函数 1.1 FreeRTOS 任务相关 API 函数介绍 FreeRTOS 提供了一系列 API 来管理任务的状态、优先级和运行信息。以下是任务管理相关的主要 API 及其功能说明: 1.1.1 任务优先级管理 API 函数作用uxTaskPriorityGet()获取任务的当前优先级…...
基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)
摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响,导致在真实临床环境中诊断不可靠。领域泛化(Domain Generalization, DG)方法旨在通过多领域训练提升模型在未知领域的性能,但…...
【C++】5.4.3 范围for语句
范围for语句基本形式: for(声明变量:序列容器) {循环执行语句; } 其中,“序列容器”是指花括号括起来的初始值列表、数组、vector或者string等类型的对象,主要特点是拥有能返回迭代器的 begin() 和 end() 成员; “声明变量”是一个类似声明…...
LeetCode 排序章节
快速排序 简单 LCR 159. 库存管理 III 仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限。 示例 1: 输入:stock [2,5,7,4], cnt 1 输出&a…...
常见的限流算法有哪些?
一、固定窗口算法(Fixed Window) 原理: 将时间划分为固定长度的窗口(如1秒、1分钟),每个窗口内统计请求次数,超过阈值则拒绝后续请求。例如:每秒限流100次,窗口结束后计…...
【pyqt】(十一)单选框
控件-单选框 单选框的类名为QRadioBox,在学习新的控件的时候, 需要掌握的内容主要除了属性之外,其信号触发方法也非常重要。还可以利用Designer来辅助我们进行学习,尤其是利用Designer的属性展示和设置。 单选框中,最…...
深度解析:视频软编码与硬编码的优劣对比
视频编码 一、基本原理与核心技术 压缩原理 通过时空冗余消除实现数据压缩: 空间冗余:利用帧内预测(如DC/角度预测)消除单帧内相邻像素相似性。时间冗余:运动估计与补偿技术(ME/MC)减少连续帧间…...
[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
参考原文:[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2 Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言…...
Lab 3 Page Table
题目链接 我的问题: 1 每个进程的kernel stack是干啥的来着?在何时初始化的? 题目2:A kernel page table per process (hard) 1 一些题目要求 Your first job is to modify the kernel so that every process uses its own c…...