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

基于STM32的逻辑分析仪

目录

  • 制约性能因素
  • 协议
    • 命令
    • 下位机回复
      • CMD_ID的回复
      • CMD_METADATA命令的回复
      • 上报的采样数
    • 设置
    • 使用开源软件PulseView设置操作
      • 1.设置采样数
      • 2.设置采样频率
      • 3.使能或禁止通道
      • 4.设置通道的触发条件
  • 实现
    • 准备
      • 汇编指令
      • 精确测量时间
    • 程序
      • C语言初实现
        • 采集数据
        • 上报数据
      • 使用汇编提高采样率

制约性能因素

逻辑分析仪的方案有很多种,产品级别的一般都使用FPGA进行数据采集。

仅使用stm32比较简易,有以下制约因素

  • 内存大小
  • 数据采集速率
  • 上报速率

协议

使用SUMP协议,使用串口通信

命令

命令命令值作用
CMD_RESET0x00复位下位机
CMD_ID0x02让下位机上报ID
CMD_METADATA0x04让下位机上报参数
CMD_SET_BASIC_TRIGGER_MASK00xC0使能某个通道的触发功能
示例数值:0x01 0x02 0x00 0x00
表示channel0, 9 使能了触发功能
CMD_SET_BASIC_TRIGGER_VALUE00xC1设置通道的触发值
示例数值:0x01 0x00 0x00 0x00
表示channel 0的触发值为高电平
channel 9的触发值为低电平
CMD_SET_BASIC_TRIGGER_CONFIG00xC2最后一个字节的bit3为1表示启动触发功能
示例数值:0x00 0x00 0x00 0x08
CMD_SET_DIVIDER0x80根据用户设置的采样频率计算出分频系数
注意:
当采样频率大于100MHz时,会"Enable demux mode",让逻辑分析工作于200MHz,分频系数=200MHz/采样频率 - 1
当采样频率小于100MHz时,分频系数=100MHz/采样频率 - 1
示例数值:0xf3 0x01 0x00 0x00
0x01f3=499=100MHz/200KHz - 1
CMD_CAPTURE_SIZE0x81使用1个命令发送READCOUNT、DELAYCOUNT两个参数
示例数值:0x0c 0x00 0x0c 0x00
前2字节表示要采样的次数为0x0c * 4 = 48
后2字节表示要延迟的次数为0x0c * 4 = 48
CMD_SET_FLAGS0x82设置flag,比如使用启动demux模式,根据用户选择的通道,使能group(见后面注释)
CMD_CAPTURE_DELAYCOUNT0x83示满足触发条件开始采样后,延迟多少次采样,才保存数据
示例数值:0x0c 0x00 0x00 0x00
表示延迟次数为0x0c * 4 = 48
CMD_CAPTURE_READCOUNT0x84表示要采样的次数
示例数值:0x0c 0x00 0x00 0x00
表示采样次数为0x0c * 4 = 48

下位机回复

CMD_ID的回复

上位机发送CMD_ID后,下位机要回复ID

CMD_METADATA命令的回复

上报的数据类别上报的数据说明
0x01“name”名字
0x20大字节序的4字节最大采样通道数
0x21大字节序的4字节保存采样数据的buffer大小
0x22大字节序的4字节动态内存大小(未使用)
0x23大字节序的4字节最大采样频率
0x24大字节序的4字节协议版本
0x401字节最大采样通道数
0x411字节协议版本
0x00结束标记

上报的采样数

它上报的数据是:先上报最后一个采样的数据,最后上报第1个采样点的数据。

设置

  • 采样次数

  • 采样频率

  • 对引脚分组,如有32个引脚,可分为group1到4,group1:channel0~7,group2:8 ~ 15等等。一个组上报一个字节的数据
    如果只想使用某些引脚,需要使能或禁止通道。如果禁止group1,需上报3个字节的数据,如果禁止channel2,仍需上报4个字节(组中所有通道都被禁止了,组对应的字节才不需要采集)

  • 由于内存很小,都采集的话浪费内存,可以选择设置采集的触发条件

使用开源软件PulseView设置操作

1.设置采样数

在这里插入图片描述

2.设置采样频率

在这里插入图片描述

