全面详细讲解OSEK直接网络管理,并对比Autosar网管。

news2024/11/25 2:29:40

        搞了两年的Autosar,用到的网络管理都是Autosar网络管理,虽然偶尔有听到或看到Osek网络管理,但是一直没机会具体进行开发和测试。最近有机会具体接触和开发到,弄完之后感受就是:还是Autosar的网络管理好用,Osek Nm状态比Autosar Nm复杂一点,而且Osek Nm不好测试。


目录

前言

以逻辑环为理解OSEK网管的切入点:

Osek网管报文的字节数据定义

1、(开始)逻辑环是怎么建立的?

步骤1:主动唤醒的节点发出Alive报文

步骤2:被动唤醒的节点发出Alive报文

步骤3:接收到Alive报文,ECU更新逻辑环中自己的后继节点

步骤4:ECU发处Alive报文前后的OSEK NM状态跳变情况

步骤5:CAN总线上发出第一帧Alive报文的ECU节点等待“TTyp”时间后,发出第一帧Ring报文,其它节点按照逻辑顺序发出Ring报文

步骤6:逻辑环建立完成

2、(结束)如果所有ECU都不需要工作了,如何结束逻辑环进入休眠?

中间小结:

3、(运行过程)逻辑环运行过程中,有一个新的ECU节点加入怎么处理?

4、(运行过程)逻辑环运行过程中,有一个ECU节点异常退出怎么处理?

某个ECU异常退出对于其它节点网管状态的影响:

某个ECU异常退出对自己内部网管状态的影响:

1、具体如何进入LimpHome状态:

2、进入LimpHome状态后的动作:

3、如何从LimpHome状态恢复

OsekNm与Autosar网管的区别:

      网络休眠->网络唤醒:

      网管唤醒后正常工作:

      网络唤醒->网络休眠:

      异常情况:


前言

        据我目前所知,网络管理有Osek网络管理和Autosar网络管理。Osek网络管理具体又分为Osek直接网络管理Osek间接网络管理。Autosar网络管理只有Autosar直接网络管理。

        直接网络管理:简单来说就是通过网管报文实现网络管理

        间接网络管理:简单来说就是通过应用报文实现网络管理(间接网络管理没有网管报文)

        而在汽车电子领域,网络管理的目的就是为了汽车上各个ECU节点能够同起同睡(关于同起同睡,可以点这里详细理解)。

        本篇文章讲的是Osek直接网络,同时对比Autosar网络管理。


        另外,再科普文中需要提前理解的概念:网管报文、ECU地址

        网管报文:所谓网管报文,就是一段范围ID的报文,Osek网络管理定义0x400-0x4FF的报文为网管报文。

        ECU地址:若网管报文ID范围为0x400-0x4FF,则基地址为0x400,ECU地址为0x00-0xFF,如BMS节点的ECU地址为0x08。


        刚开始接触OSEK网管的时候,各种网上学习,然后看到好多文章在讲什么令牌啊、逻辑环啊什么的,而状态机图还是不常见的那些状态机图,对于我这个小白来说实在是太难受了,这么抽象理解半天没搞懂。

以逻辑环为理解OSEK网管的切入点:

        我们先来看一下各个ECU节点都处于唤醒状态并且处于稳定正常工作的情况:

        所谓的OSEK NM的逻辑环,其实就是上面图中那个东西:每个ECU按照逻辑顺序依次发出网管报文,并且报文的Byte0的数据指向下个节点地址。

        从上面的报文可以看到,当前网络上有6个ECU节点,节点地址分别是:0x01,0x02,0x04,0x06,0x08,0x10。并且已经建立了逻辑环,另外我们称这些报文为Ring报文

        接下来,我们从上面所示的逻辑环为学习OSEK NM的突破口,引出一系列问题,然后逐一解答,就很容易理解OSEK网管了。

        1、(开始)这个逻辑环是怎么建立的?

        2、(运行过程)逻辑环运行过程中,有一个新的ECU节点加入怎么处理?

        3、(运行过程)逻辑环运行过程中,有一个ECU节点异常退出怎么处理?

        4、(结束)如果所有ECU都不需要工作了,如何结束逻辑环进入休眠?

        在我看来,OSEK网管机制无非就这4种情况,我觉得把这4个问题解答完,整个Osek直接网管就清晰明了了。

        在此之前,我们先看下Osek网管报文的字节数据定义:

Osek网管报文的字节数据定义

Source ID:该报文的报文ID

Dest.ID(Byte0):目的地址,即指向的下一个ECU地址

OpCode(Byte1):

        Bit0 为 Alive 报文标志位;

        Bit1 为 Ring 报文标志位;

        Bit2 为 LimpHome 报文标志位;

        Bit3、Bit6、Bit7 预留,设置为“0”;

        Bit4 代表 Sleep.Ind 即节点的睡眠指示位;

        Bit5 代表 Sleep.Ack 即节点 Ring 报文的睡眠确认位;

        其实这个也很好记,8个Bit,从低到高是按报文发出的时间顺序的:

        列出表格如下:

DataFiled(Byte2-7):数据内容与网络管理无关,数据内容由用户定义(比如可以填唤醒原因,用于问题分析等)


 另外,OSEK 网管机制中需要用到下面的时间参数需要先贴出来。大家有个印象即可,暂时不需要理解。下面讲解时用到的时候就明白了。


1、(开始)逻辑环是怎么建立的?

        建立逻辑环,又涉及到整个ECU网络的同起同睡、主动唤醒和被动唤醒了,如果对这些概念不理解的朋友可以点击这里看一下(同起同睡、主动唤醒和被动唤醒)。

步骤1:主动唤醒的节点发出Alive报文

        好了,现在整个CAN网络的所有ECU都处于休眠状态。假设ECU_A(节点地址为0x408)有主动工作请求并且主动唤醒了,然后ECU_A会向CAN总线发出一帧网管报文,由于此时逻辑环还未建立,因此发出的这帧网管报文我们称之为Alive报文

        如下面这张图所示

        

        Byte1:0x01。指示该报文为Alive报文。

        Byte0:0x08。由于该报文为Alive报文,因此该报文是指向自己的(0x408)

步骤2:被动唤醒的节点发出Alive报文

        当主动唤醒的ECU节点发出首帧CAN总线上的Alive网管报文后,CAN总线上其它ECU节点收到网管报文后被动唤醒,并且也发出一帧Alive报文,如下图所示

