99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
丁香六月av| 色噜噜,噜噜色| 综合激情五月天| 日日干五月天婷婷| 五月五月婷婷| 国产熟妇的荡欲午夜视频| 丁香五月天在线直播观看| 丁香五月婷婷av影院| 天天干电影| 99色色爰| 九九色天堂| 激情色色色| 五月丁香六月色情网欧美| 日日操,夜夜爽| av在线播放网站| 色婷婷色婷婷五月| 六月色婷婷欧美| 狠狠爱夜夜| 午夜大香蕉| 久久久久er热| 欧美天天干天天草| 思思热性操| 六月丁香狠狠爱| 久久久GOGO无码啪啪艺术 | 四色五月婷婷| 一起草无码| 五月人妻婷婷| 天天噜天天爱| 日日日日做夜夜夜夜无码| 亚洲无码九九九| 欧美经典片免费观看大全| 丁香六月激情国产| 大香蕉久久伊人网| 国产成人精品一区二区三区视频 | 久久色情| 亚洲综合久| 天天舔日日肏夜夜爽| 激情五月天色色网| 婷婷色在线| 月丁香久久久| 激情国产综合| 26uuu丁香婷婷五月| 色五月,com| 天天狠狠夜夜狠狠2023| 99在线精品观看99| 婷婷久久综合| 欧美三级巜人妻互换| 九九黄色网| 九九热这里只有精品6| 99er在线观看| 蜜乳中文字| 天堂无码人妻精品AV一区| 五月婷婷综合在线视频小说| 五月久视频| WWW,婷婷,COM| 月婷婷婷婷五月| 久久色五月天综合网| 天天日夜夜高潮| 婷婷五月综合色中文字幕| 99九九玖玖| 超碰99热在线观看| 91精产品自偷自偷综合| 九九色逼| 婷婷色网| 五月婷婷五月天天| 久久婷婷激情视频| 丁香六月婷婷久久综合| 色噜噜狠狠色综合日日| 丁香婷婷啪啪| 婷婷丁香色女人| 九九热123| 日韩精品无码99| 色婷婷国色天香综合| 激情五月天黄色小说| 亚洲中文字幕av| 96精品久久久久久久久| 一个色的综合| 99re视频精品| 丁香五月综合婷婷| AA片在线观看视频在线播放| www久久久久久久久久久久久久久久久| www.婷婷五月| 久久婷青青草原| 久久久天堂国产精品女人| 99网| 久久精品99久久久久久久久| 色色操| 开心丁五月| 久久丝丝热| 五月丁香六月婷婷,婷| 思思99精品视频在线观看| 五月丁香色婷婷伊人| 五月丁香成人网| 欧洲色区| 丁香五月婷婷国产在线| 日韩一级片| 六月婷婷之青青草| 九九热视频这里只有精品| 九九热在线精品视频| 91丨九色丨高潮丰满日本| 99日韩| 久久视频在线视频| 婷婷激情人妻| 色六月天| 五月天激情国产综合婷婷婷| 九热av| 亚洲婷婷基地| 五月丁香久久丝袜啪啪| 久久久性爱视频| 色欧美一级| 99人人干人人操| 日韩狠狠色| 国产精品美女久久久久AV超清| 99色在线观看视频者| 丁香婷婷午夜| 色五月婷婷天天操夜夜操| 停婷丁五月在线| 五月激情影视| 五月色色网| 五月天色五月天| AV色婷婷| 人人操人人看97干| 2023天天日夜夜爽| 丁香五月婷婷影视先锋| 深爱丁香网| 五月激情久久综合网| 九九99九九99偷拍视频免费看| 亚洲成av人影院| 国产精品色婷婷久久久精品| 五月天六月婷婷| 久久久激情| 久热爱大香蕉在线蜜臀悦色| 丁香婷婷十月| 超碰人人摸AV| 天天干天天射综合网| 91美女被操| yw国产AV| 天天色天天噜| 真实的国产乱XXXX在线91| 超碰在线人妻| www.com.色色| 九九热视| 六月丁香激情| 五月婷婷综合丁香视频| 人人操91色| 99热无码精品| 99热啪啪| 亚洲婷婷开心五月| www.狠狠操| 殴美激情综合网| 亚洲99热| 亚洲第二AV| 五月激情网五月综合网| 激情欧美五月丁香| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 色五月在线播放| 色综合偷拍| 狠狠狠狠狠草| 五月婷久久综合| 亚洲精品五月| 91综合网| 久久婷网| 天天噜日日噜综合无码| 99精品在线| 99黄色在线视频精品熟女| 国产精品香蕉| 色色色地址| 丁香六月婷婷| 国产毛片精品一区二区色欲黄A片| 丁香婷婷五月份| 人人澡天天色天天做| 五月综合色| 亚洲av免费在线| 天天爽天天爽| 婷婷色婷婷亚洲成人| 亚洲区视频| XX久久| 五月天社区| 丁香 亚洲 久久| 超碰国产AV| 久热天堂| 乱码操操| 综合激情网| 激情操逼婷婷| 色五月婷婷小说亚洲中文字幕组| 大香蕉99热| 日本超碰在线| 五月婷婷成人网首页| 五月丁香大香蕉| 色五月av伊人| 激情五月天婷婷| 五月婷婷婷综合网| 亚洲激情av| 91精品综合久久久久久五月丁香| 日本精品人妻无码77777| 色婷五月天亚洲| 五月丁香综合色婷婷| www.五月天社区| 一级无码作爱片| 91综合色| 日本激情五月| 91一起操| 色综啪啪啪啪啪啪| www久| 婷婷五月天伊人在线| 久久综合久色欧美综合狠狠| 亚洲成人中心| 天天干天天操天天干天天操天天干天天操 | 99热www.| 久久五月婷婷视频| 国产精品人成A片一区二区| 五月天激情Av| 爱射综合| 天天综合91入口| 婷婷性爱网| 888精品福利地址| 国产性爱大片久久| 色色色五月婷婷| 人人草人人爱手机视频看看| 激情五月天噢美| 五月天综合在线网| 婷婷五月天基地| 都市激情蜜桃婷婷五月天| 67久久| 丁香五月91| 久久精品小视频| 婷婷终合色图| 97亚洲精品| 综合激情站| 国内熟女黄色系列| 激情小说五月天| 婷婷六月天激情| 色之综合网| 超碰京东热av男人的天堂| 五月天另类激情在线| 丁香五月区| 五月伊人网| 欧美日韩婷婷五月天| 99热自拍| 9久精品视频| 九九机热| 婷婷色日本| 激情婷婷五月天| 中文字幕性爱视频| 久久一伦| 日本一级大片| 九月丁香八月婷婷久久综合久97| 久热爱大香蕉在线蜜臀悦色| 天天干天天干天天干天天干天天干| 丁香六月婷婷综情欧美| 国产成人网站在线观看| 五月丁香婷婷基地| 久久98| 四色五月视频| 婷婷五月天午夜激情影院| 国产真实乱对白精彩| 五月丁香婷婷综合网| 婷婷五月婷| 激情亚洲色图片丁香综合| 国产avapp 网| 免费婷婷| 中文字幕婷婷| 婷婷伊人网| 婷婷激情视频| 97色色婷婷五月天| 99热在线精品观看| 久久九九精彩| 91碰| 疯狂做受XXXX高潮A片动画| 天天干天天色综合| 99这里有精品| 久久大大香| 无人区码一码二码三码医生系列| 五月婷婷电影院| 国产日产亚系列精品版优势| 91干婷婷| AV在线收看| 人操91在线| 老美AA片| 久艹久| 日本欧美999久久久三级片| 国产成人综合亚洲| 欧美成人日韩| 国产韩日亚洲美州欧亚综合在线| 久久亚洲色导航| 99久久黄色顶级视频| a色色片| 玖玖资源部在线播放| 亚洲精品白浆高清久久久久久| 九月婷婷综合| 天天色五月婷婷91久久久久久久| 五月婷婷六月天| 夜夜夜天天操| 高清无码一区二区三区四区| 天天五月天综合网址| 日日噜噜夜夜狠狠久久丁香六月| 色爱综合网| 高清无码入口| 最新婷婷五月丁香| 欧美精产国品一二三区| 婷婷五月天日日日干干干| 国产,欧美,日韩,性爱| 色婷婷丁香五月天在线观看| 六月婷婷中文字幕| 欧美黄色一级| 五月丁香婷婷色色| 六月亭亭久久综合激情| 成人版视频在线观看| 色偷偷色婷婷| 99热99这里有免费的精品| WWW.开心五月天.COM| 蜜桃五月天| 五月丁香婷婷婷激情爱爱| 99热99在线| 97色婷婷| 在线99精品| 久久五月丁香婷婷| 五月丁香六月婷婷网站| 久色资源| 99热69| 狠狠操之狠狠操| 五月深爱网| 久99在线视频| 色六月 婷婷| 97婷婷丁香| 插少妇综合网| av大香蕉| 色综合色色色色| 婷婷五月综合婷婷| 九九青草热| 99国产精品白浆在线观看免费| 影音先锋一区二区资源站| 九色婷婷| 2020日日干| 成人美女网| 综激情网| 亚洲最大视频| 日本视频久久| 久热只有这里有精品| 五月丁香婷婷六月| 青青草原亚洲久| 婷婷色婷婷亚洲成人| 五月丁香基地| 七月丁香婷婷 色色| 五月丁香色色网| se99视频| 中文超碰视在线| site:picc-up.com| 丁香五月欧美| 亚洲第一黄网| 情色五月天网站| 五月婷久久综合| 五月亭亭六月激情| 99热思思| 月月AV| 激情伊人| 五月天综合久久| 婷婷五月天综合久久| 嫩草AV久久伊人妇女超级A| 91精品无码久久久久久五月天| 九九精品在线网| 粉嫩AV久久一区二区三区| 日本久久婷婷| www.99婷婷| 伊人玖玖综合| 色色色在线观看| 七七久久综合| 天天精品视频免费观看| 亚洲9久久精品| 五月丁香六月停停| 日韩AC在线免费观看| 能看的av片| www久久99| 五月总合激情网| 99热这里有精力| 狠狠综合| 蜜桃成语时李时珍 免费| 婷婷五月天av网| 伊人激情综合网| 视频一二区| 99精品在线观看| AV免费在线网站| 天天情色综合网| 日本色99网站| 久热免费| 超碰人人射| 五月丁香影院| 色婷婷最爱五月| 激情五月婷婷| 欧美黄色AA片哗啦啦啦| 色你久久| 婷婷色在线| 五月婷高清视频| 五月丁香六月片| 五月丁香激情六月| 97婷婷在线| 99色| 色婷婷激情小说网| 国产伊人大香蕉| 人人97碰| 婷婷六月网| 97碰碰草| 久久婷婷色色| 激情五月天无码| 色色五月天 亚洲| 成人丁香五月| 成人网站在线观看视频| 日韩黄色影院| 五月 成人 婷婷| 思思久久99热| 丁香五月婷婷高清| 天天干天天干天天| 婷婷五月激情视频在线| 狠狠色综合网| 午夜69成人做爰视频| 欧美成人A片AAA片在线播放| 色狠狠五月天| 99riAV成人在线视频| 婷婷亚洲综合| 春色激情第四色| 另类图片五月天激情| 色哟哟精品| 婷婷六月丁香久| 97热超碰| www超碰| 亚洲麻豆乱码国产2028| 婷婷五月色情天| 五月天开心色色网| 亚洲色在线观看| 人人人操97| 五月婷婷啪啪网| 亚洲精品又粗又大又爽A片| www,天天干| www.99热日韩.com| 超碰国产在线观看| 日韩AC在线免费观看| 五月色婷婷中文字幕| 婷婷五月天,影院| 天堂爱啪啪| 久久人妻超碰一区| www久久久| 激情亭亭五月| 六月丁香六月婷婷欧美| 久久性爱网站| 激情五月丁香五月| 六月丁香六月婷婷欧美| 99碰碰碰| 性爱激情五月| 天天射影院| 九九碰九九爱97超| 久草狼人| www.婷婷六月天| 99色丁香婷婷综合网| 五月色婷婷影院| 婷婷五月色花丁香社区| 五月丁香婷婷伊人日韩| 成人国产欧美大片一区| 婷婷五月天综合网| 五月色网| 99热99色| 丁香五月精品视频| 91超级碰碰| 日韩有码一区| 91九色无码内射| 婷婷色色欧美综合网| www久| 狠狠干无码| 久久婷婷五月综合啪| 可以观看的AV| 伊人五月天在线| 开心五月深爱激情| 丁香五月婷婷俺也要去| 亚洲色婷婷视频| 99热这里只是精品| A色色| hd五月婷婷在线| 日日操夜夜爽白洁| 久久无码激情视频| 亚州激情在线视频| 五月丁香婷婷综合激情基地| 六月婷婷日| 婷婷开心激情综合五月天| 五月婷丁香在线视频在线| 久久视频这里都是精品| 天天干天天干天天干天天干天天干天天| 婷婷五月天丁香| 丁香色婷婷| 热久久91| 激情欧美婷五月| 丁香五月婷婷色五月| 丁香伊人激情| 精品,99| 五月丁香 啪啪啪| 米奇影视资源婷婷狠狠色激情欧美五月丁香 | 婷婷五月天堂| 婷婷九月亚洲| 久久人人妻| 91狠狠综合久久| 国产全是老熟女太爽了| 超碰无码老师| 日本久久婷婷| 久久国产性爱A V| 色五月婷色彩免播放器| 欧美成人网婷婷综合在线| 国内精品免费一区二区2009| 综合婷婷久久| 爱操人妻| 99ER热精品视频| 怎么样可以看免费的一级av| 婷婷色五月天色| 91丨九色丨熟女|老版| 成人欧美日韩| 国产XXXX搡XXXXX搡麻豆| 欧美日韩婷婷五月天| 久久区区一二三av| www。狠狠干。com| 天天干夜夜想| 开心激情站| 婷婷五月花.97| 久久天堂婷婷五月| 婷婷精品视频| 综合激情深爱| 任你草| 色欧美色色色| 伊人久久大香网| 日本精品。999| 五月婷婷免费在线视频| 亚洲综合在线视频| 大香蕉婷婷丁香| 日本在线免费中文com.| 任你爽精品免费视频6| 五月综合视频| 激情99热| 婷婷丁香五月六月激情| 超碰chaompinm| 91丁香综合| 98永久精品| 天天插天天草人人玩| 五月天六月色| 五月丁香六月激情| 九九蜜臀精品| 天天日天天爽夜夜爽| 六月丁香啪啪啪| 国产综合丁香五月天| 夜夜躁狠狠 | 激情久久久久久久久| 五月丁香视频在线观看| 97人人操人人爽| 国产探花一片区| 五月视频日本免费观看| 99热免费精品| 色色色五月天激情资源| 日日射天天射| 嫩草AV久久伊人妇女超级A| 日本丁香久在线| 五月婷婷欲色| 嫩BBB搡BBBB榛BBBB| 4399亚洲视频| 综合网亚洲| 日韩av变天就操逼不卡区| 香蕉久久国产AV一区二区| 日本成人小说婷婷六月| 欧美成人AAA片一区国产精品| 久久9精品| 天天爱天天吃狠天天透| 综合另类激情| 丁香五月婷婷骚视屏| 婷婷丁香成人| 嫩草AV久久伊人妇女超级A| 色综合五月天| 9久久久| 99爱视频在线播放| 五月天婷婷Av| 日屌日日操日日色| 亚洲天堂制| 国产色丁香| 激情五月综合| 色色综合成人网| 超碰在线人人| 中文字幕永久免费| 美女五月天| 色综合久久888| 色激情综合| 人妻综合网| 成人午夜无码视频| 日本熟女视频一区二区| 欧美精品999| 狠狠操狠狠操| 99er国产| 激情98色婷婷五| 婷婷激情啪啪| 综久久久| 久久人人九| 99九九热视频免费| www.99久久久| 五月天婷婷六月激情网| 国产做爰视频免费播放| 欧洲第一久色| 97热在线精品| 日本色五月| 六月丁香五月激情亚洲AV| 婷婷久久综合久| 婷婷五月天影视网址| 97久久久久久久久久久| 思思re99视频在线观看| 久久与婷婷| 天天色色天天| 99热精品综合| 怡红院91a√| 九色PORNY自拍成人精彩视频| 综合色图区| 五月天色五月| 人妻久久久久久| 丁香 婷婷 激情 综合 五月| 夜夜综合色| www.91.com黄| 人五月天婷婷喷水| 97极品在线| 激情五月深爱五月| 99九九99九九九视频精品| 五月天开心网| 99热这里只有精品98| AV片一区在线观看| WWW,五月| 91啪级电影| 久久亚洲天堂| 六月丁香五月婷婷| 六月激情婷婷| 蜜臀av无码久久久久久久久| 五月深情久久| 亚洲精品视频在线| 桃色五月天| 激情涩涩网| 亚洲在线成人| 777精品久无码人妻蜜桃| 噜噜网免费视频| 六月激情婷婷| 色情五月| www,婷婷,com| 99热精品无码| 精品人妻伦一二三区久久| site:xiongshengzz.com| 色色图五月天| 五月丁香啪啪激情| 亚洲综合视频在线| 国产中文字幕在线视频免费观看 | 日韩1区2区| 色99视| 96精品久久久久久久久| 色啪久 | 一起草无码| 97一区二区| 五月天综合网| 久婷婷| 日韩五月丁香| 九玖欧洲亚洲| 婷婷丁香午夜综合影视| 婷婷五月激情欧美| 青青草99热久久精品国| 91久女| 五月花婷婷| 超碰人人干| 99九九视频| VA婷婷亚洲| 婷婷伊人综合中文字幕| 亚洲人妻电影| 97热超碰| 九一牛视频探花| 欧美性生交XXXXX无码小说| 丁香婷婷五月| 久热这里只精品| 丁香五月婷婷久久久| 久久综合九色综合97婷婷| 99热在这里只有精品| 99热8| 五月丁香六月婷婷国产视频| 天天色激情| 99re这里有精品手机在线| 久久五月天综合视频网站| 欧美色图天堂网| 色婷婷超碰| www.无码com| 六月色婷婷综合影视| 丁香花狠狠婷婷亚洲中文字幕| 性按摩玩人妻HD中文字幕| 任你草| 久久久五月天| 202丰满熟女妇大| 香蕉综合网| wwwss在线观看| 激情综合网激情五月天| 丁香五月天社区| 精品无码久久久久久久久| 色婷婷成人做爰A片免费看网站 | WWW五月婷婷| 五月丁香色婷婷伊人| 亚洲精品乱码久久久久久综合| 丁香激情网| 丁香婷婷基地| 欧美色婷婷| www.五月天| 91人人人人人| 卡视频1区2区| 亚洲AV第二区国产精品| 色综合色综合网| 狠狠操之狠狠操| 97干婷婷五月天| www.亚洲激情| 激情五月丁香六月综合AVXXXX| 99在线免费视频| 五月丁香综合激情| 少妇性BBB搡BBB爽爽爽视頻| 岛国在线观看91| 九九久久污| 亚洲无线视频| 日本婷婷丁香五月| 99热日韩| 中文字幕AV在线播放| 天天操天天干天天日| 亚洲成人影视在线| 天堂网色色| 九九碰九九爱97| 丁香五月狠狠综合欧美| 婷婷五月天天天| 午夜五月天| 婷婷婷婷婷婷婷婷婷婷丁香| 九九人人自拍| 婷婷五月天天| 丁香成人五月天| 欧美va在线| 婷婷丁香五月,狠狠综合| 99色性爰网络| 成人在线日韩| 欧美操逼天堂| 丁香六月婷婷综合麻豆| 欧美成人日韩| 欧美成人AAA片一区国产精品| 99久久九九视频| 任你擦免费视频| ji'qing'luan'ren'lun| 97丁香五月| 97精品人人A片免费看| 色吊丝99| 婷婷激情五月天激情在线| 99热6色| 亚洲五月婷| 7777精品伊人久久久大香线蕉最新版| 99热这里只有精品10| 婷婷五月婷婷| 琪琪色综合网站| 九九色影院| 草逼大片| 777影视理论片大全在线观看| 99噜噜噜| 9这里只有精品| 丁香五月播播| 十区AV| 亚洲五月天婷婷综合| 激情五月婷婷网| 综合超碰熟| 色青青视频| www.99视频| 五月丁香激情综合啪啪| 五月婷婷久久大片| 九九热九九热精品| 91色久| 色婷成人狠干| 日韩十国产极品久久| 任你草| 九九99免费理论| 六月综合婷婷开心伊人| 噢美99| 综合色五月天| 婷婷丁香十月| 国产精品久久..4399| 99久视频| 91jiuseshunv| 深爱五月日韩| 91久久网站| 襙逼网| 性无码专区无码| 热中文字幕| 91色五月| 超碰激情网| 成人电影AV在线观看| 亚洲五月天色色| 夜夜躁爽日| 亚洲综合五月天婷婷| 丁香婷婷人妻综合网| 色人久久| 99热国产这里只有| 五月丁香六月激情| 亚洲色情免费网| 九九久久99| 色欲婷婷夜夜| 麻豆AV一区二区三区| 亚洲九九免费| 国产露脸150部国语对白| 欧美激情 日韩无码 婷婷 五月天| 色婷视频| 久久久人妻久久久| 五月婷婷丁香| 婷婷色香六月综合激情| 99色爱| 人人操人人爱丁香五月| 99精品久| 综合婷婷五月天| 色涩影院六月丁香| 99激情网| 在线国产精品色| 少妇高潮A片无套内谢麻豆传| 操操操操操操婷婷五月天| 香蕉婷婷| 甈你aaaaa| 六月婷婷操逼| 激情六月天婷婷| AV操逼网| 婷婷午夜| 激情五月丁香综合网站| 婷婷五月电影| 99热这里有精品| 激情小说视频图片| 久久色情| 久久综合五月情| 午夜激情综合| 呦呦视频无码播放| 性色婷婷| 国产精品久久久久久妇女6080| 新激情五月天色播| 九九热re99re6在线精品| 五月丁香人妻| 婷婷四色五月| 五月天大香焦| 在线观看的av| 五月天色婷婷小说| 亚洲激情| 99久久这里只有精品| 色了色综合| 久久激情五月网| 五月天激情小说网| 深爱五月最新网址| 婷婷的久久网站| 国产精品色情AAAAA片软件| 婷婷五月激情欧美大胆视频| 久久五月情| 丁香五月婷婷五月| 99re鈥哸鈥唙| 五月天激日本色情在线| 欧美三级大片AA在线看| 国产无套精品一区二区| 亚洲六月婷| 六月婷久久| αv中文字幕在线观| 玖玖五月| 色五月天视频| 99久久综合| 99精品手机在线视频| 日本三级中国三级99人妇网站| 亚洲性爱日韩无码| 日本69日人视频| 婷婷五月精品| 精品久久99| 五月丁香啪啪啪| 这里只有精品在线播放| 99精品热视频| 9久热在线精品| 疯狂做受XXXX高潮A片| 欧美 日韩 成人| 伊人狠狠操| 79亚洲精品少妇| 99热在线精品播放| 激情av网| 欧美日韩成人h| 丁香五月偷拍| 九九精品综合| 色噜噜狠狠狠综合曰曰曰| 丁香五月婷婷五月天在线| 久久久久久久久久91| 色婷婷精| 日逼AV影音先锋男人资源站| 五月天婷婷基地| 色深爱五月| 99热国产这里只有| 狼人狠狠操| 男女激情久久| 夜夜爽77777妓女免费下载| 99人人干| 婷婷五月电影| 夜夜谢天天干| 婷婷五月天国产在线播放| 激情综合网五月激情| 久热网在线视频| 天天搞天天色综合| 开心激情网在线| 亚洲综合色色| 天天日天天摸| 激情无码网| 亚洲婷婷91丁香| 婷婷色九月| 色久天| 99视频在线| 少妇人妻丰满做爰XXX| 开心五月天激情网| 中文幕无线码中文字蜜桃| 亚洲国产精品二二三三区| 天天射影院| 啪啪日热| 超碰中文字幕在线| 一本久道综合99| 99精品久久久久久久婷婷| 日本色色网| 玖玖在线资源视频| 久久久区区一久久久久久| 五月激情婷婷开心| 九九激情| 99热18| 午夜少妇在线观看视频| 狠狠爱深色婷婷综合| 七七久久综合| www.maotanji.com| 天天干,天天舔| 99秘 在线| 丁香狠狠色婷婷久久无码视频| 五月狠狠| 91久久久久久久久18| 久久一级AV| 精品九九网| 日本99视频| 深爱丁香激情| 五月婷婷丁香五月婷婷丁香| 久碰视频| 五月天丁香婷婷网| 操逼巨乳91| 丁香五月婷婷亚洲色图| 色婷婷五月天在线| 五月天久久综合| 国产精品18久久久| 夫妻超碰在线| 青青.com| 五月播播| 另类激情中文| 97久久精品视频| 婷婷综合网站| 欧美久久婷婷| 伊人91| 中文婷婷狠狠| 91日本在线观看| 思思久久96热在精品国产,| 久久天天| 强辱丰满人妻HD中文字幕| av无码电影| 五月婷婷就去色| 色五月丁香婷婷久草| 天天日天天色| 无码yw| 五月婷婷成人w| 伊人五月婷婷| 欧美熟女视频 色婷婷| 色五月91| 免费不卡狠操美女视频网 | 996re热精品视频| 亚洲色精彩| 婷婷成人五月天成人文学| 国产精品VIDEOSSEX久久发布| 懂色av蜜臀av粉嫩av永陈冠希| 久久黄色免费视频| 丁香婷婷色| 九热av| 色综合爱综合| 久操人妻| 午夜日韩久久久网站| 丁香五月六月婷婷自拍| 亚洲AV网站| 欧美激情久| 婷婷五月综合啪| 爱射综合| 色色丁香婷婷| 婷婷六月天| 色综合99色| 国产寻花在线| 丁香六月综合激情| 六月丁香大香蕉| 97热这里只有精品| 99久操视频| 婷婷综合五月天激情| 99婷婷| 久久人人九九| 9热在线观看| 伊人久久大香线蕉亚洲五月天,| 婷婷热婷婷色| 色五月综合网| 久热这里只有国产| 色五月综合激情| 婷婷五月天久久综合88| 五月天另类图片| 婷婷综合中文字幕| 森林影视大全,最好看的2019年视频| 色播五月| www.99视频| 人妻综合网| 九月丁香婷婷综合| 成人婷99最新| 涩综合网| 五月婷婷色影院| 棕合影院色色| 丁香六月激情四射| 玖玖99免费视频| 99操无码视频观看| 成人婷婷| 日本啪啪天堂| 99爱爱| www.五月.com| 五月天无码| 五月婷婷啪啪| 99亚洲综合| 99精品国产在热久久| 激情婷婷亚洲五月| 国产午夜伦鲁鲁| 丁香五月亚洲婷婷| 色九月综合| 天天久| 婷婷丁香五月91| 日韩高清成人| 97人人草| 99爱精品| 五月丁香婷婷中文网| 日韩AC在线免费观看| 六月丁香社区| 激情四射婷婷色色色| 欧美日韩123| 激情五月天婷婷直播| 成功精品影院| 五月丁香久久丝袜啪啪| 久久五月婷综合网| 激情五月综合网| 日本欧美在线| 中文字幕无码人妻少妇免费视频| 伊人婷婷五月 | 五月天色综合| 婷婷伊人綜合中文字幕| 天天摸日日舔狠狠添婷婷婷| 婷婷色狠狠| 九九大香视频| 熟女婷婷网站一婷婷五月一丁香婷婷一婷婷激情网 | 99久久精品视频女神1| 亚洲黄3级片网站欧美| 五月激情视频| 欧洲综合视频在线观看。欧洲,亚洲综合食品在线观看。 | 99在线免费视频| 99热这里在线精品| 日本婷婷激情四射中文字幕在线观看| 久久久久er热| 91超级碰碰| 国产成人综合亚洲| 停婷丁五月在线| 99国产er热视频| 天天肏天天舔AV| AV网站免费在线| 激情合网婷婷| 婷婷色在线视频| 五月婷婷综合网| 天天综合中文| 看黄的网站18禁| 大香蕉视频99| 欧美婷婷五月丁香| 丁香色综合| 成人电影一区| 五月天啪啪网| 欧美色色色色色| 久久这里只有欧美| 色情五月丁香| 久久综合9| 婷婷五月天社区| 思思久久精品| 丁香五月婷婷色综合基地| 婷婷五月综合啪| 精品亚洲国产成AV人片传媒| 久久99精品久久久久久噜噜| 婷婷激情蜜桃玖玖丁香| 97色97干| 亚洲超碰中文字幕| 99色网站| 四色五月婷婷| 五月综合在线婷婷图片| AAA久久久| 色级婷婷| 97在线观视频免费观看| www.91操| 99这里都是精品6| 亚洲五月天伊人| 人妻22p| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 色久女| 五月色色激情网| 六月伊人婷婷| 天天日天天添| 天堂久久婷婷| 婷婷色狠狠| 国产偷人爽久久久久久老妇APP| 翔田千里 50岁 无码| 五月开心激情| 五月丁香黄色| 噜色精品| 日本妈妈乱| 91久久综合亚洲鲁鲁五月天| 日日噜噜久久婷婷五月天| 岛国在线观看91| 色情综合| 97亚洲色 torrent magnet| 丁香玖玖| 丁香六月成人网| 丁香五月婷婷操逼| 成人中文网| 香蕉久久国产AV一区二区| 婷婷导航| 婷婷激情综合网| 色欲五月婷婷| 天天噜| 日日干天天| 亚洲情欲| 国产性爱亚洲是图| 五月婷婷基地| 狠狠狠夜夜夜| 99热这里只有精品在线播放| 99爱免费在线视频| 激情校园 亚洲| 婷婷五月天.com| 激情综合女人网五月播播| 99热在线观看| 91九九| 天天做天天爱天天爽夜夜揉| 1024日韩| 精品九九在线观看视频| 天天射影| 精品无码av丁香五月激情| 激情婷婷丁香五月天小说| 九九色色| 五月激情婷婷图片基地| 深爱激情中文五月天av| 性爱网久久| 26uuu国产色| 综合久色五月| 99热只有国产在线精品| 日日操人人操| 欧美人妻一区二区| 婷婷五月婷婷| 久婷| 开心激情婷婷| 99精彩视频| 五月婷婷久久大片| 丝袜熟女一区二区三区| 丁香五月婷婷激情蜜桃| 精品综合爱| 婷婷激情九月| 六月婷婷六月天天在线免费| 五月婷婷网久久| 久久这里有精品视频| 99热这里有精品| 深爱五月激情综合| 久久五月天网| 性综合网| 伊人五月天在线| 99ER热精品视频| 亚洲成人综合网在线免费观看| 狠狠综合区| 亚洲欧美成人在线| 久久五月婷综合网| 婷婷五月天免费视频| 色色五月天丁香| AA丁香综合激情| 香蕉99网| 色综合色五月| 丁香五月综合福利视频导航| 成人视频婷婷| 婷婷五月综合在线| 亚洲 在线 另类| www热久久yy9| 91狠狠综合久久| 九月婷婷综合色干| 婷婷五月色色| 日本在线免费中文com.| 欧美色色色色色色色| 天堂久久精品| 亚洲乱码日产精品BD| 狠狠综合色网| 国产日批视频免费播放| 久久激情五月网| 高清视频一区| 98国产精品综合一区二区三区| 99热精品网| 色色色色色色色综合| 五月婷婷婷婷| 色情五月综合婷婷| 婷婷久久婷婷色五月| 天天做天天爱天天爽夜夜揉| 天天爽综合网| 精品色色| 婷婷五月丁香A∨| 人妻内射麻豆视频| 99九九热视频| 五月综合激情久久| 婷婷天堂综合| 五月丁香婷婷成人综合网| 99精品色| 青青日韩| 丁香婷停五月激情综合深爱| 超碰色色综合| 中文字幕丰满乱孑伦无码专区| 亚洲成人一区| 色婷婷五月视频| 四虎国产精品永久在线国在线| 欧美色色色色色色| 丁香五月激情性色郤| 五月丁香婷婷六月| 五月丁香人妻| 99惹精品视频| 99这里只有精品| 色激情五月| 天天爽天天草| 北京熟妇搡BBBB搡BBBB| 色情丁香五月婷婷精品| 五月天色婷婷激情| 国产精品激情AV久久久青桔| 国产99久久久| 狠狠摸狠狠摸| 久热re视频在线观看网站| 狠狠五月激情在线| www久久久久久久97| 97超级碰碰碰久久久| 五月丁香少妇A| 人人摸人人| 熟女激情网| 丁香六月综合激情| 色综合中文综合网| 另类小说五月天激情| 九九黄色网| 日韩色色色色色| 国产性爱一级| 啪啪五月综合| 九九热这里只有精品在线观看| 久久精品99国产精品日本| www.激情.com.| 91操人视频| 91操片| 亚洲午夜一区二区| 午夜福利8055| 五月婷精品| 日本97人人| 人妻VideOssS人妻高清| 国产黄色在线观看| 天天天天天操| 国产肥白大熟妇BBBB视频 | 97色婷婷| 99色综合| 婷婷久久五月天| 97色碰| 久久婷婷五月天激情新地址| AV九九| 色五月网址| 丁香六月婷婷| 婷婷五月天改成什么了| 超碰人妻在线| 五月婷婷久久综合| 色www久视频| 日日操天天爽| 激情综合网站|