3.使能或禁止通道

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b03d74ee94a64b2d83900d33775cd94d.png
当groupn里8个通道都禁止的话,那么一次采样就可以少传输1字节。比如group3里的channe116~channel23都被禁止后,一次采样就可以得到3字节数据,bit16原来对应channel16,现在对应channel24,以此类推。

4.设置通道的触发条件

可以设置采样的触发条件(对于使能了触发的多个通道,只要有某个通道的值符合触发条件了,所有通道都会开始采样):在这里插入图片描述

实现

由于单片机内存小,速度慢,为了实现最高频率采样,采用汇编代码,并且要测量出汇编代码的执行时间,一条汇编指令耗费的时间。当使用较低的采样率时,可以加入延时

准备

汇编指令

  • 读指令(load):LDR(4bit)LDRH(2bit)LDRB(1bit)把数据从内存加载到寄存器中。

  • 写指令(store):STR(4bit)STRH(2bit)STRB(1bit)将寄存器中的数据存储到内存中

  • LDR R0,[R1] //去R1表示的地址读4个字节的数据到CPU的R0寄存器

  • LDR R1,=0x20000000 //伪指令:编译器会帮我们替换为真正的指令,标识:= 表示把后面的地址 0x20000000加载到 R1 寄存器中,也就是说 R1 现在存储的是一个内存地址

  • STR R0,[R1] //吧R0的数据写到R1所指示的位置

  • 读GPIO两条指令:
    LDR R1,=0x20000000
    LDR R0,[R1]

  • 延时指令
    NOP

精确测量时间

采用示波器或更高级的逻辑分析仪来测量每次操作的耗时(可通过测量GPIO引脚高电平的时间)

void MeasureTime(void)
{/* 先让引脚为低电平 */HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET);HAL_Delay(100);/*关中断*/__disable_irq();/*汇编指令*/asm_measure();/*开中断*/__enable_irq();}
THUMBAREA    |.text|, CODE, READONLY; asm_measure handler
asm_measure    PROCEXPORT  asm_measure; 设置PA15输出高电平LDR R1, =0X40010810LDR R0, =(1<<15)STR R0, [R1]LDR  R1, =0x40010C08LDR  R0, [R1]  ; 读GPIOB_IDR100次LDR  R0, [R1]  ; 读GPIOB_IDR100次LDR  R0, [R1]  ; 读GPIOB_IDR100次......LDR  R0, [R1]  ; 读GPIOB_IDR100次LDR  R0, [R1]  ; 读GPIOB_IDR100次     ; 设置PA15输出低电平LDR R1, =0X40010810LDR R0, =(1<<31)STR R0, [R1]BX LRENDP

使用汇编来操作GPIO,发现读100次GPIO,耗时4.36us
类似的,可以利用
LDR R1, =0x20000000 LDR R0, [R1] ;
重复执行若干次来测量读内存的时间,测得一次读内存约为15ns
写内存,NOP,逻辑左移右移,加法减法的操作也是类似
还可通过执行某一段代码,在其前面禁用中断,可测出中断函数的时间

精确测量的时间如下

操作汇编指令耗时
读取 GPIO0//R1 为 0x40010C08
LDR R0, [R1]
44ns
读内存//R1 为 0x20000000
LDR R0, [R1]
15ns
写内存//R1 为 0x20000000
STRB R0, [R1]
16ns
NOP 指令NOP15ns
逻辑右移LSR R0, #824ns
累加ADD R0, #123ns
Tick 中断处理10us

逻辑分析仪读取数据需以下几步

  • 读GPIO,逻辑右移
  • 写内存,累加地址
  • (是否)延时

去掉延时,循环一次耗时44+24+16+23=107ns,理论上最高的采样频率=1/107ns=9MHz
而STM32F103C8的内存为20K,即使全部用来保存采样的数据,也只能保存20*1024/9000000=0.002秒
在有限的内存里,我们需要提高内存的使用效率:不变的数据就不要保存了

  • 定义两个数组uint8_t data_buf[5000],uint8_t cnt_buf[5000]
  • 以比较高的、频率周期性地读取GPIO的值
  • 只有GPI0值发生变化了,才存入data_buf[i++];GPIO值无变化时,cnt_buf[i-1]累加

程序

C语言初实现

采集数据

