AUTOSAR实战教程-通信协议栈CAN_CANIF_PDUR_CANTP_COM_XCP_ECUC配置一网打尽



关注公众号,点击公众号主页右上角“ ··· ”,设置星标,实时关注智能汽车电子与软件最新资讯

前言

通讯协议栈几乎是CP AUTOSAR中最庞杂的一块。由于其涉及的模块比较多(仅实现CAN信号的收发就需要ECUC/CAN/CANIF/CANTP/PDUR/COM/XCP这么多模块的协作!),且名词概念众多,入门很难。网络上关于各个模块的详细介绍浩如烟海,其深度也让人叹为观止。但没有一篇文章把这些模块串起来!

这就导致对于初学者来说,往往耐心的把各个模块的详细介绍都看完,甚至把AUTOSAR标准文档读完,依然不能建立一个全局的思路。导致在配置通讯协议栈时候,导入DBC之后,一看那么多错误,无从下手或者解决了CANIF的错误,PDUR又出现了新的错误提示,解决了PDUR错误,ECUC又报错...按下葫芦浮起瓢,这种窘境,我相信绝对是每个AUTOSAR初学者都遇到过的。

本文试图从一个全局的高度,自顶向下逐步细化开来。让你在建立全局观之后熟悉通讯协议栈各模块之间的关联然后高屋建瓴学会配置每一项!也希望在此抛砖引玉,彼此交流心得,共同进步。


原文:https://blog.csdn.net/m0_58346868/article/details/124897133
文章来源于网络,版权归原作者所有,如有侵权,请联系删除。

正文

目录
1.DBC属性与信号流

    DBC属性决定报文类型

    报文类型决定信号流路径

2.配置实践

    2.1搞定信号路径

        ECUC模块

        CAN模块

        CANIF模块

         XCP模块

        PDUR模块

        COM模块

        CANTP模块

    2.2 搞定Hoh和MailBox

        CAN模块中MailBox配置

        CANIF模块中的Hoh(Hth和Hrh)


1.DBC属性与信号流

1.1 DBC属性决定报文类型

不同的DBC属性决定不同功能的报文, 一般实际项目中涉及的报文为4类:应用报文,诊断报文,网络管理报文,XCP报文。不同作用的报文其在协议栈中的信号流路径是不同的


参考Vector给出的《TechnicalReference_DbcRules_Vector》文档,在DBC文件中对关键属性Attributes的规定如下。



  • 应用报文:GenMsgILSupport:Yes


  • 网络管理报文:NmAsrMessage:Yes


  • XCP报文

  1. 根据《TechnicalReference_DbcRules_Vector》规定只要Message中含有大写XCP字样,即可在导入DBC后被Vector的工具自动识别为XCP报文。其他属性同“应用报文:GenMsgILSupport:Yes”

  2. 如果不用1的方式,也可以在CANIF模块里手动设置其上层模块Upper Layer(PduUserTxConfirmationUL)为XCP模块。其他属性同“应用报文:GenMsgILSupport:Yes”


  • 诊断报文


  1. 功能寻址:DiagState:Yes

  2. 物理寻址请求:DiagRequest:Yes

  3. 物理寻址响应:DiagResponse:Yes(物理寻址和功能寻址的区别请自行摆渡)


1.2 报文类型决定信号流路径


以TX报文为例:


普通报文路径:CAN->CANIF->PDUR->COM



诊断报文路径:CAN->CANIF->CANTP->PDUR->DCM



XCP报文路径:CAN->CANIF->XCP



网络管理报文路径:CAN->CANIF->CANNM


之所以把PDUR标红,是因为在下面的配置中方便我们识别PDUR的相关模块,这个要在PduRBswModules配置项中选择的!从这里也可以直接确定,PDUR的PduRBswModules上下文最多只有CANIF,COM,CANTP,DCM。


2. 配置实践

DBC如下: 



我习惯将DBC中所有报文简单罗列到一个表中,按报文功能进行分类。这样结合上面我们的总结,就对于每个报文的路径有一个全局的了解。如果项目比较大,报文较多的情况,建议将普通报文之外的报文(NM报文,XCP报文,诊断报文)列出来,因为他们特殊啊!


通过观察DBC属性,制作报文分类表格:



 好,接下来进入我们的实战环节。


导入DBC,Update工程, 现在看工具自动配置中遇到的错误还是比较多的, 所以我们接下来的任务就是将这些模块的错误全部Fixed掉!



2.1 搞定信号路径

