K7系列FPGA多重启动(Multiboot)
Xilinx 家的 FPGA 支持多重启动功能(Multiboot),即可以从多个 bin 文件中进行选择性加载,从而实现对系统的动态更新,或系统功能的动态调整。
这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而同时 Xilinx 也提供了 ICAP 原语,给用户提供了访问配置功能的权限(对于 7 series 的芯片,需要使用 ICAPE2 原语),从而获得更加灵活的多重启动方式。
本文即介绍 Multiboot 以及这两种启动方式,并对两种 Multiboot 进行实现。
文章目录
- 多重启动(Multiboot)
- Golden Image Initial System Setup
- Initial MultiBoot Image System Setup
- IPROG 说明
- WBSTAR 寄存器
- Watchdog 计数器
- 从 ICAPE2 原语启动 Multiboot 介绍
- ICAPE2 原语
- 嵌入 IPROG 命令启动 Multiboot 介绍
- 嵌入 IPROG 的操作流程
- ICAPE2 启动 Multiboot 代码示例
- Multiboot_ctrl.v
- 测试
- 参考文献
多重启动(Multiboot)
首先对 Multiboot 的流程进行一下介绍,
如图所示,在实现多重启动时,FLASH 中会保存多个 bin 文件,其中保存在 0 地址的称为 Golden 镜像,而其他的被称为 Multiboot 镜像(也称为 Update 镜像),这里就以 2 个 Image 为例进行说明。
一般地,对于单个 bin 的情况,可以直接向 FLASH 烧录 .bin 文件,也可以烧录对应生成的 .mcs;而如果要烧录多个版本的镜像,则可以在生成 .mcs 时在不同地址载入多个不同的 bit 文件,然后下载这个 .mcs 文件。
Golden Image Initial System Setup
在上图所示的 Golden Image Initial System Setup 启动模式下,上电后 FPGA 会自动加载 Golden 镜像,随后尝试加载 Multiboot 镜像,以重新配置 FPGA,实现代码的更新/功能的更替。
在这种启动方式下:
- IPROG 命令被嵌入在 Golden Image 里(指将 IPROG 命令嵌在比特流文件里),或者通过 Golden Image 里编写的 ICAPE2 原语程序启动对 Multiboot Image 的读取;
- Multiboot Image 应当存储在热启动起始地址寄存器( Warm Boot Start Address Register, WBSTAR )指定的地址处;
- 应当启动 Watchdog 计时器,以在编程失败的情况下执行恢复操作。
在回退(fallback)发生时,嵌入的 IPROG 指令将被忽略,因此不会陷入反复触发加载 Multiboot 的死循环。在回退完成后,WBSTAR 将被 bitstream 重写。
Initial MultiBoot Image System Setup
也可以在上电后先启动 Multiboot 版本镜像,在启动失败的情况下自动回退地址 0 的 Golden 镜像,流程如下图所示
在在线更新功能的设计中,Initial MultiBoot Image System Setup 模式是更加常用的。
在这种启动方式下,对于 Golden Image:
- WBSTAR 应当指向 Multiboot Image,同时应当插入一个 IPROG 指令以在上电时触发对 Multiboot 的下载(在比特流文件里插入 IPROG 命令);
- 需要启动 Configuration Timer;
- 如果 Golden Image 有能力修复 FLASH,则也可以实现 ICAP 原语以重启启动 Multiboot 的加载;
- 对于 SPI 配置模式,在回退 Golden 过程中,始终采用 SPI x1 的模式。
对于 Multiboot Image:
- 需要启动 Configuration Timer;
- Multiboot Image 也可以实现 ICAP 原语以实现对其他 Multiboot Image 的重加载,或对 Golden Image 的受控回退。
IPROG 说明
IPROG(Internal PROGRAM)命令是 PROGRAM_B 引脚功能的一个子集,该命令可以从 ICAP 原语发出,也可以直接嵌入到比特流里。当为后者时,WBSTAR 和 IPROG 应当位于 Golden bit file 的开头,此时在上电后会触发从新地址加载 multiboot Image 的事件;如果加载失败,则将返回地址 0 重新加载比特流,此时会忽略 IPROG,因此加载到的程序将是 Golden Image。
WBSTAR 寄存器
WBSTAR 寄存器保存了 IPROG 命令配置的启动地址,该寄存器的值可以由嵌入在 bitstream 的 IPROG 配置,也可以由 ICAPE2 发出的 IPROG 配置。如果 bitstream 中没有配置 WBSTAR,则地址默认为 0,因此如果从 Golden Image 触发了多重启动,则在加载完 Multiboot Image 后,WBSTAR 将被设置为 0。
上电后,设备将从地址 0 开始读取 FLASH,在加载了 WBSTAR 并发出 IPROG 后,将重定向到 WBSTAR 指定地址读取 Imaeg。
Watchdog 计数器
看门狗有两种模式:配置监视器模式、用户逻辑监视器模式。在配置监视器模式下,Timer Register 通过比特流设置,需要在所有 bit File 中启用这个计数器。Watchdog 由 FPGA 内部锁相环产生的 65MHz 时钟驱动(这一描述和下表中的描述相悖),当计数器回到 0 时,将触发回退。该计数器从比特流起始开始计数,在启动序列结束时被禁用。
从 ICAPE2 原语启动 Multiboot 介绍
当从 ICAPE2 原语触发 Multiboot 时,命令序列为:1. 发送同步码;2. 设置 WBSTAR;3. 发送 IPROG 命令。一个通过 ICAPE2 发送的命令序列如下
ICAPE2 原语
ICAPE2 原语接口如图,调用格式如下
// 7 Series
// Xilinx HDL Language Template, version 2023.2
ICAPE2 #(.DEVICE_ID (32'h3651093), // Specifies the pre-programmed Device ID value to be used for simulation purposes..ICAP_WIDTH ("X32"), // Specifies the input and output data width..SIM_CFG_FILE_NAME ("NONE") // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation model.
)
ICAPE2_inst(.O (O), // 32-bit output: Configuration data output bus.CLK (CLK), // 1-bit input: Clock Input.CSIB (CSIB), // 1-bit input: Active-Low ICAP Enable.I (I), // 32-bit input: Configuration data input bus.RDWRB (RDWRB) // 1-bit input: Read/Write Select input
);
其中 DEVICE_ID 是设备 ID,与芯片型号有关,譬如对于 K7-325T,ID 如下
嵌入 IPROG 命令启动 Multiboot 介绍
WBSTAR 和 IPROG 命令可以嵌入到一个位流中,如图所示。在 7 系列 FPGA 的 bitstream 中,WBSTAR 默认填入空白,同时保留了 IPROG 的占位符。我们打开一个 .bin 文件,看看到底是如何组织的
可以看到,在地址 0x30 开始的四个字节,为同步码 AA995566,随后是一个 NO OP(20000000),然后是一些其他的命令;在 0x54 开始的 4 个字节,为 Write 1 Word to WBSTAR 命令(30020001),随后四个字节为要写入 WBSTAR 的地址,这里默认是 0;随后紧跟着 Write 1 Word to CMD 命令(30008001),随后四字节为写入的命令,这里默认是占位符 00000000,可以修改为 IPROG (0000000F)以实现 IPROG 命令的嵌入。
这里我们只是观察一下 .bin/.bit 文件中 IPROG 是如何嵌入的,通过直接修改 .bit/.mcs 实现 Multiboot 理论上也是可行的,但实际上我们不会这么做。在实际操作中我们可以通过在 xdc 中增加约束,生成需要的 .bit,然后再组合成 .mcs,下一节就介绍如何通过添加约束实现这一过程。
嵌入 IPROG 的操作流程
在编译 Golden Image 时,需要在 xdc 中增加如下约束
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x01000000 [current_design]
set_property CONFIG_MODE SPIX1 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]
#由于fallback使用SPIx1,因此请确定一定有此配置# 如果 FLASH 大小大于等于 256Mb,要增加如下约束,否则高于24位的地址会被忽略,导致无法启动对应的 update 镜像
set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES [current_design]
在编译 Multiboot Image 时,需要在 xdc 中使用如下约束
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
set_property CONFIG_MODE SPIX1 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 1 [current_design]
#由于fallback使用SPIx1,因此请确定一定有此配置# 如果 FLASH 大小大于等于 256Mb,要增加如下约束,否则高于24位的地址会被忽略,导致无法启动对应的 update 镜像
set_property BITSTREAM.CONFIG.SPI_32BIT_ADDR YES [current_design]
上述约束中,BITSTREAM.CONFIG.CONFIGFALLBACK 用于启用回退(Fallback)功能,BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 用于设置 WBSTAR 寄存器,由于 Fallback 要求 SPIx1,因此 BITSTREAM.CONFIG.SPI_BUSWIDTH 要设为 1。
编译完成后,我们还是打开 .bit 看一下,Golden Image 的如下
可以看到 WBSTAR 和 IPROG 命令已经被嵌入比特流。
将两个 .bit 文件分别载入地址 0 和高位地址,生成 .mcs,注意 Multiboot Image 所载入的高位地址应当与前面 xdc 配置的 NEXT_CONFIG_ADDR 相同。烧录后,可以看到 update Image 被启动。
ICAPE2 启动 Multiboot 代码示例
Multiboot_ctrl.v
对于 SPI 设备,WBSTAR 地址有如下描述,即 Master SPI 模式下,WBSTAR 只会使用低 24 位,这 24 位为 FLASH 地址的 31:8 bits,在实现时应当注意
代码如下
/* * file : multiboot_ctrl.v* author : 今朝无言* Lab : WHU-EIS-LMSWE* date : 2023-11-30* version : v1.0* description : ICAP 原语实现程控 multiboot(多重启动),K7需要使用 ICAPE2 原语* Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.*/
`default_nettype none
module multiboot_ctrl(
input wire clk,
input wire rst_n,input wire multiboot_start, //触发Multiboot, 上升沿有效
input wire [31:0] multiboot_addr, //要启动的Muliboot Image的起始地址output reg busy
);//-------------------ICAPE2原语-----------------------------
wire ICAPE2_CLK;
wire [31:0] ICAPE2_O;
reg ICAPE2_CSIB;
wire [31:0] ICAPE2_I;
reg ICAPE2_RDWRB;assign ICAPE2_CLK = clk;ICAPE2 #(.DEVICE_ID (32'h3651093), // Specifies the pre-programmed Device ID value to be used for simulation purposes. K7-325T的为32'h3651093.ICAP_WIDTH ("X32"), // Specifies the input and output data width..SIM_CFG_FILE_NAME ("NONE") // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation model.
)
ICAPE2_inst(.O (ICAPE2_O), // 32-bit output: Configuration data output bus.CLK (ICAPE2_CLK), // 1-bit input: Clock Input.CSIB (ICAPE2_CSIB), // 1-bit input: Active-Low ICAP Enable.I (ICAPE2_I), // 32-bit input: Configuration data input bus.RDWRB (ICAPE2_RDWRB) // 1-bit input: Read/Write Select input 1对应rd,0对应wr
);wire [31:0] Dummy = 32'hFFFFFFFF;
wire [31:0] Sync_Word = 32'hAA995566;
wire [31:0] NOOP = 32'h20000000;
wire [31:0] WR_WBSTAR = 32'h30020001;/*When using ICAPE2 to set the WBSTAR address, the 24 most significant address bits should be writtento WBSTAR[23:0]. For SPI 32-bit addressing mode, WBSTAR[23:0] are sent as address bits [31:8]. Thelower 8 bits of the address are undefined and the value could be as high as 0xFF. Any bitstreamat the WBSTAR address should contain 256 dummy bytes before the start of the bitstream.*/
wire [31:0] WBSTAR = {3'b000, 5'h0, multiboot_addr[31:8]};wire [31:0] WR_CMD = 32'h30008001;
wire [31:0] IPROG = 32'h0000000F;//ICAPE2位翻转
reg [31:0] wrdat;
assign ICAPE2_I = {wrdat[24], wrdat[25], wrdat[26], wrdat[27], wrdat[28], wrdat[29], wrdat[30], wrdat[31], wrdat[16], wrdat[17], wrdat[18], wrdat[19], wrdat[20], wrdat[21], wrdat[22], wrdat[23], wrdat[8], wrdat[9], wrdat[10], wrdat[11], wrdat[12], wrdat[13], wrdat[14], wrdat[15], wrdat[0], wrdat[1], wrdat[2], wrdat[3], wrdat[4], wrdat[5], wrdat[6], wrdat[7]};//------------------------FSM----------------------------------
localparam S_IDLE = 16'h0001;
localparam S_DUMMY = 16'h0002;
localparam S_SYN_WORD = 16'h0004;
localparam S_NOOP1 = 16'h0008;
localparam S_WR_WBSTAR = 16'h0010;
localparam S_WBSTAR = 16'h0020;
localparam S_WR_CMD = 16'h0040;
localparam S_IPROG = 16'h0080;
localparam S_NOOP2 = 16'h0100;
localparam S_STOP = 16'h0200;wire multiboot_start_pe;
reg multiboot_start_d0;
reg multiboot_start_d1;assign multiboot_start_pe = multiboot_start_d0 & (~multiboot_start_d1);always @(posedge clk) beginmultiboot_start_d0 <= multiboot_start;multiboot_start_d1 <= multiboot_start_d0;
endreg [15:0] state = S_IDLE;
reg [15:0] next_state;always @(posedge clk) beginif(~rst_n) beginstate <= S_IDLE;endelse beginstate <= next_state;end
endalways @(*) begincase(state)S_IDLE: beginif(multiboot_start_pe) beginnext_state <= S_DUMMY;endelse beginnext_state <= S_IDLE;endendS_DUMMY: next_state <= S_SYN_WORD;S_SYN_WORD: next_state <= S_NOOP1;S_NOOP1: next_state <= S_WR_WBSTAR;S_WR_WBSTAR: next_state <= S_WBSTAR;S_WBSTAR: next_state <= S_WR_CMD;S_WR_CMD: next_state <= S_IPROG;S_IPROG: next_state <= S_NOOP2;S_NOOP2: next_state <= S_STOP;S_STOP: next_state <= S_IDLE;default: next_state <= S_IDLE;endcase
endalways @(posedge clk) begincase(state)S_IDLE: beginwrdat <= 32'd0;ICAPE2_CSIB <= 1'b1;ICAPE2_RDWRB <= 1'b1;endS_DUMMY: beginwrdat <= Dummy;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_SYN_WORD: beginwrdat <= Sync_Word;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_NOOP1: beginwrdat <= NOOP;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_WR_WBSTAR: beginwrdat <= WR_WBSTAR;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_WBSTAR: beginwrdat <= WBSTAR;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_WR_CMD: beginwrdat <= WR_CMD;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_IPROG: beginwrdat <= IPROG;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_NOOP2: beginwrdat <= NOOP;ICAPE2_CSIB <= 1'b0;ICAPE2_RDWRB <= 1'b0;endS_STOP: beginwrdat <= 32'd0;ICAPE2_CSIB <= 1'b1;ICAPE2_RDWRB <= 1'b1;enddefault: beginwrdat <= 32'd0;ICAPE2_CSIB <= 1'b1;ICAPE2_RDWRB <= 1'b1;endendcase
endalways @(*) begincase(state)S_IDLE: busy <= 1'b0;default: busy <= 1'b1;endcase
endendmodule
测试
创建两个工程如下
- Prj_1
//生成2个点灯的程序,使用ICAP来回切换这两个Image
//本工程作为 Golden Image 存入地址 0
`default_nettype none
module Prj_1(
input wire clk_sys, //OXCO_10Minput wire [3:0] Key,
output wire [3:0] LED
);assign LED = 4'b0001;multiboot_ctrl multiboot_ctrl_inst(.clk (clk_sys),.rst_n (1'b1),.multiboot_start (~Key[0]),.multiboot_addr (32'h01000000), //加载0x01000000处的Multiboot Image.busy ()
);endmodule
- Prj_2
//生成2个点灯的程序,使用ICAP来回切换这两个Image
//本工程作为 Update Image 存入高位地址
`default_nettype none
module Prj_2(
input wire clk_sys, //OXCO_10Minput wire [3:0] Key,
output wire [3:0] LED
);assign LED = 4'b0010;multiboot_ctrl multiboot_ctrl_inst(.clk (clk_sys),.rst_n (1'b1),.multiboot_start (~Key[1]),.multiboot_addr (32'h00000000), //加载0x00000000处的Golden Image.busy ()
);endmodule
烧录后,通过按键可以来回切换两个工程,读者可自行验证。
一个注意事项,在烧录完成后,必须拔掉 JTAG 再掉电重启,ICAP 才可以正确启动 Multiboot Image,如果是不拔掉 JTAG 掉电重启,ICAP 触发后只会加载 Golden Image。(真坑人啊,因为这个调了好久 (•́へ•́╬) )
参考文献
- ug470_Config.pdf
- ug953-vivado-7series-libraries.pdf
相关文章:

K7系列FPGA多重启动(Multiboot)
Xilinx 家的 FPGA 支持多重启动功能(Multiboot),即可以从多个 bin 文件中进行选择性加载,从而实现对系统的动态更新,或系统功能的动态调整。 这一过程可以通过嵌入在 bit 文件里的 IPROG 命令实现上电后的自动加载。而…...

关于武汉芯景科技有限公司的RS232通信接口芯片XJ3243EEUI开发指南(兼容MAX3243EEUI)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、典型应用电路 三、功能描述 1.Transmitter 通过T1,T2可以将TTL电平转换为RS232电平 2.Receiver 通过R1,R2可以将RS232电平转换为TTL电平 3.工作模式控制 4.INVALID引脚...

TreeSize Free:你的免费磁盘空间管理专家
TreeSize Free是一款专为Windows用户设计的磁盘空间分析工具。它能够帮助用户快速识别并管理那些占用大量空间的文件夹和文件。 功能亮点 快速扫描:TreeSize Free能够迅速扫描整个磁盘卷,展示所有文件夹及其子文件夹的大小,甚至可以细化到单…...
python办公自动化:初识`python-docx`
1.1 什么是python-docx python-docx是一个用于在Python中创建和操作Word文档的库。它提供了一组简洁的API,让开发者可以轻松地生成、修改、和读取Microsoft Word (.docx)文件,而不需要安装Microsoft Office。这使得python-docx成为办公自动化、报告生成…...
LeetCode 算法:划分字母区间 c++
原题链接🔗:划分字母区间难度:中等⭐️⭐️ 题目 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接&#…...

PMP备考指南:策略、时间安排与心得分享
准备和时间安排,我是工作的时间把它顺便考了,大约花了一个月左右时间备考,前面的时间都在筹办婚礼,根本没时间,最后一个月都差点想放弃了,但想想还是冲一把就没有选择延考。 干货见下: ▌&…...
CentOS上通过frp实现HTTPS访问内网
要在CentOS上通过frp实现HTTPS访问内网,你需要按照以下步骤操作: 在外网服务器上安装frps(frp服务端)。 在外网服务器上配置frps,编辑配置文件frps.ini。 在frps服务器上启动frps服务。 在内网服务器上安装frpc&…...

短视频SDK解决方案,高效集成,助力商业变现
美摄科技,作为业界领先的多媒体技术服务商,其全面升级的短视频SDK解决方案,旨在为开发者与内容创作者提供一站式、高效能的创作工具,让每一个灵感都能瞬间转化为触动人心的视频作品。 【一站式解决方案,重塑短视频创作…...

C++系列-继承方式
继承方式 继承的语法继承方式:继承方式的特点继承方式的举例 继承可以减少重复的代码。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。基类父类,派生类子类,派生类是在继承了基类的部分成员基础…...

web前端之选项卡的实现、动态添加类名、动态移除类名、动态添加样式、激活、间距、tabBar
MENU 原生(一)原生(二)vue(一) 原生(一) 效果图 html 代码 <div class"card"><div class"tab_bar"><div class"item" onclick"handleTabBar(this)">tabBar1</div><div class"item" onclick&qu…...
sql 优化,提高查询速度
文章目录 一、前言二、建议2.1 使用索引2.2 避免使用select *2.3. 使用表连接代替子查询2.4. 优化WHERE子句,减少返回结果集的大小2.5 用union all代替union2.6 使用合适的聚合策略2.7 避免在WHERE子句中使用函数2.8 使用EXPLAIN分析查询2.9 小表驱动大表2.10 使用窗…...
springboot后端开发-自定义参数校验器
背景 在使用springboot进行后端开发的时候,经常会遇到数据校验的问题, 有时候可能默认的校验器不足以满足自己的需求, 这个时候就需要开发一个自己的校验器 在 Spring Boot 中自定义参数校验器通常涉及以下几个步骤: 1. 定义注解…...

springboot社区帮扶对象管理系统论文源码调试讲解
第2章 开发环境与技术 社区帮扶对象管理系统的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对社区帮扶对象管理系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的&…...

EmguCV学习笔记 VB.Net 6.2 轮廓处理
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...

【Python的魅力】:利用Pygame实现游戏坦克大战——含完整源码
文章目录 一、游戏运行效果二、代码实现2.1 项目搭建2.2 加载我方坦克2.3 加载敌方坦克2.4 添加爆炸效果2.5 坦克大战之音效处理 三、完整代码 一、游戏运行效果 二、代码实现 坦克大战游戏 2.1 项目搭建 本游戏主要分为两个对象,分别是我方坦克和敌方坦克。用户可…...

【机器学习】经典CNN架构
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 经典CNN架构1. 引言2. LeNet3. AlexNet4. VGGNet5. GoogLeNet(Inception)6. Res…...

图像数据处理21
五、边缘检测 5.2基于二阶导数的边缘检测 一阶导数(如Sobel、Prewitt算子)能够捕捉到灰度值的快速变化,但有时会因检测到过多的边缘点而导致边缘线过粗。为了更加精确地定位边缘位置,可以利用二阶导数的零交叉点。零交叉点是是函…...

day37动态规划+三.Github链接本地仓库
一.动态规划 474.一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 思路:这道题更像是另一种的0-…...
设备运维故障排查与修复技巧
运维中最常见的40个故障问题及其解决方法: 1. 网络不通问题:无法访问网络资源。 解决方法:检查物理线路、交换机端口、网卡驱动和配置,使用ping、traceroute等工具定位问题。 2. 网络速度慢问题:访问网络资源速度慢。 解决方法:分析带宽使用情况,检查是否存在广播风…...

探索Python的自动化魔法:AutoIt库揭秘
文章目录 探索Python的自动化魔法:AutoIt库揭秘第一部分:背景介绍第二部分:AutoIt是什么?第三部分:如何安装AutoIt库?第四部分:AutoIt的五个简单函数第五部分:场景应用第六部分&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...