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

南京观海微电子----时序图绘制工具

Wavedrom 是一款功能强大且简单易用的文本转图表工具,被广泛应用于生成时序图、波形图等交互式波形。其特点在于使用简单的文本语法,使得开发人员能够以可视化的方式表示数字信号和时间序列数据。Wavedrom 的优势在于其高度灵活性和可扩展性,使用户能够快速绘制复杂的波形和图表,并轻松与其他文档和代码进行整合。

Wavedrom 的基本语法相对简单,以 JSON 对象或简洁的文本描述波形和时序信息。开发人员只需编写简短的描述,即可生成直观的波形图。通过使用不同的标记和元素,用户可以定义时序图中的信号波形、时钟周期、状态转换等内容。Wavedrom 支持自定义样式和布局,用户可以根据需求美化波形图,增加标签和注释以增强可读性。

时序图是 Wavedrom 最常见的用途之一,通过 Wavedrom 绘制的时序图可以清晰地展示数字信号和数据的传输过程。例如,在硬件设计中,时序图可以用于描述寄存器读写、信号传输和时钟脉冲的情况,从而帮助开发人员更好地理解和分析系统的工作状态。

值得一提的是,Wavedrom 不仅可以独立使用,还可以与 Markdown 等文档格式无缝整合。通过将 Wavedrom 图表代码嵌入文档中,开发人员可以直接在文档中呈现交互式的波形图,提升文档的可读性和交互性。

总体来说,Wavedrom 是一个强大而简便的文本转图表工具,适用于各种应用场景,如硬件设计、软件开发、文档编写等。其简单的语法和可视化的输出,为开发人员提供了一个高效、直观的工具,帮助他们更好地表达和展示数字信号和时间序列数据。

用法和示例

WaveDrom 是一个基于 JavaScript 的应用程序。WaveJSON 是一种描述数字时序图的格式。WaveDrom 可以直接在浏览器中渲染这些图表。"signal"元素是 WaveLane 的数组。每个 WaveLane 都有两个必填字段:"name"和"wave"。

WaveDrom 是一个强大的工具,可用于可视化数字信号和时序数据。通过使用 WaveJSON 格式来描述信号波形,用户可以轻松地定义时序图的各个部分,包括信号波形的名称、周期和状态。WaveDrom 支持多个 WaveLane,可以同时显示多个信号波形,从而实现更复杂的时序图表。

"wave"字段是 WaveLane 的关键部分,用于定义信号波形。它由一系列字符组成,包括数字 0 和 1,代表数字信号的高和低电平,以及".",代表未定义或无效状态。此外,WaveDrom 还支持其他特殊字符,如"p"代表时钟周期,"n"代表一个时钟周期内的半个周期,"|"用于分隔不同的时钟周期。

通过将这些 WaveLane 组合成一个"signal"数组,并为每个 WaveLane 指定名称和波形描述,用户可以创建详细且直观的数字时序图。WaveDrom 渲染引擎会将这些描述解析并在浏览器中实时绘制出时序图形。

总的来说,WaveDrom 提供了一种简单但强大的方式,通过 WaveJSON 格式和 WaveLane 的组织,使用户能够在浏览器中生成各种数字时序图。它在硬件设计、嵌入式系统开发、通信协议分析等领域中有着广泛的应用,帮助开发人员更好地理解和分析数字信号的行为和传输过程。

信号

从一个简单的例子开始。下面的代码将创建一个名为"Alfa"的 1 位信号,并随时间改变其状态。

{ "signal": [{ "name": "Alfa", "wave": "01.zx=ud.23.456789" }] }

在"wave"字符串中,每个字符代表一个时间周期。符号"."将前一个状态延续一个周期。现在,让我们看一下它的图示:

图片

"Alfa" 1位信号

时钟

数字时钟是一种特殊类型的信号。它在每个时间周期内变化两次,可以具有正极性或负极性。此外,它还可以在工作边沿上带有可选的标记。时钟的各个块可以与其他信号状态混合,以创建时钟门控效果。下面是代码和生成的图示:

