操作系统论文导读(八):Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个

Schedulability analysis of sporadic tasks with multiple criticality specifications——具有多个关键性规范的零星任务的可调度性分析

目录

一、论文核心思想

二、基本定义

2.1 关键性指标

2.2 任务及相关参数定义

 2.3 几个基础定义

三、可调度性分析

3.1 调度算法分类

3.2 DP算法分析

3.3 FJP与FTP算法分析(分析相对于DP的劣势)

3.4  FTP 和 EDF对比

四、混合优先调度

4.1 算法详情

 4.2 算法评价

五、结论


一、论文核心思想

本文主要论证了在混合关键系统中各种调度协议不能像在其他没有关键性参数的RTOS系统中存在简单的相互支配(如EDF算法支配所有的FTP算法),并基于Audsley算法与Vestal算法提出了一种新的算法改良,在具有多重关键性要求的系统中不同的任务需要以不同的置信度确保在截止日期前完成,本文利用 WCET 的这种多重规范来获得更好的处理器利用率并证明了这种算法在混合关键系统的任务调度中支配EDF算法与Vestal算法,但依旧不能支配FJP算法(后续会做解释)

二、基本定义

2.1 关键性指标

从A到E,关键级别依次降低,A失败的结果是灾难性的,B是非常危险,以此类推。

尽管 RTCA DO-178B 标准仅指定了五个关键级别 A-E,但没有特别理由要求系统最多具有五个级别。 因此,文章在这里考虑一个系统模型,其中有任意多个不同的关键级别,用正整数表示,整数越大表示关键程度越高。 (因此,RTCA DO-178B 关键级别 A 将映射到 5,级别 E 映射到 1。)

多关键性零星任务模型:假设每个任务都有一对应用于不同关键水平的WCET估计量,系统可以根据实际执行行为在运行时切换不同的关键模式。

2.2 任务及相关参数定义

考虑多关键性零星任务系统的抢占式单处理器调度。 这样一个多关键性零星任务系统 τ 由 n 个多关键性零星任务 τ1,...,τn 组成。 每个任务 τi 由以下参数表征

WCET 函数 Ci : N+ → R+,指定不同关键级别的 WCET:关键级别l的 WCET 等于 Ci(l)。 在不失一般性的情况下,我们假设 , Ci(l) ≤ Ci(l+1) 。

相对期限参数 Di。

最小到达间隔或周期参数 Ti。

关键水平 Li,Li ∈ N+。

 2.3 几个基础定义

 定义 1(可行性和可调度性)如果算法 A 始终满足 τ 的所有截止日期并达到所需的保证水平,则称多临界零星任务系统 τ 可由调度算法 A 调度。 如果存在某种调度算法 A 使得 τ 可由 A 调度,则称 τ 是可行的。

定义 2(同步到达序列 (SAS))零星任务 τi 的作业同步到达序列包括 τi 的第一个作业到达时刻零,后续作业恰好到达 Ti 时间单位。 任务集合的同步到达序列由任务集合中每个单独任务的同步到达序列的并集组成。

定义二解释:个人理解实际上就是到达时间为n*Ti,其中n为整数

 定义 3 对于任意多临界零星任务系统 τ ,我们定义对应的传统零星任务系统为

在这里,每个传统的零星任务系统都由 3 元组(WCET,相对截止日期,期间)表示。 

定理 1 多临界性零星任务系统 τ 是可行的当且仅当相应的传统零星任务系统是可行的。

证明:考虑一种调度算法,该算法能够在不同作业之间实施时间隔离,允许每个作业仅执行预定的时间量。 可以使这样的算法在最多 Ci(Li) 时间单位内执行 τi 的每个作业,从而基本上忽略 WCET 的多个规范,并将每个多临界零星任务视为传统零星任务。

三、可调度性分析

从可行性分析的角度来看,多临界零星任务系统与传统的零星任务系统是相同的。 尽管如此,关于多临界性零星任务系统的调度还有许多有趣的未解决问题; 当限制可能使用的调度算法种类时,多关键性零星任务系统与传统零星任务系统有很大不同。

3.1 调度算法分类