2.1.1 ECUC模块

EcucPduCollection这个Container的作用.数据在CAN通信协议栈各层间都是以PDU形式传输的,为了将各层PDU关联起来,则需要定义全局 PDU(Global PDU)。由于全局PDU不属于任何一个标准BSW模块,所 以AUTOSAR提出了一个EcuC模块来收集一些配置信息。在EcuC模块中定义全局PDU时不需要关心其数据类型,只需要定义PDU长度即可。


所以我们先对照DBC对照检查以下,ECUC/EcucPduCollection对各个PDU(PDU是啥?你可以简单理解成一个PDU就对应总线上的一个Message再附上一个地址信息的这么一个玩意--虽然这种说法不准确,但是它能有助于你去理解)的长度定义是否正确,至于长度之外的错误,先忽略之,后面其他模块配好之后,ECUC中相关错误一般就自动消失了.



2.1.2 CAN模块

CAN模块是直接面向硬件的, 所以CAN模块主要的配置分2部分:


  • 对CAN控制器的配置,包括,参考时钟, 波特率,采样点,帧类型,处理方式Polling/Interrupt;

  • 和CANIF的联系,即对Hoh和MailBox和Filter的配置)


CAN控制器的配置


本阶段我们只关注CAN控制器的配置! (在后面的步骤中再重点配置Hoh和MailBox和Filte,所以本阶段这三方面的错误先忽略!)


CAN控制器的配置还是比较容易的,如果有什么错误一般根据工具里面给出的提示即可轻易解决。这里科普2个基本知识点, 也是CAN模块一个稍微难懂的概念 - CAN的时钟, CAN的重同步和采样点.


CAN时钟



Can/CanConfigSet/CanControllers/Clock Frequecy这个值是从芯片的时钟树分频而来, 在MCAL的MCU模块中指定.



/Can/CanGeneral/Clock Divider是对上面Can/CanConfigSet/CanControllers/Clock Frequecy的分频, 他们相除的结果在CanControllerBaudrateConfig/CanBaudrateClock中, 比如


Clock Frequecy = 40M, Clock Divider = 1, 则CanBaudrateClock= 40M = 40000KHz.



重同步和采样点


 参考文献《CAN总线学习笔记(5)- CAN通信的位定时与同步》这篇博文有非常详尽的介绍( 如果是Tir1,一般OEM会给出具体的采样点参数值, Autosar工具也会给出参考值)我在这就蜻蜓点水说以下计算原则。



Sync Seg(同步段):长度固定为1Tq, 所以配置工具中没有它的配置.


在Vector的配置工具中, 定义Prop+Seg1 = TSeg1, Seg2 = TSeg2,一开始感觉后别扭,后来发现这样也好,计算采样点位置更加方便了,比如采样点为80%:


(同步段(1) +  TSeg1)/(同步段+Tseg1+Tseg2) = 80%,


如果一个BitTime中Tq总和固定了,比如为16个Tq,


同步段(1) + TSeg1 + TSeg2 = 16


根据这个二元一次方程组则很容易算出各段的值.


Sync Seg固定为1, TSeg1 = 11, Seg2 = 4.


SyncJumpWidth:它的值是用于调整相位缓冲段1和相位缓冲段2的值, 用于CAN的同步,比如相位缓冲段1向前增长了3个,则相位缓冲段2向后减少3个Tq.---也就是一次同步中相位缓冲段改变的长度.所以Sync Jump Width的设置有2个原则:


Sync Jump Width <= 3,


Sync Jump Width <= Min(Seg1, Seg2), 因为一次同步调整的幅度不能超出相位缓冲段1和2中任意一个!


敲黑板了,下面画重点:



好了,截止目前,我们把CAN模块的1/2错误都消掉了, 剩下CanHardwareObjects这个容器里面的错误,我们先放下。继续下一步。


2.1.3 CANIF模块

CANIF的配置主要分2部分


  • 向上:指定各个PDU的上层模块

  • 向下:对Hoh的配置(配置PDU的HOh,对应MailBox和Bufffer,CAN帧的类型)


这一步我们只关注它"向上:指定各个PDU的上层模块"的功能.


检查各个PDU的上层模块


主要配置/CanIf/CanIfInitCfg/CanIfRxPduCfgs和/CanIf/CanIfInitCfg/CanIfTxPduCfgs这两个小container