{ "signal": [{ "name": "pclk", "wave": "p......." },{ "name": "Pclk", "wave": "P......." },{ "name": "nclk", "wave": "n......." },{ "name": "Nclk", "wave": "N......." },{},{ "name": "clk0", "wave": "phnlPHNL" },{ "name": "clk1", "wave": "xhlhLHl." },{ "name": "clk2", "wave": "hpHplnLn" },{ "name": "clk3", "wave": "nhNhplPl" },{ "name": "clk4", "wave": "xlh.L.Hx" },
]}

渲染后的时钟图示如下:

图片

时钟信号

合在一起

在典型的时序图中,我们通常会包含时钟信号和其他信号(线路)。对于多位信号,我们可以从"data"数组中获取相应的标签。

下面是一个例子,展示了一个包含时钟信号、多位信号和单位信号的典型时序图:

{ "signal": [{ "name": "clk", "wave": "P......" },{ "name": "bus", "wave": "x.==.=x", "data": ["head", "body", "tail", "data"] },{ "name": "wire", "wave": "0.1..0." }
]}

在这个例子中,我们有三个信号:"clk"代表时钟信号,"bus"代表多位信号,"wire"代表单位信号。

  • 时钟信号"clk"用"P"表示,代表正极性的时钟边沿。

  • 多位信号"bus"用"x.==.=x"表示,其中"x"表示未定义的状态,"="表示稳定的高电平或低电平,"."表示未稳定状态。"data"数组包含多位信号的标签,分别是:"head"、"body"、"tail"和"data"。

  • 单位信号"wire"用"0.1..0."表示,表示在时间周期内信号从低电平切换到高电平再切换回低电平。

渲染后的时序图如下:

图片

典型时序信号

空白和间隙

在时序图中,我们有时需要添加间距和空白,以便更好地组织信号和使时序图更易于阅读。下面是一个带有间距和空白的时序图示例:

{ "signal": [{ "name": "clk", "wave": "p.....|..." },{ "name": "Data", "wave": "x.345x|=.x", "data": ["head", "body", "tail", "data"] },{ "name": "Request", "wave": "0.1..0|1.0" },{},{ "name": "Acknowledge", "wave": "1.....|01." }
]}

在这个例子中,我们添加了一些间距和空白,以便更好地分隔不同的信号。

  • "clk"信号用"p"表示,代表正极性时钟边沿,后面有 3 个间距".",然后是"|...",代表 3 个空白周期。

  • "Data"信号由"x"、"="、"."组成,数据数组"data"提供了多位信号各个部分的标签:"head"、"body"、"tail"和"data"。后面有一个间距"|",然后是"=.",代表一个空白周期后紧跟着一个稳定高电平。

  • "Request"信号由"0"、"1"、"."组成,代表低电平、高电平和未定义状态。后面有一个间距"|",然后是"1.0",代表一个高电平后紧跟着一个空白周期。

  • 接着有一个空白行,表示两个信号之间的空白。

  • 最后,"Acknowledge"信号由"1"、"."组成,后面有一个间距"|",然后是"01.",代表一个高电平后紧跟着一个低电平和一个空白周期。

渲染后的时序图如下:

图片

带间隙的时序图

在这个时序图中,我们可以看到信号之间的间距和空白,使得时序图更加整齐和易读。通过添加适当的间距和空白,我们可以更好地组织信号和时钟边沿,使时序图更具可视化效果。接下来,我们将继续探索 WaveDrom 的其他高级功能和实际应用,帮助您更好地运用这个强大的文本转图表工具。

分组

在时序图中,我们可以将 WaveLane 组合成具有名称的分组,分组表示为数组形式。['分组名称', {...}, {...}, ...] 数组的第一个条目是分组的名称。分组之间还可以嵌套。

下面是一个包含分组的时序图示例:

{ "signal": [{ "name": "clk", "wave": "p..Pp..P" },["Master",["ctrl",{ "name": "write", "wave": "01.0...." },{ "name": "read", "wave": "0...1..0" }],{ "name": "addr", "wave": "x3.x4..x", "data": "A1 A2" },{ "name": "wdata", "wave": "x3.x....", "data": "D1" },],{},["Slave",["ctrl",{ "name": "ack", "wave": "x01x0.1x" },],{ "name": "rdata", "wave": "x.....4x", "data": "Q2" },]
]}

在这个例子中,我们使用了分组来组织不同的信号,将它们放在名为"Master"和"Slave"的两个分组中。

  • "clk"信号用"p..Pp..P"表示,代表正极性时钟边沿和负极性时钟边沿。

  • "Master"分组包含了三个子信号,它们分别在名称为"ctrl"的子分组中,表示控制信号"write"和"read",以及名称为"addr"的信号,"data"数组提供了信号的标签。

  • 接着有一个空白行,表示两个分组之间的空白。

  • "Slave"分组包含了两个子信号,都在名称为"ctrl"的子分组中,表示控制信号"ack",以及名称为"rdata"的信号,"data"数组提供了信号的标签。

渲染后的时序图如下:

图片

分组时序图

在这个时序图中,我们可以看到不同分组内的信号在不同时间周期内的状态。使用分组可以更好地组织和显示复杂的时序图,帮助我们更好地理解和分析数字信号之间的时序关系。通过 WaveDrom 的强大功能,我们可以轻松地在时序图中添加分组,使其更具可视化效果和清晰度。

周期和相位

在时序图中,我们可以使用"period"和"phase"参数来调整每个 WaveLane 的周期和相位。

下面是一个 DDR 读取事务的时序图示例:

{ "signal": [{ "name": "CK", "wave": "P.......", "period": 2 },{ "name": "CMD", "wave": "x.3x=x4x=x=x=x=x", "data": "RAS NOP CAS NOP NOP NOP NOP", "phase": 0.5 },{ "name": "ADDR", "wave": "x.=x..=x........", "data": "ROW COL", "phase": 0.5 },{ "name": "DQS", "wave": "z.......0.1010z." },{ "name": "DQ", "wave": "z.........5555z.", "data": "D0 D1 D2 D3" }
]}

在这个例子中,我们使用"period"参数来设置时钟信号"CK"的周期为 2 个时间周期。这意味着时钟信号每隔 2 个时间周期变化一次。

同时,我们使用"phase"参数来调整信号"CMD"和"ADDR"的相位。相位的值为 0.5,表示信号的波形在时间轴上整体向右偏移了 0.5 个时间周期。这样做可以让信号在时钟边沿之前或之后发生状态变化。

"CMD"信号表示了 DDR 读取事务的命令序列,"ADDR"信号表示了地址序列。"data"数组提供了每个部分的标签。

"DQS"信号和"DQ"信号分别表示数据校验和数据信号。其中,"DQS"信号在时钟边沿之前有一个延迟,"DQ"信号在时钟边沿之后有一个延迟。

渲染后的时序图如下:

图片

DDR读时序

在这个时序图中,我们可以看到时钟信号"CK"每隔 2 个时间周期发生一次变化。"CMD"和"ADDR"信号的波形整体向右偏移了 0.5 个时间周期,以达到与时钟信号的相位差。"DQS"信号在时钟边沿之前有一个延迟,"DQ"信号在时钟边沿之后有一个延迟。

通过调整"period"和"phase"参数,我们可以更灵活地控制时序图中各个信号的周期和相位,从而更好地表达复杂的数字信号行为。WaveDrom 提供了丰富的功能,帮助我们创建详细和直观的数字时序图,用于硬件设计、嵌入式系统开发、通信协议分析等领域。

config{}属性

在时序图中,config{}属性用于控制渲染的不同方面。

hscale