根据对作业分配优先级的方式的限制,将分为三类用于调度零星任务系统的算法:

1. 固定任务优先级 (FTP) 调度:给定任务生成的所有作业都分配相同的优先级。

2. 固定作业优先级(FJP)调度:同一任务的不同作业可能有不同的优先级。 然而,每个作业的优先级在其到达时间和完成时间之间可能不会改变。

3. 动态优先级(DP)调度:作业的优先级可能会在发布时间和完成时间之间发生变化。

从定义上可以看出,FJP调度是FTP调度的推广,DP调度是FJP调度的推广。 在传统(即非多关键性)任务系统的单处理器调度中,FJP 调度算法最早期限优先(EDF)被认为是最优的,因为 EDF 总是满足所有可行的传统零星任务系统的所有期限;而DP 调度算法(通常会产生更大的运行时实现开销)并不常用于调度此类任务系统。

在这项研究中,我们考虑更通用的 FJP 和 DP 算法。

3.2 DP算法分析

 由于 DP 算法类包括所有调度算法,因此根据定义,所有可行的多临界零星任务系统都可以通过某种 DP 调度算法进行调度。 因此,当且仅当对应的传统零星任务系统(见定义 3)可行时,多临界零星任务系统 τ 是 DP 可调度的。

3.3 FJP与FTP算法分析(分析相对于DP的劣势)

一些调度程序能够在运行时强制执行不同作业之间的时间隔离。 也就是说,每个作业都分配了最大执行量,并且调度程序能够确保没有作业超过分配给它的执行量。 在这样的系统中,没有作业依赖于另一个作业的调度,因此作业的完成不受其他作业执行时间估计准确性的影响。 

现在,任何在作业之间实现时间隔离的算法都可以在 DP 优先级驱动调度算法的框架内实现,只需在适当的时刻简单地提高和降低作业的优先级。 然而,这不能在 FJP 和 FTP 调度算法中完成:FJP 和 FTP 算法本身不能保证作业之间的时间隔离

在传统的零星任务系统中,所有可行的任务系统也可以使用某种 FJP 调度算法(特别是 EDF)进行调度。以下示例说明多关键性零星任务系统并非如此:

示例 1 考虑由两个任务 τ1 和 τ2 组成的任务系统,具有以下参数:

通过考虑这两种可能性——(i) τ1 具有更高的优先级,以及 (ii) τ2 具有更高的优先级——可以验证该系统不是 FTP 可调度的。 它也不是 FJP 可调度的,如下面的论证所示。 让我们在调度 SAS 时考虑每个任务的第一个作业,并考虑两种可能性:τ1 的第一个作业比 τ2 的第一个作业具有更高的优先级,反之亦然。 

1. 当 τ1 的第一个作业比 τ2 的第一个作业具有更高的优先级时:在这种情况下,τ2 的第一个作业不能保证在保证级别 1 的截止日期前完成:因为 C1(2) = 5,τ1 的第一个作业将在间隔 [ 0, 5), 从而允许 τ2 的作业完全不执行。

2. 当 τ2 的第一个作业比 τ1 的第一个作业具有更高的优先级时:在这种情况下,τ1 的第一个作业不能保证在保证级别 2 的截止日期前完成:因为 C2(2) = 5,所以 τ2 的第一个作业将在区间 [0 , 5), 并在截止日期前只为 τ1 的工作留下一个执行单元。

然而,由于 C1(L1)/T1 + C2(L2)/T2 =5/6+0.5/5 < 1,根据定理 1 的结果,该系统是可行的,因此是 DP 可调度的。

C1/T1 + C2/T2+....  < 1是DP算法中计算是否可调度的公式

也就是存在可使用 DP 调度算法进行调度的多临界零星任务系统,这些系统不能使用任何 FTP 或 FJP 调度算法进行调度。

3.4  FTP 和 EDF对比

对于传统的零星任务系统,从可调度性的角度可知EDF主导FTP调度——所有可通过FTP调度调度的任务系统也可通过EDF调度,而有些可通过EDF调度的任务系统不存在FTP调度。 (这是 EDF 最优性的直接结果,事实上没有 FTP 算法在能够调度所有可行的零星任务系统的意义上是最优的。)但是,这种优势不会延续到多关键零星任务系统,如以下简单示例所示。