结合我们上面讲的知识, 检查Davinci Cfg工具/CANIF/Pdu User Tx/Rx Confirmation UL这个配置项对PDU的上层配置是否正确, 即:


  • 诊断报文: CANIF之上是CANTP,(CAN->CANIF->CANTP->PDUR->DCM)

  • NM报文:CANIF之上是CANNM,(CAN->CANIF->CANNM)

  • XCP报文:CANIF之上是XCP,(CAN->CANIF->XCP)

  • 普通报文:CANIF之上是PDUR, (CAN->CANIF->PDUR->COM)


如果出现如下错误:



如果不需要Confirmation功能,则可以将Confirmation UL配置项中设为NONE -- 只要到对应模块中检查该PDU确实存在。比如:普通应用报文PDUa,它的上层应该是PDUR, 我们去PDUR中检查,如果它确实被映射到PDUR中了, 则可以在CANIF中将它的Confirmation UL设为NONE.


该容器(/CanIf/CanIfInitCfg/CanIfRxPduCfgs和/CanIf/CanIfInitCfg/CanIfTxPduCfgs)下其他的一些小错误根据工具提示修改即可.



剩下的错误在后面的操作中解决。


 2.1.4 XCP模块


主要是配置XCP中用于接收和发送的PDU,如果XcpPdus这一块有错误,则检查你在DBC中和CANIF中指定的XCP收发报文是否已经在XCP中Mapping上了,其他小错误根据提示修改即可。


2.1.5 PDUR模块

PDUR主要有2个作用:对信号的路由,对不同总线信号的网关。



PduRBswModules指定PDUR的上下文模块


根据我们上面的描述,PDUR向下向上的模块分别是:


普通报文: CANIF->PUDR->COM


诊断报文:CANTP->PDUR>DCM


XCP报文和NM报文绕过PDUR。


所以如果你的网咯中没有诊断报文,则PDURBswModules中,PDUR的上下层是CANIF和COM


如果有诊断报文,则PDURBswModules中,PDUR的上下层是CANIF,COM,DCM,CANTP.


PduRRoutingTables



 一般工具自动生成的配置,出现错误就在这三个地方。


PduR Transmission Confirmation这个错误主要是由于PDUR的上下层Confirmation没有一致,比如一个TX信号,CANIF中将Confirmation UL指定为PDUR,而在PDUR中将Transmission Confirmation设为False,则自然会报错;又或者在CANIF中将Confirmation UL设为NONE, 而在PDUR中将Transmission Confirmation设为True,则自然会报错。


其他小错误根据提示修改即可。



2.1.6 COM模块

COM模块非常简单,其作用就是将总线上的Msg进行卸货或者装车,装车:将信号组装到Msg里面;卸货:将Msg拆分成一个个的信号,给应用层或者CDD使用.



2.1.7 CANTP模块

因为诊断协议中有多帧连续帧的概念,有些报文一帧是发不完的, 所以CANTp模块的主要作用是对CAN I-PDU进行分段和重新组装,使得I-PDU的长度不大于8个字节,对CAN FD而言,CAN I-PDU不大于64个字节。


这里面的难点应该就是一些时间参数的设定, 这个要结合UDS的14229/15765/11898和主机厂释放的网络规范进行设定.



2.2 搞定Hoh和MailBox

(有朋友反应这一块有很多错误,好吧,我们先讲这一块)


CAN模块下面的CanHardwareObjects其实就是MailBox,是硬件上的存在。CANIF下面的Hoh包含Hrh(接收)和Hth(发送)是报文收发的句柄,是一个软件概念。


结合我们上面的工作, 我接下来主要是对


  • CAN部分MailBox和Filter的配置

  • CANIF部分Hoh的配置


2.2.1 CAN模块中MailBox配置


CanHardwareObjects


先检查CanHardwareObjects这个容器下面, 检查HardwareObject的数量.注意此时HardwareObject还没有和CANIF中的PDU建立任何关系!--这模块的HardwareObject我习惯叫它MailBox!


根据DBC中Message个数, 设置CAN模块下面每个CanHardwareObjects(就是MailBox)的CanHandleType,设为Full CAN还是Basic CAN.



 Full CAN和Basic CAN


先说结论:


  • Full CAN一个Hoh对应一个MailBox而Basic CAN一个MailBox可以处理多个PDU.

  • Full CAN是硬件滤波而Basic CAN软件滤波,因此配成Basic的要设置滤波.

  • Full CAN一个Buffer对应一个ID报文,无缓存功能而Basic CAN以FIFO的方式接受特定的多个报文,有缓存功能.