config:{hscale:#}属性用于调整时序图的水平缩放比例。用户可以设置任何大于 0 的整数值。

下面是一个示例,展示了如何使用 config{hscale:#}属性来调整时序图的水平缩放比例:

{ "signal": [{ "name": "clk", "wave": "p...." },{ "name": "Data", "wave": "x345x", "data": ["head", "body", "tail"] },{ "name": "Request", "wave": "01..0" }
],
"config": { "hscale": 1 }
}

在这个例子中,我们使用 config{hscale:1}属性将水平缩放比例设置为 1。这意味着时序图将以原始比例进行渲染,每个时间周期占据一个单位宽度。

渲染后的时序图如下:

图片

水平比例1

图片

水平比例2

skin

在时序图中,我们可以使用 config:{skin:'...'}属性来选择WaveDrom 的皮肤样式[2]。该属性仅在页面上的第一个时序图中起作用。WaveDrom 编辑器包含两种标准皮肤:'default'和'narrow'。

head/foot

head:{...}和 foot:{...}属性用于定义时序图上方和下方的内容区域。可以在这些属性中添加文本或其他元素。

tick/tock

tick 属性可以添加与垂直标记对齐的时间线标签,而 tock 属性可以在垂直标记之间添加时间线标签。

text

text 属性用于添加标题或说明文本。

every

every 属性用于指定仅在每 N 个周期渲染一次标记和时间线标签。

下面是一个示例,展示了如何使用这些属性来定义一个时序图:

{ "signal": [{ "name": "clk", "wave": "p...." },{ "name": "Data", "wave": "x345x", "data": "a b c" },{ "name": "Request", "wave": "01..0" }
],
"head": {"text": "WaveDrom example","tick": 0,"every": 2
},
"foot": {"text": "Figure 100","tock": 9
}
}

在这个例子中,我们添加了头部(head)和底部(foot)的文本内容。头部文本设置为"WaveDrom example",并使用 tick 属性指定不添加时间线标签。每隔 2 个周期渲染一次标记和时间线标签。底部文本设置为"Figure 100",并使用 tock 属性在垂直标记之间添加时间线标签。

渲染后的时序图如下:

图片

属性示例

在 WaveDrom 中,head 和 foot 属性用于定义时序图上方和下方的文本内容,这些文本内容支持 SVG text 的所有属性。可以使用 JsonML 标记语言来表示 SVG 文本内容,并且可以使用一些预定义的样式来设置文本的字体大小和颜色。除此之外,还可以使用其他 SVG tspan 属性来自由地定制文本的样式。

下面是一个示例,展示了如何使用不同的样式来设置时序图头部和底部的文本内容:

{ "signal": [{ "name": "clk", "wave": "p.....PPPPp...." },{ "name": "dat", "wave": "x....2345x.....", "data": "a b c d" },{ "name": "req", "wave": "0....1...0....." }
],
"head": { "text":["tspan",["tspan", { "class": "error h1" }, "error "],["tspan", { "class": "warning h2" }, "warning "],["tspan", { "class": "info h3" }, "info "],["tspan", { "class": "success h4" }, "success "],["tspan", { "class": "muted h5" }, "muted "],["tspan", { "class": "h6" }, "h6 "],"default ",["tspan", { "fill": "pink", "font-weight": "bold", "font-style": "italic" }, "pink-bold-italic"]]
},
"foot": { "text":["tspan", "E=mc",["tspan", { "dy": "-5" }, "2"],["tspan", { "dy": "5" }, ". "],["tspan", { "font-size": "25" }, "B "],["tspan", { "text-decoration": "overline" }, "over "],["tspan", { "text-decoration": "underline" }, "under "],["tspan", { "baseline-shift": "sub" }, "sub "],["tspan", { "baseline-shift": "super" }, "super "]], "tock": -5
}
}

在这个例子中,我们使用 JsonML 标记语言来表示头部和底部的文本内容,并为每个文本段落设置了不同的样式。例如,我们使用了类名"h1"、"h2"、"h3"等来设置不同的字体大小。使用类名"error"、"warning"、"info"、"success"、"muted"等来设置不同的字体颜色样式。我们还可以使用其他 SVG tspan 属性来设置文本的斜体、粗体、填充颜色等。

渲染后的时序图如下:

图片

head/foot文本属性示例

箭头

曲线

在 WaveDrom 中,我们可以使用箭头和曲线来连接不同的信号,以表示它们之间的关联和数据传递。

以下是一些常用的箭头和曲线符号:

  • ~:普通曲线

  • -~:从左到右的曲线箭头

  • <~>:双向曲线箭头

  • <~>:双向曲线箭头

  • ~>:从左到右的直线箭头

  • -~>:从左到右的实心箭头

  • ~->:从右到左的实心箭头

下面是一个示例,展示了如何使用箭头和曲线来连接不同的信号:

{ "signal": [{ "name": "A", "wave": "01........0....", "node": ".a........j" },{ "name": "B", "wave": "0.1.......0.1..", "node": "..b.......i" },{ "name": "C", "wave": "0..1....0...1..", "node": "...c....h.." },{ "name": "D", "wave": "0...1..0.....1.", "node": "....d..g..." },{ "name": "E", "wave": "0....10.......1", "node": ".....ef...." }
],
"edge": ["a~b t1", "c-~a t2", "c-~>d time 3", "d~-e","e~>f", "f->g", "g-~>h", "h~>i some text", "h~->j"
]
}

渲染后的时序图如下:

图片

箭头和曲线

折线

在 WaveDrom 中,我们还可以使用尖锐的线条符号来表示不同信号之间的连接关系。这些尖锐的线条符号可以更直观地展示信号之间的交互和数据传递。

以下是一些常用的尖锐线条符号:

  • -:直线连接

  • -|:从左到右的尖锐连接

  • |->:从右到左的尖锐连接

  • <->:双向尖锐连接

  • <-|>:从左到右的双向尖锐连接

  • |-|:从左到右的尖锐连接(包含短横线)

下面是一个示例,展示了如何使用尖锐线条来连接不同的信号:

{ "signal": [{ "name": "A", "wave": "01..0..", "node": ".a..e.." },{ "name": "B", "wave": "0.1..0.", "node": "..b..d.", "phase": 0.5 },{ "name": "C", "wave": "0..1..0", "node": "...c..f" },{ "node": "...g..h" },{ "node": "...I..J", "phase": 0.5 },{ "name": "D", "wave": "0..1..0", "phase": 0.5 }
],
"edge": ["b-|a t1", "a-|c t2", "b-|-c t3", "c-|->e t4", "e-|>f more text","e|->d t6", "c-g", "f-h", "g<->h 3 ms", "I+J 5 ms"
]
}

在这个例子中,我们有 6 个信号(A、B、C、D)和 4 个连接节点(e、g、h、I、J),它们之间通过尖锐线条连接起来。每个信号都有相应的波形图,而尖锐线条则通过edge属性来定义连接关系。

例如,b-|a t1表示从信号 B 到信号 A 的从左到右的尖锐连接,并在连接上方添加了文本标签"t1"。c-|->e t4表示从信号 C 到节点 e 的从左到右的尖锐连接,并在连接上方添加了文本标签"t4"。

渲染后的时序图如下:

图片

箭头和折线

一些代码

在 WaveDrom 中,我们可以使用 JavaScript 代码来生成复杂的时序图。这些代码可以用来生成特定的信号和波形,以及自定义时序图的展示效果。

以下是一个示例代码,展示了如何使用 JavaScript 代码生成一个特定的时序图:

(function (bits, ticks) {var i, t, gray, state, data = [], arr = [];for (i = 0; i < bits; i++) {arr.push({name: i + '', wave: ''});state = 1;for (t = 0; t < ticks; t++) {data.push(t + '');gray = (((t >> 1) ^ t) >> i) & 1;arr[i].wave += (gray === state) ? '.' : gray + '';state = gray;}}arr.unshift('gray');return {signal: [{name: 'bin', wave: '='.repeat(ticks), data: data}, arr]};
})(5, 16)

在这个例子中,我们使用了一个自执行函数来生成一个包含 5 个信号的时序图。每个信号的波形图都是根据格雷码(Gray code)生成的,其中 bits 参数表示信号的位数,ticks 参数表示时间周期数。代码使用循环来生成信号的波形图,并将生成的数据存储在 data 数组中。

最终的时序图包含 6 个信号,其中一个是用来表示二进制计数的信号(bin),其波形图是一个等号序列。其他 5 个信号的波形图是根据格雷码生成的,分别对应 0 位、1 位、2 位、3 位和 4 位格雷码的波形。

渲染后的时序图如下:

图片

js代码生成时序图

相关文章:

南京观海微电子----时序图绘制工具

Wavedrom 是一款功能强大且简单易用的文本转图表工具&#xff0c;被广泛应用于生成时序图、波形图等交互式波形。其特点在于使用简单的文本语法&#xff0c;使得开发人员能够以可视化的方式表示数字信号和时间序列数据。Wavedrom 的优势在于其高度灵活性和可扩展性&#xff0c;…...

Gin CORS 跨域请求资源共享与中间件

Gin CORS 跨域请求资源共享与中间件 文章目录 Gin CORS 跨域请求资源共享与中间件一、同源策略1.1 什么是浏览器的同源策略&#xff1f;1.2 同源策略判依据1.3 跨域问题三种解决方案 二、CORS:跨域资源共享简介(后端技术)三 CORS基本流程1.CORS请求分类2.基本流程 四、CORS两种…...

TS:.d.ts 文件 和 declare 的作用

1 declare 做外部声明1.1 声明外部类型1.2 声明外部模块1.2.1 解决引入资源模块报错1.2.2 跳过对第三方库的类型检查 1.3 声明外部变量1.4 声明外部命名空间&#xff08;作用域&#xff09; 2 .d.ts 文件做外部声明3 declare global {} 在模块中做外部声明 先说一下我对 .d.ts文…...

JavaScript-jQuery2-笔记

1.获取元素文本、属性、内部结构、表单中的值 获取标签中所夹的文本内容&#xff1a;text() 获取标签的属性值&#xff1a;prop(属性名) 获取表单元素的内容&#xff1a;如 文本框中的内容 val() 获取元素的内部html结构&#xff1a;html() 2.筛选选择器 筛选选择器&#xff1…...

设计模式之多线程版本的if------Balking模式

系列文章目录 设计模式之避免共享的设计模式Immutability&#xff08;不变性&#xff09;模式 设计模式之并发特定场景下的设计模式 Two-phase Termination&#xff08;两阶段终止&#xff09;模式 设计模式之避免共享的设计模式Copy-on-Write模式 设计模式之避免共享的设计模…...

mybatis核心配置文件介绍

mybatis核心配置文件 1. properties配置介绍 properties标签&#xff1a;加载外部的资源配置文件 ​ 属性&#xff1a;resource 指定要引入的配置文件路径 ​ 在核心配置文件中&#xff0c;通过&#xff1a;${key}方式引入外部配置文件的数据 jdbc.peroperties 的文件内容…...

Linux完全卸载Anaconda3和MiniConda3

如何安装Anaconda3和MiniConda3请看这篇文章&#xff1a; 安装Anaconda3和MiniConda3_minianaconda3-CSDN博客文章浏览阅读474次。MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&…...

Apache Answer,最好的开源问答系统

Apache Answer是一款适合任何团队的问答平台软件。无论是社区论坛、帮助中心还是知识管理平台&#xff0c;你可以永远信赖 Answer。 目前该项目在github超过10K星&#xff0c;系统采用go语言开发&#xff0c;安装配置简单&#xff0c;界面清洁易用&#xff0c;且开源免费。项目…...

【C】内存分配

首先&#xff0c;回顾一下内存分配。所有程序都必须预留足够的内存来存储程序使用的数据。这些内存中有些是自动分配的&#xff1a; float x; int place[100]; 这些声明预留了足够的空间&#xff0c;还为内存提供了一个标识符&#xff0c;可以使用x或place识别数据。 1、mal…...

MySQL 从零开始:03 基本入门语句

文章目录 1、连接数据库1.1 命令提示符登陆1.2 MySQL 8.0 Command Line Client 登陆1.3 MySQL Workbench 登陆 2、基本语句2.1 查看所有库2.2 创建库2.3 删除库2.4 选择数据库2.5 查看表2.6 创建表2.7 删除表2.8 改表名2.9 清空表 在上一小节中介绍了 MySQL 数据库的安装&#…...

井盖异动传感器,守护脚下安全

随着城市化进程的加速&#xff0c;城市基础设施的安全问题日益受到关注。其中&#xff0c;井盖作为城市地下管道的重要入口&#xff0c;其安全问题不容忽视。然而&#xff0c;传统的井盖监控方式往往存在盲区&#xff0c;无法及时发现井盖的异常移动。为此&#xff0c;我们推出…...

复合机器人作为一种新型的智能制造装备高效、精准和灵活的生产方式

随着汽车制造业的快速发展&#xff0c;对于高效、精准和灵活的生产方式需求日益增强。复合机器人作为一种新型的智能制造装备&#xff0c;以其独特的优势在汽车制造中发挥着越来越重要的作用。因此&#xff0c;富唯智能顺应时代的发展趋势&#xff0c;研发出了ICR系列的复合机器…...

重置 Docker 中 Gitlab 的账号密码

1、首先进入Docker容器 docker exec -it gitlab bash 2、连接到 gitlab 的数据库 需要谨慎操作 gitlab-rails console -e production 等待加载完后会进入控制台 ------------------------------------------------------------------------------------------------------…...

任务类型划分

以下内容来自于ChatGPT内存密集型应用和IO密集型应用是两种不同类型的计算应用&#xff0c;它们在资源需求和性能特点上有所不同。 内存密集型应用&#xff08;Memory-Intensive Applications&#xff09;&#xff1a; 特点&#xff1a; 这类应用主要依赖大量的内存资源来执行任…...

docker搭建部署mysql并挂载指定目录

Docker是一种轻量级、可移植的容器化平台&#xff0c;可以简化应用程序的部署和管理。在本文中&#xff0c;我们将探讨如何使用Docker来搭建和部署MySQL数据库&#xff0c;并将数据和配置文件挂载到外部目录&#xff0c;以实现数据持久化和方便的配置管理。 1: 安装Docker 首…...

即将推出的 OpenWrt One/AP-24.XY:OpenWrt 和 Banana Pi 合作路由器板

OpenWrt开发人员正在与Banana Pi合作开发OpenWrt One/AP-24.XY路由器板。OpenWrt 是一个轻量级嵌入式 Linux 操作系统&#xff0c;支持近 1,800 个路由器和其他设备。然而&#xff0c;这将是第一块由 OpenWrt 直接开发的路由器板。 该主板将基于 MediaTek MT7981B (Filogic 82…...

【uniapp-小程序-分享图5/4】

utils.js //裁剪分享的图片为5:4 const makeCanvas (imgUrl) > {console.log("imgUrl",imgUrl);return new Promise((resolve, reject) > {// 获取图片信息,小程序下获取网络图片信息需先配置download域名白名单才能生效uni.getImageInfo({src: imgUrl,succe…...

【响应式编程】前置知识和相关技术的总结

前置知识 这些概念都与响应式编程密切相关。&#x1f98c; 1. 并发和多线程编程&#xff1a;响应式编程需要处理并发性&#xff0c;它允许多个操作独立地并行执行。这使得应用程序可以在不同的线程、进程或设备上处理多个事件。 2. 事件驱动编程&#xff1a;响应式编程是一种…...

K8S--安装MySQL8(单机)

原文网址&#xff1a;K8S--安装MySQL8&#xff08;单机&#xff09;-CSDN博客 简介 本文介绍K8S部署MySQL8&#xff08;单机&#xff09;的方法。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题…...

CMake+QT+大漠插件的桌面应用开发

文章目录 CMakeQT大漠插件的桌面应用开发说明环境项目结构配置编译环境代码 CMakeQT大漠插件的桌面应用开发 说明 在CMake大漠插件的应用开发——处理dm.dll&#xff0c;免注册调用大漠插件中已经说明了如何免注册调用大漠插件&#xff0c;以及做了几个简单的功能调用&#x…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...