示例 2 考虑由两个任务 τ1 和 τ2 组成的任务系统,具有以下参数:

τ1 是一个更高关键性的任务。 通过为 τ1 分配比 τ2 更高的优先级,可以验证这两个任务都在所需的关键级别上满足了它们的截止日期; 因此,该系统是 FTP 可调度的。

现在考虑 EDF,让我们关注 SAS 中 τ1 的第二项工作。 回想一下,多关键性任务模型的语义要求用于确保任务满足其截止日期的所有 WCET 值与任务所需的保证级别相同。 比 τ1 的第二个工作具有更高优先级的工作是 τ2 的第一个工作,并且通过传递性,是 τ1 的第一个工作。 WCET 的 C1(2) 和 C2(2) 必须用于确定 τ1 是否满足其截止日期。 但是在使用这些 WCET 估计在 SAS 上模拟 EDF 时,很容易看出 τ1 的第二个作业在时间点 8 错过了它的截止日期(因为 τ1 的第一个作业在 [0, 2] 上执行,而 τ2 的作业在 [2, 7] 上执行) ,从而只留下一个执行单元,而不是 τ1 在截止日期前的第二个作业所需的两个单元)。

其实我觉得这个例子存在一定的问题,如果要细究的话,FTP调度中的第一轮t在0-2时任务1执行t在2-4时任务2执行,t在4-6时任务1抢占执行,则任务二依旧可能会错过D2(因为为文章给出的EDF调度中任务2的最坏执行时间是按5计算的)。只是任务2的关键性低于任务1,但系统不一定是FTP可调度的。

 定理3 FTP和EDF在多临界零星任务系统的调度中是不可比拟的调度策略。

四、混合优先调度

4.1 算法详情

正如上面定理 1 中所讨论的,Vestal 算法(产生最佳 FTP 优先级分配)和 EDF 在涉及多临界零星任务系统时是无法比拟的。 我们在本节中的目标是获得一种调度算法,该算法泛化了 EDF 和 Vestal 算法,并且在多关键性零星任务系统的调度中证明优于两者。 它结合了 FTP 调度和 EDF 的特点。 为了使用这种混合调度策略来调度多关键性零星任务系统 τ,我们必须为 τ 中的每个任务分配一个(不一定是唯一的)优先级。 根据定义,这些优先级是完全相互排序的:只要一个优先级中的作业在运行时等待执行,就不会执行较低优先级的作业。 在每个优先级内,将使用 EDF 安排任务。

同步到达序列 (SAS) 代表最坏情况下的到达序列——如果针对给定的优先级分配使用混合优先级调度来安排零星任务系统的 SAS 以满足所有截止日期,则零星任务 系统将始终满足具有相同优先级分配的混合优先级调度下的所有截止日期。后续将使用这个 观察作为设计多关键零星任务系统的混合优先级调度的优先级分配算法的基础。

优先级分配算法 ASSIGNPRIORITIES(τ ) 是 Audsley 算法的推广,用于在 FTP 调度系统中分配优先级。 过程 AUGMENTEDAUDSLEY(τcur,p) 接受一组任务 τcur ⊆ τ 和优先级 p 作为输入,并确定 τcur 中的哪些任务可以分配优先级 p,哪些必须分配更高的优先级。

在考虑当前优先级 p 的 AUGMENTEDAUDSLEY 中的每个步骤中,τcur 保留尚未排除分配优先级 p 的任务集,τhi 包含已确定需要分配更高优先级的任务集 。开始对 AUGMENTEDAUDSLEY 的初始调用具有最低优先级和所有任务(即 p ← 1 和 τcur ← τ )。

在 AUGMENTEDAUDSLEY 的执行期间,任何被识别为不能保证在当前优先级满足其时序约束的任务必须分配更高的优先级——这样的任务从 τcur 中删除并添加到 τhi。 为了识别在当前优先级无法满足其时序约束的任务,模拟了 (τcur ⋃ τhi) SAS 的混合优先级调度,已经分配了优先级的任务 <p 不需要考虑,因为它们不影响优先级为 p 或更高的任务的调度。

