免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

LabVIEW與C語言結(jié)構(gòu)體數(shù)據(jù)交互:字節(jié)對齊與內(nèi)存布局解析

LabVIEW與C語言結(jié)構(gòu)體數(shù)據(jù)交互:字節(jié)對齊與內(nèi)存布局解析 1. 為什么LabVIEW和C語言之間的數(shù)據(jù)交互總出問題搞測控和嵌入式的朋友大概率都遇到過這種場景下位機(jī)跑的是C語言寫的固件上位機(jī)用LabVIEW做數(shù)據(jù)采集和界面展示兩邊通過串口、網(wǎng)口或者共享內(nèi)存交換數(shù)據(jù)。協(xié)議文檔寫得明明白白字段順序、數(shù)據(jù)類型都對著呢可實(shí)際跑起來數(shù)據(jù)就是錯位的——溫度值讀出來是個負(fù)數(shù)計數(shù)器偶爾跳變成一個天文數(shù)字浮點(diǎn)數(shù)更是離譜到?jīng)]法看。你對著示波器和串口助手抓包發(fā)現(xiàn)底層字節(jié)流完全正確問題就出在LabVIEW這一側(cè)的解析上。這個坑我自己踩過不止一次。早些年做一個電機(jī)控制項(xiàng)目下位機(jī)用C語言定義了一個包含十幾個字段的結(jié)構(gòu)體通過串口每10毫秒往上傳一幀。LabVIEW這邊我一開始圖省事直接用“從字符串還原”配合強(qiáng)制類型轉(zhuǎn)換來解析結(jié)果電機(jī)轉(zhuǎn)速偶爾會突然飆到額定值的幾十倍嚇得我趕緊斷電。后來花了一整天才定位到問題C語言編譯器默認(rèn)會對結(jié)構(gòu)體做字節(jié)對齊結(jié)構(gòu)體里實(shí)際占用的字節(jié)數(shù)和我按字段順序累加算出來的完全不一樣中間多了好幾個填充字節(jié)。LabVIEW這邊如果按緊湊排列去解析后面所有字段全部錯位。這就是今天要聊的核心問題LabVIEW的簇Cluster和C語言的結(jié)構(gòu)體struct在內(nèi)存布局上并不是天然對應(yīng)的。C語言結(jié)構(gòu)體受編譯器對齊規(guī)則影響字段之間可能存在填充字節(jié)結(jié)構(gòu)體總大小也可能是某個值的整數(shù)倍而LabVIEW的簇默認(rèn)是按緊湊方式打包的除非你手動配置對齊方式。兩邊對不上數(shù)據(jù)必然錯亂。這篇文章適合誰看如果你正在做LabVIEW與C語言尤其是單片機(jī)、DSP、ARM嵌入式端之間的數(shù)據(jù)通信不管是串口、TCP、UDP還是共享內(nèi)存只要涉及結(jié)構(gòu)體級別的數(shù)據(jù)交換這篇內(nèi)容都能直接拿來用。我會從內(nèi)存布局原理講起把字節(jié)對齊的規(guī)則掰開揉碎然后手把手演示怎么在LabVIEW里配置簇的對齊方式讓它和C語言結(jié)構(gòu)體精確匹配。最后還會分享幾個我實(shí)際調(diào)試中總結(jié)的排查技巧和避坑經(jīng)驗(yàn)。2. 字節(jié)對齊到底是怎么回事為什么它會讓你的數(shù)據(jù)錯位2.1 從CPU訪存效率說起要理解字節(jié)對齊得先知道CPU是怎么訪問內(nèi)存的。現(xiàn)代處理器訪問內(nèi)存并不是一個字節(jié)一個字節(jié)來的而是按“字”來訪問的。32位處理器一次讀4個字節(jié)64位處理器一次讀8個字節(jié)。如果一個4字節(jié)的int類型變量存放在地址0x0001開始的位置CPU需要先讀0x0000到0x0003這4個字節(jié)再讀0x0004到0x0007這4個字節(jié)然后從中截取拼接出這個int效率直接打?qū)φ邸H绻@個int放在0x0000或者0x0004這種4的整數(shù)倍地址上一次讀取就夠了。所以編譯器為了提高訪存效率默認(rèn)會把變量安排在自然對齊的地址上。所謂自然對齊就是變量的起始地址必須是其自身大小的整數(shù)倍。比如int是4字節(jié)那它的起始地址必須是4的倍數(shù)double是8字節(jié)起始地址必須是8的倍數(shù)char是1字節(jié)任何地址都行。結(jié)構(gòu)體作為一個復(fù)合類型它的每個成員都要滿足各自的對齊要求。編譯器在成員之間插入填充字節(jié)padding保證每個成員的起始地址滿足對齊條件。同時結(jié)構(gòu)體本身也有對齊要求等于其最大成員的對齊值結(jié)構(gòu)體的總大小必須是這個值的整數(shù)倍末尾也可能有填充。2.2 一個具體的例子讓你看明白光說理論太抽象直接上代碼。假設(shè)C語言端定義了這樣一個結(jié)構(gòu)體struct SensorData { char id; // 1字節(jié) int value; // 4字節(jié) char status; // 1字節(jié) double timestamp; // 8字節(jié) };如果你按字段大小直接累加會算出141814字節(jié)。但實(shí)際在內(nèi)存中這個結(jié)構(gòu)體占多少字節(jié)呢我們來逐字段分析。id是char1字節(jié)放在偏移0處占偏移0。接下來是valueint類型4字節(jié)要求起始地址是4的倍數(shù)。當(dāng)前偏移是1不是4的倍數(shù)所以編譯器會在偏移1、2、3處插入3個填充字節(jié)value從偏移4開始占偏移4到7。然后是statuschar類型1字節(jié)放在偏移8處。接下來是timestampdouble類型8字節(jié)要求起始地址是8的倍數(shù)。當(dāng)前偏移是9不是8的倍數(shù)編譯器會在偏移9到15處插入7個填充字節(jié)timestamp從偏移16開始占偏移16到23。結(jié)構(gòu)體總大小目前是24字節(jié)而結(jié)構(gòu)體的對齊值等于最大成員的對齊值也就是double的8字節(jié)24正好是8的整數(shù)倍不需要末尾填充。所以這個結(jié)構(gòu)體實(shí)際占24字節(jié)而不是14字節(jié)。中間有3710個填充字節(jié)。如果你在LabVIEW里按14字節(jié)緊湊解析從第5個字節(jié)開始就全錯了。2.3 不同編譯器和平臺的差異更麻煩的是字節(jié)對齊規(guī)則并不是唯一的。不同的編譯器、不同的編譯選項(xiàng)、不同的目標(biāo)平臺對齊策略可能不一樣。在常見的32位ARM平臺上double類型可能只要求4字節(jié)對齊而不是8字節(jié)對齊這樣上面那個結(jié)構(gòu)體的大小就會變成20字節(jié)而不是24字節(jié)。在有些嵌入式編譯器上可以通過#pragma pack指令來改變對齊方式比如#pragma pack(1)就是按1字節(jié)對齊也就是完全緊湊排列不留任何填充。還有#pragma pack(2)、#pragma pack(4)等等。另外結(jié)構(gòu)體嵌套結(jié)構(gòu)體的時候內(nèi)層結(jié)構(gòu)體的對齊值會傳遞到外層。如果內(nèi)層結(jié)構(gòu)體因?yàn)閷R而變大了外層結(jié)構(gòu)體的布局也會跟著變。這就導(dǎo)致一個問題你光看C語言源碼里的字段定義很難直接算出實(shí)際的內(nèi)存布局必須結(jié)合編譯器和編譯選項(xiàng)來判斷。注意在實(shí)際項(xiàng)目中最可靠的做法不是靠人腦去算而是用sizeof()和offsetof()宏在C語言端打印出每個字段的實(shí)際偏移和結(jié)構(gòu)體總大小然后拿這個結(jié)果去配置LabVIEW端的簇。這是我在多個項(xiàng)目中驗(yàn)證過的最穩(wěn)妥的方法。3. LabVIEW簇的對齊配置讓兩邊內(nèi)存布局精確匹配3.1 LabVIEW簇的默認(rèn)行為LabVIEW的簇在內(nèi)存中的布局和C語言結(jié)構(gòu)體有本質(zhì)區(qū)別。LabVIEW是一種數(shù)據(jù)流編程語言簇更多是一個邏輯容器它的內(nèi)存布局由LabVIEW運(yùn)行時管理。在默認(rèn)情況下LabVIEW簇采用緊湊排列也就是說字段之間沒有填充字節(jié)每個字段緊挨著上一個字段。但LabVIEW也提供了對齊配置選項(xiàng)允許你指定簇的對齊方式使其與C語言結(jié)構(gòu)體匹配。這個配置在簇的右鍵菜單里可以找到具體路徑是右鍵簇邊框 - “高級” - “數(shù)據(jù)對齊”。在這里你可以選擇1、2、4、8字節(jié)對齊或者選擇“自然對齊”。選擇不同的對齊方式LabVIEW會在字段之間自動插入填充字節(jié)使得每個字段的偏移滿足對齊要求。這和C語言編譯器的行為是一致的。所以關(guān)鍵就是C語言端用什么對齊方式LabVIEW端就配什么對齊方式。3.2 對齊方式的選擇依據(jù)那怎么知道C語言端用的是什么對齊方式呢這取決于幾個因素。第一看編譯器的默認(rèn)對齊設(shè)置。大多數(shù)桌面和服務(wù)器的編譯器如GCC、MSVC默認(rèn)使用自然對齊也就是每個字段按其自身大小對齊。但在嵌入式領(lǐng)域很多編譯器默認(rèn)使用4字節(jié)對齊即使字段是8字節(jié)的double也只要求4字節(jié)對齊。第二看代碼里有沒有#pragma pack指令。如果C語言源碼里明確寫了#pragma pack(1)那就是緊湊排列LabVIEW端也要選1字節(jié)對齊。如果寫的是#pragma pack(4)那就選4字節(jié)對齊。第三看目標(biāo)平臺的ABI規(guī)范。不同的處理器架構(gòu)有不同的ABI應(yīng)用程序二進(jìn)制接口規(guī)范里面會規(guī)定對齊規(guī)則。比如ARM的AAPCS規(guī)范規(guī)定double是8字節(jié)對齊但有些嵌入式ABI可能規(guī)定4字節(jié)對齊。我一般的做法是先在C語言端寫一段測試代碼用sizeof()打印結(jié)構(gòu)體總大小用offsetof()打印每個字段的偏移然后拿這些數(shù)據(jù)去反推對齊方式。如果字段偏移和緊湊排列一致那就是1字節(jié)對齊如果偏移是字段大小的整數(shù)倍那就是自然對齊如果偏移是4的倍數(shù)但double字段偏移不是8的倍數(shù)那就是4字節(jié)對齊。3.3 在LabVIEW中配置簇對齊的完整步驟下面我以LabVIEW 2023為例演示完整的配置過程。假設(shè)C語言端的結(jié)構(gòu)體就是前面那個SensorData編譯器使用自然對齊結(jié)構(gòu)體總大小24字節(jié)。第一步在前面板或程序框圖里創(chuàng)建一個簇按順序放入對應(yīng)的字段。注意字段順序必須和C語言結(jié)構(gòu)體完全一致不能顛倒。字段類型也要對應(yīng)char對應(yīng)LabVIEW的U8無符號8位整數(shù)或I8有符號8位整數(shù)int對應(yīng)I32double對應(yīng)DBL。第二步右鍵簇邊框選擇“高級” - “數(shù)據(jù)對齊”。在彈出的對話框里你會看到幾個選項(xiàng)1字節(jié)、2字節(jié)、4字節(jié)、8字節(jié)、自然對齊。對于這個例子選擇“自然對齊”。第三步配置完成后LabVIEW會自動在字段之間插入填充。你可以通過“簇大小”屬性節(jié)點(diǎn)來驗(yàn)證配置后的簇占用的字節(jié)數(shù)。在程序框圖里放置一個“簇大小”屬性節(jié)點(diǎn)連接到簇運(yùn)行后看輸出的數(shù)值是否等于C語言端的sizeof()結(jié)果。如果相等說明配置正確。第四步在實(shí)際解析數(shù)據(jù)時使用“從字符串還原”函數(shù)將字節(jié)流按配置好的簇類型還原。注意“從字符串還原”函數(shù)的“數(shù)據(jù)類型”參數(shù)要連接你配置好的簇這樣LabVIEW就會按照簇的內(nèi)存布局來解析字節(jié)流。提示LabVIEW的“從字符串還原”函數(shù)默認(rèn)按照大端字節(jié)序解析。如果你的C語言端是小端x86和大多數(shù)ARM都是小端需要在解析后對多字節(jié)字段做字節(jié)序轉(zhuǎn)換或者使用“交換字節(jié)”函數(shù)。這一點(diǎn)后面會詳細(xì)講。3.4 驗(yàn)證配置是否正確的實(shí)用方法配置完了怎么確認(rèn)沒問題我通常用兩種方法交叉驗(yàn)證。方法一在C語言端構(gòu)造一個已知數(shù)據(jù)的結(jié)構(gòu)體填充一些容易識別的值比如id0x01value0x12345678status0x02timestamp1234567890.123。然后把這個結(jié)構(gòu)體按字節(jié)打印出來得到一個十六進(jìn)制字節(jié)序列。在LabVIEW端用同樣的字節(jié)序列去還原看解析出來的字段值是否和C語言端一致。方法二在LabVIEW端構(gòu)造一個簇填充已知值然后用“平化為字符串”函數(shù)轉(zhuǎn)成字節(jié)流再在C語言端用memcpy把這個字節(jié)流拷貝到結(jié)構(gòu)體變量里看字段值是否匹配。這種方法可以反向驗(yàn)證LabVIEW端的布局是否正確。兩種方法我都用過實(shí)測下來方法一更直觀因?yàn)镃語言端打印字節(jié)序列很方便LabVIEW端解析后直接看結(jié)果就行。方法二適合在LabVIEW端做數(shù)據(jù)打包發(fā)送給C語言端的場景。4. 完整實(shí)操從C語言結(jié)構(gòu)體到LabVIEW簇的端到端實(shí)現(xiàn)4.1 C語言端的數(shù)據(jù)定義與打包先看C語言端的完整代碼。假設(shè)我們有一個傳感器數(shù)據(jù)采集系統(tǒng)下位機(jī)每100毫秒采集一次數(shù)據(jù)通過串口發(fā)送給上位機(jī)。數(shù)據(jù)結(jié)構(gòu)定義如下#include stdint.h #include string.h #include stdio.h #include stddef.h #pragma pack(push, 1) // 先試試1字節(jié)對齊 typedef struct { uint8_t id; int32_t value; uint8_t status; double timestamp; } SensorData; #pragma pack(pop) int main() { printf(sizeof(SensorData) %zu\n, sizeof(SensorData)); printf(offset of id %zu\n, offsetof(SensorData, id)); printf(offset of value %zu\n, offsetof(SensorData, value)); printf(offset of status %zu\n, offsetof(SensorData, status)); printf(offset of timestamp %zu\n, offsetof(SensorData, timestamp)); return 0; }運(yùn)行這段代碼如果輸出sizeof為14各字段偏移為0、1、5、6說明1字節(jié)對齊生效了。如果去掉#pragma pack指令輸出sizeof為24偏移為0、4、8、16說明自然對齊生效了。在實(shí)際項(xiàng)目中我建議顯式指定對齊方式不要依賴編譯器默認(rèn)值。因?yàn)椴煌幾g器默認(rèn)值可能不同顯式指定可以保證跨平臺一致性。比如統(tǒng)一用#pragma pack(1)做緊湊排列這樣LabVIEW端也選1字節(jié)對齊兩邊都簡單。打包發(fā)送的代碼大概是這樣void send_sensor_data(int fd, SensorData *data) { uint8_t buffer[sizeof(SensorData)]; memcpy(buffer, data, sizeof(SensorData)); write(fd, buffer, sizeof(buffer)); }注意這里用memcpy把結(jié)構(gòu)體拷貝到字節(jié)數(shù)組而不是直接對結(jié)構(gòu)體指針做類型轉(zhuǎn)換。雖然直接轉(zhuǎn)換在大多數(shù)情況下也能工作但用memcpy更規(guī)范也避免了潛在的對齊陷阱。4.2 LabVIEW端的簇配置與解析LabVIEW端的程序框圖大致分這么幾步。第一步配置串口。用VISA配置串口函數(shù)設(shè)置波特率、數(shù)據(jù)位、停止位、校驗(yàn)位要和下位機(jī)一致。我一般用115200波特率、8數(shù)據(jù)位、1停止位、無校驗(yàn)。第二步讀取字節(jié)流。用VISA讀取函數(shù)讀取長度設(shè)為sizeof(SensorData)也就是14字節(jié)如果C語言端是1字節(jié)對齊。注意串口讀取可能一次讀不滿需要循環(huán)讀取直到讀夠14字節(jié)。我通常用一個While循環(huán)配合“VISA讀取”和“字符串長度”來判斷。第三步解析字節(jié)流。用“從字符串還原”函數(shù)數(shù)據(jù)類型連接配置好的簇。簇的配置如下右鍵簇邊框 - 高級 - 數(shù)據(jù)對齊 - 選擇1字節(jié)。然后依次放入U8、I32、U8、DBL四個字段。第四步字節(jié)序處理。如果C語言端是小端LabVIEW默認(rèn)按大端解析需要對I32和DBL字段做字節(jié)序轉(zhuǎn)換??梢杂谩敖粨Q字節(jié)”函數(shù)或者用“平化為字符串”再手動反轉(zhuǎn)字節(jié)順序。我一般寫一個小的子VI專門做字節(jié)序轉(zhuǎn)換輸入輸出都是簇內(nèi)部對多字節(jié)字段逐個處理。第五步顯示和存儲。把解析出來的字段值連接到前面板的數(shù)值控件和波形圖表上同時可以寫入TDMS文件做記錄。4.3 字節(jié)序問題的處理技巧字節(jié)序這個問題值得單獨(dú)說一下。x86架構(gòu)和大多數(shù)ARM架構(gòu)都是小端也就是低位字節(jié)存在低地址。LabVIEW運(yùn)行在x86或ARM上時內(nèi)部數(shù)據(jù)也是小端。但LabVIEW的“從字符串還原”函數(shù)在解析多字節(jié)數(shù)值時默認(rèn)按照大端順序讀取字節(jié)。這就導(dǎo)致一個矛盾C語言端按小端發(fā)送LabVIEW按大端解析結(jié)果就是字節(jié)序反了。解決這個問題有兩種思路。第一種是在LabVIEW端解析后做字節(jié)序轉(zhuǎn)換。對于I32把四個字節(jié)反轉(zhuǎn)對于DBL把八個字節(jié)反轉(zhuǎn)。LabVIEW有現(xiàn)成的“交換字節(jié)”函數(shù)可以直接用。第二種是在C語言端發(fā)送前先轉(zhuǎn)成大端但這樣會增加下位機(jī)的計算負(fù)擔(dān)而且不符合小端平臺的慣例不推薦。我一般用第一種思路在LabVIEW端寫一個通用的字節(jié)序轉(zhuǎn)換子VI。具體實(shí)現(xiàn)是把簇平化為字符串然后按字段逐個反轉(zhuǎn)字節(jié)再還原成簇。這個子VI可以復(fù)用不管簇里有多少字段只要知道每個字段的字節(jié)數(shù)就行。實(shí)操心得字節(jié)序轉(zhuǎn)換最容易出錯的地方是忘了處理。我見過好幾個項(xiàng)目調(diào)試了半天發(fā)現(xiàn)數(shù)據(jù)不對最后查出來是字節(jié)序沒轉(zhuǎn)。建議在解析函數(shù)后面立刻加一個字節(jié)序轉(zhuǎn)換步驟形成固定流程不要等到出問題了再回頭查。4.4 用共享內(nèi)存做高速數(shù)據(jù)交換的配置要點(diǎn)串口通信速率有限如果數(shù)據(jù)量大、實(shí)時性要求高可以考慮用共享內(nèi)存。LabVIEW和C語言通過共享內(nèi)存交換數(shù)據(jù)時同樣需要保證內(nèi)存布局一致。共享內(nèi)存的本質(zhì)是一塊物理內(nèi)存兩個進(jìn)程都映射到自己的地址空間。C語言端定義一個結(jié)構(gòu)體指針指向這塊內(nèi)存LabVIEW端用“映射共享內(nèi)存”函數(shù)獲取這塊內(nèi)存的引用然后按簇解析。關(guān)鍵點(diǎn)在于共享內(nèi)存的起始地址必須是結(jié)構(gòu)體對齊值的整數(shù)倍。如果C語言端用自然對齊結(jié)構(gòu)體對齊值是8那共享內(nèi)存起始地址必須是8的倍數(shù)。大多數(shù)操作系統(tǒng)在分配共享內(nèi)存時會自動滿足頁對齊通常是4096字節(jié)對齊所以這個條件一般都能滿足。另一個關(guān)鍵點(diǎn)是同步。兩個進(jìn)程同時讀寫共享內(nèi)存會出問題需要用信號量或互斥量做同步。LabVIEW有“信號量”相關(guān)的函數(shù)可以和C語言的POSIX信號量配合使用。不過同步機(jī)制的設(shè)計比較復(fù)雜展開講篇幅太大這里先記著有這么回事以后有機(jī)會單獨(dú)寫一篇。5. 常見問題排查與避坑經(jīng)驗(yàn)實(shí)錄5.1 數(shù)據(jù)錯位的典型癥狀和排查思路數(shù)據(jù)錯位最典型的癥狀就是某些字段的值看起來“差不多對”但偶爾跳變或者某些字段完全離譜。比如溫度值大部分時候正常偶爾跳到幾千度計數(shù)器大部分時候遞增正常偶爾跳變成一個巨大的數(shù)。這種“大部分正常偶爾異?!钡默F(xiàn)象往往就是對齊問題導(dǎo)致的。排查思路我總結(jié)了一個流程。首先在C語言端打印結(jié)構(gòu)體的sizeof和每個字段的offsetof記錄下來。然后在LabVIEW端用“簇大小”屬性節(jié)點(diǎn)獲取簇的字節(jié)數(shù)和C語言端的sizeof對比。如果不一致說明對齊配置有問題。如果一致再檢查每個字段的偏移是否匹配。LabVIEW沒有直接獲取字段偏移的函數(shù)但可以通過“平化為字符串”后觀察字節(jié)序列來間接驗(yàn)證。我一般會構(gòu)造一個測試用例C語言端填充已知值打印十六進(jìn)制字節(jié)序列LabVIEW端用同樣的字節(jié)序列解析看結(jié)果是否一致。這個方法最直接也最可靠。5.2 對齊配置對了但數(shù)據(jù)還是不對的幾種可能有時候?qū)R配置明明對了sizeof也一致但數(shù)據(jù)還是不對。這種情況我遇到過幾次原因各不相同。第一種可能是字節(jié)序沒處理。前面說過LabVIEW默認(rèn)大端解析C語言端小端發(fā)送多字節(jié)字段會反。這個用“交換字節(jié)”函數(shù)解決。第二種可能是字段類型不匹配。比如C語言端的int在32位平臺上是4字節(jié)在16位平臺上是2字節(jié)。LabVIEW端如果用了I32而C語言端實(shí)際是I16那就會多讀兩個字節(jié)后面全錯。所以字段類型一定要和C語言端的實(shí)際類型對應(yīng)不能想當(dāng)然。第三種可能是結(jié)構(gòu)體里有數(shù)組或指針。數(shù)組的話LabVIEW端要用數(shù)組常量放在簇里數(shù)組元素類型和長度都要匹配。指針的話就麻煩了指針存的是地址跨進(jìn)程沒有意義必須把指針指向的數(shù)據(jù)也打包進(jìn)去或者用共享內(nèi)存讓指針在兩邊都有效。第四種可能是編譯器做了優(yōu)化。有些編譯器會把結(jié)構(gòu)體里的字段重新排序或者把小的字段合并到一個字里。這種情況比較少見但在某些嵌入式編譯器上確實(shí)存在。解決辦法是用volatile關(guān)鍵字或者編譯器選項(xiàng)禁止優(yōu)化。5.3 常見問題速查表癥狀可能原因排查方法解決方案所有字段都錯位對齊方式不匹配對比sizeof和簇大小調(diào)整LabVIEW簇對齊配置多字節(jié)字段值反了字節(jié)序不匹配檢查C語言端字節(jié)序加字節(jié)序轉(zhuǎn)換步驟部分字段正常部分異常字段類型或順序不對逐字段對比偏移修正字段類型和順序偶爾跳變讀取不完整或同步問題檢查讀取循環(huán)和同步機(jī)制確保讀滿或加同步數(shù)組數(shù)據(jù)錯亂數(shù)組長度或元素類型不匹配對比數(shù)組定義修正數(shù)組配置結(jié)構(gòu)體嵌套出錯內(nèi)層對齊值傳遞檢查內(nèi)層結(jié)構(gòu)體對齊統(tǒng)一對齊方式5.4 幾個我踩過的坑和對應(yīng)的經(jīng)驗(yàn)第一個坑#pragma pack的作用范圍。#pragma pack(1)會一直生效到下一個#pragma pack或者文件結(jié)束。如果只在結(jié)構(gòu)體定義前寫了#pragma pack(1)忘了在后面恢復(fù)那后面所有結(jié)構(gòu)體都會變成1字節(jié)對齊。這個坑我踩過導(dǎo)致另一個模塊的數(shù)據(jù)全部錯位。后來我養(yǎng)成了習(xí)慣用#pragma pack(push, 1)和#pragma pack(pop)成對使用確保只影響目標(biāo)結(jié)構(gòu)體。第二個坑LabVIEW簇的“自然對齊”和C語言的“自然對齊”不一定完全一致。LabVIEW的“自然對齊”是按字段自身大小對齊C語言的“自然對齊”也是按字段自身大小對齊理論上應(yīng)該一致。但在某些平臺上C語言編譯器可能對double類型有特殊處理比如要求8字節(jié)對齊但LabVIEW只要求4字節(jié)。這種情況我遇到過一回最后是手動指定8字節(jié)對齊解決的。所以如果“自然對齊”不對試試手動指定具體的對齊字節(jié)數(shù)。第三個坑字符串字段的處理。C語言里的char數(shù)組和LabVIEW里的字符串類型在內(nèi)存布局上不一樣。C語言的char數(shù)組是固定長度的連續(xù)字節(jié)LabVIEW字符串是長度前綴加字符數(shù)據(jù)。如果結(jié)構(gòu)體里有char數(shù)組LabVIEW端不能用字符串類型要用U8數(shù)組。這個坑我踩過解析出來的字符串總是多一個字節(jié)或者少一個字節(jié)后來換成U8數(shù)組就對了。第四個坑浮點(diǎn)數(shù)的精度問題。C語言的float是4字節(jié)double是8字節(jié)。LabVIEW的SGL是4字節(jié)DBL是8字節(jié)。類型要對應(yīng)不能用DBL去解析C語言的float否則會多讀4個字節(jié)。這個坑比較隱蔽因?yàn)榻馕龀鰜淼臄?shù)值可能“看起來差不多”但精度不對而且后面字段會錯位。5.5 調(diào)試工具和輔助手段調(diào)試這類問題有幾個工具特別好用。第一個是串口助手??梢宰ト語言端發(fā)送的原始字節(jié)流保存成文件然后在LabVIEW端用文件讀取的方式反復(fù)解析不用每次都跑下位機(jī)。這樣可以快速迭代調(diào)試。第二個是LabVIEW的“平化為字符串”函數(shù)。把配置好的簇平化為字符串觀察字節(jié)序列和C語言端打印的字節(jié)序列對比。如果一致說明布局匹配如果不一致逐字節(jié)找差異。第三個是C語言的offsetof宏。這個宏在stddef.h里可以打印每個字段的偏移。我一般在結(jié)構(gòu)體定義后面加一段打印代碼編譯時輸出偏移信息方便對照。第四個是十六進(jìn)制編輯器。把C語言端發(fā)送的字節(jié)流保存成二進(jìn)制文件用十六進(jìn)制編輯器打開手動對照結(jié)構(gòu)體定義看填充字節(jié)在哪些位置。這個方法雖然原始但非常直觀適合初學(xué)者理解對齊規(guī)則。6. 進(jìn)階話題跨平臺和跨編譯器的兼容性策略6.1 統(tǒng)一對齊方式的最佳實(shí)踐如果你的項(xiàng)目涉及多個平臺比如下位機(jī)是ARM上位機(jī)是x86或者多個編譯器比如GCC和MSVC對齊方式可能不一致。為了保證兼容性我建議統(tǒng)一使用1字節(jié)對齊也就是#pragma pack(1)。這樣兩邊都是緊湊排列沒有填充字節(jié)布局最簡單也最容易驗(yàn)證。1字節(jié)對齊的代價是訪存效率可能降低因?yàn)镃PU可能需要多次讀取才能拼出一個多字節(jié)數(shù)值。但在通信場景下數(shù)據(jù)量通常不大訪存效率不是瓶頸布局簡單可靠才是最重要的。如果確實(shí)對性能有要求可以考慮4字節(jié)對齊但要在兩邊都顯式指定并且用sizeof和offsetof驗(yàn)證。6.2 用協(xié)議文檔固化內(nèi)存布局不管用什么對齊方式我都建議寫一份協(xié)議文檔把結(jié)構(gòu)體的內(nèi)存布局固化下來。文檔里要包含每個字段的名稱、類型、字節(jié)數(shù)、偏移量結(jié)構(gòu)體總大小對齊方式字節(jié)序。這樣即使換了人維護(hù)或者換了編譯器也能快速對照檢查。文檔的格式可以是這樣字段名類型字節(jié)數(shù)偏移量說明iduint8_t10傳感器IDvalueint32_t41測量值statusuint8_t15狀態(tài)碼timestampdouble86時間戳總大小14字節(jié)對齊方式1字節(jié)字節(jié)序小端。這份文檔就是兩邊開發(fā)的“合同”任何一方改了結(jié)構(gòu)體都要同步更新文檔并通知另一方。我見過太多項(xiàng)目因?yàn)榻Y(jié)構(gòu)體改了沒通知對方導(dǎo)致數(shù)據(jù)錯亂的案例。6.3 自動化驗(yàn)證腳本的編寫思路手動驗(yàn)證容易出錯我一般會寫一個自動化驗(yàn)證腳本。思路是在C語言端生成一組隨機(jī)數(shù)據(jù)填充到結(jié)構(gòu)體里打包發(fā)送在LabVIEW端解析后把解析結(jié)果回傳給C語言端C語言端對比原始數(shù)據(jù)和解析結(jié)果如果不一致就報錯。這個腳本可以用Python寫調(diào)用C語言編譯出的可執(zhí)行文件和LabVIEW的ActiveX接口。不過LabVIEW的ActiveX接口配置比較麻煩我一般用更簡單的方法C語言端把原始數(shù)據(jù)和解析結(jié)果都寫入文件LabVIEW端也把解析結(jié)果寫入文件然后用Python腳本對比兩個文件。這個方法雖然土但很有效而且不依賴復(fù)雜的接口配置。6.4 結(jié)構(gòu)體版本管理與向后兼容實(shí)際項(xiàng)目中結(jié)構(gòu)體可能會隨著需求變化而增加字段。如果直接改結(jié)構(gòu)體定義舊版本的LabVIEW程序解析新數(shù)據(jù)就會錯位。解決辦法是在結(jié)構(gòu)體開頭加一個版本號字段LabVIEW端根據(jù)版本號選擇不同的解析方式。比如typedef struct { uint8_t version; uint8_t id; int32_t value; uint8_t status; double timestamp; } SensorDataV2;LabVIEW端先讀第一個字節(jié)判斷版本號如果是V1就按舊布局解析如果是V2就按新布局解析。這樣新舊版本可以共存升級過渡更平滑。版本號字段本身也要注意對齊。如果放在開頭它是1字節(jié)后面的字段偏移會受影響。所以版本號最好放在結(jié)構(gòu)體最前面并且用1字節(jié)對齊這樣對后續(xù)字段的影響最小。7. 我個人的實(shí)操體會這套東西我用了好幾年從最早的串口通信到后來的共享內(nèi)存和網(wǎng)絡(luò)傳輸核心思路一直沒變先確定C語言端的內(nèi)存布局再在LabVIEW端精確復(fù)現(xiàn)這個布局。聽起來簡單但實(shí)際操作中細(xì)節(jié)很多稍不注意就會踩坑。最大的體會是不要靠猜要靠測。C語言端的sizeof和offsetof是唯一可信的依據(jù)LabVIEW端的“簇大小”屬性節(jié)點(diǎn)是驗(yàn)證手段。兩邊對上了再往下做。對不上就先解決對齊問題不要急著調(diào)業(yè)務(wù)邏輯。另一個體會是字節(jié)序問題和對齊問題經(jīng)常同時出現(xiàn)排查的時候要分開處理。先解決對齊確保字節(jié)數(shù)一致再解決字節(jié)序確保多字節(jié)字段的值正確。兩個問題混在一起查很容易繞暈。最后分享一個小技巧如果實(shí)在搞不定對齊配置可以用“平化為字符串”和“從字符串還原”配合手動偏移量來解析。也就是不用簇直接用“字符串子集”函數(shù)按偏移量截取每個字段的字節(jié)然后單獨(dú)做類型轉(zhuǎn)換和字節(jié)序轉(zhuǎn)換。這個方法雖然笨但絕對可靠適合應(yīng)急。等調(diào)通了再回頭優(yōu)化成簇的方式。這個內(nèi)容后續(xù)還可以擴(kuò)展到網(wǎng)絡(luò)通信場景比如TCP或UDP傳輸結(jié)構(gòu)體數(shù)據(jù)時的粘包處理和字節(jié)序協(xié)商。如果大家有興趣我可以再寫一篇專門講網(wǎng)絡(luò)傳輸?shù)摹?
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
婷婷五月丁香香蕉| 欧亚成人A片一区二区| 97艹| 激情人妻蜜夜系列区| 色色色综合色| 婷婷激情五月综合丁| 五月丁香自拍| 影音先锋男人资源站一区二区| 久久婷五月天| www.91.com黄| 五月婷婷色播| 五月丁香婷婷综合| 99视频只有这里精品| 欧美日韩91| 欧美超碰亚洲| 在线五月婷| 91久久婷婷| 激情综合五月色丁香婷婷| 综合色情网| 久久99大| 西西4r午夜剧场| 色五月丁香网| 色99视频| 久色网| 婷婷色色丁香五月天| 激情五月视频| 婷婷五月天综合色| 日日夜夜爽| 久久五月天综合视频网站| 影视av久久久噜噜噜噜噜三级| 五月四色激情| 日本色色视频| 丁香五月婷婷99| 97搞在线| 五月天色欧美| 亚洲小电影在线观看黄999| 色综合网页| 丁香五月激情综合| 裸体做A爰片毛片A片免费| 五月停停999| 色噜噜五月天| 九九99精品视频| 六九色综合婷婷五月天| 九九综合| 天天爽天天操| 久久丁香婷| 国产古装妇女野外A片| 国产精品涩涩涩视频网站| 深爱激情五月网| 特级操b片| 精品无码久久久久久久久| 五月丁香欧美在线| 激情5月婷婷狠狠干| 99久久www| 伊人青涩网| 日韩一级淫乱片一区二区三区| 亚洲无AV在线中文字幕| 久热精彩视频98| 97成人丁香| 9热久久在线| 欧美碰碰| 丁香综合婷婷开心激情网| 玖月婷婷爱丁香| 日韩砖区| 色婷婷亚洲精品天天综| 殴美日比视频| 欧美色一级色| 九九色院| 亚洲五月婷婷在线| 久久这里只有精品热在99| 狠狠色综合精品视频在线| www激情| 亚洲成人婷婷| 桃色伊人在线| 五月天激情视频| 婷婷激情人妻| 日韩在线视频9色| 五月婷婷综合在线视频| 久色网| 欧美综合激情五月丁香| 婷婷五月成人| 亚洲蜜桃精久久久久久久久久久久 | 六月丁香色色| 丁香情色五月| 九九色色| 天天做天天爱| 极品少妇XXXX精品少妇偷拍| 亚洲在线视频321| 丁香六月婷婷综合激情欧美| 五月天婷婷丁香社区| 五月天丁香久久| 99操99| 日本偷拍九九九| 九九综合网色全集| 亚洲综合狠狠艹| 99九九在线精品热动漫| AV亚洲在线| 91人人澡人人爽人人看| 三级大香蕉网| 五月丁香成人网| 九色视频九色九色91jiuseshipin| 婷色视频| 六月丁香成人网| 在线婷婷| av国产精品偷| 五月天色丁香| 色啪久| 97婷婷狠狠| 久久五月婷综合网| 婷婷五月天综合网| 久热超碰| 超碰人人在线| 婷婷五月天久久| 天天干天天色天天干| 五月丁香啪啪激情| 日本久草福利| 思思热久热| 婷婷六月色| 国产在线视频1234| 五月天成人在线播放丁香| 日本三级黄色大片| 91久久1118| 天天橾夜夜爽| 激情五月综合网丁| 五月五丁香婷婷| 婷婷伊人久久| 综合久久久| 俺去啦综合网| 91女人18毛片水多国产| 天天操夜夜爽歪歪| 嘿嘿视频免费看9| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 天天爱天天操| 99精品这里只有免费视频 | 日韩啪啪网| 综合亚洲AV| 五月天在线视频尤物视频在线看| 五月婷婷色欲| 人人看人人摸人人| 婷婷97C| 色久免费| 狠狠 久久| 日韩无码人妻一区二区三区综合| 日欧一片内射VA在线影院| 91丨九色丨大屁股| 91九色精品熟女内射| 中文字幕av久久爽一区| 色五月在线播放| 国产综合婷婷| 99热精品在线| 五月色亭丁香| 99A片| 2025天天爽天天摸| 丁香色色五月| 激情综合五月天| 888久久久| A网在线欧洲| 超碰成人黄色网| 狠狠色激情综合| 国产AV一区二区三区最新精品| WWW.五月天9999| 亚洲欧美婷婷五月色综合| 熟女激情网| 久草热8精品视频在线观看| 亚洲人人96@| 丁香五月激情综合| 天天色宗合| 9|在线观看视频| www色综合| 五月天伊人久久| 久久99热在线观看| 婷婷激情五月天综合| 亚洲久热| www.99热| 丁香六月亚洲| 丁香五月婷婷www..com| 性视频久久| 久色网| 婷婷五月天在婷| 久久视频九九视频| 操逼视频一区| 91无码一区人妻A片蜜| 五月丁香婷中文字幕| 91丁香色五月| 夜夜撸日日操| 亚亚州久久高潮| 射久久丁香五月| 亚洲免费婷婷| 久热这里只有精品6| 五月丁香福利| www.九九婷婷| 天天日天天色| 99热丁香| 丁香五月天成人| www.99热精品| 色色网站毛片| 久操婷婷| 色五月激情| 五月开心婷婷网| 爱爱网址9| 26UUU欧美| 色欲av伊人久久大香线蕉影院| 国产精品久久久久久久久久| 97视频.干com| 性色视频| 激情五月激情综合网一级丸片| 婷婷九九色| 色婷婷综合久久久久| 激情婷婷人妻| 久草 天堂| 99在线精品免费视频| 日日噜噜夜夜狠狠久久丁香六月| 九九久久99| 14色综合婷婷| 91精品视频男人的天堂| 免费超碰在线观看| 婷婷久久大香蕉| 99精品久久| 色综合色香蕉网| 激情九月婷婷| 激情深爱五月天| 99这里只有免费的精品| 综合激情五月丁香| 婷婷五月花| 人人肏逼视频在线一区二区| 日韩无码AV电影网站| 五月婷婷色播| 91色逼| 色丁香久久久| 99re这里有精品手机在线| 亚洲最大在线| 久久久8| 思思热热久久| 大狠狠在线| 五月天激情综合网俺也去| 91丨九色丨老农村| 97在线视频 欧美| 中字幕视频在线永久在线观看免费| 女人被男人吃奶到高潮| 五月天com| 婷婷激情网五月天| 婷婷五月天香蕉| 国产精品噜噜在线视频| 岛国资源网| 日本色色网| 91丨九色丨熟女|新版| 天天色综| 影音先锋一区| 九九人妻福利| 夜夜涩涩涩| 五月天丁香网| 99re思思在线视频| 五月丁香六月合| 丁香五月丐人妻| 91久操| 97香蕉碰碰人妻国产欧美| 殴美日韩成人| 丁香六月啪| 五月天激情四射| 亚洲天堂啪啪| 久久丁香五月天| 91狠狠综合久久久久久| 激情五月天网| 午夜AV网| 亚洲一区二区无遮挡A片| 久久婷中文字幕| 五月婷婷导航| 五月婷婷色播视频| 综合激情深爱| 99re在线视频| 可以看的av| 婷婷中文字幕| 日韩欧美婷婷丁| 成人免费视频一区| 丁香五月婷婷色| 狠狠色噜噜狠狠色噜噜噜999| 天天色·欧美| 激情亚洲网| 五月天婷婷小说| 色色色婷婷五月| 综合久| 婷婷五月天社区| 丰满人妻一区二区三区| 色综合9| 无码髙清| 色爱99| 亚洲mm色| 99在线视频播放| 婷婷操逼| 热996精品在线观看| 久热中文字幕| 婷婷五月天电影在线| 亚洲另类视频| 色五月婷婷五月天| 91精产品自偷自偷综合| 少妇激情五月婷婷| 97碰碰在线观看视频| 91viP在线看| 国外亚洲成AV人片在线观看| 午夜成人综合| 天天精品视频在线观看视频| 五月婷婷av| 97色色网| 成人av在线网站| 五月丁花色综合网| 操操碰| 色婷网站| 狠狠色婷婷在线| 只有久久精品免费| 亚洲成人超碰| 五月开心播播网| 丁香六月av| 婷婷亚洲五| 看国产探花操逼三级片| 天天综合精品| 欧美超级视频97| xx色综合| 青青草激情网| 97碰| 六月婷婷视频| 五月天久久小说| 久久九九网| 亚洲狠狠狠| 欧美色五月| 成人电影在线免费试看| 色色色色网| 五月丁香大香蕉| 超碰猛烈的性猛交| 九九热精品| 丁香五月婷婷激情97| 九九色精品| 开心深爱激情网| 久久国产一区二区三区| 丁香六月婷婷综合激情欧美| 五月丁香偷拍| 久久丁香五月综合六月激情红杏视频| 日91高清无玛| 日本毛片内射| 色婷婷五月视频| 中文字幕日本最新乱码视频| 另类小说五月天综合| 成人在线精品| 超碰超碰在线| 8区视频在线| 婷婷久久天堂网| 婷婷五月天熟妇| 婷婷五月天在线观看| 超碰电影在线播放| 香蕉视频91| caopeng97人人| 婷婷综合六月| 一级黄色操B| 激情网婷婷婷| 任你干嘛免费视频播放| 99热成人| 无码人妻电影| 国产这里只有精品| 99这里只有免费的小视频在线观看| 丁香六月久久| 国语对白性爱视频播放| 拍真实国产伦偷精品| 99re66热这里只有精品| 亚洲操操操| www.国产亚洲69ty.久久久久久久久久久久| 这里只有精品免费| 狠狠色官网| 国产肥白大熟妇BBBB视频| 亚洲第一色色色色| 激情综合视频| 激情综合网五月| 亚洲成人综合网在线免费观看| 丁香六月婷婷综合啪啪| 久久久婷丁香五月天激情综合| 日本成人噜噜噜| 色婷婷五月成人网| 婷婷99狠狠躁天天躁| 久久色五月天| 91九九热| 91超级碰在线视频| 这里只有精品99视频| 丁香五月天堂网| 婷婷亚洲五月丁香综合在线| 天堂网亚洲色图| 婷婷六月啪啪| eeuss人妻| 亚洲亚洲人成综合网络| 五月天婷婷在线AN| 婷婷综合五月| 婷婷丁香成人色综合| 色婷婷五月中文字幕在线dvd| 欧美久久久久久久久中文字幕| 五月天综合网| 天天日人人| 丁香深五月婷婷| 综合性爱网| 日韩三级片一区二区| 婷婷五月天97干| www.婷婷五月天.com| 九九婷婷综合| 中文不卡av| 中美日韩成人在线| 午夜无码精品色综合久久| 亚洲精品成人片在线播| 久久思思热| 99热这里只有精品免费观看| 日韩色色网| 665566 无码| 激情综合99| 激情开心五月婷婷| 国产精品电影网| 99热在线观看| 五月婷网| 五月丁香六月婷婷久久| 小视频在线亚洲| 黄色一极大片| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 欧美这里只有精品| 久99久在线| 综合性爱网| 综合色在线| 天天草天天日| 五月婷庭丁香在线| 伊人婷婷大香蕉在线| 色私五月婷婷| 超碰操日| av无码电影| site:esunnet.com| 97在线精品| 影音先锋偷偷色男人站| 国产精品色情AAAAA片软件| 丁香丁婷五月激情| 狠狠操天天干| 99九色视频在线观看| 天天 青草 制服丝袜 在线| 婷婷五月天激情影片| 182TV大香蕉| 色婷婷网| 狠狠干夜夜干| 亚洲乱码日产精品BD| 99精品偷自拍| 热久精品| 激情五月天99色| 玖玖综合色| 九九在线这里只有精品视频| 操一区| 亚洲一区二区无遮挡A片| 婷婷免费无马| 91碰碰| 双性美人被调教到喷水A片| 婷婷五月天丁香久久| 99久久综合网| 久久免费丁香| 天天操无码| 97在线日韩| 香蕉AV777XXX色综合一区| 狼友视频在线观看18| 五月婷婷丁香综合| 思思热再线视频| 婷婷深爱色五月| 亚洲性爱干干| 伊人五月天日日夜夜久久久天天| 婷婷五月天色| 激情久久四色| 丁六月激情| 色五月xxx| 婷婷丁香社区网| 久热超碰| 成人超碰AV| 丁香六月色香蕉视频| 久久丁香五月天| 五月婷婷六月丁香| 亚洲色色图片| 激情网婷婷婷| 国产密乳av一区二区三区四区| 五月之婷婷| WWW,婷婷,COM| 99亚洲视频| 99色干| 五月天大香蕉| 欧美激情性做爰免费视频| 久久丁香五月天| 99成人网站| 热热久久精品视频| 淫水导航| 日本99在线| 五月丁香综合啪啪| 少妇AB又爽又紧无码网站| 婷婷五月丁香激情| 91久久久久久久91| 无码网| 婷婷五月天激情AV影院| 日本高清久| 激情图片五月天| 成人综合网站| 中文字幕婷婷在线| 99热在线观看免费中文| 激情五月天色婷婷综合| 色婷婷先锋| 色偷偷综合| 免费在线观看AV网站| 九九热99在线视频| 丁香婷婷六月激情文学| 日日日日操| 五月丁香琪琪| 色激情网| 五月婷丁香花| 婷婷丁香色无五月| 五月婷婷激情网| 久久成人亚洲欧美电影| 伊九九三级区| 五月婷婷AV| 色色综合网站| 思思热99热| 99爱在线视频| 五月婷婷|欧美| 袁子仪视频观看| www.henhengan| 91久久久久久| 狠狠色噜噜狠狠亚洲A∨| 大香蕉手机视频| 婷婷五月色亚洲| AV在线中文| 久9久视频精品| 好看的国产精品| 人人爽人人爽人人爽人人爽| 91婷婷丁香| 成人久碰| 五月天另类综合网| 天天色亚洲| 人人97操| 99精品久久久久久久婷婷久久| 99激情网| 久久精品99久久久久久久久| 五月丁香婷婷激激激综合网色播| 五月婷婷激情| 香蕉国产2013| 激情五月天社区| 国产婷婷色综合AV蜜臀AV | 日日干日日| 丁香六月激情国产| 五月天色网站| 久久久国产精品黄毛片| 干亚洲天堂| 9l视频自拍九色9l视频自拍九色9l社区 | 第四色色六月色综合| 另类小说五月天| 五月伊人91| 狠狠色婷婷7| 久久九九爽| 亚州激情九月| 日韩欧美一级大黄网站| 久久久久久久久久久-久五月天婷婷| 色情婷婷| 天天爽天天干| 丁香五月婷婷激情小说| 亚洲激情视频在线观看| 生活片五区| 婷婷五月色色| 99热这里都是精品| 91久久综合亚洲鲁鲁五月天| 啪啪激情综合| 久久伊人大香蕉| 色哟哟精品| 伊人久久大香蕉网| 婷婷五月电影院| 五月伊人网| 久久婷婷婷| 亚洲啪啪视频| 狠狠搞五月天| 99精品久久| 99热思思在线观看| 天天躁日日躁狠狠躁日日躁2022年5月9日 | 激情五月天视频| 99超碰在线观看| 色欲午夜无码久久久久久张津瑜| 免费播放片大片| 婷婷月综合| 久久色婷婷| 亚洲AV网站| 久久久人妻久久久| 欧美成人AAA片一区国产精品| 99 这里只有精品| 九九丁香社区欧美激情| 26uuu精品一区二区| 五月婷婷,狠狠操| 99日本黄站| 丁香五月天AV在线| 无码AV免费精品一区二区三区| 五月丁香婷婷六月天| 99精品综合| 偷拍五月丁香| 性爱AV天堂| 中文字幕人妻熟女在线| WWW,五月| 大香蕉人妻| 丰满老熟妇BBBBB搡BBB| 激情深爱五月| 丁香婷婷网| 免费视频WWW在线观看网站| SS丁香五月婷婷| 9久久网| 91丨九色丨国产打屁股| A A色色| 超碰97免费在线| A久久| 五月天婷婷永久免费视频| 婷婷丁香色性爱| 夜夜爽天天干| 激情五月色在线播放| 久久久久亚洲AV成人无码电影| 丁香婷婷激情| 爱草人视频| 伍月婷婷免费视频| 五月丁香婷婷啪啪综合| 五月天成人综合| 综合伊人狠狠| 五月花综合网| 人人插9| 专区无日本视频高清8| 色五月婷婷五月天激情综合| 久久99这里只有精品| 亚洲啪| 丁香六月综合| 色五月亚洲| 五月丁香六月婷精品视频| 久久嘟嘟丁香| 婷婷中合| 天天操婷婷| 99精品小视频| 91啪级电影| 超碰99久久| 99热最新国内| 国产乱子轮XXX农村| 亚洲人成色A777777在线观看| 内射激情在线| 婷婷精品| 熟女网站久久| 丁香伊人五月色婷婷五十路| 99噜噜噜在线播放| 九九热精品视频在线观看| 狠狠色综合精品视频在线| 99久久这里只有精品免费官网| 啪啪色区| ww超碰在线| 无码少妇高潮喷水A片免费| www.五月婷婷久久.com| 99热这里只有精品青草| 。久久久久久久久久久久久久人妻 | 欧美性丁香色色五月天综合爱爱| 99热婷婷| 大香蕉久| 成人AV在线电影| 亚洲无码你懂的| 99在线视频观看| 欧美激情性做爰免费视频| 九九色综合| 91色噜噜狠狠狠狠色综合| 五月天五月天成人网亭亭成人色网站| 天天噪夜夜爽| 五月激情综合五月| 五月丁香综合久久| 日日操,日日爽| 熟女重口味αV| 伊人网欧美在线男人天堂五月丁香| 密乳Va| 超碰9在| 亚洲有码在线视频| 日韩黄色电影| 五月丁香婷婷色色色| 色一情一乱一乱91Av| 大香蕉九九操| 激情五月天啪啪| 色吧婷婷| 色综合久久888| 亚洲永久四色| 蜜桃婷婷五月| 五月婷婷网久久| 五月婷婷亚洲综合网| 天天色综合色| 五月婷婷丁香五月婷婷| 五月色丁香视频精品| 狠狠狠狠狠狠狠狠| 婷婷久月| 丁香色综合| 九九色色网| 婷婷五月激情丁香| 激情内射人妻1区2区3区| 99精品偷自拍| 天堂网色婷婷| 五月色色色| 天天肏屄夜夜爽| 婷婷AV丁香| 五月婷在线色视频| 色屌丝中文字幕| yellow视频在线观看91| 五月丁香六月| 成人国产网| 九月婷婷综合网| 日韩亚洲视频| 五月婷婷在线网站| 久久婷婷五月天蜜桃| 久re热视频| 丁香五月激情网| 密着浓厚中出乚交尾GvG935| 丁香激情五月少妇| 日本va欧美va欧美va精品| 狠狠擼综合| 五月激激激情综合网| 亚洲性爱电影| 四川女人毛多水多A片| 五月丁香日逼| 亚洲精品色色| 六月丁香VA| 综合激情五月丁香| aaa久久久| 免费黄色AV| 婷婷色五月天第7色| 另类综合婷婷五月天欧美视频| 外国碰视频网站97| 国产又色又爽又黄又免费| 久热re在线视频| 六月婷婷五月丁香首页| 天天五月天综合网址| www.日日夜夜.com| 天综合日日夜综合7799| 蜘蛛女免费观看完整版高清电影| 五月色影院| 可以看的av| 日本久久人| 亚洲看av的网站| 婷婷黄色| 久久久九九九 99| 五月天快乐开心激情网| 五月天婷婷AV| 超碰99热精品在线| 狠狠看狠狠| 亚洲色婷婷| 草草夜夜操| 综合色色婷婷| 色色a| 色爆五月| 开心五月激情| 成人AV在线电影| 丁香五月ⅤA久久久| 97深爱伊人综合| 天天干夜夜想| 久久电影4399| 夜夜夜夜撸夜夜操| 亚洲午夜在线视频| 色欲婷婷夜夜| 九九热只有精品| www.婷婷,com| 日日撸夜夜操| 婷婷综合干| 九九免费在线视频| 99这里只有精品| av九九| 丁香五月区| 97在线日本| 欧美成人五月天| 91九色最新视频| 久久99热这里只有精品23| AV在线资源| 人妻视频在线| 五月天淫乱视频| 色五月色情| 丁香五月综合网亚洲综合欧美狠狠| 99综合网| 婷婷美女精品视频| 天天爽天天爽| www.狠狠操.co m| 思思热视频| 色婷婷成人| 色婷婷影视| 丁香五月婷婷啪啪| 亚洲av骚货| 六月色色| 五月丁香六月激情| 色欲婷婷夜夜| 婷婷五月花| 婷婷丁香水多多视频| 日本片日本片祼观看网站在线看中文版网页在线看 | 婷婷丁香亚洲色综合91| 五月丁香花视频| 人人干99| 五月天色色色| 69精品人人人人| 免费精品66| 天天揷综合网| 99热免| 婷婷五月天午夜激情影院| 99热这里只有精品在线| 天堂在线9| 亚洲九九夜夜| 激情99。| 色九九九综合| 看全色黄大色大片| 天天肏视频| 大香蕉综合网| 1010日日无码| 婷婷色片| 99热官网| 亚洲一区二区无码蜜乳av| 久久99激情五月天| 色噜噜五月天| 99色在线视频观看| 婷婷97色| 天天肏高清在线| 色噜噜狠狠色综| 97干干干丁香| 性色欲情 网站| 婷婷五月天小说| 啪啪啪大香蕉| av国产精品偷| 人妻久久久久久久 | 波多婷婷久久| 婷婷射综合| www.精品99| www.91AV.com| 啪啪啪综合网| 伊人狠狠干| 激情综合国产| 日产精品一线二线三线芒果| 婷婷五月天播播| site:pzdcoin.com| 日韩国产AV播放| 婷婷亚洲综合| 开心五月深爱五月婷| 五月天婷婷狠狠| 激情五月天丁香| 亚洲色五月婷婷| 久婷婷五月激情| 丁香五月九九| 免费视频无码| 人人草人人舔| 91啪级电影| 91丨九色丨丰满人妖| 欧美成人一区二区三区在线视频| 亚洲婷婷欧美婷婷| 久久综合伊人综合在线| 亚洲六月色婷婷| 五月天婷婷青青草| 五月天综合色| 婷婷欧美| 色天天综合成人网| 这里只有精品偷拍| 六月婷色| 久久久日韩特色特黄AAAA| 欧美人妻一区二区| 亚洲视频色婷婷| 五月丁六月香av| 婷婷五月丁香综合| 九九久久精品國產| 怎么样可以看免费的一级av| 丁香五月婷婷影院| 欧美性色视频| 国产精品久久7777777精品无码| 色婷婷久久| 少妇婷婷五月天| 99热最新国内| 内射人妻视频国内| 色99视频| 另类视频综合| 99视频网址| 激情五月色在线播放| 色综合天天网| 婷婷五月天最新综合你懂的 | 激情综合文学| 国产精产国品一二三在观看 | 欧美成人AAA片一区国产精品| av九九| 色婷婷久久| 在线1青婷| 五月丁香六月婷婷手机无线| 亚洲第一色网站| 亚洲激情四射| 色欲色天天香综合| 91精品91久久久中77777久久玖玖九九 | 人人操Av| 无码一区二区日韩| 金桔一区二区ab地址| 97干网站| 国产在线中文字幕| 九色自拍| 日本综合久久| 碰碰91| 二色AV| av九九| 婷婷五月丁香基地在线视频官网| 91婷婷在线| 六月激情婷婷| 五月婷婷色色| 99婷婷五月天| 99热这只有| 色五月婷婷、老熟女| 五月丁香怕怕综合| 五月色情婷婷开心五月色情| 色婷婷五月天激情久久| 日韩欧美四五区| 九九这里精品| 色婷婷五月天在线| 亚洲综合激情五月| 天天色天天操天天射| 五月丁香综合激情| 色色色婷婷五月天| 国产精品色色| 中文字幕按摩做爰| 丁香婷婷成年| AV免费在线网站| 1024操逼视频| 天天狠狠婷婷在线| 五月丁香啪啪啪啪| 欧美日韩aaaa| 可以看的av| 丁香五月天堂| 国产人妻人伦精品一区二区| 五月婷婷电影院| 久久天堂色| 九色自拍| 久久奄也去色色网站| 五月天激日本色情在线| 在线成人视频免费| 五月丁香影院| 99热这里只有精品在线观看| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | www.五月丁香| 好好干Av| 思思精品久久艹 | 激情婷婷护士激情| 国产精品视频| 婷婷五月天无码视频| 色丁香五月婷婷在线| 亚洲人成色A777777在线观看| 九九人人操| 婷婷99狠狠躁天天久久久九九九| www.色色com| 婷婷丁香色五月亚洲| 五月婷婷无码专区| 欧美啪啪9| 免费看欧美成人A片无码| 另类图片五月天激情| 外国碰视频网站97| 狠狠狠狠狠狠狠狠草| 亚洲婷婷欧美婷婷| 99热这里只有精品99| 狠狠色九月| 26uuu四色| 激情五月五月婷婷| 这里只有精品视频| 五月丁香在线观看99| 69五月天视频| 日本一级| 五月天丁香久久综合| 91人人操.COM| 99热日韩| 午夜色婷婷| 亚洲Av成人在线观看| 色99亚洲| 婷婷精品在线| 久久天堂女人| 婷婷六月婷婷| 天堂在线9| 日韩日比视频在线| 五月丁香婷婷福利| 精品99在线| 国产精品成人网址| 开心久久五月天| 91久久色| 99热亚州综合| 五月丁香六月婷婷不卡免费无码| 日韩在线9| 婷婷丁香婷婷97| 丁香八月综合激情| 色综合色五月| 99五月婷| 天天日天天干天天天| 大战熟女丰满人妻AV| 精品婷婷| 综合久久高清| 91性人人| 国产精品五月天婷婷| 人妻AV中文系列| 天天艹天天综合网| 9999三级片| 精品九九网| 六月丁AV| 99se丁香| 九九久久综合网站| 久久在线视频免费观看| 婷婷激情中文综合| 欧美影院婷婷| www.五月天色色.com| 婷婷五月丁香综合激情| 亚洲岛国电影| 严洲天天插| 欧美叉叉叉BBB网站| 人人玩人人橾| 深爱五月激情| AV九九| 噜噜干日本| 久久 婷婷 五月天| 亚洲午夜视频| 色欲天天综合| 九九久久精品| 五月天狠狠网站| 亭亭玉月丁香| 九九热只有这里精品| 天天综合网在线| 九九色中文| 久热这里| 激情影院内射| 欧美电影在线播放| 热99久久这里只有精品| 黑人巨粗进入警花疼哭A片| 深爱网深爱综合网| 草草女人亚洲| 337午夜福利| 97婷婷丁香五月综合| 色婷婷亚洲五月天| 99九九视频| 亚洲永久免费| 爱性综合网| 北京熟妇搡BBBB搡BBBB| 天天激情夜夜干| 五月天婷婷色播综合在线| 日韩十国产极品久久| 亚洲欧美国产A片免费观看| 五月六月伦理| 久久婷狠狠色| 看片视频在线免费日产在线看| 婷婷四月 成人 狠狠干| 97在线观看| 丁香五月婷婷六月| 丁香色成人| 色色99| 天天日夜夜爽。| 91在线日本| jiZZdr| 亚洲婷婷丁香五月亚洲| 九月停停| 五月久久婷婷丁香| 五月婷婷伦理| Av中文在线| 五月停停色色丁香| 激情综合网五月天天| 依人大香蕉在钱1| 亚洲一区二区无遮挡A片| 26uuu青青| 在线视频婷婷| 久久hd| 婷婷五月激情六月丁香| 丁香五月婷婷五月基地| 欧美三级欧美一级| 五月婷无码| 色综合久网| 婷婷久热| xx人人xx| 五月婷婷高清| 色婷婷影视99| 99热婷婷| 桔色成人在线| 激情五月天在线观看婷婷| 第九色区AV在线| 婷婷操逼| 91精品综合久久久久久五月丁香| 日韩黄黄| 精品九九久久| 国产精品色| 天天狠狠夜夜狠狠2023| 久久五月六月| 婷婷刺激综合| 午夜不卡久久精品无码免费| 狼友超碰| 99惹精品视频| 色亚洲无码| 婷婷五月天性爱视频| 婷婷伊人綜合中文字幕| 五月欧美丁香在线观看| 色播五月丁香婷婷| 五月天婷婷綜合院| yjzz亚洲国产| 亭亭玉月丁香| 丁香五月AV| 九九机热| 99视频久久免费视频| 中文字幕激情综合| 性爱激情五月| 国产成人综合网| 人人97碰| 婷婷婷婷色| 婷婷激情鹿城五月天| 婷婷六月啪啪| 亚洲成片在线观看| 婷婷综合仓库中文| 91丨九色丨东北熟女| 五月天久久网站| 五月天激情视频网站| 伊人青草成人| 操99| 99碰网站| 97碰成超视频免费视频| 99日热在线视频| 亚洲欧洲中文日韩久久AV乱码| 丁香婷婷五月综合色情| 激情五月天视频| 婷婷激情五月天小说校园| 狠狠搞综合色| 五月丁香综合网色欲| 五月激情综合网| 婷婷五月色综合| 欧美激情久| 丁香九色不卡aaa| 1024AV视频| 婷婷丁香熟女| 亚洲成人AV高清字幕| 六月丁香五月婷婷| 免费黄色片子| 99热国产免费| 五月天色不卡| 玖玖婷婷五月天| 婷婷伊人网| 成人五月天丁香| 欧美三日本三级少妇三99| 五月激情影院| 婷婷五月天综合网| 亚洲色五月婷婷| 国产激情婷婷| 久草热在线视频| 天天日综合| 丁香五月天综合| 26uuu亚洲| 九九无码| 超碰在线观看9| 激情五月天啪啪| 99在线精品视频| 九色91视频| 五月丁香婷婷中文| 婷婷激情五月| 狠狠色综合网| 欧美性猛交AAAA片黑人 | 亚洲无AV在线中文字幕| 欧美日韩欧美| 亚洲狠狠丁香婷婷香蕉| 五月天另类小说久久小说网| 碰久久精品w| 久久一级片| 色色色婷婷五月| 色播五月婷婷| 激情婷婷内射| 99久久成人| 深情五月天| 欧美超级视频97| 99在线观看| 国产精品18久久久| 五月精品99综合| 99热www| 区美毛片子| 天天天天天天天干| 操日本人妻视频| 五月婷婷婷婷网| 色综合久久88色综合天天99| 五月天综合色| 亚洲宗合激情| 久久超级碰视频| 性爱综合网| 国产精品色一哟哟| 婷婷五月天伊人| 欧美25p| 丁香五月花影院| 中文字幕网站在线观看| 丁香婷婷六月激情文学| 五月婷婷深爱六月| 日日爽夜夜爽| 久久婷婷五月天| 精品九九久久| 91在线日| 婷婷深爱五月亚洲综合| 狠狠插狠狠插| 99热免费| 婷婷五月激情小说| 超碰免费人妻| 久久婷婷五月丁香| 123草逼网| 另类少妇人与禽zOZZ0性伦| 超碰激情五月| 天堂AV三级| 婷婷天天色| 色婷婷影院| 五月婷婷六月丁香首页| 日本a片网址| 5月婷婷6月六月丁香| 99操逼| 五月婷婷黄| 婷婷色五月亚洲| 九九亚洲| 国产五月视频| 久久久91| 婷婷久久亚洲| 120分钟婬片免费看| 伊人综合婷婷| 久久婷婷色丁香| 日本一道久久| 欧美成综合在线观看| 天天日日人| 激情综合色婷婷啪啪六月天| 九九热青草| 婷婷丁香在线| 久久久这里有精品| 另类小说五月天| 夜夜躁爽日日| 超碰中文字幕在线| 开心久久爱五月天| 第四色激情网| www.色色com| 五月丁香伊人网| 99综合视频| 香焦网五月天| 亚洲欧美国产高清vA在线播放| 久久五月综合| 丁香九月久久| 精品人妻一区二区三区四区不卡在| 99∨VTV| 99久久网站| 丁香综合婷婷五月天| 国产毛片操B| 六月婷婷俺也去| 亚洲综合色婷婷| 色色色色色五月| 色婷婷狠狠干芒果TV| 亚洲电影在线观看| 狠狠操.com| 噜噜五月天综合| 婷婷在线综合| 婷婷爱五月| 伊人热婷婷| 女人天堂 AV| 久777| 久热这里精品免费| 大学生高潮无套内谢视频| 激情六| 丁香六月婷婷色XXXXX| 伊人久久大香网| 色综合久久88色综合天天看| 18久久| 99热这里只有精品免费| 日本久碰| 天天插AV丝袜中| 亚洲成AV人片在线观看| 五月婷婷婷婷婷婷艺术| 国产精产国品一二三在观看| 天天爱天天做天天舔| 久久婷婷五月天| 婷婷六月婷婷| 人妻体体内射精一区二区| 日日色五月天| 欧美精品中文字幕亚洲专区| 色月视频| 欧美性猛交99久久久久99按摩| 九九热这里有精品23| 国产婷婷色综合AV蜜臀AV| 5月婷婷6月丁香aV| 日本人人超碰| 五月网在线| 日韩美女羞羞网站在线观看| 日本九九视频| 成人精品在线|