欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

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
返回資訊列表
一区二区乱码视频| 色婷婷五月天在线观看| 97成人丁香| 精品人妻久久久久久久| 色五月自偷自拍婷婷婷婷| 激情深爱五月| 日本婷婷网| 搡BBBB搡BBB搡18| 99免费热视频| 久久婷出差欧美色两性综合网| 日韩中文字幕| 亚韩在线视频| 男人的天堂五月丁香| 在线99精品| 久久久中文| 啪啪啪啪五月天| 激情久久综合网| 超碰AV在线| 精品婷婷五月天| 九九伦子片| 9l视频自拍9l九色9l成人| site:esunnet.com| 综合久久影院| 色色色色色五月| 91九九| 色婷婷亚洲婷婷| 99热最新| 日操夜撸| 天天插天天很| 久久 婷婷 五月天| 极品九九九九九九| 七七色综合| 丁香五月婷婷五月| 五月天天天色| 丁香五月在线伊人| 色色色婷婷五月| 韩国真做片在线观看| 99热只有这里才是精品| 丁香婷婷免费| 8区视频在线| 欧美搡BBBBB摔BBBBB| 69色婷婷| 婷婷香五月天| 婷婷色色综合激情| 538在线| 色婷婷在线视频观看| 91久热| 五月天精品综合| 五月天大香蕉| 91超碰人人操| 色婷婷综合综合网| 女同激情久久av久久| 超碰AV在线| 夜夜谢天天干| 激情五月婷婷老师| 婷久看人爽| 久久久久激情网| 图片区 小说区 区 亚洲五月| 天天五月天综合网址| 怡红院院久久| 婷婷五月天少妇| 婷香五月| 91人人网| 黄色成人网站在线播放| 欧美色色色色色色色| 亚洲无码影音| 在线观看视频1区| 天天拍天天操| 激情综合久久| 亚洲天天| 狠狠干综合| 一级二级色大片| 色婷婷丁香特级性爱视频| 超碰在线人人| 涩综合在线| 999激情视频| 91九色 熟| 亚洲日本韩国| 九九综合88| 日本成人内射| 97色一二三| www.夜夜爱.com| 六月婷婷色色网| 97人妻超级碰碰碰碰碰| 激情骚五月| 激情人妻蜜夜系列区| 天天狠天天叉| 欧美S码亚洲码精品M码| 久久综合图片| 九色在线五月婷婷网址| 日本三日本三级少妇三级66| 狠狠色噜噜狠狠狠狠综合| 婷婷成人AV| 色一情一乱一乱91Av| 艹天天射| 欧美情月伍月天| 日日夜夜狠狠婷婷色| 五月玖玖| 天天色天天干天天插| 色五月在线| 婷婷五六日| 天天操九九插| 婷婷开心激情| 五月婷婷开心网| 120分钟婬片免费看| 99综合| 婷婷五月天激情网| 七七色综合| 无码动漫AV| A级毛片高清免费不卡播放谢谢谢谢| 丁香玖玖| 夜夜天天天天天干天天爽| 91操碰| ww亚洲ww在线观看| 五月婷婷 激情五月| 亚洲精品永久久久久久| 免费看欧美成人A片无码| 久久视频这里有精品99| 亚洲中文AV网站| 日本在线视频播放91| 九九热这里只有精品23| 天天激情| 精品欧美一区二区三区久久久| 爱操天堂| 思思热闹这里只有精品| 婷婷的色色五月天| 日本操B视频| 男人的天堂99| 97色五月天| 久色中文| 丁香五月性爱| 婷婷五月娱乐在线| www.狠狠色.com| 六月婷婷色综合| 色五月在线播放| 色五月婷婷777| 中文成人在线| caopeng97日韩| 五月丁香另类图片| 久9热视频在线| 久热AA| 99精品视频在线| 五月综合激情| 久久婷婷亚洲无码一起| 夜夜综合色| 99精品热| 日本九九视频| 五月婷婷六月丁香在线视频免费在线观看| 综合六月久久| 人妻五月天激情开心网| 婷婷丁香成人| 激情五月天色色网| 99热青青草| 九七色色六月丁香| 色热久资源| 人妻精品一区二区三区| 久久99网| 丁香六月婷婷综合在线| 丁香,开心成人,久久| 色婷婷免费观看| 久久er99| www,99色| 玖玖婷婷五月天| 欧美顶级少妇做爰HD| 日亚二欧美| 99久久99热这里只有精品| 97操碰视频| 日本综合九九| 狠狠狠夜夜夜| 久久99免费视屏| 99色视频在线观看| 97人人妻人人艹| 激情亚洲五月| 伊久大香蕉| 五月天婷婷一起草| 欧美人与性动交CCOO| 久久婷婷啪啪视频| 99热精品在线观看| 思思色综合网站| 99热伊人| 色亚洲色宗合| 五月婷婷丁香日韩在线| 欧美色五月天| 九月久久婷婷| 日日色综合| 琪琪色五月天| 亚洲欧洲另类| 国产高清RV综合aVa| 丁香五月婷婷啪啪| 婷婷五月婷婷五月| 久99精品视频| 日本一级| 99热20| 五月丁香激情综合网| 金桔一区二区ab地址| 色五月激情综合| 欧美在线视频免费播放| 永久精品| 五月婷在线视频免费播放| 嫩草AV久久伊人妇女超级A| 亚洲激情无码久久| 一区=区操屄高清大全av| www狠狠| 香蕉久久国产AV一区二区| 欧美成人热| 欧美69久成人做爰视频| 99久久五月婷婷| 婷婷99丁香| 色久女| 操操啪| 五月天伊人网| 五月天激情视频五月天| 大香蕉网站,大香蕉综合| 亚洲成人免费电影| 久热这里只有精品视频免费观看| 亚洲六月婷婷| 成人无码精品1区2区3区免费看 | 激情五月丁香五月| 久久无码成人| 国产熟女一区二区三区五月婷| 日本三级中国三级99人妇网站| 99热这里| 99亚洲视频| 99色网站| 久久综合天天综合| 婷婷射丁香| 99性视频| 成人丁香| 热99久久这里只有精品| 婷婷五月天激情小说| 99热免费在线| 狠狠穞A片一區二區三區| 色五月91| 99ri视频在线观看| 99国产精品久久久久久久久久久| 九九青草热| 伊人大香五月天| 亚洲精级| 99热精品在线播放| 青青草原伊人网| 三区激情四射av| 欧美人人超级碰| 色婷婷色99国产综合精品| 九一99| 大香蕉久艹| 五月丁香花成人社区| 国产婷婷综合在线免费视频| 99爱精品视频| 六月丁香婷婷色综合| 欧洲一区二区| 五月婷婷久| 九九色中文| 中文婷婷狠狠| 色狠狠色综合久久久绯色aⅴ影视| 97色天堂| 五月综合久久| 99热这里只有精品86| xxxx五月| 婷婷开心深爱五月天| 超碰激情五月| 激情综合九| 成人做爰高潮A片免费视频| 激情五月婷黄版| 久热只有这里精品| 这里只有精品免费视频在线观看| 甈吧vv| 久久永久网址| 丁香五月花婷婷开心| 亚洲另类毛片| 天天色凹凸| 午夜成人片400| 色婷婷久久| 亚洲九九视频| 九九这里有精品| 日日夜夜天天爽| 久久婷婷激情五月天一区二区| 久久精品夜色噜噜亚洲a∨| 五月婷婷激情在线| 久久婷婷五| a级毛片一区二区免费视频| 亚洲精品视频在线播放| 免费视频无码| 久久艹 五月天| 97人人操人人干| 久久综合人妻| 国产精产国品一二三在观看| 666555。COm毛片| 丁香五月天视频| 思思精品视频| 国产真人做爰视频免费| 婷婷婷狠狠| 国产精品久久久久9999小说| 国产精女同一区二区三区久| 91窝窝| 九九九九成人| 91九色欧美| 97婷婷久久丁香| 99re久热| 99伊人性爱在线影院| 98色丁香五月婷婷综合网| 色色色五月天激情资源| 六月久久婷婷| 樱花99视频| 亚洲色色图片| 人人人va亚洲视频在线| 五月婷婷|欧美| 丁香五月婷婷偷拍| 深爱综合网| 99在线免费视频| 99热综合| 日本在线wwww| 五月丁香久久| site:ornaments52.com| 国产avapp 网| 99国产精品白浆在线观看免费 | 色五月婷婷丁香凹凸| 色九月综合| 五月婷丁香久久综合| 国产综合A片| 97碰操| 久久久99免费视频| 91狼友视频网页更新| 国产AV网页| 久久五月天精品视频| 久久天堂婷婷五月| 婷婷色色综合激情| 激情综合一| 五月婷婷av| 综合五月婷婷| www.91在线观看| 六月丁香婷婷拍拍| 99热只有| 天天色图| 五月激情四射网站| 1024人妻| 天天久| 久热中文字幕| 久久久久久久久久久久久久久久久精典| 六月丁花香啪啪激情欧美| 久久大香蕉伊人| www.婷婷,com| 开心五月激情五月丁香五月婷婷| 激情综合网五月丁香| AA片在线观看视频在线播放| 99精品久久| 97干干干丁香| 婷婷八月激情| 极品另类| 久久大国产香蕉| 色综合久久88色综合天天99| 日韩99精品| 亚洲成人在线综合| 六月丁香啪| 综合激情伊人影视在线| 亚洲另类婷婷综合| 色色色在线观看| 人妻肉射免费观看| 任你躁XXXXX麻豆精品| 激情色色| VA婷婷| 99视频只有精品| 香蕉人妻AV久久久久天天| 亚洲不卡欧洲| www.婷婷六月天| 碰碰碰97免费精彩视频| 色爱五月天| 刘玥av在线| 九九这里只这里只有精品| 成人视屏在线观看| 九九99精品视频在线观看| www.日韩国产| 大香蕉啪啪| 久9视频免费播放| 51精品国内探花| 开心五月婷婷99| 牛牛热这里只有jingpin| 激情宗合哪里能看| 99这里有精品视频| 亚洲国产成人裸舞| 97在线视频 欧美| 五月六月激情| 超91在线视频| 91久久色| 五月天激情黄色小说在线观看| 97碰在线视频| 99成人精品六| 影音先锋日本三级资源| 五月网在线| 日韩久久日| 成人va在线| 天天摸天天日天天舔| 九九热狼人| 可以免费看AV网站| 狠狠爱婷婷丁香| 国产精品色色| 青草网在线观看| 激情深爱五月天| 亚州激情网站无码| 色噜婷婷| 99啪啪| 成人va在线观看视频| www.婷婷| 久久婷婷丁香五月宗合| 五月天激情综合网| 久狠日av| 性生活视频98791| 婷综合| 亚洲成人网无码| 婷婷六月天| 激情五月天免费视频| 欧美123区免| 色情五月丁香| 婷婷六月激情丁香| 成人一级片| 激情五月综合网| 五月丁香六月合| 九九九九无码| 大香蕉九九| 色六月天| 五月丁香六月婷综合成人综合| 乱精品一区字幕二区| 91婷婷在线观看| se99视频| 思思热在线播放| 五月丁香福利| WWW.HENHENL.| 六月婷婷激情| 色色色色热| 538在线| 男人的天堂在线婷婷| 超碰人人射| 99热这里精| 丁香五月六月综合激情| 噢美99| 五月天久久婷婷| 五月丁香花免费视频| 色五月大香蕉| 九九热自拍| 九玖欧洲亚洲| 99 热| 碰碰碰97免费精彩视频| 激情综合丁香六| 97在线视频人妻九色| 伍月婷丁香花全集| 丁香久久AV| 操人久久| 青青日韩| 7777久久亚洲中文字幕| 人妻第九页| AA丁香综合激情| 欧美人妻一区二区| www.sezonghe| 色 丁香婷婷| 国产精品久久..4399| 亚洲视频在线网| 激情内射人妻1区2区3区| 九九热AV| 日本啪啪天堂| 蜜臀av粉嫩av懂色av| 玖玖资源天天无码| 婷婷五月骚厕所| 丁香狠狠| 99热成人精品| 99热这里只有精品98| 伊人久久五月天| 婷婷久久五月天中文字幕在线观看| 亚洲视频在线网站| 99热网精品| 热久久这里只有精品| 五月丁香婷婷综合久久| www.91久久| 丁香狠狠色婷婷| 91免费看片| 青青操成人福利| 亚洲岛国电影| ...婷婷五月综合不卡,国产在线手机| 丁香婷婷婷婷十二月在线观看视频| 亚洲乱码日产精品BD| 天天操天天插| 91操人人操| 777精品久无码人妻蜜桃| 成年人丁香五月| 伊人激情| 久久小视频| 久久五月天综合| 婷婷亚洲影院| 这里只有精品久久| 99色热综合| 北条麻妃伊人 | 色色五月婷婷狠狠| 五月天综合色| 亚州操逼网| 狠狠色噜噜狠狠狠狠综合| 国内一级精品| 伊人婷婷青青cao| 综合亚洲六月婷婷在线| 婷五月天在线草| 99色视频在线观看| 精品乱码久久久久| 大香网伊人久久综合| 国产无套精品一区二区| 亚洲国产精品VA在线看黑人| 黄色AAAAAAA| 久久9热| 五月天丁香婷| 久er7久热| 久久婷婷五月天激情| 五月好婷婷| 天天做天天爽| 久草五月| 97碰碰人人视频| www.久久爱.com| 九月婷婷综合| 丁香九月婷婷色| 激情五月丁香亭亭 | 超碰在线国产9| 99热思思久| 操丝袜视频影院导航| 超碰人人操| 婷婷综合五月天| 激情婷婷色小说| 色综合综合色| 99热最新| 超碰A V在线| 久久9精品| 久久成人综合五月天| 丁香五月天论坛| 五月天色婷婷综合| 91AV视频| 日本ww亚洲| 人人摸人人| 日韩无码成人电影| 久久性刺激| 激情五月婷婷色综合| 亭亭玉月丁香| 九九成人电影婷婷| 五月丁香色色网| 久久久久人妻中文| 婷婷色综合| 人人超碰99| 樱花99视频| 五月丁香六月婷婷激情视频在线观看免费| 成人国产欧美大片一区| 亚洲在线资源| 五月丁香六月婷婷无码| 97在线观视频免费观看| 99精品视频在线观看免费| 青青草99热久久精品国| 天色综合网站| 婷婷狠狠干| 色色九区| 婷婷激情五月天在线| 99这里有精品视频| 久久精品4| 思思热久热| 在线观看免费视频| 国产色色在线| 99ri精品| 日本一级特黄大片AAAAA级| 五月丁香花激情综合网| 亚洲乱码日产精品BD| 97精品综合| 久久五月天色婷婷| 99久在线精品99re5热视频| 色婷婷六月综合| 天天日,天天干,天天操| 中文字幕av久久爽一区| 亚洲色图五月丁香| 色九九九九| 九九在线这里只有精品视频| 天天插操| 思思热在线视频99| 伊人婷婷福利网| 无码中文一区二区三区| 色五月婷婷网| 婷婷成人综合免费视频| 日本熟女内射| 婷婷丁香无码专区| 五月婷婷伊人在线| 色婷婷AV久久| 天天日夜夜拍| 婷五月天丁香婷五月| 99爱视频在线播放| 伊人久热91| 婷婷五月激情视频在线| 亚洲国产网站| 天天做天天爽| 久婷| 日日操夜夜撸| 色色色视频| 精品一区二区三区免费毛片爱| 伊人大香五月天| 五月婷婷色| A一级操| 青草视频在线观看视频| 丁香五月激情视频在线| 免费观看日韩成人av| 五月天婷婷亚洲| 99九九热视频| 亚洲AV成人在线| 五月天婷婷色在线视频免费观看 | 日韩在线成人电影| 久婷婷| 婷婷色导航| 99热婷婷| 婷婷五月天人妻| 成人丁香| 色婷婷97| 国产偷人爽久久久久久老妇APP| 99这里只有精品在线| WWW.HENHENL.| 丁香九九九九| 丁香五月天天日| 99碰碰。| 激情丁香六月| 日日噜噜久久婷婷五月天 | 超碰日韩成人| 色婷婷精品视频| 99热这里只有99| 专区无日本视频高清8| 亚洲无码九九| 伊人超碰| 草草夜夜操| 天天弄天天操| ...婷婷国产成人亚洲日韩| 五月天综合在线网| www.婷婷亚洲基地| 六月婷婷网站| 99ri在线观看视频| 9热超碰| 五月婷激情影院| 色婷婷五月六月丁香综合视频| 99久久婷婷精品视频| 成人网站免费在线播放| 婷婷五月天亚洲图片| 91丨九色丨白浆| 婷婷丁香综合成人| 色综合久久88色综合天天99| 99超碰欧美| 日本一道久久| 婷婷五月天激情基地| 97色在线| 五月天之色情综合网| 天天爽天天干| 伊人激情综合网| 天堂AV在线看| 久久婷婷丁香五月一二三| 丁香花五月天婷婷成人社区| 99这里只有精| 婷丁香五月天| 九九精品视频在线6| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 狠狠夜夜五月丁香| 婷婷色啪| 四季日韩AV无码综合| 99这里都是精品| 五月天婷婷AV| 婷婷丁香色五月| 色五月久久成人婷婷| 亚洲第一成人无码A片| 另类婷婷五月天啪帕帕| 拍真实国产伦偷精品| 翔田千里 50岁 无码| 99re这里| 91人人操人人看| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 五月激情啪啪啪| 97超碰欧美中文字幕| 天天碰夜夜操| 国产AV一区二区三区最新精品| 亚洲操逼片| 日日干天天| 色性五月天| 婷婷五月永远18免费久久久| 久久er这里只有精品| 日本熟妇精品99| 婷婷涩涩五月天| 午夜日日| 九色PORNY在线精品酒店| 婷婷五月色播天| 成人做爰A片免费看视频| 99免费| 激情丁香社区| 人人爱操| 99热在线观看免费精品| 饮料下药迷倒漂亮女同事强干| 91丨九色丨43老版熟女| 伊人91| 激情亚洲网| 天天性视频| 成人av免费观看| 91日本在线| 九九色中文| 777色婷婷爱五月| 青青热视频| 五月丁香啪啪| 99热精品10| 婷婷另类开心| 激情五月天婷婷视频| 五月天激情婷婷丁香| 亚洲人人操BD| 五月天色社区| 99无码| 综合久久综合| 色五月天在线观看| 午夜成人片400| 丁香五月婷婷图片综合| 欧美69色| 天天操加勒比| 五月天婷亚洲天综合网综合| 五月色天五月色| 天天综合社区| 欧美精品啪啪| 五月综合色| 天天干人人奸97| 超碰中文字幕在线| 久久综合九九| 激情综合婷婷| 婷婷五月天国产在线播放| 亚洲激情婷婷| 99热在线观看| 加勒比久热| 九九色影视| 丁香五月-激情综合| 久热伊人在91| 婷婷偷拍网| 久久婷婷五月草视频| 四月丁香五月婷婷久久| 亚洲免费婷婷| 五月天婷婷狂暴白浆| 在线观看996精品| 另类五月婷婷| 六月婷婷五月天| WWW.婷婷| 秋霞网在线免费基地五月婷婷丁香| 超碰在线观看9| 精品婷婷五月天| 五月天色丁香| 五月丁香啪| 婷婷五月18永久免费网站| 91人妻色色网| www.婷婷五月| 狠狠精品干练久久久无码中文字幕| 97热超碰| WWW五月天| 欧美影院| 婷婷久久色五月婷婷久久久| 色婷婷亚洲婷婷| 看久久性爱视频| 99免费在线视频| 婷婷伊人綜合| 91婷婷五月天综合视频| 色婷婷香蕉| www.久久色.com| 色婷婷久久综合久色| 精品爆操| 内射 无码 伊人| 99在线精品视频免费| 丁香婷婷激情| 99re8热精品免费视频| 丁香5月激情网| 婷婷午夜精品久久久| 六月久久狠狠| 爱久久小说下载网| 久久只有精| 欧美啪啪9| 爱iii做iiii日日| 99热思思在线观看| 色色日本| 亚洲在线综合| 色五月婷婷基地| 爱操天堂| 亚洲 无码 中文字幕 中出| 这里只有精品免费视频| 欧美精产国品一二三区| 欧美五月丁香| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 123草逼网| 天天干天天干天天操| 欧美天堂婷婷日韩| 操丝袜视频影院导航| 风流少妇A片一区二区蜜桃| 深爱婷婷基地| 六月激情婷婷| 99欧美| 99在线热| 97色色色| 成人短视频在线| 91久久综合亚洲噜噜成人在线| 五月婷婷婷| 五月婷婷9| 五月婷婷免费在线观看视频| 久9草在线观看视频| 成人色色视频| 丁香八月综合激情| 五月婷婷之美女图片| 丁香五月在线播放| 久久久婷婷色五月资源网| 五月天天天色| 亚洲有码在线视频| 九色无码| 婷婷的99视频网站| 综合六月激情婷婷| 性爱久久| 日本在线视频手机播放五月婷| 色婷婷电影网| 五月丁香好婷婷A片网 | 亚洲人成网站999综合| 日日.c| www,超碰| a在线观看| 99热综合在线| 荫道BBWBBB高潮潮喷| 亚洲色色精品| 五月天丁香看婷婷| 伊人久久大香线蕉av一区| 中文字幕av在线| 51国精产品自偷自偷综合 | 91.com男女操| jiqingtaose五月天| 婷婷五月影院| 久久视频在线| 五月丁香六月婷婷成人| 丁香色婷婷| 久久婷婷五月综合激情国产| 69久久久| 伊人超碰| 五月婷婷色丁香| 99热午夜精品| av在线免费网站 | 激情婷婷五月天网址| 99热只有精| 久激情| 欧美婷婷| 思思热再线视频| 五月天停婷基地| 婷婷午夜| 色五月综合婷婷| 日韩精品一区二区亚洲AV观看| 婷婷成人五月天成人文学| 特级片神马电影| 五月丁香啪啪综合网| 99久久久99久久91熟女| 久久五月天激情| 欧美色图天堂网| 色五月婷婷777| 亚洲99在线| 久热2025无码| 久久狠婷婷| 欧美操人| 色婷久久| www.色婷婷。com| 嫩草视频观看| 另类少妇人与禽zOZZ0性伦| 婷婷激情视频欧美视频自拍视频欧美剧| 色久九| www.ywav| 色色色色色色网站| 亚洲成人五月天| 99热无码精品| 亚洲AV第二区国产精品| 成人做爰A片免费看网站找不到了| 天天操天天操天天操天天操天天操| 亚洲色婷婷色| 色婷婷偷拍| 欧美A级成人婬片免费看理论| 久婷婷婷| 中文字幕乱轮| 色播五月天天| 色五月综合| 婷五月天| 国精产品一区一区三区免费视频| 五月激情综合网| 亚洲99在线| 亚洲中文字幕AV在线| 日本99热| 色老久久| 狠狠狠夜夜夜| 亚洲XX日本| 丁香色六月| 丁香婷婷色色| 色婷婷色综合| 亚洲国产精品VA在线看黑人| 日日夜夜天天综合| 亚洲成人高清在线| 久久这里只有精品热在99| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 激情五月婷婷综合| 欧美性爱中文字幕| 激情六月天婷婷| 婷婷五月天综合色| 天天干天天干天天干天天干天天干天天 | 成人网在线视频| 久久九九99.www| 五月天丁香色色| 色综合天天| 五月丁香久久| 欧美丁香婷婷五月| 色五月婷婷丁香五月| 超碰成人电影| 久热一本| 99九九热在线观看| 99re热在线视频观看| 久狠狠狠| 99精品在线| 九九精品热| 亚州操人在线视频| 99爱视频在线播放| 久久五月综合| 五月婷婷五月天激情网| 丁香五月 激情文学| 六月色 亚洲| 爆乳熟女-区二区三区| 婷婷9月天| 日逼影音先锋男人资源站| 国产精女同一区二区三区久| 大香蕉婷婷婷| www.玖玖婷婷在线| 五月天丁香欧美激情| 丁香 亚洲 久久| 色九亚洲| 伊九九三级区| xxxx五月| 五月天婷婷导航| 激情五月婷婷丁香综合网| 丁香五月婷中字幕| 丁香久久久| 91一起操| 六月丁香婷| 电影91久久久| 91操在线| 大香蕉久久久久| 五月天激情播播网| 婷婷色色播五月天| 99热这里只有精品86| 97色在线观看视频| 五月婷婷六月激情| 日本eVa一区=区视频| 黄色91在线观看| 7777激情基地| 色五月aV| 天天激情站| 97视频久久| 国产伦亲子伦亲子视频观看 | 草草视频91| 亚洲激情五月婷婷日日| 97丁香五月| 97精品自拍| 色五月激情五月| 五月丁香婷婷色播无码| 97九色| 天天做天天爱天天爽在| 六月婷婷七月丁香| 在线va网站| 五月婷婷基地| 色色色色色色网站| 日韩av免费版| 久久性操| 五月综合六月丁| 99色视频| 少妇AB又爽又紧无码网站| 五月丁香婷婷老司机| 亚洲精品无码久久| 色播婷婷五月天| 五月婷婷综合激情网| 成人国产网站在线免费看| 国产九九一区二区三区| 欧美综合婷婷欧美综| 色欧洲| 免费AV播放| 伊人热婷婷| 26uuu美女三级视频| 九九热在线精品视频| 开心五月色婷婷综合开心网| 狠狠爱婷婷丁香| 五月丁香激情综合欧美| 久大香蕉| 五月停停大香蕉| 欧美精品999| 99精品免费欧美小视频| 色色五月天婷婷| 日亚二欧美| 高清无码中文字幕aVDV| 激情五月天在线视频| 97操男人的天堂| 人人人人人人人人人草| 超碰色综合| 亚洲在线网站| 99久久这里只有精品免费官网| 婷婷五月天社区| 这里只有精品96| 99热 这里只有精品 国产 日韩| 噜噜狠狠色综无码久久合欧美| 亚洲欧洲中文日韩久久AV乱码| 亚洲成人AV在线观看| 久久99热这里只有精品| 久久精品凹凸分类| 国产伊人五月天| 91碰超| 秋霞网在线免费基地五月婷婷丁香| 五月婷婷深深爱爱| 色色99色色| 91色噜噜狠狠狠狠色综合| 亚洲精品另类| 思思热精品免费视频| 另类视频五月天| ww久久| 婷婷五月色播| 久久一操| 99爱无码| 久久婷婷五月丁香蜜桃网| 99在线爽| 丁香六月婷婷久久综合| 欧美激情综合| 91一起操| 久久五月网| 91色涩| 婷婷五月天情色| 五月天亭亭俺也| AV在线不卡网站| 操日挥操日日| 婷婷综合天堂| 开心婷婷五月中文字幕组| 天天干天天日蜜臀av| 五月天伊人日日噜影片AV| 97在线观视频免费观看| 日本在线免费中文com.| 亚洲妇女熟BBW| 日 日干 日日做| 免费看欧美成人A片无码| 丁香五月视频在线观看| 亚洲成av人影院| 五月天色婷婷图片| 影音 五月 婷婷 久久| 亚洲一区二区无码蜜乳av| 新激情五月天| 99成人免费热视频| 九月丁香欧美综合| 91啪啪网| 三级三久久线久久99久目本WW| 综合网色| 五月天婷婷一起草| 搡BBBB搡BBB搡18 | 天天干天天射色综合| 任你搞在线观看视频| 婷婷的色色五月天| 久久激情网| AA丁香综合激情| 这里只有精品在线播放| 啪啪视频99| 婷婷综合五月| 欧美日韩99| 色婷婷九月| 激情色情五月天| 色日本综合| 香蕉综合网| 欧美性生交XXXXX无码小说| 五月天激情婷婷丁香| 日韩久操婷婷| 99久热在线精品| 深爱五月婷婷开心中文字幕| 激情人妻蜜夜系列区| 色五月婷婷小说亚洲中文字幕组| 无码区婷婷五月花开| 六月丁香五月婷婷| 无码网站视频| 五月婷婷久久综合| 99精品偷自拍| 亚洲日日操| WWW.99热| 全部老头和老太XXXXX| 丁香五月激情婷婷婷婷在线观看| 色色吧综合| 日本视频久久| 五月婷婷丁香五月婷婷丁香| 九九日本视频| 1024AV视频| 中文字幕在线不卡| 日韩av干| 久婷久婷激情肉| 高清一区二区三区日本久| 99思思| 熟女色专区| www.久操| 99热亚洲| 欧美婷婷综合| 综合激情五月丁香9999久久精| 五月丁香 狠狠爱| 99热这里只有精品3| 天天爽综合网| 色婷五月婷婷| 99人妻碰碰碰久久久久视| 激情又色又爽又黄的A片| 五月丁香六月婷婷色情| 婷婷丁香成人在线视频| 中文字幕97超级碰| 超碰操日| 日本色婷婷| 99热这里| 狠狠操.COM| 久久丁香| 五月天丁香欧美激情| 人妻丰满精品一区二区A片| 色婷婷激情| 国语精品探花| 激情五月黄色小说| 4399在线观看免费高清黄色视频| 成人无码免费一区二区中文| 激情綜合W W W,激情五月天| 第五色婷婷| 久99久热只有精品国产99| 国产毛多水多女人A片| 1区2区视频| 色人妻五月| 狠狠色噜噜狠狠色噜噜噜999| 成人毛片在线免费观看| 无码碰碰| 激情又色又爽又黄的A片| 人人摸人人搞| 日韩另类在线观看| 丁香五月婷婷色偷偷| 综合激情综合啪啪| 五月天婷基地| 久久色情| 色婷婷五月在线| 色五月中文字幕| 六月丁香AV| 婷婷五月丁香青青草在线| 五月丁香亭亭| 玖玖婷婷色欲| 激情综合网五月激情| 中文字幕簧片| 欧日美女Va| 五月丁香狠狠爱| 玖玖无码中文| 色激情五月| 婷婷综合日本| www.久操| 五月丁香 狠狠爱| 潘金莲AAAAAAAAAA| 欧美五月停| 无码激情AAAAA片-区区| 深爱激情五月天| 第四色婷婷五月| 亚洲色五月天是什么| 激情美女五月天| 五月丁香激情片| 天天做天天爱高潮片| 91精品久久久久久综合五月天| 五月婷婷六月天| 操99| 另类在线| 成久综合视频| 丁香五月 综合| 久这里只有精品| 五月香蕉婷婷| 久久午夜理论| 色婷婷香蕉丁丁网| 天天色天天色天天色天天色天天色| 丁香五月综合亚洲| 五月丁香在线综合| 色五月涩涩婷婷| 99热这里只有精品1025| 色啪影院| 丁香六月色婷婷| 99这里只有精品| 午夜天堂一区人妻| 亚洲av另类在线观看| 国产性爱色| 中文字幕精品在线观看| 性欧美日本| 精热在线综合网| 婷婷丁香人妻| 俺去啦综合网| 久久婷婷五月综合| 99综合免费视频| 天天综合网站| 久久久全国免费视频| 久婷自拍视频| 久久婷婷五月丁香网| 五月花综合网| 婷婷五月AV| 色五月丁香婷婷| 婷婷色播婷婷| 开心激情站| 婷婷综合玖玖五月| 久9免费视频| 做爱夜夜干天天操| 丁香五月亚洲天堂| 婷婷五月丁香超碰| 狠狠操天天干| 97啪在线观看视频| 九色 在线| 77799热| 五月天激情啪啪| 色情久久久| 69精品人人人人| 琪琪色五月天| 天天色粽合合合合合合合| 五月伊人91| 五月激情网站| 三区激情四射av| 久久人妻久久| 婷婷丁香18| 婷婷五月天丁香综合网| 亚洲天堂爱爱| 丁香伊人激情| 久草a片| 情欲禁地| 亚洲视频操| 精品人妻久久久| 91九色熟女| 9精品久久999| 久久色天堂| 婷婷五月天色综合| 九九热超碰| 男人的天堂99| site:pzdcoin.com| 天天日天天草| 国产人妻777人伦精品HD| 激情九色| a v色婷婷| 欧美熟女99| 九月停停| 五月丁香网av| 欧美在线视频免费播放| 久久一级AV| 亚洲精品成人| 思思热高清在线观看| 天天日天天操心| 啪啪婷婷五月天激情| 天天干天天爽天天操| 99性爱| 97干在线播放| 天天操夜夜爽歪歪| 国产精品天天狠天天看| 爱久综合| www.99热视频| 色五月综合激情网| 激情的五月婷婷蜜桃| 97热这里精品在线视频| 无语停婷丁香网| 婷婷亚洲激情在线观看视频| 丁香大香蕉| 热99在线精品| 久久综合激情婷婷激情| 亚洲妇女熟BBW| 婷婷五月天中文字幕.| 五月天丁香成人| 91窝窝| 五月丁香六月婷综合成人综合| 五月天激情网站| 婷婷她六月天| caop在线视频| 狠狠99| 欧美这里只有精品| 超碰啪啪网| 。久久久久久久久久久久久久人妻| 丁香五月天啪啪| 思思色播| 五月丁香久久| 久久综合综合久久| 九九自拍网| AV成人在线播放| www.99热在线| 久久久久98|