USB3.0接口——(3)协议层(包格式)

7.协议层

7.1.超高速传输事务

超高速事务(SuperSpeed transactions)由主机对设备端点请求或发送数据开始,并在端点发送数据或确认收到数据时完成。超高速总线上的数据传输(transfer)是主机请求设备应用程序生成的数据,然后该请求被分解成一个或多个突发事务(burst transactions)。当等待完成当前的总线事务时,超高速主机可以启动一个或多个OUT总线事务到一个或多个端点。

注意:在满足如下条件之一前,超高速主机不可以发起另一个IN总线事务到任何端点:
• 接收到所有DPs,或者一个NRDY,或者一个STALL TP,或者发送给非等时(non-isochronous)端点的当前ACK TP事务超时;或者

• 接收到所有的已经请求过的DPs,或者接收到一个短包(short packet),或者接收到一个last packet flag被设置的DP,或者发送给等时(isochronous)端点的当前ACK TP事务超时。

对于非等时传输(non-isochronous transfers),端点可能通过如下方式对有效的事务(valid transactions)做出响应:

• 返回一个NRDY事务包(Transaction Packet)

• 返回ACK事务包(Transaction Packet)来接受OUT事务 • 返回一个或多个数据包来响应IN事务

• 如果遇到端点内部错误,返回一个STALL事务包(Transaction Packet)

NRDY 事务包(TP)响应表示端点没有准备好接受或者发送数据。结果,在该端点通知主机它已经准备好之前,主机和该端点之间不应该有进一步的活动。这就允许主机和设备之间的链路被设置到低功耗状态(reduced power state),直到端点准备好接受或者发送数据。一旦准备好,端点异步发送一个通知(ERDY TP)给主机,告诉主机它现在已经准备好搬移数据,而主机也通过重新调度先前的请求来做出对该通知的响应。注意等时传输不使用ERDY 或者 NRDY TPs,因为它们是由主机周期性地服务的。此外,在等时端点上发送或者接收的数据包不需要确认,也就是说,没有ACK TPs被发送来确认数据包的接收。

端点只响应由主机作出的请求。主机负责调度总线上的事务,并维护总线上数据搬移的优先级和公平性(priority and fairness);这是通过对IN和OUT请求进行计时和排序(timing and ordering)达到的。事务不是广播;包通过一条直接的路径在主机和设备间穿越(traverse a direct path)。任何没有被使用的链路都可以被设置到低功耗状态(reduced power states),使得总线可以满足严苛的电源管理要求(amenable to aggressive power management)。

7.2.数据包类型

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0331c0bae2684d3aa54a1f85471a11c7.png在这里插入图片描述

超高速USB使用4种基本数据包类型,每个类型又有一个或者多个子类型。这4种类型如下:

• 链路管理包【Link Management Packets (LMP)】
只在一对链路(一对直接连接的端口)之间传送,主要用于管理这条链路。

• 事务包【Transaction Packets (TP)】
在所有的直接连接主机和设备的链路上传送。它们被用于数据包流程控制制,配置设备及集线器等等。事务包没有数据负载。

• 数据包【Data Packets (DP)】
在所有的直接连接主机和设备的链路上传送。数据包有两部分:数据包头【Data Packet Header (DPH)】以及数据包负载【Data Packet Payload (DPP)】。

• 等时时戳包【Isochronous Timestamp Packets (ITP)】
是在主机到一个或多个设备间的所有活动链路(active links)上的多播(multicast)。

所有的包都包含一个14字节的头部,紧接包尾的2字节链路控制字(Link Control Word)(总共16字节)。所有的头都有一个Type字段,被接收实体(receiving entity)(例如主机,集线器,或者设备)用来判断如何处理这个包。所有的头部都包含2字节CRC (CRC-16)。包头具有在1020个比特中少于1个不可校正或不可检验(uncorrectable or undetectable)的错误率。

