免费国产精品自在自线-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
返回資訊列表
婷婷丁香综合色AV| 日韩精品色| 五月天婷婷基地| 色五月丁香一区在线| 色情终和网| 色色色色色色网站| 热99久久这里只有精品| 久久综合激情| 一级黄色操B| 日韩成人电影AV| 99色1| 大香蕉久久婷婷| 日韩成人电影AV| 久久视频这里99| 久久天天天| 在线色婷婷| 激情五月天综合| 综合网五月天123| 色色色婷婷五月| 久久精品一区二区三区四区| 丁香五月婷久久| 人人爽欧美婷婷久久久五月丁香| 婷婷丁香六月影视| 五月丁香六月色婷婷综合五月天| 久久婷婷色情7777网站| 久久综合9| 99久久网站| 天天拍夜夜爽日日| 加勒比色色| 九色在线观看91av| 欧美超碰亚洲| 狠狠色综合久久久久| 日日夜夜婷婷| 91操熟女| 日韩欧洲亚洲| 综合久久9| 日日懆天天懆| 五月亭亭综合五码| 精品少妇蜜臀91| 天天爽在线视频| 婷婷九月在线| 97人妻人人| 淫五月停停| 色色色色色色网站| 能看的av网站| 精品人妻一区| 成人片在线播放| 91狠狠综合网| 国产免费一区二区三州老师F1F1| 人人操插| 开心激情综合| 99九九精品| 色五月天丁香| 久久激情网| 久久9精品| 激情五月天网站| 亚洲色激情| 色色亚卅| 99re思思热久久| 色婷婷五月天在线| www夜夜操comwww| 丁香五月天精品| 人人玩人人橾| 亚洲五月天伊人| 丁香五月天激情网址| 啪啪综合| 色综久久AV| 狠狠舔| 色色婷婷五月天| 国产在线黄色| 丁香色五月婷婷17C| 色综合激情| 老妇操B| 日本123区日韩欧美不卡在线看| 日韩AV在线免费| 九九艹女| 操比激情五月| 日本操碰碰| 久久久久激情| 日韩一区二区在线播放| 丁香八月综合激情| 五月六月伦理| 婷婷网五月天| 人妻丰满精品一区二区A片| 天天干天天做| 最熟少妇乱码| 丁香五月婷婷啪啪| 六月五月久久丁香| 久久九九免费视频| 69精品人人人人| 久热大香蕉| 狠狠色婷婷7777久| 亚洲网综合在线| 岛国AAAV| 中文字幕婷婷| 婷婷五月天色网久| 丁香五月,激情五月,深爱五月| 色色免费网战视频| 色五月婷婷av| 中日韩美欧成人一区二区精品在线| 色婷丁香91| 中文字幕婷婷在线| 五月总合激情网| 综合激情网| 密桃激情五月天综合网| 日本色图综合| 日本三级99人妇网站| www99精品在线观看| 亚洲精品444久久久久久| 久久人五月| 婷婷五月天成人在线视频| 99惹在线精品免费观看| 丁香五月激情啪啪| 五月综合激情网| 国产做爰视频免费播放| 成人视频在线免费播放| 久久久五月激| 超碰免费人妻| 丁香五月婷婷高清| 激情无码五月天| 色欲资源网| 天天舔天天摸| 九色视频九色九色91jiuseshipin| 99色.com| 婷婷五月天亚洲激情戏精品| 婷婷四色五月| 999九九九久久久99HD| www.色9| 色婷婷婷综合五月天| 激情五月天综合| 开心激情网五月天| 五月丁香中文婷婷中文| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 中文网婷婷字幕婷| 激情www.98com| 99精品综合视频| 九九热视频在线观看| 日日操夜夜操中国无码| 亚洲99视频| 97干欧美| 亚州色综合| 99色6爱9热| 另类激情五月天| 丁香五月天啪啪| 精品日本视频444| 热99这里只是精品| 日韩AV片| 色噜噜狠狠色综合网| 色色色色色色色色色999| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 婷婷在线精品| 五月天成人免费视频| 欧美大片免费播放器| 99热综合在线| 五月天成人免费视频| 免费视频无码| 97色在线| 伊人啪啪网| 看逼中文字幕| 天天干com| 九九色精品| 九九人人看| 思思99热这里只有精品6| 婷婷丁香五月综合| 色婷精品91| 丁香色婷婷五月天| 激情五月天婷婷色色色色色色色色色色色 | 色色色色色综合| 丰满少妇猛烈A片免费看观看| 亚洲成人AV在线观看| 99re这里只有精品视频了| 人妻久久久| 国产成人av在线| 综合久久五月天| 亚洲深喉aV| 成人五月天在线观看| 99久.| 91精产一区三区免费观看| www,婷婷五月天,com| 国产精产国品一二三在观看| 免費亭亭成人| 91男人操女人视频| 丁香美女主播视频在线观看| 五月丁香婷婷激情图片| 丁香五月天激情免费在线观看AV777| 秋霞AV吧| 天天情色综合网| 五月丁香婷婷钟和色图| 激情综合五月色丁香婷婷| 天天日天天舔| 五月婷婷激清网| 国产高清av黄色看片| 色综合网上班开心婷婷久久| AV中文在线| 亚洲激情四射| XX色综合| 人人摸人人搞| 久草A片| 99干99| 天天综合五月天| 亚洲天堂啪啪| 综合久| 五月天婷婷黄色视频| 亚洲综合激情五月久久| 狠狠干在线视频| 五月丁香色停停啪啪啪| 久久婷婷五月| 综合亚洲六月婷婷在线| 五月天伊人| www.五月婷婷久久.com| 色色色色色综合| 99精品在线| 色婷婷88| 国产99久久久国产精品免费看| 丁香五月天殴美激情| 91干网站| 亚洲天堂啪啪| 丁香五月天婷婷久久| 激情综合色婷婷啪啪六月天| 狠狠色噜噜狠狠狠888| 久9热| 五月天天天操天天爽夜夜操| 精品热青草| 激情五月天色播| 99色在线观看| 99国产97在线,| 麻豆雪千夏| 婷婷六月色| 免费看欧美成人A片无码| 九九热视频免费的| 丁香久月婷| 婷婷伊人| 99久久综合| 国产 亚洲 在线| 色五月婷婷中文字幕| 天堂AV在线看| 成久综合视频| 超碰色天堂| 色五月激情综合网| 色五狠狠| 激情 五月 婷婷 丁香| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 激情综合五月| 丁香六月婷婷色播| 婷婷狠狠五月综合| 九九色精品| AⅤ网站在线看| 狠狠干,狠狠操| 思思久ren热| 91n啪啪| 日本色天堂| www.色婷婷。com| 涩 五月 婷婷 狠狠| 99久久综合网| 九色91视频| 欧美丁香婷婷天天操| 丁香婷婷五月天成人| 丁香六月久久| 综合婷婷五月天| 丁香六月天AV| 午夜成人网站在线观看| 亚洲久艹| 99热精品无码| 亚洲 在线 性爱| 26uuu丁香婷婷五月| 99无码精品| 天天肏高清在线| 色婷婷丁香AV综合| 色色色视频免费无码 | 五月婷婷我| 级情九色| 婷婷九月狠狠色| 婷婷五月天天| 欧美成人精品三区综合A片| 停停五月色宗合| 777精品成人a v久久| 狠狠第四色| 91av传媒高清在线视频网| 色啪影院| 久99久在线| 综合久久人妻| 亚州性爱99| sS丁香五月婷婷| 99无码视频| 99久久6| 丁香五月天殴美激情| 在线99精品| 五月婷性爱| 婷婷亚洲天堂| 五月丁香综合激情| 91精品丝袜久久久久久| 九九在线精点品| 久久最新色| 色五XX| 深爱五月天天| 激情九九综合网| 热这里只有精| WWW丁香五月| 九九精品在线视频观看| 五月总合激情网| 久久九区| 噜噜噜噜噜久| 蜜臀av无码久久久久久久久| 国产精品久久久99视频| 深情六月婷婷综合久久| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 亚洲综合欧美色丁香婷婷888月图片| 人妻内射一区二区在线视频| 亚洲精品又粗又大又爽A片| 99国产在线| 婷婷五月av| 丁香婷婷九月| 婷婷性爱影院| 色五月首页| 伊人五月天| 99热这里有精品| 久热婷婷| 极品人妻VIDEOSSS人妻| 2025神马午夜福利| 人人97操| 9l视频自拍9l九色9l成人| 久久久精品AV| 激情宗合哪里能看| 色综合久久伊伊婷婷五月| 色五月婷婷成人视频| 99久久99热| 尤物一区二区| 99视频在线看| 夜夜大香蕉婷婷丁香| 婷婷99视频精品| 亚洲成人网在线观看| 久久9久| 天天天久久久| 久久久久久综合五月婷婷| 五月精品免费XXX| 亚洲欧美国产高清vA在线播放| 99热无码首页| 亚洲色另类| 91凹凸在线| 五月天激情亚洲| 天天干天天爽| 国产永久一黄| 日日爱678| 5月色亭亭视频| 五月天婷婷开心| 成人超碰Av| 九九热最新| 丁香综合网| 欧美成人精品A片免费一区99| 色 色 色综合com| 狠狠综合网| 激情五月丁香五月| 超碰在线50| 久久机热探花| 欧美激情五月天婷婷| 五月色欧洲| 久久机热/这里只有精品| 97色天堂| 97久久人人人干| 丁香五月婷婷久久久| 激情99热| 丁香婷婷五月基地| 久热无码| CAoub青青超碰| 99久在线精品99re8热| 五月丁香婷中文字幕| 日本va欧美va国产激情| 天天做天天爱| 99riAv1国产在线观看| 久久久久久草黄色片AV在线观看| 欧美α√| 免费视频WWW在线观看网站| 91窝窝| 五月天激情四射| 六月丁香五月激情婷婷| 六月婷婷无码观看| 人人综合久| 国产亚洲成AV人片在线观黄桃| av五月丁香婷婷网| 天天色综合色| 激情九月婷婷| 热久久色| 婷婷激情五月天在线| 99ri精品| 9精品视频在线| 综合狠狠五月婷婷| 日本三级黄色大片| 欧美性爱中文字幕| 婷婷五月花西瓜| 超碰在线国产| 99热九九在线| 激情网婷婷婷| 免费观看欧美成人AA片爱我多深| 日本久久天堂| 超碰免费99| 欧美槡BBBB槡BBB少妇| 丁香五月色网| 五月丁香六月激情啪| 日本丁香五月| 丁香五月天综合| 青青草原爱爱网| 五月天婷婷丁香花| 99视频内射三四| 色综合久久综合| 婷婷五月婷婷五月天| 九九re精品视频在线观看| 九九婷婷激情综合网| 少妇激情基地| 久色大| 丁香色色五月| 五月天激情啪啪| 狠狠穞A片一區二區三區| 五月天久久综合| 这里精品| 996热re视频在线观看视频| 99热这里只有精品国产免费| 99免费视频| 综合视频久久| 亚洲综合九九| 色综合婷婷| 97超碰在线免费观看| 69人人操人人爽| 五月激情偷拍婷婷| 69超碰在线| 婷婷天天五月天| sewuyue第四色| www.五月丁香| 免费色色色| 色五月激情网| 熟女重口味αV| 亚洲色综合| 五月天激情黄色小说在线观看| 色色色综合网| 九色视频91疯狂| 国产精品视频| 九九亚洲视频| 另类小说五月天| 亚洲在线激情婷婷五月| 狠狠精品干练久久久无码中文字幕 | 67194中文字幕| 97热九九| 成人精品在线观看| 婷婷五月丁香影院| 日韩黄色中文字幕| 五月天综合图片| 丁香婷婷五月天成人| 夜夜操激情| 9热超碰| 深夜A片| 激情图片五月天| 天天做天天爱天天摸| 99热久久这里只有精品| 激情五月婷婷开心网| 肏屄色播伊人97婷婷| 超碰人人艹| 九九热色视频| 婷婷五月天VI| 99精彩视频| 国产操B视频| 色婷婷综合网| 91啪级电影| 狠狠色中色| 免费观看大片视频 丁香婷婷 六月欧美| 99五月婷| 亚洲日韩乱码一区二区三区四区 | 色播五月丁香综合| 九九99热| 射婷婷中文字幕| 五月丁香综合| 6080av| 99久久视频| 伊人五月天| 五月激情六月综合| 有码人妻久久| 激情开心五月天| 五月天婷婷色小说| 啪啪激情综合| 啪啪啪丁香五月| 五月天综合婷婷| www,五月天激情| 色色色色色色色色五月先| 国产AV一区二区三区日韩| 天天舔天天摸| 激情综合另类| 99丁香五月婷| 色婷婷777狠狠| 大香伊人久色| 久久久久久久人妻| 亚洲人妻Av| 五月天婷婷开心| 九九热中文| 91婷婷丁香五月亚洲| 丁香五月六月| 天堂久久婷婷| 丁婷婷五月天在线播放| 婷婷五月丁香基| 伊人久久大香线蕉av最新| 97超级碰人人| 日产精品久久久久久久蜜臀| 久久婷婷五月| 超碰在线精品| 久久性爱视频| 国产日韩av片| 99精品综合在线| 久久九九99| 成人 在线 日韩| 开心深爱激情网| 99色色最新视频| 69热在线| 成人视频一区| 91丨九色丨白浆秘| 大香蕉Av在线| 婷婷伊人五月丁香天堂网| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 五月婷婷丁香| 色色网站| 青草五月天| 丁香五月香蕉| 激情六月婷婷| 久久久精品AV| 五月婷婷激情性爱| 噜噜色五月| 五月花激情| 天天草天天日| 激情五月婷婷在线| 欧美性爱5月天天天看| 久色视频首页| 亚洲中文无码成人| wwW天天干| 99在线精品视频免费| 亚洲欧美在线观看| 婷婷丁香社区| 亚洲中文字幕在线观看| 高清资源站日A美A欧亚…| 激情婷婷丁香| 五月天久久色| 狠狠色噜噜狠| 五月婷性爱| 成人精品免费在线观看| 97色综合视频| 操人视频91| 色蜜婷婷| 秋霞A V毛片| 91操操| 九九热在线精品视频| 狠狠色婷婷| 久久久久9| 色五月人妻| 色综合色色| 丁香六月天| 亚洲电影在线观看| 色婷婷激情视频| 五月色激情综合网| aaa久久| www九九热| 五月丁香六月婷婷,婷| 99精品这里只有免费视频| 欧美精品久久久久久视频观看| 狠狠做五月婷婷| 婷婷成人小说综合| 久色视频| 日日爽日日| 五月综合色| 五月激香蕉网| 操人精品| 综合激情伊人影视在线| 色五月丁香激情| 久久久精品人妻录| 婷婷六月激情| 香蕉久久av一区二区三区| 亚洲久久天堂| 182TV亚洲| 噜综合| 婷婷五月伦理| 亚洲在线操| 激情婷婷丁香| 综合www色| 欧亚洲在线高清视频| 天天爱天天做天天舔| 色婷婷九月| 97干视频在线| 国产精品第一国产精品| 久久九九re热| 婷婷激情五月天激情在线| 色婷婷五月综合网| 色综合九九| 荫道BBWBBB高潮潮喷| 久久精品噜噜噜成人A∨色欲| 久久久久9| 欧美亚洲婷婷五月| 狠狠色婷婷777| 五月日韩中文字幕| 五月婷婷亚洲| 亚洲综合狠狠艹| 日本啪啪网| 国产人妻人伦精品一区二区| 五月天婷婷情色| 国产日韩欧美性生活| 综合久久五月天| 99热精品在线| 婷婷五月天AV在线| A色色| 超碰精品在线| 五月丁香综合网| 五月丁香亚洲校园欧美| 婷婷综合网| 丰满老熟妇BBBBB搡BBB| 92国产福利| 婷婷之六月丁香| 欧美在线干| 97色碰碰公开视频| 婷婷丁香久久五月综合| 丁香五月综合婷婷| 97操男人的天堂| 99热免费网站| 成人av中文字幕| 九热网站| 婷婷色天香| 97狠狠色| 正宗黄色毛片| 精品A√| 裸体做A爰片毛片A片免费| 99re久热只有精品6在线直播.com| 丁香五月婷婷天激情| 婷婷婷婷婷婷婷五月丁香| 曰本aaaaaa丈片| 色播五月天天| 色丁香五月婷婷| 五月天久久www| 久久人妻久久| 五月丁香婷婷伊人日韩| 五月丁香在线婷婷蜜桃| 久久久久久欧美精品se一二三四| 婷婷涩五月| 欧洲色| 五月天婷婷激情六月久久| 这里只有精品视频国产| 久久激情五月婷婷| 翔田千里 50岁 无码| 色噜噜五月天| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | www婷婷| 婷婷欧美综合| 五月天婷婷免费| 狠狠综合色网| 五月天婷婷丁香| 九九伦子片| 精品九九视频| 牛色色碰| 久久久区区一久久久久久| 日日干夜夜干| 色五月天综合| 国外亚洲成AV人片在线观看| 26UUU成人网| 婷婷五月在线视频| 激情五月开心五月在线视频| 五月丁香婷婷综合网| WWW久久久| 中文字幕AV在线播放| 99久超碰| 色狠狠综合| 妇激情基地| 可以直接看的AV| 婷婷性爱| 激情五月婷婷| 伊人狠狠综合| 九九综合九色欧美狠狠| 色XX综合网| 91亚洲天堂| 久操97| 九色91视频| 久久伊人大香蕉| 六月丁香激情综合网| 婷婷五月天影院| 亚洲激情99| αv中文字幕在线观| 色五月婷婷天天操夜夜操| 天天色凹凸| 色色色色热| 99热99美国在线观看| 亚洲综合视频在线| 永久的网站AAAA | wwwss在线观看| 五月天激情小说| 丁香婷婷啪啪啪| 婷婷五月综合丁香久久| 欧美激情VA永久在线播放| 久久九九玖玖| 五月婷婷激情综合| SESE无码AV| 超碰无码318604| 婷婷金品综合视频| 我要色综合五月婷婷| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久丁香五月婷| www.色综合.com| 99久久久久| 五月天玖玖狠狠色色| 青青草Avb在线| 免费黄色片子| 丁香五月婷婷乱| 色婷婷精品视频| 亚洲激情另类| 六月丁香色婷婷| 亚洲AV成人片无码网站| 日韩黄色中文字幕| 超碰资源在线| 五月丁香WWW| 五月色婷婷夜色| 欧美在线干| 亚洲色域网| 亚洲色图81p| AV大香蕉| 99亚洲精品| 五月婷婷开心色伊人| 一区二区三区四区牛| 五月丁香婷婷综合网| 色狠狠综合| 综合AV在线| 五月天丁香久久综合| 欧洲亚洲免费视频9| 丁香花五月天| 久热黄色| 色五月色开心开心五月| 婷婷五月激情中文字幕| 97婷婷丁香| 久久艹网| 另类国产区| 天天做天天爱高潮片| 很很干在线视频| 人人草开心五月天| 综合激情视频| 碰碰碰97国产| 五月婷中文字幕| 激情五月婷婷色综合| 裸体美女丁香五月天。| 五月丁香六月色| 婷婷99狠| 狠狠干综合| 丁香五月在线观看完整版| 久婷婷婷| 日韩ww| 综合网啪啪| 天天操天天操天天操| 99久热| 99精品国产在热久久| 蜜乳人妻一区二区三区| 国产成人VA| 激情五月婷婷视频一区二区三区| 婷婷久草| 色情婷婷。| 五月综合亚洲婷婷| 黄网免费观看| 色噜噜狠狠狠狠色综合久欧美| 99操逼视频| 思思热国产| 五月激情影视| 丁香五月综合无码趴趴| 日操五月婷| 在线成人网址| 七七久久综合| Se.婷婷五月天| 婷婷五月影院| 亚州男人天堂婷婷五月| 久思思久视频| 4438激情网| 91色性感五月婷婷丁香| 激情六| 五月天天天天天天天天天天天天天天天婷婷婷| 国产午夜精品AV一区二区麻豆| 日本久久超碰| 久久丁香久久| AA片在线观看视频在线播放| 婷婷永久在线| 色噜噜狠噜噜视频| 五月婷婷 婷婷五月 一区二区 久久久 | 久操欧美在线观看97| 成人 在线 日韩| 99A片| 九九九九九999999| 丁香婷婷精品视频| 色六月婷婷| 五月婷婷黄色毛片| 丁香婷婷色五月合集| 婷婷六月天| 91碰| 丁香久久久| 色99欧洲色19| 丁香欧美| 最近中文字幕2019视频1| 涩五月婷婷| 国产成人AV在线播放| 日韩无码亚欧无码| 色婷婷a三区麻| 九九热视频在线观看| 丁香五月性| www.五月婷婷.com| 91人操人人人操人| 991自拍视频| 99精品爱| 99超超碰| www.五月天婷婷姐姐| 国产成人+综合亚洲+天堂| 99色综合网| 久久五月激情综合| 五月天桃色深爱网| 狠狠香蕉| 婷婷久月| 色欲丁香| 三级三久久线久久99久目本WW| 亚洲成人另类| 啪啪操超碰| 婷婷六月综合基地| 涩五月婷婷| 丁香五月天婷婷91| 五月天狠狠网| 色婷婷女优有码五月亭| 天天日夜夜拍| 人妻中文av| 六月婷婷中文字幕| 色射7856五月天激情四射| 99热.com| 精品综合爱| 热99在线精品| 丁香六月婷婷久久高清| 99久在线观看| 伊人久久大香网| 日韩啪啪视频| 97久久超碰| 91碰碰碰| 96人人操人人操人人| 这里有精品| 蜜乳A√| 丁香五月综合网| 婷婷丁香色情| 99热在线看| 天天干天天干天天干| 五月天激情网址| 性色婷婷| 丁香色五月婷婷17C| 丁香九月婷婷| 久久99色色| 丁香五月色激情| 丁婷婷五月天在线播放| 五月丁香花激情综合网| 超碰99在线观看| 久久五月视频| 五月日韩中文字幕| 玖玖资源站蜜臀| 五月天婷婷激情网| 五月丁香福利| 激情深爱综合| 97爱艹婷婷开心丁香激情综合| 天天视频亚洲| 五月婷久久久| 思思热视频| 激情亚洲色图片丁香综合| 国产性爱大片久久| 色色日本欧美| 99免费热在线精品| 97色五月婷婷在线| 思思热精品在线| 玖玖综合网| 色色99| 有哪些A片网站| 涩九九九九| 五月丁香综合网| 婷婷九月丁香久久| 97操碰在线视频| 色色色色五月| 日韩久久这里只有精品| 丁香玖玖视频大全| 婷婷丁香人妻天天爽| 天天拍夜夜爽| 婷婷五月丁香超碰| 色婷婷色五月综合| 欧美色碰| 色婷久久| 玖玖资源站中文| 97av在线视频| 九九色婷婷五月天| 婷婷五月天亚洲综合| 天天综合久久| 亚洲中文AV网站| 99色视频| 五月开行婷婷色五月| 日本综合色色| 五月婷婷黄色网址| 婷婷五月天激情综合| 五月丁香六月婷婷中合网| 久草网大香视频| 婷婷五月天av| www天天色天天射| 天天噜天天插| 岛国资源站| 操91| 超碰99资源站| 婷婷深爱五月亚洲综合| 久久久婷婷五月亚洲97号色| 亚洲蜜桃精久久久久久久久久久久| 成人丁香| 国产日日夜夜操| 狠狠爱婷婷爱| 久综合4| 99色网站| 精品久久这里热66| 九九一综合精品| 中文字幕,综合,91| 亚洲成人AV高清字幕| 很操日本7| 9久热在线视频精品| 久草婷婷网 | 亚洲色爱综合| 亚州激情网站无码| 久99久精品视频| 国产干逼片| 六月婷婷五月丁香| 久热这里| 日日狠夜夜狠| 深爱五月激情综合| 91精品人妻少妇无码影院| 婷婷五月丁香激情| 无码色| 亚洲激情综| 久久婷婷激情视频| 好好日激情五月天| 97人人干人人操| 日韩五月婷婷| 丁香五月婷婷综合精品素人| xxx日本东京热| 色综合夜夜| 天堂成人久久| 丁香花五月天社区| 无码一区精品一区视频| 26uuu欧美| 中文AV在线播放| 可以直接看的av| 色天天综合成人网| 2025中文在线视频字幕免费观看| 六月婷婷av| 激情婷婷九月| 成片免费观看大全| 久久婷婷五月丁香蜜桃网| 亚洲超碰在线| 丁香五月婷婷影院| 激情综合网五月丁香| 亚洲国产99| 26uuu欧美宗合| 99色热视频| 婷婷五月天无码熟女| 日韩色色色色色| 亚洲不卡| 99在线视频精品| 婷婷色在线播放| 91精品综合久久久久久五月丁香| 色女人久久| 五月天婷婷基地| 99热在这里只有精品| 婷婷丁香色五月久久88| 六月婷婷网站| 亚洲射激情| 天天综合天天做天天综合| 五月花综合网| 视频综合网| 丁香五月影院| 亚洲激情在线| 伊人久久婷婷| 男女99免费视频| 99日在线视频| 91精品久久久久久久| 色婷天天| 婷婷五月激情图片| 久9久9久9久9久9久9| 日韩超碰在线| 婷婷97碰碰| 欧美日韩成人免费在线| 五月 成人 婷婷| 91婷婷色| 99热国产精品| 久久九九综合| 久久这里这里有精品免费视频| 五月丁香婷婷色| 99这里只有精品视频免费| 无码地址| 天天摸天天舔天天爽| 五月丁香六月激情综合啪啪| 五月天色婷婷视频| 综合久久五月| 激情五月深爱婷婷| 五月久视频| 91se在线观看| 超碰人人干| 五月婷视频| 99无码精品| 97丨九色丨国产丨PORNY| 五月婷婷玖玖综合玖玖爱| 久草 tingting| 色色色色色综合| 9月色婷婷| 人妻AV在线| 美臀自射自家人妻| 玖久精品视频9| 精品A√| 蜜臀av粉嫩av懂色av| 久久曰曰| 女人高潮内射99精品| 丁香六月丁香婷婷激情| 色97啪啪| 超碰人人超碰| A一级操| 99热免费精品| 99热国产| 婷婷五月天亚洲天堂| 狠狠操性爱av| 婷婷 伊人 久久| 丁香五月成人社区| www.99热国产| 丁香综合久久| 婷婷五月天色色| 国产Va视频| 热99精品视频| 综合一区二区三区| 五月丁香网站| www.lchjjc.com| 黄久久久| 婷婷五月花免费视频在线| 久久这里有精品99| 色五月婷婷五月天| 亚洲欧美婷婷五月色综合| 色婷婷性爱网| 99久久精品国产色欲| 五月欧美色播| 精品,99| 亚洲99综合| 亚洲精品又粗又大又爽A片| 精品操逼一区二区| 五夜婷婷| 婷婷五月天激情AV影院| 干一干xxxx| 天天做天天爱天天爽| 久久五月天丁香| 操99| 色偷偷狠狠| 操久久网| 伊人婷婷99热精品| 色噜噜狠狠色综合成人网| 五月丁香直播| 亚洲婷婷五月| 亚洲视频一区| 日本97在线| 丁香婷婷六月天| 色老久久| 超碰9799| 秋霞A V毛片| 五月停停丁香| 婷婷色网| 婷婷综合干| site:jszngf.com| 丁香婷婷社区| 欧美69久成人做爰视频| 大香蕉中文| 九月色婷婷综合| 狠狠综合| 天天透天天干| 天天舔天天摸天天射| av在线免费网站 | 五月桃花网综合| 久婷五月| 五月婷av| 天天干天天干天天干| 丁香婷婷91在线观看视频| 米奇影视资源777狠狠色婷婷五月天激情网 | 欧洲激情五月天婷婷| 2020日日干| 伊人五月婷| 色婷婷WWW| 成人丁香| 婷婷色色网站| 开心五月六月婷婷| 最新va在线播放| 日韩AV免费看| 欧美婷婷六月丁香综合色| 丁香成人五月天| 激情婷婷丁香| 另类色视频| 婷婷五月大香蕉| 五月丁香激情综合网官网| 99区视频| 婷婷91| 9 1在线视频| 色色色色色色色色色999| 26uuu在线观看| 涩九九九九| 深爱激清网| www,黄色在线,con| 激情深爱婷婷网| 在线色色| www91在线| 99热亚洲精品| 欧美 色婷婷| 色婷婷4| 亚洲激情婷婷| 婷久久| 高清无码网址| 婷婷基地成人五月天| 五月婷六月丁| 99热国品| 99热国产在| 欧美性丁香色色五月天干干| 色狠狠色综合久久久绯色AⅤ影视| 在线1青婷| 91久久久久| 丁香五月综合在线播放 | 久久99热免费最新版| 色色草97| 永久AⅤ1| 丁香五月大香蕉在线99| 人妖色AV色综合| 久久婷婷五月综合啪| 免费观看全黄做爰的视频| 婷婷五月成人色综合| 欧美va在线| 成人视频一区| 99ri精品| 激情婷婷色色| 亚洲av成人在线| 亚洲操精品| 色婷精品91| 99九九在线观看免费| 六月婷婷久久| 色婷婷久久天天性爱| 91超级碰在线| www.日本91| 久久久久网站| 亚洲一区国产传媒| 狼人狠狠操| 亚洲在线操| 婷婷激情综合网| 九九热AV| www.夜夜操| 国产色色网址网站| 亚洲精品色| 色综合爱综合| 七七婷婷综合| 狠狠色婷婷六月激情网| 影音先锋男士资源网一区| 婷婷五月天堂一本在线| 色99欧洲色19| 综合噜噜| 狼友超碰| 亚洲人妻av| 天天肏屄夜夜爽| av亚洲国产小电影| 欧美97p| 91高潮喷水久久久久久久久| 九九热思思| 五月婷婷丁香啪啪| 97色婷婷成人综合在线观看| 激情婷婷| 三男玩一女三A片| 激情小说之五月| 欧在线一区| 偷偷操99| 久热这里只精品| 99国产精品久久久久久久久久久| 久色中文| 狠狠 久久| 五月天婷婷伊人| 色婷婷小说| 国产精品第一国产精品| 三级大香蕉网| 日本在线视频看se99| 99A级片| 五月婷婷在线视频免费观看| 三级片AAA久久久AAA久久久AAA| 26uuuuuuuu国产| 婷婷综合在线播放| 久草五月天| 激情婷婷丁香色情五月天| 色天使色综合| 97人妻碰碰碰久久香蕉| 伊人网欧美在线男人天堂五月丁香| 女人高潮内射99精品| 亚洲最大五月天成人网| 五夜丁香| 色婷婷网| 97碰久久| 成人做爰高潮A片免费视频 | www.夜夜夜| 亚洲国产黄色电影| 久9久9热久热| 狠狠人人| 久久综合五月婷婷| 五月丁香| 亚洲色vA| 99九九综合久久九九| 全部老头和老太XXXXX| 91婷婷五月天嫩女| 丁香五月影院| 激情五月天。| 91色操| 夜夜操少妇| 色www.con| 色噜噜狠狠色综无码久久合欧美| 天天日日综合| 色色色色欧洲| 五月婷婷综合天天操| 激情文学久久| 天天爽天天透天天爱| 丁香五月综合激情啪啪| 免费无码毛片一区二区A片 | 婷婷五月大| 就去色色五月丁香婷婷久久久| 欧洲亚洲免费视频9| 丁香五月天欧美在线| 久99在线视频| 97在线观视频免费观看| 五月丁香婷婷综合视频| 色你久久| AV中文在线| 久久99网| 九九精品免费| 色色AV色色色东莞| 丁香五月天色综合| 人人97操| 国产精品18久久久| 99热免费| 激情五月婷婷啪啪| 丁香 久久| 五月婷婷亚洲天堂97色婷婷| 色婷婷综合久久久久| 99色在线观看视频| 狠狠干狠狠色| 91操在线| 夫妇交换刺激做爰| 丁香九九九九| 激情六月婷| 深爱五月婷婷开心中文字幕| 玖玖色资源| 丁香五月欧美婷婷综合| 99这里只有精品|v| 天天激情欧美美女| 色狠狠伊人久久五月丁香| 日韩在线视频网站| 婷婷五月丁香综合瑟瑟| 色色婷婷五月| 五月综合激情| 色爱99| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 99热6色| 激情伊人五月婷婷久久| 97碰| 密视AV综合在线| 亚洲12p| 五月丁香啪啪网| 日本爆乳片手机在线播放| 婷婷五月天论坛| 这里只有精品,日韩视频| av国产精品偷| 狠狠 久久| 影音先锋91在线资源站| 人人操av| 香蕉综合在线| 欧美色色色色色色| 五月丁香在线看| 久久九九99亚洲国产久精综合|