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

ARTICLE DETAIL

資訊詳情

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

ESP32 動(dòng)態(tài)加載 WebAssembly 應(yīng)用平臺(tái)實(shí)踐

ESP32 動(dòng)態(tài)加載 WebAssembly 應(yīng)用平臺(tái)實(shí)踐 1. 從一個(gè)“不切實(shí)際”的想法說(shuō)起去年冬天我在調(diào)試一塊 ESP32-S3 開(kāi)發(fā)板的時(shí)候腦子里突然冒出一個(gè)念頭手機(jī)能裝 App電腦能裝軟件為什么單片機(jī)不行每次想換個(gè)功能就得重新編譯固件、插上 USB 線(xiàn)、等燒錄進(jìn)度條跑完這套流程我重復(fù)了不下幾百次煩透了。尤其是當(dāng)設(shè)備已經(jīng)裝在殼子里、固定在某個(gè)角落的時(shí)候?yàn)榱烁囊恍羞壿嫲阉鹣聛?lái)重新燒錄那種感覺(jué)就像為了換個(gè)手機(jī)鈴聲而把手機(jī)拆開(kāi)焊一遍芯片。這個(gè)念頭一直在我腦子里轉(zhuǎn)。后來(lái)我了解到WebAssembly這個(gè)東西它最初是為瀏覽器設(shè)計(jì)的能讓 C/C 編譯出來(lái)的代碼在網(wǎng)頁(yè)里以接近原生的速度運(yùn)行。但更關(guān)鍵的是WASM 的運(yùn)行時(shí)可以做得非常小小到能塞進(jìn) ESP32 這種只有幾百 KB RAM 的芯片里。于是我開(kāi)始琢磨能不能在 ESP32 上跑一個(gè) WASM 運(yùn)行時(shí)把每個(gè)“應(yīng)用”編譯成.wasm文件通過(guò)網(wǎng)絡(luò)或者串口傳進(jìn)去讓固件動(dòng)態(tài)加載執(zhí)行這樣一來(lái)固件本身只需要燒錄一次之后所有的功能變更都通過(guò)“安裝應(yīng)用”來(lái)完成。這就是我做這個(gè)小型應(yīng)用平臺(tái)的起點(diǎn)。它不是一個(gè)商業(yè)產(chǎn)品也不是什么成熟框架而是一個(gè)驗(yàn)證性的項(xiàng)目用來(lái)回答一個(gè)很具體的問(wèn)題ESP32 到底能不能像手機(jī)一樣“安裝應(yīng)用”這篇文章我會(huì)把整個(gè)思路、技術(shù)選型、踩過(guò)的坑、實(shí)測(cè)數(shù)據(jù)全部攤開(kāi)來(lái)講適合對(duì) ESP32 有一定基礎(chǔ)、想了解動(dòng)態(tài)加載和 WASM 在嵌入式場(chǎng)景下可行性的朋友。如果你只是想讓 LED 閃一閃那這篇文章可能有點(diǎn)“殺雞用牛刀”但如果你想搞清楚嵌入式系統(tǒng)怎么做到“固件不動(dòng)、功能可換”那接下來(lái)的內(nèi)容應(yīng)該對(duì)你有用。2. 整體設(shè)計(jì)思路與方案選型2.1 為什么不是 OTA 而是“應(yīng)用平臺(tái)”很多人第一反應(yīng)是ESP32 本來(lái)就有 OTA 升級(jí)啊直接遠(yuǎn)程更新固件不就行了沒(méi)錯(cuò)OTA 確實(shí)能解決“不拆機(jī)更新”的問(wèn)題但它解決的是固件整體替換不是功能模塊化加載。OTA 的本質(zhì)是把整個(gè)固件鏡像寫(xiě)到另一個(gè)分區(qū)然后重啟切換每次更新都是全量的而且更新完必須重啟。這意味著你沒(méi)法在運(yùn)行時(shí)動(dòng)態(tài)增加一個(gè)功能也沒(méi)法讓兩個(gè)獨(dú)立開(kāi)發(fā)的功能模塊互不干擾地共存。我想要的“應(yīng)用平臺(tái)”是這樣的固件提供一套基礎(chǔ)能力GPIO 控制、網(wǎng)絡(luò)通信、文件系統(tǒng)、定時(shí)器等應(yīng)用層是一個(gè)個(gè)獨(dú)立的.wasm文件每個(gè)文件實(shí)現(xiàn)一個(gè)具體功能比如“讀溫度傳感器并上報(bào)”“控制繼電器開(kāi)關(guān)”“驅(qū)動(dòng) OLED 顯示”。安裝應(yīng)用就是把.wasm文件傳到設(shè)備上卸載就是刪掉文件運(yùn)行就是讓 WASM 運(yùn)行時(shí)加載并執(zhí)行。整個(gè)過(guò)程不需要重啟不需要重新燒錄固件。這個(gè)思路的核心價(jià)值在于解耦。固件開(kāi)發(fā)者只需要維護(hù)底層能力和 WASM 運(yùn)行時(shí)應(yīng)用開(kāi)發(fā)者只需要寫(xiě)業(yè)務(wù)邏輯然后編譯成 WASM兩邊可以獨(dú)立迭代。對(duì)于需要頻繁調(diào)整邏輯的場(chǎng)景比如工業(yè)現(xiàn)場(chǎng)的參數(shù)調(diào)整、智能家居的功能增減這種模式能省掉大量重復(fù)燒錄的時(shí)間。2.2 為什么選 WebAssembly 而不是 Lua 或 MicroPython嵌入式領(lǐng)域做動(dòng)態(tài)加載常見(jiàn)方案有幾種Lua 腳本、MicroPython、JerryScriptJavaScript、還有 WASM。我逐一評(píng)估過(guò)。Lua 的優(yōu)勢(shì)是運(yùn)行時(shí)極小核心庫(kù)編譯出來(lái)可能就幾十 KB而且解釋執(zhí)行不需要編譯步驟。但 Lua 的性能在計(jì)算密集型任務(wù)上比較吃力而且它的生態(tài)偏向腳本化配置對(duì)于需要調(diào)用底層硬件接口的場(chǎng)景綁定層寫(xiě)起來(lái)比較繁瑣。MicroPython 的生態(tài)很好但運(yùn)行時(shí)體積偏大ESP32 上跑 MicroPython 固件本身就要占掉不少 Flash 和 RAM再在上面跑應(yīng)用層資源會(huì)很緊張。JerryScript 也是類(lèi)似的問(wèn)題JS 引擎的內(nèi)存占用對(duì)于 ESP32 來(lái)說(shuō)還是偏重。WASM 的優(yōu)勢(shì)在于第一它是編譯型字節(jié)碼執(zhí)行效率比解釋型腳本高不少第二它的沙箱模型天然適合做應(yīng)用隔離每個(gè) WASM 模塊只能訪問(wèn)宿主顯式導(dǎo)出的函數(shù)不能隨便碰內(nèi)存第三工具鏈成熟C/C、Rust 都能編譯到 WASM開(kāi)發(fā)者不需要學(xué)新語(yǔ)言。劣勢(shì)是運(yùn)行時(shí)本身需要一定資源而且 WASM 的內(nèi)存模型和嵌入式系統(tǒng)的裸內(nèi)存管理需要做適配。我最終選了 WASM主要原因是性能與隔離性的平衡。實(shí)測(cè)下來(lái)一個(gè)簡(jiǎn)單的 WASM 運(yùn)行時(shí)比如 Wasm3在 ESP32 上占用的 Flash 大約 50-60 KBRAM 峰值在 10 KB 左右這個(gè)開(kāi)銷(xiāo)是可以接受的。而且 Wasm3 是解釋執(zhí)行 WASM 字節(jié)碼不需要 JIT移植起來(lái)相對(duì)簡(jiǎn)單。2.3 系統(tǒng)架構(gòu)分層整個(gè)平臺(tái)分成四層硬件層ESP32-S3 開(kāi)發(fā)板帶 8 MB PSRAM 和 16 MB Flash外設(shè)包括 GPIO、I2C、SPI、UART。固件層基于 ESP-IDF 開(kāi)發(fā)提供硬件抽象接口GPIO 讀寫(xiě)、I2C 傳輸、網(wǎng)絡(luò) socket、文件系統(tǒng)操作以及 WASM 運(yùn)行時(shí)的宿主環(huán)境。運(yùn)行時(shí)層Wasm3 解釋器負(fù)責(zé)加載.wasm文件、解析導(dǎo)入導(dǎo)出、管理線(xiàn)性?xún)?nèi)存、執(zhí)行字節(jié)碼。應(yīng)用層一個(gè)個(gè).wasm文件每個(gè)文件是一個(gè)獨(dú)立應(yīng)用通過(guò)宿主導(dǎo)出的 API 調(diào)用硬件能力。應(yīng)用和固件之間的接口通過(guò) WASM 的導(dǎo)入/導(dǎo)出機(jī)制定義。固件導(dǎo)出一些 C 函數(shù)給 WASM 調(diào)用比如gpio_set_level、i2c_write、delay_msWASM 模塊導(dǎo)出app_init、app_loop、app_deinit三個(gè)函數(shù)運(yùn)行時(shí)在加載后調(diào)用app_init然后在主循環(huán)里反復(fù)調(diào)用app_loop卸載時(shí)調(diào)用app_deinit。這種設(shè)計(jì)的好處是應(yīng)用開(kāi)發(fā)者只需要關(guān)心業(yè)務(wù)邏輯底層硬件操作全部通過(guò)標(biāo)準(zhǔn) API 完成。而且因?yàn)?WASM 的沙箱特性一個(gè)應(yīng)用崩潰不會(huì)直接把整個(gè)系統(tǒng)搞死運(yùn)行時(shí)可以捕獲異常并卸載該應(yīng)用。3. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)3.1 WASM 運(yùn)行時(shí)的移植與裁剪Wasm3 本身是設(shè)計(jì)給資源受限環(huán)境的但默認(rèn)配置還是偏大。移植到 ESP32 需要做幾件事第一關(guān)閉不必要的特性。Wasm3 支持 WASM 的很多擴(kuò)展比如浮點(diǎn)運(yùn)算、批量?jī)?nèi)存操作、多返回值等。對(duì)于嵌入式場(chǎng)景我關(guān)掉了浮點(diǎn)運(yùn)算用定點(diǎn)數(shù)替代、關(guān)掉了 WASM 的bulk memory擴(kuò)展只保留最核心的整數(shù)運(yùn)算和內(nèi)存訪問(wèn)。這樣編譯出來(lái)的運(yùn)行時(shí)體積從默認(rèn)的 80 多 KB 降到了 55 KB 左右。第二調(diào)整內(nèi)存配置。Wasm3 需要一塊線(xiàn)性?xún)?nèi)存給 WASM 模塊使用默認(rèn)是 64 KB。ESP32-S3 有 512 KB 內(nèi)部 SRAM 和 8 MB PSRAM我把 WASM 線(xiàn)性?xún)?nèi)存設(shè)在 PSRAM 上分配了 256 KB這樣應(yīng)用可以有更多空間做數(shù)據(jù)處理。但要注意PSRAM 的訪問(wèn)速度比內(nèi)部 SRAM 慢對(duì)于頻繁訪問(wèn)的內(nèi)存區(qū)域還是放在內(nèi)部 SRAM 更合適。第三實(shí)現(xiàn)宿主函數(shù)綁定。Wasm3 通過(guò)m3_LinkRawFunction把 C 函數(shù)鏈接到 WASM 的導(dǎo)入符號(hào)上。每個(gè)宿主函數(shù)需要處理參數(shù)解析和返回值封裝。比如gpio_set_level接收兩個(gè)整數(shù)參數(shù)引腳號(hào)、電平值返回一個(gè)整數(shù)0 表示成功非 0 表示錯(cuò)誤。這部分代碼需要仔細(xì)處理邊界條件因?yàn)?WASM 傳過(guò)來(lái)的參數(shù)是不可信的必須做范圍檢查。注意Wasm3 默認(rèn)使用m3_Malloc和m3_Free做內(nèi)存分配在 ESP32 上需要重定向到heap_caps_malloc和heap_caps_free并且指定分配區(qū)域內(nèi)部 SRAM 或 PSRAM。如果忘記重定向可能會(huì)用到默認(rèn)的 libc malloc在內(nèi)存緊張時(shí)容易失敗。3.2 應(yīng)用接口的設(shè)計(jì)與約定應(yīng)用和固件之間的接口設(shè)計(jì)是整個(gè)平臺(tái)的關(guān)鍵。我定義了一套簡(jiǎn)單的 API分成幾類(lèi)GPIO 類(lèi)gpio_mode(pin, mode)、gpio_write(pin, level)、gpio_read(pin)。I2C 類(lèi)i2c_init(sda, scl, freq)、i2c_write(addr, reg, data, len)、i2c_read(addr, reg, buf, len)。時(shí)間類(lèi)delay_ms(ms)、millis()。網(wǎng)絡(luò)類(lèi)net_connect(ssid, pass)、net_send(data, len)、net_recv(buf, len)。文件類(lèi)file_open(path, mode)、file_read(fd, buf, len)、file_write(fd, data, len)、file_close(fd)。日志類(lèi)log_info(msg)、log_error(msg)。每個(gè)函數(shù)在 WASM 側(cè)都有一個(gè)對(duì)應(yīng)的導(dǎo)入聲明。應(yīng)用開(kāi)發(fā)者用 C 寫(xiě)代碼時(shí)只需要包含一個(gè)頭文件里面聲明了這些函數(shù)的原型然后正常調(diào)用即可。編譯時(shí)用wasm32-unknown-unknown目標(biāo)鏈接時(shí)這些符號(hào)會(huì)變成導(dǎo)入項(xiàng)運(yùn)行時(shí)由 Wasm3 解析并綁定到實(shí)際的 C 函數(shù)。這里有個(gè)細(xì)節(jié)WASM 的字符串傳遞。C 語(yǔ)言里字符串是char*但在 WASM 里指針是線(xiàn)性?xún)?nèi)存的偏移量。宿主函數(shù)收到的是一個(gè)整數(shù)偏移量需要先把它轉(zhuǎn)換成實(shí)際的指針才能讀取字符串內(nèi)容。Wasm3 提供了m3_GetMemory來(lái)獲取線(xiàn)性?xún)?nèi)存的基地址加上偏移量就是實(shí)際地址。但要注意WASM 模塊的內(nèi)存可能會(huì)在運(yùn)行過(guò)程中增長(zhǎng)如果調(diào)用了memory.grow所以每次訪問(wèn)前都要重新獲取基地址不能緩存。3.3 應(yīng)用的生命周期管理每個(gè)應(yīng)用在設(shè)備上的生命周期包括安裝、加載、運(yùn)行、卸載。安裝就是把.wasm文件寫(xiě)到 Flash 的文件系統(tǒng)里我用的是 SPIFFS后來(lái)?yè)Q成了 LittleFS因?yàn)?LittleFS 的掉電恢復(fù)能力更好。文件命名用應(yīng)用的唯一標(biāo)識(shí)比如app_001.wasm。安裝可以通過(guò)網(wǎng)絡(luò)上傳HTTP POST或者串口傳輸XMODEM 協(xié)議。加載是運(yùn)行時(shí)讀取.wasm文件內(nèi)容調(diào)用m3_ParseModule解析字節(jié)碼然后m3_LoadModule加載到運(yùn)行時(shí)環(huán)境。加載成功后查找模塊導(dǎo)出的app_init函數(shù)并調(diào)用。運(yùn)行是在主循環(huán)里定期調(diào)用app_loop。這里有個(gè)調(diào)度問(wèn)題如果應(yīng)用很多每個(gè)應(yīng)用的app_loop都調(diào)用一遍可能會(huì)拖慢整體響應(yīng)。我的做法是給每個(gè)應(yīng)用分配一個(gè)時(shí)間片比如每個(gè)應(yīng)用最多執(zhí)行 10 ms超時(shí)就讓出 CPU 給下一個(gè)應(yīng)用。Wasm3 本身不支持中斷執(zhí)行所以時(shí)間片控制需要在應(yīng)用層面配合要求應(yīng)用開(kāi)發(fā)者不要在app_loop里寫(xiě)死循環(huán)。卸載是調(diào)用app_deinit然后m3_FreeModule釋放模塊占用的內(nèi)存最后刪除.wasm文件。實(shí)操心得Wasm3 在卸載模塊后線(xiàn)性?xún)?nèi)存不會(huì)自動(dòng)歸還給系統(tǒng)而是留在運(yùn)行時(shí)的內(nèi)存池里。如果頻繁安裝卸載應(yīng)用內(nèi)存池會(huì)碎片化。我的解決辦法是限制同時(shí)運(yùn)行的應(yīng)用數(shù)量最多 4 個(gè)并且在卸載后如果內(nèi)存碎片率超過(guò)閾值就重啟一次運(yùn)行時(shí)不是重啟設(shè)備。3.4 資源隔離與錯(cuò)誤處理WASM 的沙箱模型提供了一定程度的隔離但還不夠。因?yàn)樗袘?yīng)用共享同一個(gè) WASM 線(xiàn)性?xún)?nèi)存空間Wasm3 默認(rèn)行為一個(gè)應(yīng)用如果越界寫(xiě)內(nèi)存可能會(huì)破壞其他應(yīng)用的數(shù)據(jù)。為了解決這個(gè)問(wèn)題我給每個(gè)應(yīng)用分配獨(dú)立的M3Environment和M3Runtime這樣每個(gè)應(yīng)用有自己獨(dú)立的線(xiàn)性?xún)?nèi)存。代價(jià)是內(nèi)存開(kāi)銷(xiāo)變大每個(gè)運(yùn)行時(shí)至少需要 16 KB 的固定開(kāi)銷(xiāo)。在 8 MB PSRAM 的板子上跑 4 個(gè)應(yīng)用還是綽綽有余的。錯(cuò)誤處理方面Wasm3 提供了m3_GetErrorInfo來(lái)獲取錯(cuò)誤信息。當(dāng)應(yīng)用執(zhí)行出錯(cuò)比如除以零、訪問(wèn)非法內(nèi)存、調(diào)用不存在的導(dǎo)入函數(shù)時(shí)運(yùn)行時(shí)會(huì)返回錯(cuò)誤碼。我的做法是捕獲錯(cuò)誤后記錄日志然后卸載該應(yīng)用不影響其他應(yīng)用繼續(xù)運(yùn)行。還有一個(gè)坑WASM 模塊的棧溢出。Wasm3 默認(rèn)的棧大小是 64 KB對(duì)于嵌入式應(yīng)用來(lái)說(shuō)太大了。我把它調(diào)到了 8 KB但有些應(yīng)用遞歸調(diào)用太深還是會(huì)溢出。后來(lái)我在編譯應(yīng)用時(shí)加了-Wl,-z,stack-size4096來(lái)限制應(yīng)用的棧使用同時(shí)在運(yùn)行時(shí)捕獲棧溢出錯(cuò)誤。4. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)4.1 開(kāi)發(fā)環(huán)境搭建與工具鏈配置先說(shuō)一下我的開(kāi)發(fā)環(huán)境。固件側(cè)用的是 ESP-IDF v5.1編譯鏈?zhǔn)?xtensa-esp32s3-elf-gcc。WASM 運(yùn)行時(shí)用的是 Wasm3從 GitHub 上拉的最新源碼。應(yīng)用側(cè)用的是 WASI SDK 提供的 clang 編譯器目標(biāo)設(shè)為wasm32-unknown-unknown。安裝 WASI SDK 的步驟很簡(jiǎn)單下載對(duì)應(yīng)平臺(tái)的壓縮包解壓后把bin目錄加到 PATH 里就行。驗(yàn)證安裝是否成功clang --targetwasm32-unknown-unknown -v如果輸出里能看到Target: wasm32-unknown-unknown說(shuō)明配置正確。然后編譯 Wasm3 到 ESP32。Wasm3 的源碼里有一個(gè)platforms/embedded目錄里面有針對(duì)嵌入式平臺(tái)的移植示例。我參考了esp32的示例但做了一些修改把m3_config.h里的d_m3MaxFunctionStackHeight從默認(rèn)的 2000 改成了 500減少??臻g占用把d_m3EnableOpTracing關(guān)掉減少代碼體積。編譯命令大概是這樣idf.py set-target esp32s3 idf.py menuconfig在 menuconfig 里需要把 PSRAM 打開(kāi)Component config - ESP PSRAM - Support for external, SPI-connected RAM然后把 Flash 大小設(shè)為 16 MB分區(qū)表選自定義。4.2 固件側(cè)宿主函數(shù)的實(shí)現(xiàn)宿主函數(shù)是固件導(dǎo)出給 WASM 調(diào)用的接口。以gpio_write為例實(shí)現(xiàn)如下m3ApiRawFunction(host_gpio_write) { m3ApiGetArg(int32_t, pin); m3ApiGetArg(int32_t, level); if (pin 0 || pin 48) { m3ApiReturnType(int32_t); m3ApiReturn(-1); } gpio_set_level(pin, level); m3ApiReturnType(int32_t); m3ApiReturn(0); }這段代碼用 Wasm3 提供的宏來(lái)解析參數(shù)和返回值。m3ApiGetArg從 WASM 棧上取參數(shù)m3ApiReturn把返回值壓回棧上。注意參數(shù)類(lèi)型必須和 WASM 側(cè)聲明的類(lèi)型匹配否則會(huì)出現(xiàn)未定義行為。鏈接函數(shù)到導(dǎo)入符號(hào)m3_LinkRawFunction(module, env, gpio_write, i(ii), host_gpio_write);這里的i(ii)是函數(shù)簽名表示返回 int32接收兩個(gè) int32 參數(shù)。Wasm3 用這種緊湊的簽名格式來(lái)描述函數(shù)類(lèi)型具體規(guī)則可以參考 Wasm3 的文檔。注意如果簽名寫(xiě)錯(cuò)了Wasm3 在鏈接時(shí)會(huì)報(bào)錯(cuò)但錯(cuò)誤信息可能不太直觀。建議先用wasm-objdump查看 WASM 模塊的導(dǎo)入表確認(rèn)函數(shù)名和簽名后再寫(xiě)鏈接代碼。4.3 應(yīng)用側(cè)代碼編寫(xiě)與編譯應(yīng)用側(cè)用 C 寫(xiě)包含一個(gè)頭文件app_api.h里面聲明了所有可用的宿主函數(shù)。比如extern int gpio_write(int pin, int level); extern int delay_ms(int ms); extern int log_info(const char* msg);然后寫(xiě)應(yīng)用邏輯#include app_api.h int app_init() { log_info(app started); gpio_write(2, 1); return 0; } int app_loop() { gpio_write(2, 0); delay_ms(500); gpio_write(2, 1); delay_ms(500); return 0; } int app_deinit() { gpio_write(2, 0); log_info(app stopped); return 0; }編譯命令clang --targetwasm32-unknown-unknown -nostdlib -Wl,--no-entry -Wl,--exportapp_init -Wl,--exportapp_loop -Wl,--exportapp_deinit -Wl,--allow-undefined -o app_001.wasm app_001.c幾個(gè)關(guān)鍵參數(shù)-nostdlib表示不鏈接標(biāo)準(zhǔn)庫(kù)因?yàn)?WASM 環(huán)境里沒(méi)有 libc--no-entry表示不生成默認(rèn)入口--export指定要導(dǎo)出的函數(shù)--allow-undefined允許未定義的符號(hào)這些就是宿主函數(shù)運(yùn)行時(shí)才綁定。編譯出來(lái)的.wasm文件通常只有幾 KB非常小巧。4.4 應(yīng)用上傳與加載流程應(yīng)用上傳我實(shí)現(xiàn)了兩種方式HTTP 上傳和串口傳輸。HTTP 上傳是在固件里起一個(gè)簡(jiǎn)單的 HTTP 服務(wù)器監(jiān)聽(tīng)/upload路徑的 POST 請(qǐng)求。收到數(shù)據(jù)后寫(xiě)到 LittleFS 里。這種方式適合設(shè)備已經(jīng)聯(lián)網(wǎng)的場(chǎng)景。串口傳輸用的是 XMODEM 協(xié)議通過(guò) UART 接收文件。這種方式適合設(shè)備還沒(méi)聯(lián)網(wǎng)、需要本地部署的場(chǎng)景。XMODEM 的實(shí)現(xiàn)我參考了 ESP-IDF 里的示例做了一些簡(jiǎn)化只支持 128 字節(jié)包和 CRC 校驗(yàn)。加載流程是這樣的設(shè)備啟動(dòng)后掃描 LittleFS 里所有.wasm文件逐個(gè)加載并調(diào)用app_init。然后在主循環(huán)里輪詢(xún)每個(gè)應(yīng)用的app_loop。如果某個(gè)應(yīng)用返回非零值就認(rèn)為它請(qǐng)求卸載運(yùn)行時(shí)調(diào)用app_deinit然后釋放模塊。實(shí)測(cè)下來(lái)一個(gè) 4 KB 的 WASM 應(yīng)用從加載到app_init執(zhí)行完成耗時(shí)大約 15 ms。app_loop的單次執(zhí)行時(shí)間取決于具體邏輯簡(jiǎn)單的 GPIO 翻轉(zhuǎn)大約 0.1 ms復(fù)雜的 I2C 讀寫(xiě)大約 2-3 ms。4.5 性能實(shí)測(cè)數(shù)據(jù)我在 ESP32-S3240 MHz 主頻8 MB PSRAM上做了一組基準(zhǔn)測(cè)試結(jié)果如下測(cè)試項(xiàng)耗時(shí)備注WASM 模塊加載4 KB12 ms包含解析和鏈接app_init 執(zhí)行3 ms簡(jiǎn)單 GPIO 初始化app_loop 單次執(zhí)行GPIO 翻轉(zhuǎn)0.1 ms無(wú)阻塞操作app_loop 單次執(zhí)行I2C 讀傳感器2.5 ms100 kHz I2C 時(shí)鐘宿主函數(shù)調(diào)用開(kāi)銷(xiāo)約 2 us從 WASM 進(jìn)入 C 函數(shù)再返回內(nèi)存占用運(yùn)行時(shí) 1 個(gè)應(yīng)用約 80 KB含線(xiàn)性?xún)?nèi)存從數(shù)據(jù)看WASM 的解釋執(zhí)行開(kāi)銷(xiāo)確實(shí)比原生代碼高但對(duì)于大多數(shù)嵌入式控制場(chǎng)景來(lái)說(shuō)完全夠用。GPIO 翻轉(zhuǎn)的 0.1 ms 延遲對(duì)于 LED 控制、繼電器開(kāi)關(guān)這類(lèi)應(yīng)用綽綽有余。I2C 讀寫(xiě)的 2.5 ms 主要花在 I2C 傳輸本身WASM 的解釋開(kāi)銷(xiāo)只占很小一部分。實(shí)操心得如果應(yīng)用里有大量循環(huán)計(jì)算WASM 的解釋執(zhí)行會(huì)比原生慢 5-10 倍。這種情況下可以把計(jì)算密集的部分放到固件里作為宿主函數(shù)應(yīng)用只負(fù)責(zé)調(diào)用和邏輯編排。比如 PID 控制算法我就是在固件里實(shí)現(xiàn)的應(yīng)用只傳參數(shù)和讀結(jié)果。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 WASM 模塊加載失敗這是最常見(jiàn)的問(wèn)題表現(xiàn)是m3_ParseModule返回 NULL 或者m3_LoadModule報(bào)錯(cuò)。原因通常有幾個(gè)第一WASM 文件損壞??赡苁巧蟼鬟^(guò)程中丟包或者 Flash 寫(xiě)入失敗。排查方法是把文件讀出來(lái)用wasm-objdump -h檢查文件頭是否正確。如果文件頭不是\0asm說(shuō)明文件損壞。第二WASM 模塊使用了不支持的指令。Wasm3 不是完整的 WASM 實(shí)現(xiàn)某些指令比如 SIMD、異常處理不支持。排查方法是用wasm-objdump -d反匯編看有沒(méi)有不認(rèn)識(shí)的指令。解決辦法是在編譯應(yīng)用時(shí)加上-mno-simd -mno-exception-handling等標(biāo)志。第三內(nèi)存不足。Wasm3 在加載模塊時(shí)需要分配線(xiàn)性?xún)?nèi)存如果 PSRAM 碎片化嚴(yán)重或者剩余內(nèi)存不足加載會(huì)失敗。排查方法是打印heap_caps_get_free_size(MALLOC_CAP_SPIRAM)看剩余內(nèi)存。解決辦法是減少同時(shí)運(yùn)行的應(yīng)用數(shù)量或者在加載前先卸載一些不用的應(yīng)用。5.2 宿主函數(shù)調(diào)用崩潰表現(xiàn)是應(yīng)用執(zhí)行到某個(gè)宿主函數(shù)時(shí)設(shè)備重啟或者卡死。原因通常是參數(shù)越界或者指針?lè)欠?。比如i2c_write的len參數(shù)如果 WASM 傳了一個(gè)很大的值宿主函數(shù)里直接按這個(gè)長(zhǎng)度讀內(nèi)存就會(huì)越界訪問(wèn)。解決辦法是在宿主函數(shù)里做參數(shù)檢查len不能超過(guò)緩沖區(qū)大小addr必須在合法范圍內(nèi)。還有一個(gè)坑是字符串指針。WASM 傳過(guò)來(lái)的字符串指針是線(xiàn)性?xún)?nèi)存的偏移量如果應(yīng)用傳了一個(gè)非法偏移量比如超出了線(xiàn)性?xún)?nèi)存范圍宿主函數(shù)讀取時(shí)就會(huì)崩潰。解決辦法是用m3_GetMemory獲取線(xiàn)性?xún)?nèi)存的基地址和大小然后檢查偏移量是否在范圍內(nèi)。uint32_t mem_size; uint8_t* mem_base m3_GetMemory(runtime, mem_size, 0); if (offset mem_size) { return -1; } char* str (char*)(mem_base offset);5.3 應(yīng)用之間互相干擾前面提到過(guò)如果多個(gè)應(yīng)用共享同一個(gè) WASM 運(yùn)行時(shí)一個(gè)應(yīng)用越界寫(xiě)內(nèi)存會(huì)影響其他應(yīng)用。表現(xiàn)是某個(gè)應(yīng)用運(yùn)行正常但另一個(gè)應(yīng)用突然行為異常。排查方法是給每個(gè)應(yīng)用分配獨(dú)立的運(yùn)行時(shí)環(huán)境這樣內(nèi)存是隔離的。如果資源不夠至少要在宿主函數(shù)層面做嚴(yán)格的參數(shù)檢查防止應(yīng)用通過(guò)宿主函數(shù)間接破壞其他應(yīng)用的數(shù)據(jù)。還有一個(gè)干擾是 GPIO 沖突。兩個(gè)應(yīng)用同時(shí)操作同一個(gè)引腳會(huì)導(dǎo)致電平狀態(tài)不確定。我的做法是在宿主函數(shù)里維護(hù)一個(gè)引腳占用表應(yīng)用在app_init里需要先“申請(qǐng)”引腳申請(qǐng)失敗就不能使用。卸載時(shí)釋放引腳。5.4 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決辦法模塊加載返回 NULL文件損壞wasm-objdump -h檢查文件頭重新上傳文件模塊加載返回 NULL不支持的指令wasm-objdump -d反匯編編譯時(shí)禁用不支持的特性模塊加載返回 NULL內(nèi)存不足打印剩余 PSRAM卸載不用的應(yīng)用宿主函數(shù)調(diào)用崩潰參數(shù)越界在宿主函數(shù)里加日志增加參數(shù)檢查宿主函數(shù)調(diào)用崩潰字符串指針?lè)欠z查偏移量范圍用m3_GetMemory驗(yàn)證應(yīng)用行為異常內(nèi)存被其他應(yīng)用破壞檢查是否共享運(yùn)行時(shí)分配獨(dú)立運(yùn)行時(shí)應(yīng)用行為異常GPIO 沖突檢查引腳占用表增加引腳申請(qǐng)機(jī)制執(zhí)行速度慢計(jì)算密集測(cè)量app_loop耗時(shí)把計(jì)算移到固件側(cè)設(shè)備重啟棧溢出檢查遞歸深度限制棧大小優(yōu)化代碼5.5 獨(dú)家避坑技巧第一個(gè)技巧在開(kāi)發(fā)階段給每個(gè)宿主函數(shù)加上詳細(xì)的日志記錄參數(shù)和返回值。這樣當(dāng)應(yīng)用行為異常時(shí)可以通過(guò)日志快速定位是哪個(gè)函數(shù)調(diào)用出了問(wèn)題。日志用ESP_LOGI輸出到串口不影響實(shí)時(shí)性。第二個(gè)技巧WASM 應(yīng)用的編譯優(yōu)化級(jí)別建議用-O2而不是-Os。雖然-Os能減小代碼體積但生成的 WASM 字節(jié)碼可能更復(fù)雜解釋執(zhí)行反而更慢。實(shí)測(cè)-O2編譯出來(lái)的應(yīng)用執(zhí)行速度比-Os快 20% 左右體積只大了 10%。第三個(gè)技巧如果應(yīng)用需要頻繁調(diào)用宿主函數(shù)比如每毫秒調(diào)用一次gpio_read考慮在固件側(cè)做一個(gè)批量接口一次調(diào)用讀取多個(gè)引腳的狀態(tài)減少 WASM 和宿主之間的切換開(kāi)銷(xiāo)。每次切換大約 2 us頻繁切換累積起來(lái)也很可觀。第四個(gè)技巧LittleFS 的塊大小建議設(shè)為 4 KB和 Flash 的扇區(qū)大小一致。如果設(shè)得太小文件系統(tǒng)元數(shù)據(jù)會(huì)占用過(guò)多空間設(shè)得太大小文件會(huì)浪費(fèi)空間。4 KB 是一個(gè)比較平衡的選擇。6. 這個(gè)平臺(tái)還能怎么擴(kuò)展目前這個(gè)平臺(tái)已經(jīng)能跑起來(lái)基本功能都驗(yàn)證過(guò)了。但說(shuō)實(shí)話(huà)它離“好用”還有距離。我接下來(lái)打算做幾個(gè)方向的擴(kuò)展。第一個(gè)方向是應(yīng)用商店的概念?,F(xiàn)在安裝應(yīng)用需要手動(dòng)上傳.wasm文件如果能做一個(gè)簡(jiǎn)單的應(yīng)用倉(cāng)庫(kù)設(shè)備直接通過(guò) URL 下載安裝那就更方便了。倉(cāng)庫(kù)可以是一個(gè)靜態(tài)文件服務(wù)器設(shè)備端實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 HTTP 客戶(hù)端根據(jù)應(yīng)用 ID 去拉取對(duì)應(yīng)的.wasm文件。第二個(gè)方向是應(yīng)用間通信?,F(xiàn)在每個(gè)應(yīng)用是獨(dú)立的互相不能傳數(shù)據(jù)。如果能讓?xiě)?yīng)用之間通過(guò)消息隊(duì)列或者共享內(nèi)存通信就能組合出更復(fù)雜的功能。比如一個(gè)應(yīng)用負(fù)責(zé)采集傳感器數(shù)據(jù)另一個(gè)應(yīng)用負(fù)責(zé)顯示兩者通過(guò)消息傳遞數(shù)據(jù)。第三個(gè)方向是權(quán)限控制?,F(xiàn)在應(yīng)用可以調(diào)用所有宿主函數(shù)沒(méi)有權(quán)限區(qū)分。如果能在加載應(yīng)用時(shí)指定權(quán)限比如只能訪問(wèn) GPIO不能訪問(wèn)網(wǎng)絡(luò)安全性會(huì)更好。WASM 的導(dǎo)入機(jī)制天然支持這個(gè)只需要在鏈接宿主函數(shù)時(shí)根據(jù)權(quán)限決定鏈接哪些函數(shù)即可。第四個(gè)方向是熱更新。現(xiàn)在更新應(yīng)用需要先卸載再安裝中間有一段時(shí)間應(yīng)用不可用。如果能做到原子替換先加載新版本切換成功后再卸載舊版本就能實(shí)現(xiàn)無(wú)縫更新。這些擴(kuò)展方向里應(yīng)用間通信和權(quán)限控制是我最想做的。前者能讓平臺(tái)從“能跑多個(gè)應(yīng)用”變成“應(yīng)用能協(xié)作”后者能讓平臺(tái)從“能用”變成“敢用”。不過(guò)這些都需要對(duì) Wasm3 做更深入的改造工作量不小。我在實(shí)際使用中發(fā)現(xiàn)WASM 在 ESP32 上的表現(xiàn)比預(yù)期好但也不是沒(méi)有代價(jià)。解釋執(zhí)行的開(kāi)銷(xiāo)、內(nèi)存隔離的成本、工具鏈的復(fù)雜度這些都是需要權(quán)衡的。如果你的場(chǎng)景是功能固定、不需要?jiǎng)討B(tài)加載那直接燒固件更簡(jiǎn)單高效。但如果你需要頻繁調(diào)整邏輯、或者想讓不同的人獨(dú)立開(kāi)發(fā)功能模塊那這個(gè)平臺(tái)能省掉很多重復(fù)勞動(dòng)。踩過(guò)幾次坑之后我的建議是先從一個(gè)小功能開(kāi)始驗(yàn)證比如用 WASM 控制一個(gè) LED跑通了再逐步擴(kuò)展。不要一上來(lái)就搞復(fù)雜架構(gòu)那樣容易在細(xì)節(jié)里迷失。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月激情婷婷四射| 成人在线观看精品| 开心五月婷| 日韩色色网| 99性爱视频网站| 色五月婷婷在线| 欧美成综合在线观看| 免费看片在线观看| 久久综合久色欧美综合狠狠| 思思久久99| 亚洲激情av| 五月天玖玖狠狠色色| 色五月婷婷五月天激情综合| 色噜噜狠狠色综合日日| 五月天婷婷久久视频| www.亭亭五月天| 婷婷色九月| 风流少妇A片一区二区蜜桃| 久久精品只有这| 婷婷五月综合婷婷| 玖热精品综合视频| 操一区| 久久网址99热| 这里只有精品2| 思思热视频在线| 99热精品在线播放观看| 日日干综合| 丁香激情久久| 色婷婷电影网| 国产色丁香| 丁香五月色五月| AV在线免费观看不卡| 婷婷在线免费| 五月熟妇婷婷久久| 天天狠狠婷婷在线| 美妞av| 91精品综合久久久久久五月丁香| 久久这里只有精品无码| A A色色| 在线观看熟女少妇| 这里只有视频精品| 丁香六月婷婷高清| 欧美英丁香开心快乐六月天网| 丁香婷婷久久| AV天堂淫乩| 六月婷婷激情| 99亚洲综合| 五夜婷婷| 丁香综合网| 久热丁香| 操操啪| 91爱操| 91久久色| 色色日韩网| 五月丁香啪啪啪综合网| 色综合xx| 强伦轩人妻一区二区电影| 另类国产综合| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 五月婷天堂视频| 五月色情| 操b视频在线观看一区二区| 在线看的免费网站| 日韩大片艹艹| 色5在线| 五月天婷婷激情网| 亚洲色 视频| 天天操,夜夜骑| www..com色爱| 丁香五月成人社区| 久久综合性| 亭亭社区五月天| 色五月激情视频在线综合| 深爱1激情网| 亭亭五月天黑人2014| Va另类视频| 天天色天天爱天天爽| 五月色丁香婷婷综合| 婷婷成人综合五月| 成人在线综合| 欧美成人AAA片一区国产精品| 丰满少妇乱A片无码| 97色精品视频 | 91九色 熟| 99啪在线视频| 日本特黄aaaaa| 婷婷综合在线观看视频| 成人五月天丁香| 六月丁香五月婷婷| 久久思思99| 91 影音先锋| 98热精品| 午夜 外网 精品 在线| 日韩六十路91性交电影| 久操大香蕉| 色婷五月天| 婷婷最新地址| 9久久婷婷国产综合精品性色| 79色色色色| 丁香五月天堂| 中文字幕乱码亚洲精品一区| 婷婷五月AV| 婷婷丁香五月视频| 成人永久免费视频在线观看| 五月天色小说| 亚洲五月天综合色| 色99xx| 五月天丁香看婷婷| 另类色视频| 五月婷天天搞视频| 欧美性生交XXXXX无码小说| 大香蕉在线观看9| 激情超碰网| 五月丁香六月综合激情| 99热这里只有精品268| WWW色综合| 丁香五月色情| 亚洲精品久久久无码| 97干在线播放| 91干视频| 99热在线观看99| 九九精品少妇| 插插干干干色| 色女人久久| 日韩无码成人电影| 啪啪啪大香蕉| 婷婷伊人綜合中文字幕| 97资源碰碰在线| 九九免费在线视频| 婷婷丁香人妻天天爽| 校园激情 亚洲| 中文字幕在线观看视频www| av在线婷婷| 他改变了拜占庭| 网色99| 色色综合五月| 五月草影视| 久久亚洲婷婷| 亚洲性爱99| 日本色天堂| 激情骚五月| 亚州视频九九99| 日韩啪啪视频| 猫咪伊人久久| 天天久综合网永久入口18| 五月综合激情图片| 五月天综合在线网| 欧美激情-区二区三区| 欧美日本va| 深爱开心激情网| 激情久久久| 国产九九一区二区三区| AV成人在线播放| 大香蕉懂9| 9色免费网| av大香蕉| 天天射射夜| 五月天色不卡| 婷色成人| 婷婷日本在线| 玖玖婷婷五月| 久热无码| 四川女人毛多水多A片| 99热这里在线精品| 色婷婷网大全在线| 成人综合伍月天| 97碰碰草| 五月丁香花视频| 91丁香五月| 五月天婷婷色色网| 思思久久精品视频| 伊人成综合五月婷婷| 五月天天天色| 婷婷大乡焦噜噜| 色婷婷69| aaa丁香五月天| 六月丁香啪啪啪| 国产精女同一区二区三区久| 欧洲永久精品| 在线综合网| 99热无码首页| 九九在线视频| 啄木鸟黑丝一区二区| 色综合爱综合| 99精品久久久久久久婷婷久久| 六月丁香啪啪啪| 午夜 外网 精品 在线| 久久性爱网| 99热这里只有精品最新| 久播影院免费观看电视剧大全最新网| 久久大香蕉同僚| 狠狠插狠狠插| 激情五月丁香六月综合AVXXXX| 天堂久久大香蕉| 九九aV| 秋霞学生妹一二级| 色在线99| 极骚大香蕉伊人| 99热在线播放| 97久久五月丁香婷婷| 伊人青涩网| 五月天婷婷色色网| 人人爽人人爽人人爽人人爽| 五月婷婷影| 极品少妇高潮啪啪AV无码| 激情五月,激情综合网| 婷婷六月天天| 99视频日韩| 操九色| 日本色噜| 婷婷色九月| 国产精品99久久久久久久女警| 婷婷五月激情在线视频| 九九sese| 丁香5月激情网| 日本97在线观看| 九月婷婷久久久| 天天干天天操天天干天天操天天干天天操| 婷婷丁香宗合888| 日韩黄在免| 久久丝袜婷婷| 激情五月小说婷婷| 国模淫穴色图| 深爱开心五月天| 9久国产精品| 日操夜操天天操不卡| 久99久视频| 婷婷五月天影院| 超碰网站在线观看| 色情丁香五月婷婷精品| 99热这里只有精| 色色激情| 激情五月天视频| 五月丁香六月婷婷视频| 九九婷婷五月天影视| 大香蕉综合网| 色婷婷99| 99热欧美在线观看| 免费视频这里只有精品| 99丁香五月婷| 色色热| 久久亚洲A| 婷婷五月丁香花综合| 亚洲综合色婷| 玖玖色综合色| 久久久亚洲成人无码A片| 99re6在线视频精品免费| 超碰在线精品| 97色热| 99热国产这里只有精品| 五月天 婷 欧美亚洲| 伍月婷丁香花全集| 亚洲色亚洲精品| 婷婷五月欧美综合| 五月婷婷激情色情网| 婷婷六月激情小说网| 99精品热视频| 久久视频66| 亚洲超碰在线| 婷婷五月天直播| 婷婷 久综合| 久久XX| 999热在线视频| 五月丁香六月激情综合| 五月婷丁香| 欧洲区自拍| www.com久久久久久久久久久久久久久久久| 狠狠色综合网| 综合天堂AV久久久久久久| 五月丁香六月婷婷国产视频| 97日本在线| 国产免费av网站| 狠狠爱丁香婷| 91激情五月开心| 色婷婷色情| 久久92| 97婷婷五月丁香| 这里只有精品在线免费视频| 婷婷六月情| 五月丁香中文字幕| 久草大| 这里只有精品视频| 亚洲AV日韩在线观看| 操97在线观看| 狼人狠狠操| 色综合久久888| 色五月激情问网站| 噜噜精品| 啪啪91| 久热A片| 爱狠射| 激情六月丁香| 婷婷丁香亚洲五月天| 五月婷婷性| 黄网免费观看| 欧美性爱丁香五月| 99热国产精品| 色播五月| 乱岳熟女50岁| 91超级碰在线视频| 激情五月色综合| 色婷婷综合亚洲| 婷婷丁香十月| 五月天丁香欧美激情| 婷婷五月激情网| 九色视频这里只有精品| 婷婷五月情| 99精品偷自拍| 久久精品视频99| 色色日韩无码| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 久久婷婷五月综合色欧美| 亚洲丁香五月美女| 色婷婷9| 精品一二三区久久AAA片| 丁香五月综合激情久久潮喷| 久久性爱视频免费| 国产精品久久..4399| 国产AV一区二区三区最新精品| 91亚洲免费片| 亚洲一区二区无码蜜乳av| 五月婷婷久久网| 日本精品久久久久中文字幕| 五月婷婷av| 99久在线观看| 久久探花91swag| 五月天激情四射| 婷婷五月婷| 97人人草| 26uuu青青| 婷婷丁香成人五月天| 亭亭玉月丁香| 99爱视频精品| 99碰超| 精品国产a| 77799热| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 丁香五月五婷| 色五月激情问网站| 久综合| 思思久久精品| 色婷婷九月综合| 色综合夜夜| 色色五月婷婷| 色综合色色色| 婷婷第六色| 欧洲亚洲免费视频9| 超碰99成人在线| 丁香五月AV综合激情| 久久九九热视频| 婷婷综合亚洲| 婷婷久久大香蕉| 日本久久9| 六月婷婷九月丁香亚洲综合| 激情超碰网| 无码人妻一区二区三区免费九色| 五月婷婷电影院| 热的五码久久精品| 五月丁香啪啪啪| 99无码视频| 超碰男人色| 色婷婷综合影院| 99热这里只要精品免费| 九九激情视频| AV成人在线播放| 五月停停色| 五月激情六月丁香| 日韩久热| 国产1区2区3区| 五月天婷婷綜合院| 婷婷色导航| 久久伊人大香蕉| www.91九色| 99在线精品视频| 大香蕉久久婷婷| 天天肏视频| 五月丁香六月婷综合成人综合| caop在线视频| 色综合五月婷婷狠狠干| 激情五月天.色网| 婷婷五月综合视频免费播放| 婷婷五月丁香综合激情| 激情五月婷婷综合| 丁香激情五月少妇| 九九热中文| 天天网曰日曰夜夜综合永久免费| 亚洲情综合五月天| 五月天色婷婷网| 丁香五月 性爱| 五月婷婷之综合激情| a色婷婷| 婷婷五月丁香六月| 日日想日日夜日日操| 婷婷五月丁香亚洲| 超碰在线观看9| 能直接看的AV网站| 九月婷婷激情| 婷婷的久久网站| 五月激情丁香五月| 97综合在线| 亚洲欧美婷婷五月色综合| 99热播放| 99婷婷综合| 天天综合 99久久婷婷| 色色综合色视频| 99婷婷| 精品久久婷婷| 九热视频| 99热这里只有精品8| 色五月天丁香| 色婷婷丁香AV综合| ai97re99一本| 丁香五月婷婷少妇| 久久伦乱| 丁香六月情| 激情婷婷五月天伊人在线观看| 高清 码 免费看片短视频| 婷婷五月天伊人| 久热这里只有精品3| 综合色色婷婷| 色婷婷丁香网| 狠狠干五月天| 九色视频91疯狂| 无码人妻丰满熟妇奶水区码| 91色在线/日韩| 五月综合婷婷久久在线| 玖玖99福利| 亚洲xx网| 九色激情| 色综合综合综合| 91操碰| 激情5月婷婷| 青青热久精品视频在线观看| 综合网色| 五月天激情亚洲| 中文字幕在线免费观看视频| 操逼视频一区| 六月丁香五月天| 婷婷五月天777| 婷婷97碰碰| 麻豆忘忧草午夜| 天天天天干| 天天操无码| 亚洲美女网Va| jizzdr| 全国最新疫情| 色色色视频免费无码 | 99热碰碰| 一区二区成人电影免费播放| 色欲色欲久久宗合网| 人妻精品在线| 天堂久久婷婷| 98色花堂98t.R| 五月久久丁香| xfplayav在线| 99精品久久久久久久婷婷久久| www.激情在线| 极品人妻VIDEOSSS人妻| 九九精品网站| 大香蕉人妻| 狠狠第四色| 五月间天堂综合| 丁香五月婷综合| 91九色超碰| 在线中文AV| 国产精品18久久久| 久操香蕉| 日韩 mm 不卡| 国产综合81p| 国产精品久久久海的味道| 亚州综合色| 婷婷五月情| 九九婷婷热| 色色网站毛片| 九九久久玖玖爱| 婷婷在线日韩综合| 五月丁香婷色| 另类视屏| 入口五月婷婷六月香| 国产亚洲99| 婷婷久久五月| 深爱激情av| 五月婷婷精品无在线| 天天色天天爱天天舔| 天天综合色丁香| 五月天婷婷高清无码| 婷婷激情欧美| 香蕉人在线香蕉人在线 | 久久大香蕉同僚| 国产激情AV| 99综合| 亚洲色无码A片一区二区麻豆| 97人妻超级碰碰碰碰碰| 香蕉五月婷婷| 激情婷婷五月天| 日日天天天| 夜夜做天天爽| 蜜臀99精品| 伊人久久婷婷| 丁香六月成人| 五月天色色网站| 亚洲五月婷婷在线| 1024操逼| 99色在线观看视频| 久久激情综合| 泰州成人视频| 影视av久久久噜噜噜噜噜三级| 九九婷婷热| 爱狠射| 日韩另类| 天天操综合网| 92国产福利| 丁香五月香蕉在线| 天天爽天天草| 九九亚洲| 日韩三及成人AV片| 26uuu.| 99色亚洲| 可以免费观看的av| 亚洲AV第二区国产精品| 少妇久久诱惑视频| 天天肏夜夜肏| 欧美色偷偷大香| 久久99热这里只有| 日本色色网站| 日韩AV片| 五月婷av| 丁香五月婷婷色综合基地| 99这里都是精品| 91超级碰人人操| j久久性爱视频| 色播五月| 欧美日韩二区在线| 丁香五月六月久久综合 | www.精品99| www,五月丁,com| 婷婷五月丁香成人网| 99,色| 久久99成人性爱高清视频| 久热九九| 亚洲性视频| 五月天婷婷青青草| 五月丁香亭亭| 激情五月婷黄版| 九九大香蕉黄色影院| 天天色天天搡| 人五月天婷婷喷水| 九九热精品视频| 五月天激情视频| 五月丁香激情深爱婷婷| 激情综合婷婷| 91丨九色丨东北熟女| 色欲色香伊人| 激情五月婷婷综合网| aaa丁香五月天| 91婷婷色五月| 久久九九中文字幕| 欧美在线视频免费播放| 国内久久亭亭| 亚洲男女激情| 色色影院黄大片| 日日夜夜狠狠干| 五月丁香婷婷狠狠操| 热99热9| 五月天成人在线| 婷婷综合五月天亚洲综合| 99色色爰| 9久久久久| 狠狠五月天| se婷97| 丁香五月欧美色综合| 免费看成人AA片无码视频吃奶| 欧美日韩99| 91综合色| 丁香五月日韩| 精品久久久人妻| 色久天| 丁香五月影院| 、激情六月天| 97干在线| 激情久久天天| 99在线看视频| 99久久这里只有精品| 丁香婷婷五月人体| 激情图片婷婷| 99色这里| 激情内射人妻1区2区3区| 日韩成人精品一区久久久久| 色九四色| 亚洲精品99| 97久久久久| 亚洲色热| 婷婷五月丁香综合人妻| 五月婷婷导航| 五月丁香在线| 久久丁香久久| av色婷婷| 国内一级片| 激情五月小说婷婷| 久久五月婷婷电影| 婷婷5月久久综合网站| 五月花综合视频| WWW色色色COm| 免费无码毛片一区二区A片| 天天色五月| 深爱激情六月天| 丁香婷婷五月综合| 狠狠综合网| 亚洲激情av| 一区二区三区视频| 日韩黄色影院| 五月丁香婷婷免费视频| 色激情五月| 日韩无码亚欧无码| 婷婷六月中文字幕| 成人资源在线| a久久| 人人爽亚洲| 丁香婷婷六月天| 在线理论片| 国产视频婷婷| 五月丁香婷婷综合在线| 99色在线视频观看| 五月天婷婷成人网| 97极品在线| 色欧美影院| 亚洲日日操| 色情久久久| 91久久综合亚洲噜噜成人在线| 伊人婷婷五月天| 激情五月天小说| 伊人婷婷青青cao| 99久久婷婷综合| 99色视频在线| 五月天另类激情在线| 开心五月丁香综合久久| 97碰碰视频在线观看免费| 婷婷六月丁香五月图区| 色色色图| 袁子仪视频观看| 激情婷婷五月天| 91性交在线播放| 九八Av| 成人永久免费视频在线观看| 蜜桃婷婷丁香| 婷婷日| 99九九在线精品热动漫| 日韩人人操| 免费无码毛片一区二区A片| 综合99久久天天综合| 天天影视色综合网| 日韩美一级毛卡片| 深爱五月激情| 天天爽综合| 人人爱干人人爱草| 五月天社区| 丁香六月婷婷综合欧美| 亚洲无码AV片| 国产无套精品一区二区| 9 1 A v久久久| 国自产拍偷拍精品啪啪一区二区 | 99re热在线视频观看| 啪啪激情网站| 色婷婷六月精品| 秋霞午夜理论| 丁香五月天人体| h在线看免费版在线看| 久久综合性| 国产激情av| 五月精品| 色丁香五月| 欧美婷婷五月天| 欧美成人性爱网| 丁香激情五月少妇| 天天干天天干天天操| 日本五月天一页| 天天色综合网1| 激情五月狠狠| 五月综合婷婷五月| 亚洲成人网站在线播放| 婷婷五月丁香啪啪| 99视频内射三四| 思思re99视频在线观看| 五月丁香激情综合| 久久xx| 国产成人网站在线观看| 婷婷在线播放av| 欧美亚洲成人在线| www.com五月天| 欧美色骚婷婷五月天| 亚洲AV无码电影| 久艹大香蕉| 色婷婷丁香五月| 久热人妻| 九九九九操逼| 五月丁香本色在线观看| 色吧99| www.久9| 色婷婷久久综合久色综| 99色激| 性婷婷| 丁香久久久| 亚洲操操操| 99热超碰| 丁香五月花影院| 97人妻人人| 色综合久久99色| 天天肏屄夜夜爽| 午夜电影网VA内射| 婷婷久久五月天丁香| 五月天色区| 中文字幕1区2区。| 五月天婷婷AV| 丁香五月色综合色播五月| 激情激情激情网| 五月丁香六月综合激情| 26uuu日韩| 1024欧美看片| 91日本在线观看| 天天拍久久| 久热这里| 99视频| 无码yw| 97涩涩丁香五月天| 五月丁香婷婷深深爱| 国产免费一区二区在线A片视频| 天天激情站| 九色91国产| 五月婷婷免费在线观看| 亚洲AV人人操| 另类婷婷五月天啪帕帕| 婷婷月五天在线在线看| 激情小说婷婷五月| 婷婷五月丁香基| 華人性愛AV在線| 91丨九色丨东北熟女| 狠婷婷五月| 色综合激情| 亚洲天堂九九九| 天天色天天干天天插| 日韩好吊操| 人妻中文字幕精品| 色婷婷文字幕| 五月丁香综合中文| 五月丁香色综合| 91超碰人人操| 亚洲自拍天堂| 国产丁香五月天婷婷| 久久九九@| BlACKEDRAW视频一区二区| 激情综合青草| 亚洲中文字幕AV| 狠狠色综合网站久久久久| 成人婷婷深爱综合网| 亚洲高清在线| 免费97碰碰| 大香蕉婷婷久久| 99热碰碰| WWW五月| 五月婷婷六月激情| 综合激情五月综合激情五月激情1| 色五月成人| 天天综合色99| 色五月婷婷天天操夜夜操| 大香蕉五月天| 秋霞AV美国| 美女天天爽| 色色图五月天| 婷婷5月九九| 五月婷婷黄色网址| 欧美毛片www| 精品国产AV色一区二区深夜久久| 五月丁香美女视频| 五月天综合婷婷| 99在线热| 99热免| 国产小精品| 精品五月视频婷婷在线观看| 热九九精品| 久久婷婷五月综合色丁香| 久久99热这里只有精品| 99九九在线观看免费| 五月天激情国产综合婷婷| 99热草草| 天天情色五月天| 久久综合久色欧美综合狠狠 | 色婷婷狠狠| 亚洲中文字幕AV| 人人摸人人操人人爽| 五月丁香六月婷婷啪啪| 99久在线精品99re8| 婷婷丁香五月麻豆| 五月天啪啪啪| 丁香六月婷婷综合激情欧美| 精品夜夜澡人妻无码AV| 婷婷五月天天| 国产一级黄色影片,| 婷婷丁香五月综合激情视频| 日本理论久久| 99热这里只有精品1025| 婷婷激情四射| 最近中文字幕大全免费版在线| 色五月开心五月激情五月| 色伦专区97中文字幕| 91人妻视频| 在线观看欧美3区| 99色综合| 五月天综合网| 国产露脸150部国语对白| 欧美3AaAa大片| 色五月中文字幕| 97AV在线视频| 亚洲激情网站无码| 亚洲精品九九| 999热在线视频| 色婷婷91激情小说| 人人操人人妻| 婷色五月天| 丁香婷婷五月天色综合| 7777国产盗摄农村女人| 丁香六月婷婷久久综合| 丁香五月激情六月欧亚激情综合导航| 亚洲国产精品SUV| 99热无码| 99在线观看| 成人五月天综合网| 五月色丁香| 69五月天视频| 99热网址| ..真实国产乱子伦对白在线_欧| 91色情播放| 99ri视频| 韩日AV片| 婷婷五月天影院| 五月丁香婷婷潮喷中文字幕| www.色99| 四季日韩AV无码综合| 色色色色色色色色综合网| 婷婷五月天免费| 97干网站| 91猫咪国产在线播放| av中文在线| 亚洲热久久| .操區COm| 色噜噜狠狠色综合网| 综合色、色综合| 色五月综合网| 婷婷五月天激情五月天深爱五月天| 国产成人综合网| 色婷婷成人久久| www99热| 色综合伊人网| 日韩AV色色色| 婷婷午夜| 3p久久| 色婷婷很很十八禁| 国产精品成人在线| 五月天操逼网| 97 A I色色| 深爱激情五月天色婷婷| 成人在线不卡| 久久久久久久久久久44| 超碰婷婷色| www.色五月| 五月婷婷熟女| 五月天伊人| 久久婷婷五月综合伊人| 日日爽日日操| 天天狠天天狠| 久久久久久久97| 婷婷亚洲久久| 大香蕉天堂色| 91re色综合视频| 日韩中文字幕| 六月激情网| 日本精品99| pom538精品视频| 五月婷婷影| 直接看的AV网站| 五月色丁香激情| 五月激情另类| 五月婷婷与六月丁香图片激情| 丁香五月欧美激情| 91九色国产熟女| 五月天婷婷情色| 日韩大片艹艹| 色色色色色五月| 国产成人亚洲综合亚洲| 97日日碰碰| 人人操操97| 超级碰人人操人人干| 五月婷婷综合在线视频| 99网址在线观看| 久久人人添人人爽添人人片αV| 九九无码AV| 99天天操夜夜操| 91在线精品一区二区| 婷婷五月丁香国产| 久久综合图片| 综合精品啪啪| 9热在线视频精品| 色欲婷婷五月天丁香| 五月婷婷色啪| w婷婷五月婷婷w| 婷婷在线免费| 国产伊人五月天| 日本色婷婷久久99精品91| 亚洲婷婷月丁香五月| www.色窝| 九月丁香五月婷婷| 天天精品视频免费观看| 色丁香五月婷婷| 亚洲网视屏| www.丁香五月| 最近中文字幕2019视频1| 亚洲六月综合激情久久下卡| 高清 码 免费看片短视频| 亚洲顶级VA在线观看-高清完整版在线影院观看-S022AV | 婷婷五月天基地| 激情内射人妻1区2区3区| 99色人| 伊人九九热| 狼人久草| 久久av电影| 婷婷色情六月| 99热综合网| 久碰视频| 精品无码片| 伊人碰碰碰| 久久综合热17c| www,av好吊操| 六月婷婷激情| 精品国产AV色一区二区深夜久久| 3DAV亚洲香蕉久久 一区二区| 久久婷婷丁香| 狠狠人人| 五月成人网站| 婷婷丁香六月天| 99欧美热| 婷婷射丁香| 可以直接看的av网站| 99热国产免费| 色久综合| 婷婷第一页| 丁香五月天色| 婷婷丁香人妻天天爽| 色播五月| 婷婷五月天大香蕉在线视频观看| 91色婷婷综合久久中文字幕二区| 青青草婷婷综合五月| www.婷婷五月天| 亚洲综合激情五月久久| 亚洲欧美国产A片免费观看| 大香蕉九九| 99热99干| 丰满人妻一区二区三区| 91亚洲免费片| 婷婷丁香成人在线视频| 狠狠干综合网| wwwav大香蕉| 国产激情AV| www激情五月天| 成人AV在线电影| 婷婷久久影院| 色丁香久综合在线久综合在线观看| www,色婷婷| 清纯唯美 激情四射| 日本熟妇精品99| 99re视频精品| 99这里只有精品| 九九热10| 婷婷五月天无码| 97人妻超级碰碰碰碰碰| 99爱视频精品| 丁香六月婷婷久久综合| 日本色99网站| 精品网站99| 久久视频婷婷视频| 99热日本精品| 色婷婷丁香AV综合| 五月天偷拍| 秋霞A V毛片| 久久99网| 影音先锋一区二区资源站| 成人片久久网站| 99久久久久| 热99久| 婷婷五月综合激情免费视频| 国产精品久久久久久喷浆| 久久er免费视频| 九九色婷婷| 久综合| 激情婷婷五月天| 人人97操| 青青草原精品久久| 91夫妻视频| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 久色视频首页| 五月天丁香| 草综合网| 99九九视频| 玖玖综合色| av在线中文| 久久久久久99精品无码| 夜夜爽天天爽| 伊人久热91| 26uuu在线观看| 日本全黄一级999| 久久开心五月天激情| 五月天婷婷色综合| 婷婷五月天干干| 99视频啪啪| 久久九九视频| 伊人丁香五月婷婷潮吹| 婷婷丁香五月高清| 人操91在线| 色五月婷婷久久| 五月视频日本免费观看| 日韩无码色色| site:xiongshengzz.com| 婷婷五月天成人| 琪琪理论片| 97精品人人A片免费看| 另类丁香五月天区图| 青青久在线视频免费观看| 婷婷五月开心中文字幕在线| 99精日本久久| 97 A I色色| www.综合久久.com| 亚洲操逼网| 激情五月天婷婷久久久久久久久久久| 九九激情网| 99re这里有精品手机在线| 欧美va亚洲va| 色五月丁香总合网| 中文字幕日产A片在线看| 青青草护士中出内射-欧美电影在线天堂新版 | 六月丁香VA| 六月婷婷色色色| 丁香五月自拍| 综合久久婷婷五月丁香| 国产精品人成A片一区二区| 丰满人妻一区三区三区| 成人AV播放| 丁香五月婷婷偷拍| 色五月天.con| 九九亚洲天堂| 久热只有精品| 婷婷六月色开| 日韩一区二区A片免费观看| Www.激情| 久久久久9| 天堂成人A片永久免费网站| 成人性爱无码| 91操片| 开心激情站| 丁香五月另类小说| 玖玖综合色| 成人综合视频网址| 婷婷五月综合色拍| 停停色综合伊人| 亭亭丁香97| 日本婷婷| 自拍盗摄 另类| 91viP在线看| 激情综合网激情五月俺也去| 先锋资源91| 精品综合久久久久久五月天| 九九超日本| 久久九九综合| 亚洲成人婷婷| 夜夜骑操AV| 9 1大香蕉| av在线资源| 欧美中文五月天| 精品色情一区二区三区四区| 黄色99热| 无码激情AAAAA片-区区| 丁香五月六月综合激情| 人妻性爱| 色九亚洲| 久久婷婷一级片| 五月天啪啪啪| 99热国产免费| wwwxxx五月婷婷小说| 久婷婷| 91久久九九| 日本精品久久久久中文字幕| 性色婷婷| 热99AV网站| 亚洲精品操一操、噜一噜、摸一摸、爽| 人妻中文字幕精品| 五月网站| 亚洲无码99| 成人在线视频一区| 婷婷开心综合人妻小说网址| 1024操逼视频| 淫视馆av三区| WWW.国产| 日本丁香五月| 99久在线观看| 日韩三级高清无码| 美女主播野战视步页| 色玖玖| 六月婷婷啪啪| 色婷婷aV四虎| 国产亚洲精品久久久久久久久动漫| 97碰在线视频| 久久在线大香蕉| 伊人AV五月婷| 人人干Av| 狠狠草婷婷| 丁香五月天在线观看视频| 欧美日比视频| 美国不卡视频| 99热黄| 婷婷亚洲在线| 超碰国产在线播放| 国外亚洲成AV人片在线观看 | 丁香色五月AV在线| 91久久久久| 五月婷婷色在线| 欧美性猛交XXXX乱大交极品| 99在线观看| 五月激情综合网| 五月激情影视| 夜夜操天天干| 丁香五月婷婷六月| 久久ww| 亚洲综合五月天婷婷丁香| 综合99在线| 超级碰人人操人人干| 丁香六月亚洲| 亚洲免费电影2| 婷婷WWW久久| 五月色丁香婷婷综合| 人妻Av在线| 大香蕉丁香| 99人妻碰碰碰久久久久视| 99热狠狠操| 欧美大香蕉视频| 日韩另类| 激情综合女人网五月播播| 婷婷久久久久久久| 99er免费在线观看| 人人摸人人射| 五月婷婷丁香色播网| 欧美人人草| 狠狠干五月天| 欧洲亚洲免费视频9| 五月花激情| 超碰91在线| 久久久亚洲精品一区二区三区浴池| 狠狠精品干练久久久无码中文字幕| 婷婷色五月91啪啪| 97碰 在线视频观看| 五月香蕉网| 99欧州偷拍视频| 思思热久久阴99| 九九热视频免费观看| 五月激情婷婷六月| 国产这里只有精品| 国产激情综合五月久久| 色播丁香| 亚洲成人在线电影网站| 中文字幕婷婷在线| 五月丁香婷婷综合网| 乱女乱妇熟女熟妇综合网站| 色五月天成人在线| 亚洲第一第二网站| WWW久久久| 欧美私人家庭影院| 丁香五月天社区婷婷| 人人综合久| 色色色色色色色综合| 五月婷婷福利| 99热爱爱干干日| 少妇性BBB搡BBB爽爽爽视頻| 极品五月天| 狠狠色婷婷777| 激情五月网站| 99视频只有精品| 中文字幕成人| 色婷婷综合在线| 99久久久| 丁香涩涩爱| 成人丁香五月| 91re色综合视频| 97九色| 1010日日无码| 超碰免费人人| 亚洲正能量欧美| 97超碰综合| 洗浴中心操B视频| 99色性爰网络| 中文字幕综合色| 那里有AV网址| 五月丁香婷婷成人网| 久久五月丁香| 五月婷婷国产| 成人色情五月天婷婷丁香| 天天操夜夜操| 久久99热网| 黄色三级日本| 深爱激情网综合| 91操人视频| 综合色吧| 色小说五月婷婷| 九九久久精品| 日韩啪图| 爱草视频在线| www色色com| 综合网色综合| 丁香五月激情六月综合| 色五月首页| 91九色成人原创视频| 精品无码色| 婷香五月| 亚洲精品成人片在线播| 我爱婷婷五月天综合88| 免费AV播放| 99久久新视频| A久网| 无遮挡国产高潮视频免费观看| 久久精品9| www.国产色| 婷婷久综合| 精品久久人妻热| 丁香色色网| www一起操在线观看| 影音先锋人妻出差| 五月天激情网站| 狠狠干综合| 久久色天堂| 99久久五月丁香野外| 久色五月| AA片在线观看视频在线播放| 国产片天天爽夜夜爽| 啪啪激情综合| 亭亭玉月丁香| 亚洲aV写真天天综合网久久| 超碰97在线操| 婷婷五月天无码视频| 五月婷婷,六月丁香| 伊人久久大香线蕉av最新| 性爱久久| 99婷婷五月天激情| av五月天婷婷丁香| 欧美97p| 爽tv | 丁香六月婷婷综合麻豆| 91精品国产99久久久久久天美| 香蕉操亚洲| 五月丁香成年黄色| 99热九九在线| 天天插天天爽| 久久婷中文字幕| 丁香五月中文字幕色播| 五月丁香综合影院| 亚洲色色色| 99乱视频| 99热人人| 色婷婷丁香五月| 五月丁香婷婷色| 五月婷婷色男女| 性爱网五月婷婷|