因此:


  • 对于诊断报文和NM报文的接收报文必须配置成Basic Can,

  • 其他报文最好配成高效的Full CAN.


关于Full CAN和Basic CAN, 这篇文章讲的很详细《【AUTOSAR-CAN】CAN的 “BasicCAN架构” 和 “FullCAN架构”》, 这里我说一下我的理解, 不一定很准确,但有助于理解.



如果你在CanHardwareObjects这个容器下面配置的BasicCAN个数>1(Tx MailBox>1个或者Rx的MailBox>1个)这个时候你应该会遇到一个报错:



这是翻译成人话就是你没有使能Multi BasicCAN或者你么有更高级的授权, 而这个时候你进入CanGeneral这个容器下面却发现不允许使能Multi BasicCAN!!

是不是很崩溃?---没关系, 按下面这样做:


将所有Tx的BasicCAN删除到只剩一个, Rx的BasicCAN删除只剩一个,然后命名(随个人喜好)TxBasicCanMailBoxCommon和RxBasicCanMailBoxCommon.然后设置其Size大小为之前所有BasicCAN的MailBox总和!



最后别忘了给接收的BasicCAN设置滤波,并绑定:


在CanFilterMasks下面设置滤波, 在BasicCAN的MailBox下面设置映射:



再科普以下滤波的设置:


滤波参数



 白名单模式计算原则是: received ID & Mask == Code & Mask.


有一个简便的方法就是,Code Value里面填写ID大的那个ID值, Mask Value里面填写ID小的那个ID值两个数按位与后的值.


例如:我只想接受0x7DF和0x7D4这两个报文,将其他报文过滤掉. 根据计算公式,对于0x7DF报文, 


0x7DF & 0x7D4 == 0x7DF & 0x7D4


对于0x7D4报文, 0x7D4 & 0x7D4 == 0x7DF & 0x7D4


好了,纵然现在千般错, 先放过.去CANIF模块!


2.2.2 CANIF模块中的PDU(Rx和Tx PDU)

进入/CanIf/CanIfInitCfg/CanIfInitHohCfgs/CanIfInitHohCfg/CanIfHrhCfgs这个下面,



将诊断Rx PDU和网络管理的Rx PDU(他们是Basic Can)都映射到CAN模块下面的RxBasicCanMailBoxCommon上!并勾选CanIfHrhSoftwareFilter.



将XCP报文和普通应用报文与CAN模块下面的MailBox进行一对一映射!--因为他们是FULL CAN!


并取消CanIfHrhSoftwareFilter.



进入/CanIf/CanIfInitCfg/CanIfInitHohCfgs/CanIfInitHohCfg/CanIfHthCfgs这个下面,安装上面的步骤操作即可!


接下来为Tx的PDU配置Buffer即可!


其他一些错误根据工具提示修复即可.这一块相互绑定关系我做个图谱:



截止目前CAN和CANIF的错误就全部消除了



来源:汽车嵌入式

                                    --END--

关注公众号,点击公众号主页右上角“ ··· ”,设置星标,实时关注智能汽车电子与软件最新资讯

