CAN通信稳定性开发分析
本篇文章從嵌入式工程師的角度,借鑒了一些成熟的通信概念與架構(gòu),從包括硬件,軟件各個(gè)角度分析嵌入式程序如何實(shí)現(xiàn)穩(wěn)定CAN通信的難點(diǎn)以及方案,將相關(guān)的難點(diǎn)分別進(jìn)行梳理,讀者在完整讀完這篇文章之后能夠?qū)?shí)現(xiàn)一個(gè)穩(wěn)定CAN通信做到胸有成竹。
文章目錄
- CAN總線布線長(zhǎng)度限制
- CAN總線循環(huán)延時(shí)
- 差分電壓
- CAN總線節(jié)點(diǎn)最大數(shù)量。
- 振鈴效應(yīng)/終端電阻
- 最佳/最大用戶并發(fā)數(shù)
- 粘包/半包與拆包
CAN總線布線長(zhǎng)度限制
CAN總線上任意兩個(gè)節(jié)點(diǎn)之間的最大傳輸距離,決定因素有兩個(gè)方面,一個(gè)是互連總線節(jié)點(diǎn)的回路延時(shí)(由CAN總線控制器和驅(qū)動(dòng)器等引入)+總線線路延時(shí)。另一個(gè)是由于總線電纜串聯(lián)等效電阻和總線節(jié)點(diǎn)的輸入電阻而導(dǎo)致的信號(hào)幅度下降。
CAN總線循環(huán)延時(shí)
《ISO 11898-1》把一個(gè)位時(shí)間分為四段。
Sync_Seg(同步段)、Phase_Seg1(相位緩沖段1)、Phase_Seg2(相位緩沖段2):CAN控制器在每一個(gè)CAN幀的幀起始做硬同步,將總線的跳變沿定位到這個(gè)段內(nèi),在傳輸過(guò)程中,因?yàn)镃AN幀使用位填充的方式進(jìn)行編碼,總線上不會(huì)連續(xù)出現(xiàn)6個(gè)相同的位電平,CAN控制通過(guò)預(yù)設(shè)的SJW調(diào)整位寬長(zhǎng)度進(jìn)行軟同步,如果節(jié)點(diǎn)出現(xiàn)正相位差,則增加Phase_Seg1段長(zhǎng)度,當(dāng)節(jié)點(diǎn)產(chǎn)生負(fù)的相位差,則減少Phase_Seg2段長(zhǎng)度,確保總線上的跳變沿處在同步段。
Prop_Seg(傳輸段):一般的CAN控制器都將傳輸段和相位緩沖段1合并為一個(gè)時(shí)間段供用戶配置(諸如STM32的bxCAN)。傳輸段用于抵消數(shù)據(jù)由CAN控制器發(fā)出,到總線上另一個(gè)CAN控制器的時(shí)間延時(shí)。
Sample Point(采樣點(diǎn)):CAN控制器在這個(gè)時(shí)間點(diǎn)判斷總線當(dāng)前位是顯性的還是隱性的。
CAN系統(tǒng)之所以對(duì)信號(hào)傳輸延時(shí)非常敏感,主要來(lái)源于節(jié)點(diǎn)之間競(jìng)爭(zhēng)訪問(wèn)網(wǎng)絡(luò)時(shí)的非破壞性仲裁以及幀內(nèi)應(yīng)答。也就是說(shuō),一個(gè)節(jié)點(diǎn)A控制總線由顯性轉(zhuǎn)換為隱性時(shí)(ACK應(yīng)答間隙),另一個(gè)節(jié)點(diǎn)B在采樣到總線為隱性的時(shí)候,需要控制總線為顯性,而節(jié)點(diǎn)A能夠正常采樣到總線為顯性。設(shè)tprop(a,b)為由A節(jié)點(diǎn)的CAN控制到B節(jié)點(diǎn)控制器的通信延時(shí)。
以收發(fā)器選擇TJA1044(循環(huán)延時(shí)為210ns),波特率為500K,采樣點(diǎn)為位時(shí)間的80%的為例,我們先將電信號(hào)在線纜上的傳輸速度暫定為0.23m/ns。可以計(jì)算出總線的長(zhǎng)度為(((1 * 109/5 * 105)* 80% - 2 * 210)*0.23)/2= 135.7m。
計(jì)算的原理是(硬同步到采樣點(diǎn)所持續(xù)的時(shí)間-2倍的循環(huán)延時(shí)時(shí)間)/2倍的信號(hào)在總線上傳輸?shù)乃俣取_@里電信號(hào)在線纜的傳輸?shù)乃俣?#xff0c;是跟實(shí)際選擇的線纜有關(guān),當(dāng)然,線纜以及節(jié)點(diǎn)數(shù)的接入,產(chǎn)生的容抗和感抗都會(huì)在不同的側(cè)面影響這個(gè)“速度”,從而對(duì)長(zhǎng)度產(chǎn)生影響
我看網(wǎng)上還有專門測(cè)總線傳輸延時(shí)和節(jié)點(diǎn)的容抗和阻抗的。其實(shí)把握了基本原理底線,再測(cè)試一些自己開(kāi)發(fā)設(shè)備在幾種典型應(yīng)用的性能,就能得針對(duì)現(xiàn)場(chǎng)的實(shí)際情況得出一個(gè)性價(jià)比較高的方案。
差分電壓
CAN總線降低了通信頻率之后,限制總線長(zhǎng)度的就不是線上的延時(shí)了,而是輸入差動(dòng)電壓。因?yàn)槲易龅膽?yīng)用對(duì)速率有硬性要求,這部分這篇文章就點(diǎn)到計(jì)算公式上。
公式一:Vdiff.in.req=Vth+Ksm*(Vdiff.out-Vth)
其中Vdiff.in.req為收發(fā)器顯性電平采樣需要的壓差,Vth為接收差分閾值如下圖>0.9v,KSM為決定安全電壓的差分系數(shù),Vdiff.out為收發(fā)器輸出的差動(dòng)電壓。
公式二:Vdiff.in=Vdiff.out/(2RW(1/RT+(n-1)/Rdiff)+1)
其中Vdiff.in為差分輸入電壓,Vdiff.out為差分輸出電壓,RW為總線電纜電阻,RT為終端電阻,Rdiff為CAN節(jié)點(diǎn)差分電阻。n為總線終端數(shù)。
公式三:RWmax=Pmax*Lmax
其中RWmax為最大線阻。Pmax最大電阻率,Lmax總線最大長(zhǎng)度。
將公式三和公式二代入公式一,即可得到總線最大長(zhǎng)度。
可以看出,在差分電壓在總線上壓降為決定因素的情況下(速率低,通信距離長(zhǎng)),總線最大長(zhǎng)度與節(jié)點(diǎn)數(shù)和終點(diǎn)電阻以及導(dǎo)線的電阻率成反比。
CAN總線節(jié)點(diǎn)最大數(shù)量。
單純談CAN總線的節(jié)點(diǎn)數(shù)量是由收發(fā)器的可驅(qū)動(dòng)最小負(fù)載阻抗決定。
最大節(jié)點(diǎn)數(shù)量節(jié)點(diǎn)數(shù)量計(jì)算公式(假設(shè)總線電阻RW為0,此時(shí)為最壞情況):n < 1+Riff_min*(1/Rl_min-2/Rt_min)
下面舉一個(gè)例子來(lái)計(jì)算一下最大的帶節(jié)點(diǎn)數(shù)量:
收發(fā)器選型TJA1044:
Riff_min(差動(dòng)輸入阻抗最小值):19K歐姆
Rl_min(可驅(qū)動(dòng)最小負(fù)載阻抗):45歐姆
終端匹配電阻阻值:
Rt_min(特征阻抗):120歐姆
最終得值:107個(gè)終端。
107個(gè)終端的計(jì)算值可能比在實(shí)際環(huán)境下的帶機(jī)量要小一些,如果注意can節(jié)點(diǎn)之間的距離,線纜的質(zhì)量,支線長(zhǎng)度等因素,可以做到120個(gè)左右的穩(wěn)定使用。
振鈴效應(yīng)/終端電阻
因?yàn)檫@塊是CAN通信出現(xiàn)問(wèn)題的多發(fā)原因,我盡量的多說(shuō)一些,但是我會(huì)避開(kāi)地彈、眼圖這些概念。我們都知道CAN通信是差分信號(hào),但是我先從單端的信號(hào)講起,什么是振鈴(過(guò)沖)。我們從一個(gè)測(cè)試電路入手,A點(diǎn)為電壓輸出端口,B點(diǎn)是為了接入電阻切的口,C點(diǎn)為同軸電壓測(cè)試點(diǎn)。
在B點(diǎn)處用導(dǎo)線相連,C點(diǎn)引同軸線到示波器(內(nèi)阻1M),A點(diǎn)接入電源,能夠看到示波器上升沿有過(guò)沖現(xiàn)象。
如果信號(hào)在傳輸過(guò)程中感受到阻抗的變化,就會(huì)發(fā)生信號(hào)的反射。根據(jù)反射系數(shù)公式,當(dāng)信號(hào)感受到阻抗變小之后,就會(huì)發(fā)生負(fù)反射,反射的負(fù)電壓就會(huì)使信號(hào)產(chǎn)生下沖,反之像剛才的例子,信號(hào)遇到了開(kāi)路,阻抗突然變成了無(wú)窮大,就會(huì)發(fā)生過(guò)沖。
而信號(hào)在驅(qū)動(dòng)端和遠(yuǎn)端負(fù)載之間多次反射,其結(jié)果就是信號(hào)振鈴。信號(hào)振鈴的過(guò)程可以用反彈圖來(lái)直觀解釋。假設(shè)驅(qū)動(dòng)端的輸出阻抗是10歐姆,PCB的特性阻抗是50歐姆(可以通過(guò)改變PCB走線走線寬度,走線方式,以及內(nèi)層參考平面間介質(zhì)厚度來(lái)調(diào)整),遠(yuǎn)端開(kāi)路(遠(yuǎn)端阻抗無(wú)窮大),驅(qū)動(dòng)端產(chǎn)生傳輸信號(hào)3.3v,我們忽略寄生電容電感的影響,只考慮阻性負(fù)載,我們跟著信號(hào)在這條傳輸線上跑一次,看看到底發(fā)生了什么。
第一反射:信號(hào)從驅(qū)動(dòng)端芯片出發(fā),經(jīng)過(guò)10歐姆的輸出阻抗和PCB走線50歐姆的特性阻抗分壓,實(shí)際加到PCB走線源端A點(diǎn)的電壓為2.75V。信號(hào)傳輸?shù)竭h(yuǎn)端B點(diǎn),由于遇到開(kāi)路,阻抗無(wú)窮大,反射系數(shù)為1,信號(hào)全部反射,反射信號(hào)也為2.75v,則此時(shí)B點(diǎn)的電壓是2.75+2.75=5.5v。
第二次反射:傳輸線上抬高的2.75v反射電壓傳輸回A點(diǎn),阻抗由50歐姆變?yōu)?0歐姆,發(fā)生負(fù)反射,根據(jù)阻抗變化的關(guān)系,A點(diǎn)反射的電壓為-1.83v,該電壓再次到達(dá)B點(diǎn),再次發(fā)生反射,反射電壓為-1.83v。則此時(shí)B點(diǎn)測(cè)量的電壓值為5.5v-1.83-1.83=1.84V。
第三次反射…第四次反射。反射電壓在A點(diǎn)與B電來(lái)回回彈,直至消失。如下圖,線上的電壓標(biāo)值為信號(hào)(壓差)值。
觀察B點(diǎn)測(cè)量的電壓,我們期望的是一個(gè)穩(wěn)定的3.3輸出,但是得到的卻是5.5v----1.84v----4.28v。在示波器上顯示的信號(hào)傳輸波形就如振鈴一樣。
解決這種單端信號(hào)過(guò)沖的一般方法叫做匹配,或者叫做端接(termination).端接可以總結(jié)為兩種形式:第一種是源端串聯(lián)電阻,與傳輸線做阻抗匹配,消除第二次反射。
第二種是終端并聯(lián)匹配消除第一次反射。
在實(shí)際的電路中,我們要根據(jù)電路不同的特點(diǎn)來(lái)選擇合適的端接方式,具體可以可以從驅(qū)動(dòng)DDR的電路入手,參考高速PCB理論。
單端的信號(hào)就介紹這么多,說(shuō)差分信號(hào)。
差分信號(hào)的干擾從兩個(gè)方面理解:1.共模干擾(Common-mode):兩導(dǎo)線上振幅相等,而方向相同稱為共模干擾,它串入的回路是信號(hào)線和地線之間。2.差模干擾(Differential-mode):兩導(dǎo)線上干擾電流,振幅相等,方向相反。他串入的回路是兩個(gè)差分信號(hào)線之間。
差模信號(hào)采用跨接電阻來(lái)分別匹配,消除信號(hào)的反射影響,CAN線如果不接終端電阻,振鈴的現(xiàn)象會(huì)非常明顯的用示波器量出,CAN總線的通信質(zhì)量下降。具體的信號(hào)反彈圖如上邊的單端信號(hào)。如果加了終端電阻,信號(hào)的CANH和CANL的信號(hào)反彈會(huì)相互抵消,差模信號(hào)的振鈴效應(yīng)會(huì)消失。實(shí)際的電壓如下圖。
但是,這種端接方式對(duì)共模信號(hào)產(chǎn)生問(wèn)題。CANH與CANL的地同時(shí)向上抬1v會(huì)產(chǎn)生振鈴效應(yīng)直至衰減完畢,不過(guò)信號(hào)共模信號(hào)的干擾產(chǎn)生的是同相同幅的的干擾,對(duì)我們差分信號(hào)的數(shù)據(jù)識(shí)別影響不大,而且CAN線上走的也不是有周期的時(shí)鐘信號(hào)。但是共模信號(hào)帶來(lái)的振鈴效應(yīng)電壓幅值過(guò)大,還有有幾率帶來(lái)can位數(shù)據(jù)丟失同步,導(dǎo)致CAN錯(cuò)誤計(jì)數(shù)累加的問(wèn)題。
有些文章介紹過(guò)can信號(hào)下降沿因?yàn)榭偩€間電容斜率變大,終端電阻有幫助放電,提高斜率的作用,我做的測(cè)試沒(méi)有測(cè)出來(lái),就不贅述了。
這里強(qiáng)調(diào)一下不管是跨接終端電阻做匹配,還是分別并聯(lián)匹配。只要是CAN總線,無(wú)論總線長(zhǎng)短,帶機(jī)數(shù)量,都要做這個(gè)匹配,CAN總線對(duì)接收器的定義與其余的現(xiàn)場(chǎng)總線不同。
最佳/最大用戶并發(fā)數(shù)
我們從例子,引發(fā)出具體的概念。
理發(fā)店共有3名理發(fā)師(處理器同時(shí)處理事務(wù)數(shù))處理到店理發(fā)的用戶,理發(fā)師給每個(gè)用戶理發(fā)的時(shí)間為1小時(shí)(處理時(shí)間),店里有三個(gè)等待的理發(fā)的椅子(請(qǐng)求緩存),客人在理發(fā)店呆的時(shí)間超過(guò)3個(gè)小時(shí)就會(huì)無(wú)法忍受離開(kāi)(超時(shí)時(shí)間)。
在這個(gè)場(chǎng)景里,隨著用戶增大(負(fù)載),1.資源利用率逐漸增加,到3名客戶后維持不變。2.系統(tǒng)吞吐量逐漸增加,到達(dá)3個(gè)客戶后增加的速度變小,到了9個(gè)客戶左右開(kāi)始下降。3.響應(yīng)時(shí)間在0~3個(gè)客戶之間保持穩(wěn)定,超過(guò)3個(gè)客戶之后逐漸增加,增長(zhǎng)速度也逐漸增加,超過(guò)9個(gè)客戶之后接近無(wú)窮大。
資源利用率和相應(yīng)時(shí)間隨著負(fù)載的變化曲線比較好理解,吞吐量在這里表示系統(tǒng)成功執(zhí)行的請(qǐng)求數(shù),吞吐量在超過(guò)9個(gè)客戶下降的主要原因是因?yàn)橄到y(tǒng)超負(fù)荷運(yùn)算,多余的上線文切換,低速IO的訪問(wèn),或如STM32的CAN超負(fù)荷報(bào)文下,多余的中斷響應(yīng),ARM模式的切換,客觀上將處理時(shí)間(1小時(shí))拉長(zhǎng)了,所以會(huì)導(dǎo)致吞吐量下降。因?yàn)橛谩安l(fā)用戶數(shù)”這個(gè)詞容易引起誤會(huì),尤其是在現(xiàn)在多核的處理器已經(jīng)普及。我將并發(fā)改為單位時(shí)間的請(qǐng)求數(shù)。
對(duì)一個(gè)確定的被測(cè)系統(tǒng)(無(wú)論是從整體,業(yè)務(wù)軟件+硬件來(lái)說(shuō),還是硬件本身)來(lái)說(shuō),在一個(gè)特定的環(huán)境中,他的"最佳單位時(shí)間請(qǐng)求數(shù)"以及“最大單位時(shí)間請(qǐng)求數(shù)”都是客觀存在的,我們做的系統(tǒng),應(yīng)該確保系統(tǒng)的“最大單位時(shí)間請(qǐng)求數(shù)”大于系統(tǒng)需要承受的峰值負(fù)載,并且在系統(tǒng)的日常使用過(guò)程中,負(fù)載處在“最佳單位時(shí)間請(qǐng)求數(shù)”左右。
粘包/半包與拆包
講了這么多跟軟件沒(méi)有關(guān)系的概念,這個(gè)一級(jí)標(biāo)題的內(nèi)容我要告訴你怎么簡(jiǎn)單處理CAN總線上的拆包問(wèn)題。
CAN協(xié)議的幀格式規(guī)定了一幀CAN協(xié)議中包含8字節(jié)64位數(shù)據(jù)。如果你的系統(tǒng)應(yīng)用層的協(xié)議的數(shù)據(jù)量小于一個(gè)CAN幀中的數(shù)據(jù)量,那么恭喜你,可以不用看這部分了。最近CIA的網(wǎng)站介紹了一種CAN FD的實(shí)現(xiàn),波特率最高支持到5Mbit/s,一幀包含的有效數(shù)據(jù)能達(dá)到64字節(jié)512位的數(shù)據(jù)。
粘包和半包的產(chǎn)生原因,是因?yàn)殒溌穼?MAC芯片,CAN控制器)將應(yīng)用層的下發(fā)的業(yè)務(wù)數(shù)據(jù)做分片處理(CAN分割成每8字節(jié)一個(gè)數(shù)據(jù)幀),那么勢(shì)必會(huì)引起數(shù)據(jù)傳輸?shù)綄?duì)端的基本數(shù)據(jù)單位是分片的長(zhǎng)度,那么就會(huì)出現(xiàn)收到的數(shù)據(jù)不是一整包的數(shù)據(jù)(半包),這個(gè)比較好理解。粘包是因?yàn)閿?shù)據(jù)傳輸延時(shí)等原因,兩整包的數(shù)據(jù)一起收到。
發(fā)送部分的邏輯:將發(fā)送的整包數(shù)據(jù)的源地址和目標(biāo)地址以及這個(gè)數(shù)據(jù)在目標(biāo)設(shè)備的緩存起始地址(這個(gè)地址表示的寬度是8字節(jié)數(shù)據(jù))寫入要發(fā)送幀的標(biāo)識(shí)符(使用擴(kuò)展幀)。將分片的數(shù)據(jù)寫入幀的數(shù)據(jù)區(qū),然后發(fā)送。因?yàn)檫@里我們先將拆包,所以這部分邏輯我先點(diǎn)到這個(gè)局部,下一個(gè)文章我再細(xì)講發(fā)送部分如何將并行轉(zhuǎn)成串行,以及總線時(shí)間片的測(cè)量及實(shí)現(xiàn)。
接收部分邏輯:先說(shuō)存儲(chǔ)數(shù)據(jù)的核心的數(shù)據(jù)結(jié)構(gòu),因?yàn)閿?shù)據(jù)的緩存是隨機(jī)存儲(chǔ),且單位數(shù)據(jù)長(zhǎng)度是固定的,這里就選擇最單純的char類型的二維數(shù)組S,列數(shù)指定為8字節(jié),行數(shù)根據(jù)實(shí)際的平臺(tái)的限制,選擇合適的幀緩存數(shù)據(jù)最大值(256)。數(shù)據(jù)結(jié)構(gòu)A不僅包含S,還包括兩個(gè)char類型指針,一個(gè)指向待處理數(shù)據(jù)頭,一個(gè)指向待處理數(shù)據(jù)尾。然后根據(jù)根據(jù)實(shí)際的需要以及處理器的RAM剩余情況,選擇合適的支持節(jié)點(diǎn)數(shù)(64個(gè)終端),數(shù)據(jù)結(jié)構(gòu)B是我們拆包使用的數(shù)據(jù)結(jié)構(gòu),由支持節(jié)點(diǎn)數(shù)個(gè)數(shù)的數(shù)據(jù)結(jié)構(gòu)A,和一個(gè)表示數(shù)據(jù)結(jié)構(gòu)A有待處理項(xiàng)的Int值。
CAN接收中斷函數(shù)先判斷從標(biāo)識(shí)符中取出目標(biāo)地址,判斷合法之后將CAN數(shù)據(jù)放到源地址對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)B.A[源地址].S[行地址]中,,并移動(dòng)待處理數(shù)據(jù)為尾指針。這塊處理需要注意兩點(diǎn)。
1.放數(shù)據(jù)的時(shí)候根據(jù)幀中實(shí)際數(shù)據(jù)長(zhǎng)度,結(jié)合尾指針位置以及標(biāo)識(shí)符中指定行地址綜合判斷,決定放到內(nèi)存8字節(jié)單位空間的那個(gè)字節(jié)位置,保證針對(duì)每個(gè)終端的內(nèi)存地址空間從字節(jié)流的角度上看是連續(xù)的。
2.遇到不連續(xù)的寫入(尾指針在行地址2,寫入數(shù)據(jù)的行地址卻是10),要根據(jù)包長(zhǎng)度來(lái)判斷合法性。
至此,我們有了總線上不同源地址對(duì)這個(gè)目標(biāo)地址的發(fā)送數(shù)據(jù)的緩存,下面就是拆包了。
拆包因協(xié)議的特征而定拆包的邏輯,Netty 中就有針對(duì)不同特點(diǎn)的拆包器,比如固定長(zhǎng)度的拆包器 FixedLengthFrameDecoder,分隔符拆包器 DelimiterBasedFrameDecoder以及基于數(shù)據(jù)包長(zhǎng)度的拆包器 LengthFieldBasedFrameDecoder。
因?yàn)槲沂褂玫膮f(xié)議是有版本號(hào)和包長(zhǎng)度的,跟 LengthFieldBasedFrameDecoder有點(diǎn)像,但是CAN通信要面對(duì)的是百分之百的分包,數(shù)據(jù)幀的亂序,以及一定概率的誤碼,且處理器性能以及資源有限。所以就復(fù)雜一些。拿兩個(gè)點(diǎn)來(lái)具體說(shuō)明一下:
1.如果有數(shù)據(jù)就直接進(jìn)行拆包的處理驗(yàn)證,會(huì)引起沖突/MCU空轉(zhuǎn)的問(wèn)題,甚至有一定概率引起RAM混亂的問(wèn)題,這時(shí)就需要測(cè)量一下總線一個(gè)完整協(xié)議傳輸?shù)臅r(shí)間,我這邊最長(zhǎng)的協(xié)議時(shí)間為3ms,所以這邊就在自接收到第一幀數(shù)據(jù)之后3ms,再進(jìn)行分包處理。
2.因?yàn)槭前俜种俚姆职?#xff0c;所以數(shù)據(jù)幀的亂序概率我測(cè)試下來(lái)比實(shí)際想象的要高,所以就需要一個(gè)兜底的PlanB去將雜訊中的有效數(shù)據(jù)進(jìn)行拆包,將會(huì)在這樣不會(huì)因?yàn)榭偩€在出現(xiàn)誤碼/亂序的情況下,影響后續(xù)拆包的操作。(當(dāng)然,這部分可以采用定期清緩存來(lái)保證,但是,我們要的是即刻的“恢復(fù)“,即PlanB能保證不丟有效幀,定期清緩存只是一種維護(hù)手段)。
具體的邏輯我如下圖流程圖
?十六宿舍 原創(chuàng)作品,轉(zhuǎn)載必須標(biāo)注原文鏈接。
?2023 Yang Li. All rights reserved.
歡迎關(guān)注『十六宿舍』,大家喜歡的話,給個(gè)👍,更多關(guān)于嵌入式相關(guān)技術(shù)的內(nèi)容持續(xù)更新中。
?
總結(jié)
以上是生活随笔為你收集整理的CAN通信稳定性开发分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 腾讯开源Spring Cloud Ten
- 下一篇: Vue制作图片翻面效果