所有的设备(包括集线器)以及主机都消耗掉它们接收到的链路管理包(LMPs)。集线器有附加的责任来转发DPs, ITPs, 以及TPs到接近设备的下行端口(downstream port nearer a device),或者到接近主机的上行端口(upstream port nearer the host)。注意等时时戳包(ITPs)只由主机发送,而由设备接收。所有除链路管理包(LMPs)之外的包都会被集线器转发,除非这个包是路由给该集线器自己的。对路由等时时戳包(ITPs)的附加规则在第8.7节中描述。注意,在TP, ITP, 或者DPH中的链路控制字(Link Control Word)可能会被集线器在转发之前改变。

如果Type字段的值是Transaction Packet 或者Data Packet Header,那么Route String和Device Address字段将依照Type字段而定。Route String字段被集线器用于路由在其上行端口出现的数据包到适当的下行端口。从设备来的数据包总是从集线器的下行端口路由到其上行端口。Device Address字段用来供主机识别一个数据包的源。所有其它的字段将在本章后面得以详述。

数据包在包头中包含附加的信息用来描述数据块(Data Block)。数据块(Data Block)总是紧跟4字节的CRC-32字段,用以判定数据的正确性。数据块和CRC-32一起被称作数据包负载(Data Packet Payload)。

7.3.数据包格式

注意:保留值和保留字段的处理
保留字段和保留值不允许以Vendor特定的方式使用。
发送方应该将所有的保留字段都设置为零值,接收方应该忽略所有的保留字段。
发送方不允许将已定义的字段设置成保留值,接收方应该忽略所有的将已定义字段的值设成了保留值的数据包。

7.3.1.包头

在这里插入图片描述

这一节定义超高速数据包。定义组成包类型和子类型(packet type and subtypes)的各个字段。

在本节中,数据包字节和bit位定义使用未编码的数据格式来定义。

7.3.1.1.所有包头都有的字段
7.3.1.1.1.Type字段

所有的超高速头包都是以Type字段开始的,用以判定如何解释该包。在高层次上这告诉包的接收者如何处理它:要么使用它来管理链路,要么用来控制设备和主机之间的数据流。

Type字段是一个5-bit的字段,用于指定数据包的具体格式。类型是被中间的链路用于判定数据包如何被使用或者被转发。

在这里插入图片描述

7.3.1.1.2.CRC-16

所有的包头都有16-bit CRC字段。这个字段是对前面的12字节进行CRC计算而得到的。

7.3.1.1.3.链路控制字(Link Control Word)

在这里插入图片描述
在这里插入图片描述

7.4.链路管理包

在这里插入图片描述

Type 字段设置成Link Management Packet 的数据包被称作链路管理包LMPs。这些数据包被用来管理单个链路。它们不携带地址信息,因此不能被路由。它们可能因执行集线器端口命令而被生成。例如,一个集线器命令可被用来设置U2不活动超时值(U2 inactivity timeout)。此外,他们被用来交换端口能力信息以及完成测试目的。

7.4.1.Sub Type字段

LMP Subtype字段的值进一步标示LMP的内容
在这里插入图片描述

7.4.2.Set Link Function

Set Link Function LMP应该被用来配置可以无须脱离活动状态(U0)就能被改变的功能性(functionality)。

一旦接收到一个Force_LinkPM_Accept bit有效的(asserted)LMP包,端口应该接受所有的LGO_U1 和 LGO_U2链路命令,直到端口接收到Force_LinkPM_Accept无效的(de-asserted)LMP包。

设备必须保持在U1或U2,直到下行端口发起退出到U0。软件在发起导致生成LGO_U1 或者LGO_U2链路命令的SetPortFeature命令之前,需要确保链路层级上没有正在等待的包(no pending packets at the link level)。在常规操作期间,该特性只能在所有将链路状态从U0降低到U1或U2的其他方式都失败的情况下使用。这个LMP是在集线器接收到一个SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接给特定端口上的设备。
注意,不恰当地使用Force_LinkPM_Accept功能可能极大地影响链路性能,而在某些情况下(仅指在常规操作期间使用时)可能导致设备不能被返回到正常操作。

这个LMP被集线器在接收到SetPortFeature (FORCE_LINKPM_ACCEPT)命令时,发送给连接到特定端口上的设备。
在这里插入图片描述