智能汽车电子与软件 专注于汽车电子领域的信息交融平台,涵盖汽车电子行业资讯、市场动态、技术干货、知识见解、行业趋势等资讯深度覆盖。
评论
  • 在智能网联汽车中,各种通信技术如2G/3G/4G/5G、GNSS(全球导航卫星系统)、V2X(车联网通信)等在行业内被广泛使用。这些技术让汽车能够实现紧急呼叫、在线娱乐、导航等多种功能。EMC测试就是为了确保在复杂电磁环境下,汽车的通信系统仍然可以正常工作,保护驾乘者的安全。参考《QCT-基于LTE-V2X直连通信的车载信息交互系统技术要求及试验方法-1》标准10.5电磁兼容试验方法,下面将会从整车功能层面为大家解读V2X整车电磁兼容试验的过程。测试过程揭秘1. 设备准备为了进行电磁兼容试验,技
    北汇信息 2025-01-09 11:24 22浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球中空长航时无人机产值达到9009百万美元,2024-2030年期间年复合增长率CAGR为8.0%。 环洋市场咨询机构出版了的【全球中空长航时无人机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球中空长航时无人机总体规模,包括产量、产值、消费量、主要生产地区、主要生产商及市场份额,同时分析中空长航时无人机市场主要驱动因素、阻碍因素、市场机遇、挑战、新产品发布等。报告从中空长航时
    GIRtina 2025-01-09 10:35 21浏览
  • 一个真正的质量工程师(QE)必须将一件产品设计的“意图”与系统的可制造性、可服务性以及资源在现实中实现设计和产品的能力结合起来。所以,可以说,这确实是一种工程学科。我们常开玩笑说,质量工程师是工程领域里的「侦探」、「警察」或「律师」,守护神是"墨菲”,信奉的哲学就是「墨菲定律」。(注:墨菲定律是一种启发性原则,常被表述为:任何可能出错的事情最终都会出错。)做质量工程师的,有时会不受欢迎,也会被忽视,甚至可能遭遇主动或被动的阻碍,而一旦出了问题,责任往往就落在质量工程师的头上。虽然质量工程师并不负
    优思学院 2025-01-09 11:48 27浏览
  • 故障现象一辆2017款东风风神AX7车,搭载DFMA14T发动机,累计行驶里程约为13.7万km。该车冷起动后怠速运转正常,热机后怠速运转不稳,组合仪表上的发动机转速表指针上下轻微抖动。 故障诊断 用故障检测仪检测,发动机控制单元中无故障代码存储;读取发动机数据流,发现进气歧管绝对压力波动明显,有时能达到69 kPa,明显偏高,推断可能的原因有:进气系统漏气;进气歧管绝对压力传感器信号失真;发动机机械故障。首先从节气门处打烟雾,没有发现进气管周围有漏气的地方;接着拔下进气管上的两个真空
    虹科Pico汽车示波器 2025-01-08 16:51 92浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2025-01-09 09:58 22浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 100浏览
  •  在全球能源结构加速向清洁、可再生方向转型的今天,风力发电作为一种绿色能源,已成为各国新能源发展的重要组成部分。然而,风力发电系统在复杂的环境中长时间运行,对系统的安全性、稳定性和抗干扰能力提出了极高要求。光耦(光电耦合器)作为一种电气隔离与信号传输器件,凭借其优秀的隔离保护性能和信号传输能力,已成为风力发电系统中不可或缺的关键组件。 风力发电系统对隔离与控制的需求风力发电系统中,包括发电机、变流器、变压器和控制系统等多个部分,通常工作在高压、大功率的环境中。光耦在这里扮演了
    晶台光耦 2025-01-08 16:03 80浏览
  • 在过去十年中,自动驾驶和高级驾驶辅助系统(AD/ADAS)软件与硬件的快速发展对多传感器数据采集的设计需求提出了更高的要求。然而,目前仍缺乏能够高质量集成多传感器数据采集的解决方案。康谋ADTF正是应运而生,它提供了一个广受认可和广泛引用的软件框架,包含模块化的标准化应用程序和工具,旨在为ADAS功能的开发提供一站式体验。一、ADTF的关键之处!无论是奥迪、大众、宝马还是梅赛德斯-奔驰:他们都依赖我们不断发展的ADTF来开发智能驾驶辅助解决方案,直至实现自动驾驶的目标。从新功能的最初构思到批量生
    康谋 2025-01-09 10:04 23浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 150浏览
  • 1月7日-10日,2025年国际消费电子产品展览会(CES 2025)盛大举行,广和通发布Fibocom AI Stack,赋智千行百业端侧应用。Fibocom AI Stack提供集高性能模组、AI工具链、高性能推理引擎、海量模型、支持与服务一体化的端侧AI解决方案,帮助智能设备快速实现AI能力商用。为适应不同端侧场景的应用,AI Stack具备海量端侧AI模型及行业端侧模型,基于不同等级算力的芯片平台或模组,Fibocom AI Stack可将TensorFlow、PyTorch、ONNX、
    物吾悟小通 2025-01-08 18:17 29浏览
  • 「他明明跟我同梯进来,为什么就是升得比我快?」许多人都有这样的疑问:明明就战绩也不比隔壁同事差,升迁之路却比别人苦。其实,之间的差异就在于「领导力」。並非必须当管理者才需要「领导力」,而是散发领导力特质的人,才更容易被晓明。许多领导力和特质,都可以通过努力和学习获得,因此就算不是天生的领导者,也能成为一个具备领导魅力的人,进而被老板看见,向你伸出升迁的橘子枝。领导力是什么?领导力是一种能力或特质,甚至可以说是一种「影响力」。好的领导者通常具备影响和鼓励他人的能力,并导引他们朝着共同的目标和愿景前
    优思学院 2025-01-08 14:54 82浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 115浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 128浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