归结的流程如下:

1. 首先让 π1,π2,...,π 表示 τcur 中任务的不同关键级别,按降序排列。用使用 Ci(π1) 作为任务的 WCET; 如果 τcur 中具有临界级别 π1 的任务的所有作业截止日期都得到满足,则它使用 Ci(π2) 作为任务的 WCET 来模拟 (τcur ⋃ τhi) 的 SAS 的混合优先级调度; 如果 τcur 中具有临界级别 π2 的任务的所有作业截止日期都得到满足,它接下来使用 Ci(π3) 作为任务的 WCET 来模拟 (τcur ⋃ τhi) 的 SAS 的混合优先级调度。如果用最低关键级别Ci(πl)用作WCET时满足 τcur 中所有最低关键级别的截止日期,那么就可以完成 τcur 中所有任务都被分配了优先级p时的调度保障

2. 当某个任务在关键级别πj关键级别实验失败时,令 τk 表示具有关键性 πj 的任务生成第一个错过其截止日期的此类作业。 为了让这个作业满足它的截止日期,它有必要比 SAS 中 τcur 分配的优先级 p 中某个任务的某个更早截止日期的作业具有更高的优先级。 

3. 以这种方式为 τk 分配了更高的优先级后, 必须再次重新检查整个系统(第 3-5 行中的 while 循环)。 也就是说,它重新模拟 SAS 在每个关键级别 π1、π2、... 的调度,除了现在为 τk 分配的优先级高于 τcur 中剩余的任务。 这样做时,可以确定一些其他任务 τ ′ k 是否也需要提升到更高的优先级。

4. 与Audsley 方法 一样,AUGMENTEDAUDSLEY 本质上是识别要分配当前优先级 p 的任务,后续会继续在τhi中进行递归,逐渐生成更多优先级为p+1,p+2等等各类任务。但若τcur在执行后变空,即所有任务都需要升级优先级(则算法本质上没啥意义了),返回调度失败。

后续的具体执行如下图所示:

算法是为了解决Vestal提出的任务模型在动态优先级调度下的可调度性问题。算法的目标是给每个任务分配一个虚拟截止时间,使得在不同的关键性模式下,任务的虚拟截止时间都不会超过它们的真实截止时间,并且任务集能够被EDF调度。

伪代码如下:

输入:一个具有多重关键性规范的任务集 T = {T1, T2, ..., Tn}
输出:一个虚拟截止时间分配方案,如果存在的话,或者“不可调度”
开始
  对于 T 中的每个任务 Ti,计算它的关键性等级 Li = max{L | Ci(L) > 0}
  按照关键性等级从高到低对 T 中的任务进行排序
  让 Lmax 为 T 中任何任务的最高关键性等级
  对于 L = Lmax 到 1,执行以下操作:
    让 TL 为 T 中关键性等级至少为 L 的任务子集
    让 CL 为 TL 在 L 等级下的总利用率
    如果 CL > 1,那么返回“不可调度”
    让 DL 为 TL 中任务相对截止时间的不同值集合
    按照相对截止时间从小到大对 DL 进行排序
    让 D0 = 0 和 Dk+1 = infinity,其中 k >= |DL|
    对于 j = 1 到 k,执行以下操作:
      让 Uj 为 TL 中相对截止时间不超过 Dj 的任务的总利用率
      让 Wj 为 TL 中相对截止时间不超过 Dj 的任务在 [Dj-1, Dj] 内的总工作量
      如果 Wj > Uj * (Dj - Dj-1),那么返回“不可调度”
      让 Vj 为 TL 中相对截止时间等于 Dj 的任务集合
      对于 Vj 中的每个任务 Ti,按照以下方式分配虚拟截止时间 Di(L):
        Di(L) = min{Di(L+1), Dj - (Wj - Uj * (Dj - Dj-1)) / Ui(L)}
      如果 Di(L) < Di,那么返回“不可调度”
    结束循环
  结束循环
  返回虚拟截止时间分配方案
结束

这种算法的核心思想是从最高的关键性等级开始,逐步给每个任务分配一个虚拟截止时间,使得每个关键性等级下的任务集都能满足EDF调度的充分条件。

 4.2 算法评价