在这里插入图片描述

7.4.3.U2不活动超时(Inactivity Timeout)

U2不活动超时LMP应该被用来定义从U1转换到U2的超时值。【已勘误,对于上行端口,没有U1不活动定时器。】
在这里插入图片描述

U2不活动超时功能(Inactivity Timer Functionality)

在这里插入图片描述
在这里插入图片描述

7.4.4.制造商设备测试(Vendor Device Test)

使用这个LMP主要是为了制造商特定的测试目的,不应该用于正常的链路操作。

在这里插入图片描述

制造商特定的测试功能
在这里插入图片描述

7.4.5.端口能力(Port Capabilities)

端口能力LMP(Port Capability LMP)描述每个端口的链路能力,且在成功完成训练和链路初始化之后,链路伙伴双方都要发送。在端口从Polling进入U0之后,端口应该发送在链路初始化(完成之后的tPortConfiguration时间内发送Port Capability LMP。注意端口可能不总是从Polling直接转换进入U0,而是在进入U0之前可能通过其他中间状态(例如,Recovery或Hot Reset)转换。不论在Polling和进入U0之间经过了什么状态,设备都应该在进入U0时立即发送一个Port Capability LMP。

如果一个链路伙伴在tPortConfiguration时间内没有接收到这个LMP,那么:

如果链路伙伴有下行能力,它应该按照第10.14.2.6节所描述的那样发送一个错误信号。
如果链路伙伴只支持上行能力,那么上行端口应该转换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
在这里插入图片描述

端口能力LMP 格式
在这里插入图片描述
在交换端口能力LMPs之后,链路伙伴应该根据下表所指定的那样来判定由哪一方被配置为下行端口。

端口类型选择矩阵
在这里插入图片描述
注1: 如果TieBreaker字段相等,那么链路伙伴双方应该用新的不同TieBreaker值来重新交换端口能力LMPs。端口生成TieBreaker字段值的顺序应该足够随机。【译注:TieBreaker本身就含有决胜局之意。】

7.4.6.端口配置(Port Configuration)

这一节只描述与端口能力LMP有区别的字段。所有的支持下行端口能力的超高速端口都应该能够发送这个LMP。如果即将被配置成上行模式的端口没有在链路被初始化之后的tPortConfiguration时间内接收到这个LMP,那么这个上行端口应该切换到SS.Disabled状态,并且应该尝试以这个设备支持的其它速度进行连接。
在这里插入图片描述

端口配置LMP格式 (与端口能力LMP有区别之处)

在这里插入图片描述
被配置为下行模式的端口应该发送这个端口配置LMP给上行端口。发送该LMP的端口应该只选择Link Speed字段的其中1个比特。如果有能力充当下行端口的端口不能与其链路伙伴协同工作,那么该有能力充当下行端口的端口应该发送一个错误信号。

7.4.7.端口配置响应(Port Configuration Response)

在这里插入图片描述

这个LMP是由上行端口作为对端口配置LMP的响应而发出的。他被用作对端口配置LMP的接受或者拒绝的指示。这一节也只描述与端口能力LMP有区别的字段。
所有支持上行端口能力的超高速端口都应该能够发送这个LMP。
如果下行端口在tPortConfiguration之内没有收到这个LMP,则它应该发送一个错误信号。

端口配置响应LMP格式 (与端口能力LMP有区别之处)

在这里插入图片描述
如果Response Code 指示Link Speed 被上行端口拒绝, 下行端口应该发送一个错误信号。

7.5.事务包【Transaction Packet (TP)】

事务包(TPs)被用来报告数据事务的状态,并且可以返回值用以指示数据包的成功接收(reception of data packets),命令被接收或拒绝(command acceptance or rejection),流程控制(flow control),以及暂停情况(halt conditions)。
组成事务的包依端点类型的不同而有所不同。有4种端点类型:批量(bulk),控制(control),中断(interrupt),以及等时(isochronous)。
在这里插入图片描述

事务包 (TPs) 穿越主机和设备之间的直接路径。
事务包被用来控制数据流和管理端到端的连接。
Type字段的值应该设置为Transaction Packet (即00100b)。
Route String字段是被集线器用来路由出现在其上行端口上的包到正确的下行端口。从设备发出的事务包的路由字串被设置为零。
当主机发送一个事务包时,Device Address字段包含预定的接收者的地址。当设备发送一个事务包给主机时,它将Device Address字段设置为它自己的设备地址。该字段被主机用来识别事务包的来源。
事务包中SubType字段被接收者用来判定事务包的格式和使用方式。

在这里插入图片描述

7.5.1.ACK

这个事务包用于两个目的:

对于IN端点,由主机发送该事务包,用来从设备请求数据,以及对主机之前接收到的数据包进行确认。
对于OUT端点,由设备发送该事务包,用来对主机之前发送的数据包进行接收确认,以及通知主机在接收到这个包后设备还有多少个数据包缓冲区可用。
在这里插入图片描述

确认事务包 ACK TP 格式
在这里插入图片描述
在这里插入图片描述

7.5.2.NRDY

只能由设备的非等时端点发送这个事务包。OUT端点在设备没有包缓冲区来接收主机已经发送来的数据包DP的情况下,发送这个TP给主机。IN端点在不能发送数据包DP给主机的情况下,发送这个TP给主机,作为对主机已经发送来的ACK TP的响应。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

在这里插入图片描述

7.5.3.ERDY

只能由设备的非等时端点发送这个事务包。它被用来通知主机,端点已经准备好发送或者接收数据包。

本节只描述与ACK TP有区别的字段。

在这里插入图片描述

ERDY TP 格式 (与 ACK TP 有区别部分)
在这里插入图片描述

7.5.4.STATUS

只能由主机发送这个事务包。它被用来通知设备的控制端点,主机已经发起控制传输的状态阶段。这个TP应该只被发送给控制端点。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

STATUS TP 格式(与 ACK TP 有区别部分)
在这里插入图片描述

7.5.5.STALL

只能由设备的端点发送这个事务包。它被用来通知主机,端点已经被暂停(halted)或者控制传输无效。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

在这里插入图片描述

7.5.6.DEV_NOTIFICATION

只能由设备发送这个事务包。它被设备用来通知主机,设备或者接口状态有异步改变,例如,用来识别设备中引起设备执行一次远程唤醒操作的功能(function)。这个事务包不是从一个特别的端点发送的,在总体上是由设备发送的。

本节只描述与ACK TP有区别的字段。
在这里插入图片描述

设备通知 TP 格式 (与 ACK TP 有区别部分)
在这里插入图片描述

7.5.7.PING

这个事务包只能被主机发送。他被主机用来在发起一个等时传输之前,将到一个设备的所有链路转换到U0状态。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。

设备应该通过在tPingResponse时间(参考表8-33)内,发送PING_RESPONSE TP给主机,来响应PING TP(参考8.5.8节)。注意设备不应该验证EP_NUM和Direction字段,而是简单地将它们拷贝到PING_RESPONSE TP的相关字段中【已勘误】。

设备应该将其链路保持在U0状态,直到它从主机接收到一个后续包,或者直到tPingResponse时间(参考表8-33)超时。

在这里插入图片描述

PING TP 格式 (与 ACK TP 有区别的地方)

在这里插入图片描述

7.5.8.PING_RESPONSE

这个事务包只能由设备发送,来响应主机发送的PING TP。每接收到一个PING TP都应该发送一个PING_RESPONSE TP。参考附录C中关于使用这个TP的细节。本节只描述与ACK TP有区别的字段。

PING_RESPONSE TP 格式 (与 ACK TP 有区别的地方)
在这里插入图片描述

7.6.数据包

数据包可以被主机或者设备发送。主机用这个包发送数据给设备。设备用这个包返回数据给主机,作为对ACK TP的相应。
所有的数据包都由数据包头(Data Packet Header)和数据包负载(Data Packet Payload)组成。本节只描述与ACK TP有区别的字段。

数据包在主机和设备间的直接路径上穿行。
注意发送零长数据块的数据包是允许的,但还是需要一个CRC-32。
在这里插入图片描述

数据包格式 (与 ACK TP 有区别的地方)

在这里插入图片描述
在这里插入图片描述

7.7.等时时戳包【ITP】

ITP的Type字段是01100b (Isochronous Timestamp Packet)。ITPs 被用于从主机传送时间戳信息到所有的活动设备。ITPs不携带寻址或者路由信息,被集线器多播(multicast)到其链路处于U0状态的所有下行端口。设备不应该响应ITP。ITP用来提供主机端的时序信息到设备以达到同步。注意所有的设备或者集线器都可能接收ITP。主机应该当且仅当根端口链路已经在U0状态时在该链路上传送ITP。只有主机应该发起ITP传送。主机不应该为了要传送ITP而将根端口链路带进U0状态。如果根端口链路处于U0状态,主机应该在每个总线间隔的边界的tTimestampWindow内传送一个ITP。主机应该在主机的根端口的链路从轮询状态进入U0状态tIsochronousTimestampStart时间内开始传送ITPs。ITP可以在一个突发的包之间传送。如果一个设备接收到一个链路控制字中的延迟标志(DL)被设置的ITP,其时间戳值可能非常不精确,可以被设备忽略。
在这里插入图片描述

等时时戳包格式

在这里插入图片描述
在ITP的第一个分帧符号(framing symbol)被传送时测量的ITP的ITS值精确度应该具有主机时钟(用于ITP生成)值的±1个 tIsochTimestampGranularity单位。

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

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

相关文章

在做题中学习(58):和为K的子数组

560. 和为 K 的子数组 - 力扣(LeetCode) 因为是判断子数组的和 要返回 k 的次数,所以 解法:前缀和 哈希表 提出一个概念:以下标i为结尾的所有子数组 那要找出所有和 k的子数组 就相当于:找出所有值为…

高端智能终端RK3399主板在配送机器人项目的应用,支持免费定制

基于高端智能终端主板IoT-3399E推出了系列配送机器人,面向各类线下门店的配送服务。配送机器人可实现智能识别、精准配送、自动避障、自主调度系统、语音播报、信息互动等功能,大幅提升服务效率,为消费者带来更加便捷、智能的服务体验。 核心…

Zab之光:照亮分布式系统数据一致性迷宫的智慧火把

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 在构建大型分布式系统时,数据一致性是我们必须面对的挑战之一。随着业务的增长和系统规模的扩大,如何保证在多个节点间复制的数据保持一致,成为了一…

keepalived双机热备超详细入门介绍

keepalived 一、keepalived入门介绍 1.keepalived简介 2.keepalived服务的三个重要功能 2.1.管理LVS负载均衡软件 2.2.实现对LVS集群节点健康检查功能 2.3.作为系统网络服务的高可用功能 3.keepalived高可用故障切换转移原理 4.keepalived安装及主配置文件介绍 …

图搜索算法-最短路径算法-贝尔曼-福特算法

相关文章: 数据结构–图的概念 图搜索算法 - 深度优先搜索法(DFS) 图搜索算法 - 广度优先搜索法(BFS) 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 贝尔曼-福特算法(Bellman-Ford&#…

OpenAI春季发布会, GPT-4o引爆科技圈 |千字文全面解读

今天,OpenAI再一次引爆了科技圈。这次的核心亮点无疑是他们的全新模型:GPT-4o,以及基于此模型构建的全新ChatGPT版本。 GPT-4o是什么? OpenAI 最新推出的 GPT-4o,“o”代表“Omni”,这一拉丁词根在英语中常…

CentOS报错: Fontconfig head is null, check your fonts or fonts configuration

错误 解决方案 这个报错的原因时java读取本地字体时发现字体损坏或者缺失,只需要补充一下字体就可以了,解决方法安装FontConfig组件即可: sudo yum install fontconfig

弥合孤岛:克服构建 DevOps 文化的挑战

持续变革正在发生软件开发行业。DevOps 因其对自动化、协作和持续改进的关注而成为优化软件交付并弥合开发和运营团队之间鸿沟的重要方法。然而,过渡到真正的 DevOps 文化并非没有挑战。本文探讨了您在追求 DevOps 时可能面临的障碍并提供了解决方案。 01 了解 Dev…

JINGWHALE 数字认证体系 · 进阶知识库

JINGWHALE 数字认证体系 是 JINGWHALE 数字科学艺术创新中心 的数字认证服务。 ◢◤ 宗旨 致力于数字化知行合一的知识赋能! ◥ 数字化人才培养 培养数字化思维,传播数字化知识,赋能各行业数字化。 ◥ 职业人才发展 无缝衔接学校高等…

Databend 开源周报第 144 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 了解 Databend …

有一个21年的前端vue项目,死活安不上依赖

在公司开发的时候遇到的一个很玄幻的问题,这个项目是21年开发的,现在我是24年中途二开增加新功能 这个项目经过多人之手,现在已经出现了问题------项目依赖安不上,我能启动完全是因为在23年的时候写这个项目的时候将依赖费九牛二虎之力下载好后打成了压缩包发给另外一个安不上依…

分析 vs2019 c++ 中的 decltype 与 declval

(1) decltype 可以让推断其参数的类型。按住 ctrl 点击 decltype ,会发现无法查阅 其定义 : (2) 但 STL 库里咱们可以查阅函数 declval 的 定义,很短,摘抄如下: templat…

PostgreSQL源码安装

文章目录 一、先决条件检查二、源码安装1、获取源代码2、编译安装1.运行 configure2.运行make 3、PostgreSQL的配置4、安装contrib目录下的工具 三、初始化数据库1、创建数据库管理员2、创建数据库实例3、启动和停止数据库4、设置数据库密码 四、PostgreSQL的简单配置1、pg_hba…

Java项目实现报文数据校验注解方式(必输项、值大小)

普通项目 导入校验依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

系统定期执行命令的方法

系统定期执行命令的方法 一、进入超级用户下 执行命令&#xff1a;sudo su 二、添加要执行的命令 例子&#xff1a;每天0点执行一次myapp.sh命令 先后输入&#xff1a;crontab -e、 1、 回车 设置每天0点执行一次myapp.sh操作&#xff0c;需要写绝对路径 含义&#xff1…

RK3576 Camera:资源介绍

RK3576是RK今年上市的中高端旗舰芯片&#xff0c;定位弱于RK3588。这篇文章主要分享一下RK3576这颗主控芯片的camera资源。 &#xff08;1&#xff09;RK3576 camera资源 ①RK3576 camera硬件框图 RK3576的camera硬件框图如图所示&#xff0c;拥有一路4lane的DCPHY&#xff…

Spring Cloud Consul 4.1.1

该项目通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法&#xff0c;为 Spring Boot 应用程序提供 Consul 集成。通过一些简单的注释&#xff0c;您可以快速启用和配置应用程序内的常见模式&#xff0c;并使用基于 Consul 的组件构建大型分布式系统。提供的模式…

银河麒麟v10 重装系统恢复原home分区

现象&#xff1a;系统还原后在锁屏状态下输入密码后闪退回锁屏 ctrl alt f1切到命令行模式&#xff0c;查看/home目录下的用户文件夹里无文件 1、blkid找到data分区的uuid和设备编号&#xff0c;记录下来&#xff1b; 2、sudo mount /dev/sda5 3、sudo vi /etc/fstab&#xf…

JAVA中类和对象(承接上次的补充)

目录&#xff1a; 一.static修饰成员方法 二.static成员变量初始化 三.代码块 一.static修饰成员方法: 1.一般类中的数据成员都设置为 private &#xff0c;而成员方法设置为 public &#xff0c; 问&#xff1a;那设置之后&#xff0c;Student类中&#xff0c;被Student修饰…

数据结构——01-抽奖数人-链表-实验题目与解答

数据结构抽奖数人链表实验题目与解答 一、**实验题目** 抽奖游戏&#xff1a; n个人围成一圈&#xff0c;由第一个人开始&#xff0c;依次报数&#xff0c;数到第m人&#xff0c;便抽出来作为中奖人&#xff0c;然后从他的下一个人数起&#xff0c;数到第m人&#xff0c;再抽…