步骤3:接收到Alive报文,ECU更新逻辑环中自己的后继节点

        CAN总线上的节点在发出一帧Alive报文的同时还会接收来自总线其它节点的Alive报文。并且根据接收到的网管报文的报文ID,更新自己的后继节点。具体逻辑如下图所示:

        其中:

        R:Receiver为接收到网管报文的ECU(可以理解为自己

        S:Source为发送网管报文的ECU(可以理解为发网管报文过来的ECU

        L:Log.successor为接收到网管报文的ECU的当前后继ECU(可以理解为当前自己的后继ECU

        更新自己后继节点的算法流程图如下:

         当L = S的时候,就说明自己的后继节点(即L)需要更新为发送该网管报文的ECU节点(即S)。

        用第一行举个例子:

        假设,Source-ECU发出的报文ID为0x400,Log.successor-ECU地址为0x01,Receiver-ECU的地址为0x0F。

        当Source-ECU没有发出网管报文的时候,Receiver-ECU为逻辑环中地址最大的ECU节点,因此它的后继节点为地址最低的节点:0x01。现在Source-ECU发出了网管报文0x400,因此Receiver-ECU的后继节点就不是0x01,而是0x00了。如下图所示:

        

        图中其它行也是一样的理解。

        好了。每个ECU节点按照这种后继节点的更新机制,当CAN总线上所有的ECU都发出一帧Alive报文后,同时每个ECU也都找到了自己的后继节点。

步骤4:ECU发处Alive报文前后的OSEK NM状态跳变情况

步骤5:CAN总线上发出第一帧Alive报文的ECU节点等待“TTyp”时间后,发出第一帧Ring报文,其它节点按照逻辑顺序发出Ring报文

        我们先来看一下"TTyp"定时器。

        定义:

        即:两帧Ring报文的时间间隔。

        再看看“Ttyp”定时器何时开启何时关闭及定时器到时动作,如下图所示:

       从这个表格可以看出,TTyp定时器的使用,其实就是实现了使得各个节点按照逻辑顺序依次发出Ring报文的功能,如一开始的那张图,可以知道TTyp定时器就是100ms。

        而CAN总线发出的第一帧Ring报文从何而来?

        其实这就跟上述 “TTyp”定时器开启的情况①有关:每个ECU发出Alive报文后都会开启自己的TTyp定时器。

        由于大家的TTyp定时器的时间都是一样的,因此当然是发出首帧Alive报文的ECU的Ttyp定时器先计时完,然后发出第一帧Ring报文。如下图所示:

        Byte1:0x02,指示该报文为Ring报文。

        Byte0:0x10,指示该报文指向的下个地址为0x10的ECU,如下图所示。

步骤6:逻辑环建立完成

        各个ECU按照 “TTyp”定时器开启条件和关闭条件,当计时完成就发出自己的Ring报文。

        至此!整个逻辑环就建完了。各个ECU按部就班发出Ring报文就好了,正如本篇文章开头的图片所示:       

        到这为止,大家应该对开头的这张图就有了更深的理解。

        在建立逻辑环的过程中,涉及到两个重要的网管状态:NMRESETNMNORMAL

        这两个状态实际上做了许多事情,如下图所示,大家可以仔细看看。

2、(结束)如果所有ECU都不需要工作了,如何结束逻辑环进入休眠?

        再看回Osek网管报文的帧结构:

        其中

        Bit4,SleepInd位:即睡眠指示位,这个位的置位与其它ECU无关当ECU自己没有主动工作请求后,在发出的网管报文中就把SleepInd置位。当ECU有主动工作请求时,在发出的网管报文中就把SleepInd置位。(睡眠指示位无论是在Alive、Ring、LimpHome报文都能置位)

        Bit5,SleepAck位:即睡眠应答位,这个位的置位与其它ECU有关。逻辑环中每个ECU在发出Ring报文前,都会首先检查一遍逻辑环中其它ECU的SleepInd位是否都已置位,并且自己无主动请求,则将发出的Ring报文的SleepAck位置位,其它ECU检测到网管报文的SleepAck位置位后,则进入NMWaitBusSleep状态。(睡眠应答位只在Ring置位)

        因此,当逻辑环中ECU都不需要工作后,会发出SleepInd位置位的报文,当最后一个不需要工作的ECU将SleepAck位置位后发出Ring报文,然后大家就都停放网管报文和应用报文,大家都进入NMTwbsNormal状态了。并等待TWaitBusSleep后进入NMBusSleep状态,大家都休眠了。

        流程如下图所示:

        另外,当处于NMTwbsNormal状态若检测到唤醒源主动唤醒或被动唤醒(被动唤醒即SleepInd不置位的网管报文),则重新进入NMReset状态,重新开始建环流程。


中间小结:

        到这里为止,就是处于正常情况下(所有ECU的Rx和Tx都正常)的OSEK网管从唤醒,到建环,再到完成建环,到最后整个网络休眠的整个流程。

        但是由于OSEK网管的逻辑环机制,导致当某些ECU出现异常情况的时候,出现异常的ECU和其它ECU必须有相对应的措施

        而Autosar网管则远远没这么复杂,它只需要检测总线是否有网管报文,有网管报文就保持唤醒,没网管报文则进入休眠,不需要检测网管报文的数据内容,当某个ECU出现异常的时候,其它ECU是不需要对应做任何操作的。

        好了,讲完OSEK网管正常工况,下面开始讲OSEK网管异常工况。


3、(运行过程)逻辑环运行过程中,有一个新的ECU节点加入怎么处理?

        当CAN总线上各个节点唤醒并且处于逻辑环正常工作的时候,在一遍逻辑环的循环中的每个ECU肯定能被指向一次。

        如果这时候有个ECU打开自己的CAN通道接入CAN总线中,CAN总线肯定没有一个ECU发的网管报文是指向它的。这怎么办呢?

        因此,这新加入的ECU需要具备检测自己是否被逻辑环跳过的机制,当发现自己被跳过后,需要立即发送Alive报文,以加入逻辑环中

        官方解释及检测是否被跳过的算法流程图如下图所示:

        其中:

        R:Receiver为接收到网管报文的ECU(可以理解为自己

        S:Source为发送网管报文的ECU(可以理解为发网管报文过来的ECU

        D:Destination为所发送的网管报文的指向地址(可以理解为发网管报文过来的ECU的网管报文的指向地址

        以第3行举例如下:

         假设:Source为0x08,Destination为0x00, Receiver为0x0F。

        即,Source节点发送的网管报文的指向地址为0x00,但是由于,Receiver节点的地址是0x0F,因此,Source节点应该发送网管报文的指向地址为0x0F。

        可以发现,Receive节点被跳过了。

        其它情况也是同样的分析方式。

4、(运行过程)逻辑环运行过程中,有一个ECU节点异常退出怎么处理?

某个ECU异常退出对于其它节点网管状态的影响:

        逻辑环正常工作的时候,某个节点异常退出,对其它节点而言的现象,就是突然少了这个节点的Ring报文。

        因此,我们先看下逻辑环正常工作的时候,一帧Ring报文对其它节点有什么作用。

        影响①:对Ring报文指向的ECU节点的作用

        即,Ring报文指向的ECU需要开启TTyp计时器,等待计时器到时后就发出它的Ring报文。

        影响②:对Ring报文不指向的ECU节点的作用

        即,当ECU接收到不指向自己的Ring报文的时候,会关闭TTyp定时器,因为Ring报文不指向它,所以下一个发Ring报文的ECU不是它,当然就不需要开启TTyp定时器了。

        可见,当某个ECU突然退出逻辑环,当出现指向这个ECU的Ring报文时,其它所有ECU的TTyp定时器都会关闭但由于最后一帧Ring报文指向的这个ECU退出了逻辑环,因此它不会再发出Ring报文了。逻辑环到它这就卡住了。

        因此,若Ring报文只控制CAN总线网络上ECU节点的TTyp计时器,则还无法监测到某个ECU退出逻辑环的情况。

        于是,另外一个叫做“TMax”计时器就排上用场了。

        “TMax”定义如下:       

        即:两帧Ring报文之间最大的时间间隔。

       我们再来看下“ TMax”定时器开启、关闭及计时器到时动作,如下图所示:        

         由上图可见,接收到不指向自己的Ring报文后会开启“TMax”定时器。并且当定时器到时后,NM状态会进入RESET状态。

        因此,当某个ECU突然退出逻辑环后,其它所有ECU的TTyp定时器都会关闭,但同时会开启“TMax”定时器,当定时器时间一到,CAN总线网络上每个正常节点都进入RESET状态,重新发送Alive报文,然后重复开始建环的动作。

某个ECU异常退出对自己内部网管状态的影响:

        首先要知道,正常情况下,参与CAN网络的节点是不可能无故退出网络的。某个ECU退出CAN网络只有两种情况:

        ①该ECU的接收出问题了,导致无法接收网管报文。

        ②该ECU的发送出问题了,导致无法发送网管报文。

        那么,怎么样才算接收出问题,怎么样才算发送出问题呢?

        于是官方定义两个参数:

        这两个参数的值由车企定义。一般来说,rx_limit = 4。tx_limit = 8

        阈值rx_limit和tx_limit对应两个计数器:

        当NMrxcount大于等于rx_limit或tx_limit大于等于NMtxcount,则认为ECU通信出现错误,NM状态进入NMLimpHome状态(即跛足状态)

        如下图所示:

        NMrxcount和NMtxcount计数器累加或清0的条件:

        如下图所示:    

        即:

        进入NMRest状态:

                ①NMrxcounter加1

                ②NMtxcounter加1

        进入NMRest状态:

                ①成功接收网管报文时,清空NMrxcounter

                ②成功发送网管报文时,清空NMtxcounter

                ③有发送网管报文的请求时,NMtxcounter加1

        好了,当有了一些LimpHome的基本概念后。我们看下当ECU的通信出错后,具体是如何进入LimpHome状态的:

1、具体如何进入LimpHome状态:

a、当有主动请求(Active)或CAN总线上存在节点SleepInd不为1时,TX失败:

        情况A:当处于NMNORMAL状态出现TX失败

                ①当出现CAN总线上的Ring报文指向我们后,我们开启“TTyp”定时器,定时时间完成后,我们会请求发出网管报文但发送失败(NMtxcounter+1),并开启“TMax”定时器,由于我们没发出网管报文,导致其它ECU的“TMax”计时完成,我们的“TMax”计时也完成同时网管状态进入NMRESET状态。

                ②我们进入REST状态后请求发出Alive报文但发送不成功(NMtxcounter+1),并再次进入NMNORMAL状态。

                ③由于我们Alive报文发送不成功,CAN总线的逻辑环不会包含我们节点,因此,逻辑环会跳过我们,我们由于检测到被跳过,因此会请求发送Alive报文,但仍然发送失败(NMtxcounter+1)

                ④不断循环步骤3,直到NMtxcounter等于txlimit。我们的NM状态进入LimpHome状态

        情况B:当处于NMRESET状态出现TX失败

                情况A中的除去①,剩下的②③④即是处于NMRESET状态出现TX失败的流程。

b、当有主动请求(Active)时,RX失败:

        由于我们有主动请求,因此不会进入休眠。

        又由于无法接收报文,我们无法收到指向我们的Ring报文,“TMax”计时完成后,我们会进入RESET状态(NMrxcount+1),并发送Alive报文,然后进入NMNORMAL。

        不断循环上述情况,直到NMrxcount等于rxlimit。我们的NM状态进入LimpHome状态

c、当无主动请求(Passive)且CAN总线上所有节点SleepInd为1,TX失败:

        当我们无主动请求,且所有节点SleepInd为1时,逻辑环一定会出现某个节点SleepAck为1。由于txlimit为8,理论上来说,当这个NMtxcounter计数器还没到txlimit,我们节点就能接收到SleepAck为1的报文,则直接进入WaitBusSleep模式了。

d、当无主动请求(Passive)时,RX失败:

        ①由于无法接收到Ring报文,“TMax”计时完成后,我们会进入RESET状态(NMrxcount+1)

        ②在RESET状态发送Alive报文后,开启“TTyp”定时器,并进入NMNORMAL状态,“TTyp”定时器完成后,由于未收到其它节点的报文,因此我们认为总线上所有节点的SleepInd已置位,然后我们发送SleepAck报文,并进入WaitBusSleep模式。

2、进入LimpHome状态后的动作:

        当ECU处于LimpHome状态,ECU将不再申请加入逻辑环,即不再发送Alive报文和Ring报文。而是发送LimpHome报文。

        LimpHome状态如下图:

       LimpHome报文的发送情况:

                情况1、当有主动请求(Active)或接收到CAN总线上存在节点SleepInd不为1时

                LimpHome状态处于“NMLimpHome Active”子状态,并按照TError周期发送LimpHome报文

                情况2、当无主动请求且接收到CAN总线上所有节点SleepInd都为1时:

                发送SleepInd置1的LimpHome报文,LimpHome状态从“NMLimpHomeActive”子状态跳至““NMLimpHomeActivePreSleep”子状态。发送完该报文同时开启“TMax”计时器,等待计时结束后网管状态进入NMTwbsLimpHome,等待TwaitBusSlee时间后进入BusSleep状态

                情况3、当接收到SleepAck置1的网管报文

                则直接进入NMTwbsLimpHome状态,等待TwaitBusSlee时间后进入BusSleep状态。

        另外,当在NMTwbsLimpHome状态再次有主动请求或接收到CAN总线上存在节点SleepInd不为1时,则根据上述的情况1、2、3执行对应操作

3、如何从LimpHome状态恢复

        简单来说,就是在LimpHome状态时,如果成功发送LimpHome报文且成功接收到网管报文后,网管状态则跳转至Reset状态

        但是你看上面的LimpHome状态图,可以看到其实状态图里面描述的是很复杂的。但是它只不过是详细拆开了各种情况去讲解,大家结合上面的内容,理解一下就可以了。


        另外,下面再贴上一些Osek网管的状态图:

        ①:Osek网管的完整简化状态图

        ② 从唤醒状态,到休眠状态,再到唤醒状态的过程状态图


OsekNm与Autosar网管的区别:

        首先:Autosar网管不需要检测网管报文的数据内容。

      网络休眠->网络唤醒:

        Osek网管:主动唤醒的节点先发出一帧Alive报文,其它各个节点接收到网管报文后被动唤醒,发出一帧Alive网管报文

        Autosar网管:主动唤醒的节点先发出网管报文(持续发出网管报文),其它节点接收到网管报文后被动唤醒,同时也发出网管报文(只发出几帧网管报文)。

      网管唤醒后正常工作

        Osek网管:无论是主动唤醒节点还是被动唤醒节点,都要按照逻辑环机制发出Ring报文。

        Autosar网管:主动唤醒的节点持续按照周期发送网管报文,被动唤醒的节点不发送网管报文。

      网络唤醒->网络休眠:

        Osek网管:接收到Ring报文的SleepAck后所有节点马上进入预休眠状态,等待TwaitBusSleep时间后进入BusSleep状态。

        Autosar网管:总线不再出现网管报文后所有节点等待一段时间后进入预休眠状态,等待TwaitBusSleep时间后进入BusSleep状态。

      异常情况:

        Osek网管:ECU有对应的LimpHome状态,及该状态下对应的动作。

        Autosar网管:由于ECU的休眠唤醒只于总线上是否有网管报文有关,因此某个ECU出现异常时,其它ECU不会有对应的处理机制,异常ECU本身也没有对应的网管机制


        好了,Osek网管主要的内容大致就是这些了,这文章是我写的最久的一篇,但是质量可能不太好,后面我再学习过程中发现写的不好的地方会再回来改改的。主要先记录下来,不然久了就忘记了。

        相对于Autosar网管,Osek网管真的复杂很多。


返回目录:

Autosar BSW 开发笔记(目录)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10、SpringCloud -- 优化重复下单

目录 优化重复下单问题的产生:需求:思路:代码:测试:优化重复下单 之前超卖、重复下单的解决方式 问题的产生: 比如这个秒杀活动没人去玩,只有一个人去参与秒杀,然后秒杀成功了,因为有联合索引,所以这个人他没法重复下单,但是他依然去请求秒杀,在秒杀的10个商品没…

设计模式大赏(一):桥接模式,组合模式

设计模式大赏(一):桥接模式,组合模式 导言 本篇文章是设计模式大赏中的第一篇文章,这个系列的文章中我们主要将介绍一些常见的设计模式,主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要…

Android 快速实现隐私协议跳转链接

首先在string.xml创建对应字串 <string name"link">我已仔细阅读并同意<annotation value"privacy_policy">《隐私政策》</annotation>和<annotation value"service_agreement">《服务协议》</annotation></st…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…

人工智能与航天技术的融合:未来发展的新趋势

人工智能与航天技术的融合&#xff1a;未来发展的新趋势 随着科技的飞速发展&#xff0c;人工智能和航天技术已经成为人类探索未知世界的重要工具。本文将探讨这两个领域的结合点&#xff0c;以及未来的发展趋势和应用前景。通过了解这些技术&#xff0c;读者将更好地理解人工…

用Python定义一个函数,用递归的方式模拟汉诺塔问题

【任务需求】 定义一个函数&#xff0c;用递归的方式模拟汉诺塔问题&#xff0c;三个柱子&#xff0c;分别为A、B、C&#xff0c;其中A柱子上有N个盘子&#xff0c;从小到大编号为1到N&#xff0c;盘子大小不同。现在要将这N个盘子从A柱子移动到C柱子上&#xff0c;但移动的过…

段页式管理方式

一、分段、分页的优缺点 1.分页管理&#xff1a;内存空间利用率高&#xff0c;无外部碎片&#xff0c;只有少量页内碎片&#xff0c;以物理结构划分&#xff0c;不便于按逻辑方式实现信息共享和保护 2.分段管理&#xff1a;为段长过大分配连续空间会很不方便&#xff0c;会产生…

Nginx动静分离以及防盗链问题

目录 1.动静分离 1.1概念 1.2准备环境 1.3.测试访问 2.Nginx防盗链问题 2.1nginx 防止网站资源被盗用模块 2.2防盗链配置 2.3准备两台机器 2.4测试 ①开启防盗链 ②让盗链ip可一访问服务资源 ③防盗链不设置none参数 1.动静分离 1.1概念 为了加快网站的解析速度&…

【图像分类】钢轨表面缺陷分类数据集介绍(4个类别)

写在前面&#xff1a; 首先感谢兄弟们的支持&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

Pytorch入门实例

数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd import torch.nn as nn import torch.optim as optimdata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape…

Windows环境下MosQuitto服务器搭建,安装mqtt服务端软件

1、下载、安装MosQuitto服务器 下载地址&#xff1a;http://mosquitto.org/files/binary/ 根据平台选择相应的代码下载。 安装完成后&#xff0c;安装文件夹下部分文件的功能

私有云:【9】Connection配置

私有云&#xff1a;【9】Connection配置 1、关闭IE增强配置2、Connection配置2.1、登录connection管理台配置许可证2.2、添加VCenter主机2.3、配置Composer 1、关闭IE增强配置 关闭此项 全部关闭 2、Connection配置 2.1、登录connection管理台配置许可证 上一章connection…

DevChat:你的私人助理,让工作变得如此简单!

前言&#xff1a; 首先我们来浅浅说下AI吧。有小伙伴把AI看得十分“高高在上”&#xff0c;觉得它属于“诸神之战”&#xff0c;与我等凡人无关。其实这个看法是不对的。就好像我们刚开始对于手机系统或者电脑系统感觉很有陌生感一样&#xff0c;一直到技术落地到抖音、微信等…

复习Animate和木疙瘩学习笔记-动画制作的回家之路

这个融媒体H5制作平台功能比较完善&#xff1a;包含了Flash(现在叫Animate)传统H5网页制作 720全景视频制作发布网页&#xff01; 主要功能&#xff1a;素材导入、2D动画制作、常见交互添加、发布生成链接二维码 基本就是一个制作H5为主&#xff0c;但是里面的动画可以依赖4种…

LeetCode 415 字符串相加 简单

题目 - 点击直达 1. 415 字符串相加 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 415 字符串相加 简单 1. 题目详情 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。…

[Java/力扣100]判断两棵二叉树是否相同

我希望通过这道题&#xff0c;能进一步了解递归思想和“树是递归定义的”这句话 分析 我们的目的是写一个方法来检验两棵树是否相同 什么叫“两棵树相同”&#xff1f;——相同的位置存在相同的结点 有三种情况&#xff1a;1、两棵树一颗为空一颗不为空——不相同&#xff…

高阶数据结构学习 —— 图(2)

文章目录 1、BFS1、DFS 1、BFS 广度优先。确定从哪个点开始&#xff0c;然后用队列来完成遍历。拿出一个点就把和这个点相连的其它点放进去&#xff0c;但是这样前面放进过队列的也有可能被再次放入&#xff0c;所以需要做好标记。一个队列&#xff0c;一个标记容器。在邻接矩…

NodeMCU ESP8266 面包板的介绍和使用详解(图文并茂)

文章目录 前言什么是面包&#xff1f;面包板的历史 如何使用&#xff1f;1 如何连接面包板2 如何读取面包板的行和列&#xff1f;面包板标签“”和“-”符号 3 电源轨连接4. 中心槽&#xff08;DIP 支持&#xff09; 实际案例总结 前言 在嵌入式学习的过程中&#xff0c;会遇到…

【ESP 保姆级教程】疯狂TFT篇 ——教你从0到1打造太空人时钟① TFT_eSPI、TJpg_Decoder库

系列最终效果,一步步进阶学习 忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-27❤️❤️ 本篇更新记录 2023-10-27❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何…