算法用于为多关键性零星任务系统中的任务分配优先级,以便使用混合优先级调度算法调度生成的系统以满足其各自所需保证级别的所有时序约束 . 我们现在将这种方法与其他可能的多关键零星任务系统调度方法进行比较。

首先,该算法支配 EDF 调度:任何可被 EDF 调度的 τ 将被该算法确定为可调度,并且 τ 中的所有任务都被分配相同的最低优先级。 也就是说,第一次调用 AUGMENTEDAUDSLEY(τ, 1) 通过执行第 8 行的返回语句来声明成功,并且不再对 AUGMENTEDAUDSLEY 进行递归调用。

该算法也支配了 Vestal 算法。 Vestal 算法在每个优先级必须恰好分配给它一个任务的意义上更具限制性; 不难证明,Vestal 算法找到这种优先级分配的任何 τ 也将具有我们的算法找到的优先级分配。

如定理 2所示,存在可行的多临界零星任务系统,这些系统可以使用动态优先级算法进行调度,但不能使用任何 FJP 或 FTP 算法进行调度。 而对于该算法也是如此,即有些任务系统是 FJP 可调度的,但不能使用算法进行调度。

(举例略,文章中例子很好理解)

五、结论

Vestal 提出的多关键性任务模型代表了安全关键型实时系统的建模和分析方面潜在的非常重要的进步。 在本文中,我们试图更好地理解多关键性零星任务系统的抢占式单处理器调度。 我们已经研究了基本的调度理论问题——表现力; 可行性; 特定类别的调度算法的可调度性; 等等——必须理解这些才能完全理解新的任务模型。 我们从这项研究中学到了很多与我们之前使用传统零星任务系统的经验相反的东西:例如,我们了解到 EDF 不是调度多临界零星任务系统的最佳算法,而且 EDF 和固定优先级调度是无法比较的 . 我们还推导出并评估了一种新方案,用于在抢占式单处理器上调度此类多关键性零星任务系统,并表明该新方案优于先前提出的方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「教程」抖音短剧小程序源码开发后上架的教程及好处

上线抖音短剧小程序的步骤 注册账号与准备资料&#xff1a;首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;并完成相关认证&#xff0c;获取小程序开发权限。同时&#xff0c;要准备好短剧相关的素材&#xff0c;如视频、音频、剧本、封面图片等 开发或选择小程…

omi friend实战记录

一、简介 omi friend是国外githab上开源的一个“AI硬件”的制作教程&#xff0c;它的形状是个三角形&#xff0c;属于项链佩戴这类的。可以接入llm进行对话&#xff0c;他有麦克风、扬声器&#xff0c;还有电池。外形好看&#xff0c;功能实用。还有专属的一系列app可以供方便…

活动预告 |【Part2】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课&#xff0c;掌握创造新机遇所需的技能&#xff0c;加快对 Microsoft 云技术的了解。参加我们举办的“迁移和保护 Windows Server 和 SQL Server 工作负载”活动&#xff0c;了解 Azure 如何为将工作负载…

hive-sql 连续登录五天的用户