①禁止中断:这是为了在采集数据时以最快的频率采集,不让中断干扰。但要保留串口中断
,原因在于:上位机可能发来命令停止采样。
②等待触发条件:用户可能设置触发采样的条件
③触发条件满足后,延时一会:没有必要
④循环:以最高频率采样
退出的条件有三:收到上位机发来的停止命令、采集完毕、数据buffer已经满
⑤恢复中断

static void start (void)
{uint8_t data;uint8_t pre_data;volatile uint16_t *data_reg = (volatile uint16_t *)0x40010C08; /* GPIOB_IDR */g_convreted_sample_count = g_sampleNumber * (MAX_FREQUENCY / g_samplingRate);get_stop_cmd = 0;g_cur_pos = 0;g_cur_sample_cnt = 0;(void)pre_data;(void)pa15_reg;/* 除了串口中断,其他中断都禁止 */Disable_TickIRQ();memset(g_rxcnt_buf, 0, sizeof(g_rxcnt_buf));/* 等待触发条件 */if (g_triggerState && g_triggerMask){while (1){data = (*data_reg) >> 8;if (data & g_triggerMask & g_triggerValue)break;if (~data & g_triggerMask & ~g_triggerValue)break;if (get_stop_cmd)return;}}data = (*data_reg) >> 8;g_rxdata_buf[0] = data;g_rxcnt_buf[0] = 1;g_cur_sample_cnt = 1;pre_data = data;/* 采集数据 */while (1){        /* 读取数据 */data = (*data_reg) >> 8;/* 保存数据 */        g_cur_pos += (data != pre_data)? 1 : 0; /* 数据不变的话,写位置不变 */g_rxdata_buf[g_cur_pos] = data;         /* 保存数据 */g_rxcnt_buf[g_cur_pos]++;               /* 增加"相同的数据"个数 */g_cur_sample_cnt++;                     /* 累加采样个数 */pre_data = data;/* 停止条件 *//* 串口收到停止命令 */if (get_stop_cmd)break;/* 采集完毕 */if (g_cur_sample_cnt >= g_convreted_sample_count)break;/* buffer满 */if (g_cur_pos >= BUFFER_SIZE)break;/* 根据实际情况加入延时凑出1MHz */__asm volatile( "nop" );__asm volatile( "nop" );......__asm volatile( "nop" );}/* 使能被禁止的中断 */Enable_TickIRQ();
}
上报数据
static void upload (void)
{int32_t i = g_cur_pos;uint32_t j;uint32_t rate = MAX_FREQUENCY / g_samplingRate;int cnt = 0;uint8_t pre_data;uint8_t data;uint8_t rle_cnt = 0;for (; i >= 0; i--){for (j = 0; j < g_rxcnt_buf[i]; j++){cnt++;  if (cnt == rate) {if (g_flags & CAPTURE_FLAG_RLE){/* RLE : Run Length Encoding, 将连续出现的相同数据,用该数据的值以及出现的次数来表示, 在传输重复的数据时可以提高效率,但会少一个通道 */data = g_rxdata_buf[i] & ~0x80; /* 使用RLE时数据的最高位要清零 */;if (rle_cnt == 0){pre_data = data;rle_cnt = 1;}else if (pre_data == data){rle_cnt++; /* 数据相同则累加个数 */}else if (pre_data != data){/* 数据不同则上传前面的数据 */if (rle_cnt == 1) /* 如果前面的数据只有一个,则无需RLE编码 */uart_send(&pre_data, 1, 100, 0);else{/* 如果前面的数据大于1个,则使用RLE编码 */rle_cnt = 0x80 | (rle_cnt - 1);uart_send(&rle_cnt, 1, 100, 0);uart_send(&pre_data, 1, 100, 0);}pre_data = data;rle_cnt = 1;}if (rle_cnt == 128){/* 对于只有8个通道的逻辑分析仪, 只使用1个字节表示长度,最大长度为128,当相同数据个数累加到128个时,就先上传 */rle_cnt = 0x80 | (rle_cnt - 1);uart_send(&rle_cnt, 1, 100, 0);uart_send(&pre_data, 1, 100, 0);rle_cnt = 0;}}else{/* 上位机没有起到RLE功能则直接上传 */uart_send(&g_rxdata_buf[i], 1, 100, 0);}cnt = 0;}}}

使用汇编提高采样率

使用汇编采集数据,可使得最高采样率达到2MHz

BUFFER_SIZE equ 3100  ; 注意这个数值要跟logicanalyzer.c中的BUFFER_SIZE保持一致THUMBAREA    |.text|, CODE, READONLY; sample_function handler
sample_function    PROCEXPORT  sample_functionIMPORT g_rxdata_bufIMPORT g_rxcnt_bufIMPORT g_cur_posIMPORT g_cur_sample_cntIMPORT get_stop_cmdIMPORT g_convreted_sample_countPUSH     {R4, R5, R6, R7, R8, R9, R10, R11, R12, LR}LDR R0, =g_rxdata_buf  ; 得到这些变量的地址LDR R1, =g_rxcnt_buf   ; 得到g_rxcnt_buf变量的地址LDR R2, =g_cur_pos     ; 得到g_cur_pos变量的地址LDR R2, [R2]           ; 得到g_cur_pos变量的值LDR R3, =g_cur_sample_cntLDR R3, [R3]LDR R4, =get_stop_cmdLDR R5, =g_convreted_sample_countLDR R5, [R5]LDR R8, [R0]  ; pre_dataLDR R10, =BUFFER_SIZELDR  R6, =0x40010C08LDR LR, =(1<<31)
Loop  LDRH R7, [R6]  ; 读GPIOB_IDRLSR R7, #8    ; data = (*data_reg) >> 8;CMP R7, R8ADDNE R2, #1  ; g_cur_pos += (data != pre_data)? 1 : 0;STRB R7, [R0, R2] ; g_rxdata_buf[g_cur_pos] = data;    MOV R8, R7        ; pre_data = dataLDR R7, [R1, R2, LSL #2] ; R7 = g_rxcnt_buf[g_cur_pos]ADD R7, #1STR R7, [R1, R2, LSL #2] ; g_rxcnt_buf[g_cur_pos]++;ADD R3, #1    ; g_cur_sample_cnt++;CMP R3, R5    ; if (g_cur_sample_cnt >= g_convreted_sample_count) break;BGE LoopDoneLDR R7, [R4]  ; R7 = get_stop_cmdCMP R7, #0    ; if (get_stop_cmd) break;BNE LoopDoneCMP R2, R10    ; if (g_cur_pos >= BUFFER_SIZE) break;BGE LoopDoneNOPNOP         ; 延时, 凑出2MHzB LoopLoopDoneLDR R0, =g_cur_pos     ; 得到g_cur_pos变量的地址,并不是得到它的值STR R2, [R0]           ; 保存g_cur_pos变量的值LDR R0, =g_cur_sample_cntSTR R3, [R0]           ; 保存g_cur_sample_cnt变量的值POP     {R4, R5, R6, R7, R8, R9, R10, R11, R12, PC}ENDP

相关文章:

基于STM32的逻辑分析仪

目录 制约性能因素协议命令下位机回复CMD_ID的回复CMD_METADATA命令的回复上报的采样数 设置使用开源软件PulseView设置操作1&#xff0e;设置采样数2&#xff0e;设置采样频率3.使能或禁止通道4.设置通道的触发条件 实现准备汇编指令精确测量时间 程序C语言初实现采集数据上报…...

mapbox高阶,结合threejs(threebox)添加管道

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Tube静态对象二、🍀使用thr…...

使用PySpark进行大数据处理与机器学习实战指南

1. 技术介绍 1.1 PySpark概述 PySpark是Apache Spark的Python API&#xff0c;它结合了Python的易用性和Spark的分布式计算能力&#xff0c;能够高效处理PB级数据集。Spark基于内存计算的特性使其比传统Hadoop MapReduce快10-100倍&#xff0c;支持流处理、SQL查询、机器学习…...

注意力机制-学习

1. 自注意力机制 句子&#xff1a;"The animal didnt cross the street because it was too tired." 在这个句子中&#xff0c;“it”指的是“animal”. 在自注意力机制中&#xff0c;当我们处理到“it”这个词时&#xff0c;模型会计算“it”与句子中其他所有词的…...

华纳云:香港服务器出现带宽堵塞一般是什么原因?

香港服务器带宽堵塞的原因通常可以归结为以下几个方面&#xff1a; 1. 机房带宽资源有限 (1)香港本地国际带宽成本高 香港的国际出口带宽昂贵&#xff0c;机房通常提供的带宽较小(如默认1Mbps-5Mbps)&#xff0c;如果多个用户争抢有限的带宽&#xff0c;就会出现网络拥堵、丢包…...

我们在开发时,什么时候用到虚函数和纯虚函数?

在曾经学习面向对象的概念上&#xff0c;对虚函数和纯虚函数的区别&#xff0c;我们都会止于这样的理解层面&#xff1a;虚函数是用于被子类可继承可重写的函数&#xff0c;而纯虚函数是子类继承后就必须重写的函数。但是在开发工作上&#xff0c;却有很多开发者是没法彻底参透…...

Python:lambda结合if判断,内置函数与拆包

lambda的应用&#xff1a; #a,b是形参&#xff0c;比较大小 complambda a,b:"a<b" if a<b else "a>b" print(comp(8,5)) 特点&#xff1a;lambda只能实现简单的逻辑&#xff0c;如果逻辑复杂且代码量较大&#xff0c;不建议使用lambda降低代码的…...

【Java学习】包装类

面向对象系列九 包装类变量 一、装箱 1.实例化包装对象 2.静态缓存池 3.写法 二、拆箱 包装类变量 每个基本数据类型都有对应的基本类型的包装类变量&#xff0c;将基本数据类型通过对应的包装类对象载入着进入到类与对象面向对象体系 一、装箱 Integer.valueOf(int) —…...

从新手到专家:嵌入式代码空间优化技巧

目录 一、基本概念 内存开销 优化目标 二、存储管理 数据类型选择 变量作用域 结构体对齐 三、代码结构 循环优化 函数调用 分支语句 查表法的动态扩展 查表法与算法结合 指针替代数组(续) 指针与动态内存结合 指针与函数指针结合 常量优化(续) 常量传播与…...

本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件

文章目录 前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问 前言 今天我要给大家安利一个超酷的私有化音乐神器——Navidrome&#xff01;它不仅让你随时随地畅享本地音乐…...

AI自动化编程初探

先说vscodeclinemodelscope方案&#xff0c;后面体验trae或者cursor再写写其它的。vscode和trae方案目前来说是免费的&#xff0c;cursor要用claud需要付费&#xff0c;而且不便宜&#xff0c;当然效果可能是最好的。 vscode方案&#xff0c;我的经验是最好在ubuntu上&#xff…...

KUKA机器人:智能制造的先锋力量

在科技日新月异的今天&#xff0c;自动化和智能化已成为推动制造业转型升级的重要引擎。作为全球领先的智能、资源节约型自动化解决方案供应商&#xff0c;KUKA机器人在这一浪潮中扮演着举足轻重的角色。本文将带您深入了解KUKA机器人的发展现状&#xff0c;探索其在智能制造领…...

2021 年 9 月青少年软编等考 C 语言六级真题解析

目录 T1. 合法出栈序列思路分析T2. 奇怪的括号思路分析T3. 区间合并思路分析T4. 双端队列思路分析T1. 合法出栈序列 题目链接:SOJ D1110 给定一个由不同小写字母构成的长度不超过 8 8 8 的字符串 x x x,现在要将该字符串的字符依次压入栈中,然后再全部弹出。要求左边的字…...

java快速输入

带解析 package Month3; import java.util.*; import java.io.*; public class Demo100843 {static class Reader{BufferedReader bf new BufferedReader(new InputStreamReader(System.in));StringTokenizer st new StringTokenizer("");String next() throws IO…...

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

AntV_G6实现UI树

UI 树的实现 背景 目前需要实现一个 UI 树&#xff0c;用于展示设备树&#xff0c;以及设备树中设备的属性。与树状列表不同&#xff0c;UI 树需要有特定的交互方式&#xff0c;支持边以及当前节点的点击事件。 实现效果【复制到.html文件夹就看见了】 总体效果 点击节点效果…...

【0016】Python数据类型-不可变集合详解

如果你觉得我的文章写的不错&#xff0c;请关注我哟&#xff0c;请点赞、评论&#xff0c;收藏此文章&#xff0c;谢谢&#xff01; 本文内容体系结构如下&#xff1a; 在Python中&#xff0c;除了我们常见的可变集合&#xff08;Set&#xff09;外&#xff0c;还有一种不可…...

学习资料电子版 免费下载的网盘网站(非常全!)

我分享一个私人收藏的电子书免费下载的网盘网站&#xff08;学习资料为主&#xff09;&#xff1a; link3.cc/sbook123 所有资料都保存在网盘了&#xff0c;直接转存即可&#xff0c;非常的便利&#xff01; 包括了少儿&#xff0c;小学&#xff0c;初中&#xff0c;中职&am…...

ROS2学习笔记2

前言 本篇文章属于ROS2humble的学习笔记&#xff0c;来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili …...

为什么大模型网站使用 SSE 而不是 WebSocket?

在大模型网站&#xff08;如 ChatGPT、Claude、Gemini 等&#xff09;中&#xff0c;前端通常使用 EventSource&#xff08;Server-Sent Events, SSE&#xff09; 来与后端对接&#xff0c;而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…...

利用阿里云Atlas地区选择器与Plotly.js实现数据可视化与交互

在数据科学与可视化领域&#xff0c;交互式图表和地图应用越来越成为数据分析和展示的重要手段。本文将介绍如何结合阿里云Atlas地区选择器与Plotly.js&#xff0c;创建动态交互式的数据可视化应用。 一、阿里云Atlas地区选择器简介 阿里云Atlas是阿里云的一款数据可视化产品…...

尚硅谷TS快速入门笔记(个人笔记用)

TypeScript 快速上手 &#x1faa9; 禹神&#xff1a;三小时快速上手TypeScript&#xff0c;TS速通教程_哔哩哔哩_bilibili ⼀、TypeScript 简介 TypeScript 由微软开发,是基于 JavaScript 的⼀个扩展语⾔。 TypeScript 包含了 JavaScript 的所有内容,即: TypeScript 是 Jav…...

python: DDD+ORM using oracle 21c

sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…...

KidneyTalk-open系统,RAG在医疗场景的真实落地:用于解决肾脏疾病的医疗问答问题

如何在保护隐私的前提下,本地部署大型语言模型(LLMs),以支持肾脏疾病的医学决策支持。难点包括:云端LLMs的数据泄露风险、本地部署的复杂性、通用LLMs在医学知识整合方面的不足、检索增强系统在医学文档处理和临床可用性方面的挣扎。Med-PaLM 2和MedFound在医学问答和临床…...

flask-定时任务

文章目录 前言一、APScheduler是什么二、APScheduler 主要功能&#xff1a;三、主要组成部分&#xff1a;四、典型使用场景&#xff1a;五、具体使用1.安装 APScheduler2.假设我们有一个需要五分钟请求一次http接口的任务1.定义一个scheduler.py去专门处理定时2.启动文件处理3.…...

6-langchang多模态输入和自定义输出

6-langchang多模态输入和自定义输出 多模态数据输入urlbase64url list工具调用自定义输出: JSON, XML, YAML如何解析 JSON 输出json如何解析xmlYAML解析器多模态数据输入 这里我们演示如何将多模态输入直接传递给模型。我们目前期望所有输入都以与OpenAI 期望的格式相同的格式…...

接口自动化入门 —— Http的请求头,请求体,响应码解析!

在接口自动化测试中&#xff0c;HTTP请求头、请求体和响应码是核心组成部分。理解它们的作用、格式和解析方法对于进行有效的接口测试至关重要。以下是详细解析&#xff1a; 1. HTTP 请求头&#xff08;Request Header&#xff09; 1.1 作用 请求头是客户端向服务器发送的附加…...

AI-NAS:当存储遇上智能,开启数据管理新纪元

在数据爆炸的时代&#xff0c;NAS&#xff08;网络附加存储&#xff09;已成为个人和企业存储海量数据的利器。然而&#xff0c;面对日益庞大的数据量&#xff0c;传统的NAS系统在文件管理和搜索效率上逐渐力不从心。AI-NAS应运而生&#xff0c;它将NAS与人工智能&#xff08;A…...

MWC 2025 | 移远通信推出AI智能无人零售解决方案,以“动态视觉+边缘计算”引领智能零售新潮流

在无人零售市场蓬勃发展的浪潮中&#xff0c;自动售货机正经历着从传统机械式操作向AI视觉技术的重大跨越。 移远通信作为全球领先的物联网整体解决方案供应商&#xff0c;精准把握行业趋势&#xff0c;在2025世界移动通信大会&#xff08;MWC&#xff09;上宣布推出全新AI智能…...

个人记录的一个插件,Unity-RuntimeMonitor

没有什么干货,仅仅是个人的记录 基于GUI做的一个工具:好处就是Monitor必须,Unity天然支持实时的Monitor;唯一不好处,就是默认字体太小了,layout居中,居右也是要自行设计的。 (下面文字是有一点点写错,但意思和功能就很牛逼了;并不是都按2 x shift,而是一个 shift 添…...

【C语言】考研复试上机代码题(基础篇)

文章目录 一、输入与输出1、温度转换2、排齐数据3、进制转换 二、选择分支结构1、分段函数求值2、成绩评定3、平闰年判定4、二次方程的根5、字符大小写 三、循环结构程序1、倒数求和4、判断数根5、打印菱形6、最大公约数7、最小公倍数8、复读机 四 、数组1、数组的批量增2、数组…...

video可以播放视屏但无法使用进度条点击快进/video的进度条失效无法点击

1、问题描述? 1、在SpringBoot+jQuery的$.get+HTML的video,进行动态加载视屏的时候,页面可以正常的播放视频,但是video自带的点击进度条快进视频功能失效。即如下进度条无法点击,只能顺序播放。 2、视频格式是mp4格式。 3、在主流的浏览器中都可以实现点击播放,但是进度…...

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型

DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型 文章目录 DeepSeekR1之四_在RAGFlow中配置DeepSeekR1模型1. 通过Ollama下载模型1. 下载DeepSeekR1模型2. 下载嵌入模型 2. 查看本地的Ollama模型3. 模型提供商中添加模型1. 打开模型提供商2. 选择Ollama待添加模型3. 添加DeepSee…...

electron + vue3 + vite 渲染进程与渲染进程之间的消息端口通信

渲染进程与渲染进程之间的通信有两种&#xff1a; 通过主进程进行消息转发&#xff08;通过组合主进程与渲染进程之间的单向、双向通信可以实现&#xff0c;可以自己动手尝试&#xff0c;该篇不讲解&#xff09;通过消息端口进行直接通信 该篇主要用示例讲解下单项目内多个窗口…...

MySQL性能调优实战手册:从慢查询到执行计划全解析

一、调优流程四步走 &#x1f680; 当我们遇到数据库调优问题的时候&#xff0c;该如何思考呢? 这里把思考的流程整理成下面这张图。 整个流程划分成了观察&#xff08;Show status&#xff09;和 行动(Action&#xff09;两个部分。字母S的部分代表观察&#xff08;会使用相…...

作为高数小白,我尝试理解概念:高数 - 导数

作为C#开发者&#xff0c;其实我是一个高数小白&#xff0c;可是我对它极其好奇&#xff0c;非常想了解它里面到底讲了什么内容&#xff0c;貌似这对于我是一个非常艰难的过程&#xff0c;因为完全没有接触过高等数学&#xff0c;可是又太想去了解。所以我计划开始慢慢学习它。…...

在 IntelliJ IDEA(2024) 中创建 JAR 包步骤

下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤&#xff1a; ​1. 选择File -> Project Structure->Artifacts&#xff0c; (1)点击➕新建&#xff0c;如下图所示&#xff1a; (2)选择JAR->Empty (3)输入jar包名称&#xff0c;确定输出路径 &#xff08;4&#…...

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …...

Mentalab Explore 在低密度 EEG 系统中的创新应用

在当今科技飞速发展的时代&#xff0c;脑电图&#xff08;EEG&#xff09;技术已成为神经科学研究、医疗诊断和教育领域广泛使用的工具。Mentalab Explore 作为一款专为灵活性和高效性设计的便携式低密度 EEG 系统&#xff0c;凭借其性能和多样的应用场景&#xff0c;正引领着便…...

Ubuntu 24.04.2 允许 root 登录桌面、 ssh 远程、允许 Ubuntu 客户机与主机拖拽传递文件

允许 root 登录桌面 修改 /etc/pam.d/gdm-autologin , /etc/pam.d/gdm-password 加 # 以注释掉 auth required pam_succeed_if.so user ! root quiet_success 允许 root 通过 ssh 登录 修改 /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin …...

ngx_openssl_create_conf

ngx_openssl_create_conf 声明在 src\event\ngx_event_openssl.c static void *ngx_openssl_create_conf(ngx_cycle_t *cycle); 定义在 src\event\ngx_event_openssl.c static void * ngx_openssl_create_conf(ngx_cycle_t *cycle) {ngx_openssl_conf_t *oscf;oscf ngx_…...

数学 二次函数

二次函数 就是计算一个抛物线。 抛物线的基本公式&#xff1a; 重点中的重点就是解决&#xff1a; &#xff08;开口方向&#xff1a; 对称轴&#xff0c;顶点&#xff0c;交点&#xff09; 这里的 y 和 x 就是 这个抛物线的个个点的坐标连成的线。 a 的正负 决定和大小决定…...

系统架构的评估的系统的质量属性

体系结构苹果可以针对一个体系结构&#xff0c;也可以针对一组体系结构。 体系结构评估过程中&#xff0c;评估人员所关注的是系统的质量属性&#xff0c;所有评估方法所普遍关注的质量属性有以下几个&#xff1a;性能、可靠性&#xff08;容错&#xff0c;健壮性&#xff09;…...

Facebook 的历史与发展:从校园网站到全球社交平台

引言 Facebook&#xff0c;这个全球最大的社交网络平台之一&#xff0c;其发展历程充满了创新和变革。从最初的校园网站到如今的全球社交平台&#xff0c;Facebook 不仅改变了人们的沟通方式&#xff0c;也重塑了信息传播和社交互动的模式。 起源&#xff1a;校园内的点子 Fa…...

开源、创新与人才发展:机器人产业的战略布局与稚晖君成功案例解析

目录 引言 一、开源&#xff1a;机器人产业的战略布局 促进技术进步和生态建设 吸引人才和合作伙伴 建立标准和网络效应 降低研发风险与成本 二、稚晖君&#xff1a;华为"天才少年计划"的成功典范 深厚的技术积累与动手能力 强烈的探索和创新意识 持续公开…...

Visual Studio 2022新建c语言项目的详细步骤

步骤1&#xff1a;点击创建新项目 步骤2&#xff1a;到了项目模板 --> 选择“控制台应用” (在window终端运行代码。默认打印"Hello World") --> 点击 “下一步” 步骤3&#xff1a;到了配置新项目模块 --> 输入“项目名称” --> 更改“位置”路径&…...

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突 Spring 容器的加载与隔离⽀持注解配置⽂件定位与容器初始化嵌套Spring容器的加载 隔离优化EagleEye traceId不⼀致问题原因解决 Spring 容器的加载与隔离 ⽀持注解 这个⽐较容易&#xff0c;主要是我们之前的应⽤不⽀持⼆⽅包内部的注解&#xf…...

【TMS570LC4357】之工程创建

备注&#xff1a;具体资料请在官网海淘.TMS570LC4357资料 1. 下载软件 官网下载对应的编译编辑工具如下图&#xff0c;主要是这两个&#xff0c;其它Flash工具等酌情考虑 安装软件&#xff0c;一直next就可以。安装后新建工程 2. 新建工程 如果不知道怎么建工程&#xff0…...

工作记录 2016-12-22

工作记录 2016-12-22 更新的问题 1、修改了Job Summary的Bill Amount的Bug。 2、修改了Account #的宽度。 3、修改了Clearinghouse Status的默认查询的条件。 4、修改了Upload Files的Add File的bug。 5、Pending Pool、Missing Infos加了Write Off&#xff0c;修改了Histor…...

若依-导出后端解析

针对若依框架微服务版本学习 若依导入导出功能的具体使用详见&#xff1a;后台手册 | RuoYi 1.导出逻辑&#xff1a; 导出文件的逻辑是先创建一个临时文件&#xff0c;等待前端请求下载结束后马上删除这个临时文件。但是有些下载插件&#xff0c;例如迅雷&#xff08;他们是二…...