with tmp as (select 梁牧泽 as uid, 2023-03-03 as dt union allselect 梁牧泽 as uid, 2023-03-04 as dt union allselect 梁牧泽 as uid, 2023-03-05 as dt union allselect 梁牧泽 as uid, 2023-03-07 as dt union allselect 梁牧泽 as uid, 2023-03-08 as dt union allsel…

(NDSS2024)论文阅读——仅低质量的训练数据?用于检测加密恶意网络流量的稳健框架

文章基本信息 作者&#xff1a;Yuqi Qing et al. &#xff08;清华大学李琦团队&#xff09; 代码 文章 摘要 存在问题&#xff1a;收集包含足够数量的带有正确标签的加密恶意数据的训练数据集是具有挑战性的&#xff0c;当使用低质量的训练数据训练机器学习模型时&#xff…

【心随行动】让行动轨迹和复盘形成闭环螺旋式上升

为何会迷茫&#xff0c;因为不知过去未谋将来。认真复盘可以帮达到理想的彼岸&#xff01;&#xff01;&#xff01; 文章目录 为何会迷茫&#xff0c;因为不知过去未谋将来。认真复盘可以帮达到理想的彼岸&#xff01;&#xff01;&#xff01;日复盘模板&#xff1a;时间&…

LabVIEW生物医学信号虚拟实验平台

介绍了一款基于LabVIEW的多功能生物医学信号处理实验平台的设计和实现。平台通过实践活动加强学生对理论的理解和应用能力&#xff0c;特别是在心电图(ECG)和脑电图(EEG)的信号处理方面。实验平台包括信号的滤波、特征提取和频谱分析等功能&#xff0c;能直观体验和掌握生物医学…

Ubuntu安装MinIO

注&#xff1a;本文章的ubuntu的版本为&#xff1a;ubuntu-20.04.6-live-server-amd64。 Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 通过wget下载MinIO二进制文件 sudo wget -P /usr/local/bin https://dl.min.io/server/minio/release/linux…

光纤收发器技术参数详解

1.1系统架构 1.2光纤收发器发展历程 数据速率 模块 最新修订年份 描述 应用 1 Gbps GBIC 2000年 千兆接口转换器 千兆以太网、SDH/SONET (2.5 Gb/s) 和光纤通道 (4Gb/s) 10 Gbps SFP 2001年 小型可插拔 千兆以太网、SDH/SONET (2.5 Gb/s) 和光纤通道 (4Gb/s)…

数据结构--顺序表(详解)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、线性表二、顺序表 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结…

C#高级篇 反射和属性详解【代码之美系列】

&#x1f380;&#x1f380;&#x1f380;代码之美系列目录&#x1f380;&#x1f380;&#x1f380; 一、C# 命名规则规范 二、C# 代码约定规范 三、C# 参数类型约束 四、浅析 B/S 应用程序体系结构原则 五、浅析 C# Async 和 Await 六、浅析 ASP.NET Core SignalR 双工通信 …

C语言程序设计:程序设计和C语言

文章目录 C语言程序设计&#xff1a;程序设计和C语言一、计算机程序和语言计算机语言C语言的发展及其特点C语言的发展历程C语言的特点 二、编译器安装三、最简单的C 语言程序简单的C语言程序介绍程序执行流程&#xff1a;输出&#xff1a; 求两个整数之和运行结果&#xff1a; …

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…

发表文章去哪里投稿?软文推广常见的几种渠道类型

在互联网高度繁荣的当下&#xff0c;人们获取信息的门槛愈发降低&#xff0c;投放信息渠道的类型也五花八门。但想要获得理想的推广效果&#xff0c;信息投放渠道在其中发挥着不小的作用。发表文章去哪里投稿&#xff1f;下面就让我们来了解一下软文推广常见的几种渠道类型。 一…

QComboBox中使用树形控件进行选择

事情是这样的&#xff0c;要在一个ComboBox中通过树形结构进行内容的选择。 默认的QComboBox展开是下拉的列表。因此需要定制一下。 效果就是这样的 实现上面效果的核心代码就是下面这样的 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { treenew…

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…

Linux之ARM(MX6U)裸机篇----7.蜂鸣器实验

一&#xff0c;蜂鸣器模块 封装步骤&#xff1a; ①初始化SNVS_TAMPER这IO复用为GPIO ②设置SNVS_TAMPPER这个IO的电气属性 ③初始化GPIO ④控制GPIO输出高低电平 bsp_beep.c: #include "bsp_beep.h" #include "cc.h"/* BEEP初始化 */ void beep_init…

前端学习DAY29(1688侧边栏)

完整代码、 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1688导航条</title><style>…

NLP模型工程化部署

文章目录 一、理论-微服务、测试与GPU1&#xff09;微服务架构2&#xff09;代码测试3&#xff09;GPU使用 二、实践-封装微服务&#xff0c;编写测试用例和脚本&#xff0c;并观察GPU1&#xff09;微服务封装(RestFul和RPC)2&#xff09;测试编写(unit_test\api_test\load_tes…

重生之我在异世界学编程之数据结构与算法:深入队列篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 一、概述二、链表节点结构三、队列结构四、基…