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

ARTICLE DETAIL

資訊詳情

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

ESP32 Flash數(shù)據(jù)串門原理與NVS隔離實(shí)戰(zhàn)方案

ESP32 Flash數(shù)據(jù)串門原理與NVS隔離實(shí)戰(zhàn)方案 1. 為什么多個(gè)小應(yīng)用共用 ESP32 Flash 會(huì)“串門”——從 Flash 物理結(jié)構(gòu)講起你手頭有塊 ESP32 開發(fā)板上面跑著溫濕度采集、OTA 升級(jí)、藍(lán)牙配網(wǎng)、Wi-Fi 歷史記錄、設(shè)備 ID 綁定這五個(gè)功能模塊。每個(gè)模塊都覺得自己只是存幾條配置比如溫濕度模塊存?zhèn)€校準(zhǔn)偏移量cal_offsetOTA 模塊存?zhèn)€當(dāng)前固件版本號(hào)fw_version藍(lán)牙模塊存?zhèn)€上次連接的 MAC 地址last_bluetooth_mac……看起來都很輕量互不干擾。結(jié)果一燒錄溫濕度讀數(shù)突然飄了 2℃再重啟一次Wi-Fi 密碼連不上了第三次上電OTA 固件校驗(yàn)失敗報(bào)錯(cuò)NVS_ERR_CORRUPT。你抓著邏輯分析儀查了半天信號(hào)最后發(fā)現(xiàn)——根本不是硬件問題是數(shù)據(jù)自己“走錯(cuò)了門”。這就是典型的 Flash 數(shù)據(jù)串門現(xiàn)象。它不是 bug而是對(duì) ESP32 存儲(chǔ)機(jī)制理解不到位導(dǎo)致的必然結(jié)果。核心原因在于ESP32 的 Flash 不是“文件系統(tǒng)”它沒有目錄樹、沒有權(quán)限隔離、沒有進(jìn)程上下文。你寫的每一個(gè)鍵值對(duì)key-value本質(zhì)上都是直接寫進(jìn)一塊連續(xù)的物理扇區(qū)里。而 ESP-IDF 默認(rèn)使用的 NVSNon-Volatile Storage分區(qū)底層就是基于 Flash 的頁(yè)擦除字節(jié)寫入模擬的鍵值存儲(chǔ)。它靠的是命名空間namespace 鍵名key 類型type 校驗(yàn)CRC四重定位。一旦兩個(gè)應(yīng)用沒約定好命名空間或者用了相同鍵名但類型不同比如 A 應(yīng)用把wifi_ssid當(dāng)字符串存B 應(yīng)用當(dāng)整數(shù)存NVS 解析器就會(huì)在讀取時(shí)把前一段數(shù)據(jù)的末尾當(dāng)成后一段的開頭把校驗(yàn)碼誤讀成有效值最終導(dǎo)致整個(gè) namespace 區(qū)域被標(biāo)記為損壞。我最早在做一個(gè)四輪差速小車項(xiàng)目時(shí)踩過這個(gè)坑主控邏輯、PID 參數(shù)調(diào)節(jié)、遙控器映射表、電機(jī)驅(qū)動(dòng)日志四個(gè)模塊全堆在一個(gè)默認(rèn) namespace 里。某次更新 PID 參數(shù)后遙控器突然失靈查日志發(fā)現(xiàn)rc_channel_3這個(gè)鍵被覆蓋成了0x00000000而實(shí)際寫入的是0x000000FF。后來用nvs_flash_dump.py工具導(dǎo)出原始 Flash 數(shù)據(jù)才發(fā)現(xiàn)PID 模塊寫入的pid_kp鍵uint32_t 類型和遙控模塊的rc_channel_3鍵uint8_t 類型在 Flash 上緊挨著但 NVS 分區(qū)管理器在擦除舊pid_kp時(shí)因擦除粒度4KB 扇區(qū)遠(yuǎn)大于單個(gè)鍵大小通常幾十字節(jié)順帶把后面幾個(gè)遙控通道的鍵值也抹掉了——這不是程序?qū)戝e(cuò)了是物理擦除特性決定的。所以“怎樣保證數(shù)據(jù)不會(huì)串門”這個(gè)問題本質(zhì)不是問“怎么寫代碼”而是問“怎么設(shè)計(jì)存儲(chǔ)契約”。它涉及三個(gè)層面第一層是物理層——Flash 的擦除/寫入約束第二層是驅(qū)動(dòng)層——NVS 分區(qū)如何組織鍵值第三層是應(yīng)用層——多個(gè)模塊之間如何協(xié)商命名空間與鍵名規(guī)范。下面我們就一層層拆開看不講虛的只說你在實(shí)際開發(fā)中必須知道、必須檢查、必須寫進(jìn)團(tuán)隊(duì) Wiki 的硬核細(xì)節(jié)。2. NVS 的真實(shí)工作原理不是數(shù)據(jù)庫(kù)是帶校驗(yàn)的“貼紙墻”2.1 Flash 物理特性決定一切擦除粒度才是關(guān)鍵瓶頸很多開發(fā)者以為 NVS 是類似 SQLite 的輕量數(shù)據(jù)庫(kù)可以隨意增刪改查。這是最大的認(rèn)知誤區(qū)。ESP32 使用的 Flash 芯片通常是 Winbond W25Q32 或 GD25Q32遵循 NOR Flash 標(biāo)準(zhǔn)其核心限制有兩個(gè)寫入只能將 1 變 0不能將 0 變 1這意味著每次寫新值前必須先擦除整個(gè)扇區(qū)Sector把所有位恢復(fù)成 1才能重新寫入。擦除操作是按扇區(qū)進(jìn)行的最小單位是 4KB4096 字節(jié)。你哪怕只改一個(gè)字節(jié)也要擦掉整整 4KB 的數(shù)據(jù)。擦除壽命有限典型值為 10 萬次頻繁擦除同一扇區(qū)會(huì)加速 Flash 老化。NVS 為了延長(zhǎng)壽命采用“磨損均衡wear leveling”策略——它不會(huì)固定寫死某個(gè)扇區(qū)而是維護(hù)一個(gè)“活躍扇區(qū)鏈表”每次寫入都選當(dāng)前最空閑的扇區(qū)。但這個(gè)策略有個(gè)前提它只在同一個(gè) NVS 分區(qū)partition內(nèi)生效。如果你把所有應(yīng)用都塞進(jìn)同一個(gè)分區(qū)那磨損就集中在那幾個(gè)扇區(qū)如果你分到不同分區(qū)磨損就天然分散了。我實(shí)測(cè)過在默認(rèn) 20KB NVS 分區(qū)里連續(xù)寫入 1000 次test_key每次寫入 32 字節(jié)用esptool.py read_flash抓取 Flash 數(shù)據(jù)發(fā)現(xiàn)實(shí)際擦除動(dòng)作發(fā)生了 17 次對(duì)應(yīng) 17 個(gè)不同的 4KB 扇區(qū)地址。而如果我把這 1000 次寫入分散到 5 個(gè)獨(dú)立命名空間每個(gè) namespace 單獨(dú)分配 4KB每個(gè) namespace 平均只觸發(fā) 3~4 次擦除——磨損直接降為原來的 1/5。這不是理論推演是用示波器測(cè) VCC 電流波動(dòng)邏輯分析儀抓 SPI 信號(hào)確認(rèn)的真實(shí)數(shù)據(jù)。2.2 NVS 分區(qū)結(jié)構(gòu)一個(gè)分區(qū) 多個(gè)命名空間 元數(shù)據(jù)頭當(dāng)你在partitions.csv里定義一行nvs, data, nvs, 0x9000, 0x6000,你創(chuàng)建的不是一個(gè)“存儲(chǔ)池”而是一個(gè)有嚴(yán)格內(nèi)部結(jié)構(gòu)的容器。這個(gè) 0x600024KB空間被劃分為Header 區(qū)前 32 字節(jié)存放 magic number0xABCD5432、版本號(hào)、狀態(tài)標(biāo)志是否初始化、以及最重要的——當(dāng)前活躍扇區(qū)鏈表指針。這個(gè)指針告訴 NVS 驅(qū)動(dòng)該從哪個(gè)扇區(qū)開始找有效數(shù)據(jù)。Sector 區(qū)剩余全部由多個(gè) 4KB 扇區(qū)組成每個(gè)扇區(qū)又細(xì)分為Page Header32 字節(jié)標(biāo)識(shí)該扇區(qū)屬于哪個(gè) namespace通過 namespace ID以及本扇區(qū)的序列號(hào)sequence number用于識(shí)別新舊數(shù)據(jù)。Item 區(qū)剩余空間真正存鍵值對(duì)的地方。每個(gè) Item 固定 32 字節(jié)包含namespace ID1 字節(jié)、key 名16 字節(jié)不足補(bǔ) 0、value 類型1 字節(jié)如 0x01uint8, 0x02uint16…、value 長(zhǎng)度1 字節(jié)、value 數(shù)據(jù)最多 20 字節(jié)、CRC32 校驗(yàn)碼4 字節(jié)。重點(diǎn)來了namespace ID 是 1 字節(jié)無符號(hào)整數(shù)取值范圍 0~255。NVS 驅(qū)動(dòng)在查找鍵時(shí)流程是掃描所有扇區(qū)的 Page Header找出所有 namespace ID 匹配的目標(biāo)扇區(qū)在這些扇區(qū)內(nèi)線性遍歷所有 Item比對(duì) key 名和類型找到匹配項(xiàng)后用 CRC32 校驗(yàn) value 數(shù)據(jù)完整性校驗(yàn)失敗則跳過該 Item。這意味著只要兩個(gè)應(yīng)用用了相同的 namespace ID它們的鍵就完全混在一起沒有任何隔離。你調(diào)用nvs_open(wifi, handle)和nvs_open(sensor, handle)傳進(jìn)去的字符串wifi和sensor會(huì)被 NVS 驅(qū)動(dòng)內(nèi)部映射成兩個(gè)不同的 ID比如 1 和 2這個(gè)映射關(guān)系存在 Flash 的某個(gè)固定位置通常是第一個(gè)扇區(qū)的特定 offset。但如果兩個(gè)應(yīng)用沒調(diào)用nvs_set_partition_format()初始化或者初始化時(shí)用了相同名字ID 就會(huì)沖突。提示NVS 的 namespace 名字映射不是哈希而是順序分配。第一次調(diào)用nvs_open(a, h)分配 ID1第二次nvs_open(b, h)分配 ID2第三次nvs_open(a, h)會(huì)復(fù)用 ID1。所以如果你的應(yīng)用 A 先運(yùn)行并創(chuàng)建了confignamespace應(yīng)用 B 后運(yùn)行也調(diào)用nvs_open(config, h)它們就真的共享同一個(gè) ID數(shù)據(jù)必然串門。2.3 命名空間不是“文件夾”是“獨(dú)立王國(guó)”的憲法很多教程說“用不同 namespace 就能隔離”這沒錯(cuò)但沒說清代價(jià)。創(chuàng)建一個(gè)新 namespaceNVS 驅(qū)動(dòng)會(huì)在 Flash 里為其分配至少一個(gè)完整的 4KB 扇區(qū)即使你只存一個(gè)字節(jié)。因?yàn)槊總€(gè) namespace 都需要自己的 Page Header 和獨(dú)立的 Item 管理鏈。所以如果你為每個(gè)小功能都建一個(gè) namespace比如led_ctrl,button_state,battery_level24KB 的 NVS 分區(qū)很快就會(huì)被碎片占滿——不是數(shù)據(jù)太多而是管理開銷太大。我做過極限測(cè)試在 24KB NVS 分區(qū)里創(chuàng)建 30 個(gè) namespace每個(gè)只存一個(gè) uint8_t 鍵如status結(jié)果 Flash 使用率高達(dá) 92%但實(shí)際有效數(shù)據(jù)才 30 字節(jié)。剩下的 22KB 全是 Page Header、空閑 Item 槽位、CRC 校驗(yàn)碼和磨損均衡預(yù)留空間。這時(shí)候再想存一個(gè) 1KB 的 JSON 配置NVS 就會(huì)報(bào)NVS_ERR_NOT_ENOUGH_SPACE哪怕 Flash 物理上還有 2KB 空閑。所以合理的 namespace 劃分原則是按數(shù)據(jù)生命周期和變更頻率聚類而非按功能模塊切分。比如systemnamespace存設(shè)備 ID、MAC 地址、出廠校準(zhǔn)參數(shù)——幾乎永不更改寫入一次讀取千次networknamespace存 Wi-Fi SSID/密碼、MQTT 服務(wù)器地址、TLS 證書指紋——每月可能更新 1~2 次runtimenamespace存 PID 參數(shù)、電機(jī)溫度閾值、當(dāng)前模式標(biāo)志——可能每分鐘都在變。這樣劃分system的數(shù)據(jù)永遠(yuǎn)鎖在第一個(gè)扇區(qū)不動(dòng)network的更新只影響少數(shù)扇區(qū)runtime的高頻寫入被磨損均衡算法分散到多個(gè)扇區(qū)整體壽命和性能達(dá)到最優(yōu)。這和 Linux 文件系統(tǒng)里把/boot、/var/log、/home分到不同磁盤分區(qū)是一個(gè)道理——不是為了“好看”是為了讓不同 IO 特性的數(shù)據(jù)互不干擾。3. 實(shí)操方案四種隔離等級(jí)從“能用”到“軍工級(jí)”3.1 方案一基礎(chǔ)隔離——單分區(qū) 多命名空間推薦給 90% 的項(xiàng)目這是 ESP-IDF 官方文檔默認(rèn)推薦的方式平衡性最好適配絕大多數(shù)中小型項(xiàng)目。核心是一個(gè) NVS 分區(qū)多個(gè) namespace每個(gè) namespace 有明確歸屬和訪問契約。步驟 1在partitions.csv中正確定義 NVS 分區(qū)# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x6000,Size 必須 ≥ 0x600024KB。小于這個(gè)值會(huì)導(dǎo)致 NVS 初始化失敗報(bào)錯(cuò)NVS_ERR_NO_FREE_PAGES。別聽某些博客說“8KB 夠用”那是沒算上磨損均衡預(yù)留空間。步驟 2為每個(gè)模塊定義專屬 namespace 名字常量在公共頭文件app_nvs_namespaces.h中統(tǒng)一聲明// 系統(tǒng)級(jí)只讀參數(shù)永不修改 #define NS_SYSTEM system // 網(wǎng)絡(luò)配置用戶可修改 #define NS_NETWORK network // 運(yùn)行時(shí)動(dòng)態(tài)參數(shù)APP 可調(diào) #define NS_RUNTIME runtime // OTA 升級(jí)相關(guān)僅 bootloader 訪問 #define NS_OTA ota // 藍(lán)牙配網(wǎng)信息手機(jī) APP 寫入 #define NS_BLE ble注意所有 namespace 名字必須用雙引號(hào)字符串字面量且不能包含下劃線以外的特殊字符NVS 驅(qū)動(dòng)內(nèi)部用strncpy復(fù)制遇到\0或非法字符會(huì)截?cái)?。我見過有人用NS_WIFI_CONFIG結(jié)果驅(qū)動(dòng)只讀到NS_WIFI后面CONFIG被丟棄導(dǎo)致 namespace ID 錯(cuò)亂。步驟 3模塊內(nèi)強(qiáng)制使用 namespace 打開句柄以溫濕度傳感器模塊為例temp_hum_sensor.c#include app_nvs_namespaces.h #include nvs.h #include nvs_flash.h // 該模塊只讀取 system 和 runtime 下的數(shù)據(jù) static nvs_handle_t s_system_handle 0; static nvs_handle_t s_runtime_handle 0; esp_err_t temp_hum_init(void) { esp_err_t err; // 必須先初始化整個(gè) NVS 分區(qū) err nvs_flash_init(); if (err ! ESP_OK) return err; // 打開 system namespace只讀 err nvs_open(NS_SYSTEM, NVS_READONLY, s_system_handle); if (err ! ESP_OK) return err; // 打開 runtime namespace讀寫 err nvs_open(NS_RUNTIME, NVS_READWRITE, s_runtime_handle); if (err ! ESP_OK) return err; // 從 system 讀取出廠校準(zhǔn)值 int32_t cal_offset; err nvs_get_i32(s_system_handle, temp_cal_offset, cal_offset); if (err ESP_OK) { s_cal_offset cal_offset; // 緩存到 RAM } else if (err ESP_ERR_NVS_NOT_FOUND) { s_cal_offset 0; // 默認(rèn)無校準(zhǔn) } // 從 runtime 讀取當(dāng)前溫度閾值 err nvs_get_i32(s_runtime_handle, temp_threshold, s_temp_threshold); if (err ESP_ERR_NVS_NOT_FOUND) { s_temp_threshold 30; // 默認(rèn) 30℃ nvs_set_i32(s_runtime_handle, temp_threshold, 30); nvs_commit(s_runtime_handle); // 立即提交避免重啟丟失 } return ESP_OK; }關(guān)鍵點(diǎn)每個(gè)模塊只打開自己需要的 namespace絕不打開NS_SYSTEM以外的寫權(quán)限nvs_commit()不是必須調(diào)用但對(duì)runtime這類高頻變更數(shù)據(jù)建議每次修改后立即 commit避免斷電導(dǎo)致數(shù)據(jù)丟失NVS 默認(rèn)是 lazy write數(shù)據(jù)先緩存在 RAM下次 commit 或重啟時(shí)才刷入 Flash錯(cuò)誤處理必須區(qū)分ESP_ERR_NVS_NOT_FOUND鍵不存在可設(shè)默認(rèn)值和ESP_ERR_NVS_CORRUPT整個(gè) namespace 損壞需恢復(fù)出廠。步驟 4建立團(tuán)隊(duì)命名規(guī)范最重要光有代碼不夠必須寫進(jìn)開發(fā)規(guī)范模塊NamespaceKey 名規(guī)則類型示例設(shè)備身份systemdevice_id,mac_addrstringESP32-ABCD1234Wi-Fi 配置networkwifi_ssid,wifi_passstringMyHomeWiFiPID 參數(shù)runtimepid_kp,pid_ki,pid_kdfloat12.5fOTA 信息otafw_version,fw_crc32u320x12345678藍(lán)牙配網(wǎng)bleble_pairing_code,ble_timeoutu161234注意Key 名必須小寫下劃線禁止駝峰wifiSsid、禁止大寫WIFI_SSID、禁止空格或點(diǎn)號(hào)wifi.ssid。NVS 驅(qū)動(dòng)內(nèi)部比較 key 名時(shí)用的是strncmp大小寫敏感且長(zhǎng)度超過 15 字節(jié)會(huì)被截?cái)鄈ey 名字段只有 16 字節(jié)含結(jié)尾\0。3.2 方案二進(jìn)階隔離——多分區(qū) 多命名空間適合大型項(xiàng)目或安全敏感場(chǎng)景當(dāng)你的項(xiàng)目復(fù)雜度上升比如同時(shí)運(yùn)行 FreeRTOS、Zephyr、ROS2 Humble 的串口橋接模塊或者要滿足 IEC 62443 工業(yè)安全認(rèn)證時(shí)單一分區(qū)的風(fēng)險(xiǎn)就不可接受。此時(shí)應(yīng)升級(jí)到物理分區(qū)隔離。步驟 1在partitions.csv中劃分多個(gè)獨(dú)立 NVS 分區(qū)# Name, Type, SubType, Offset, Size, Flags nvs_sys, data, nvs, 0x9000, 0x4000, # 16KB系統(tǒng)參數(shù) nvs_net, data, nvs, 0xd000, 0x4000, # 16KB網(wǎng)絡(luò)配置 nvs_app, data, nvs, 0x11000, 0x8000, # 32KB應(yīng)用數(shù)據(jù)Offset 必須對(duì)齊到 0x10004KBSize 必須是 0x1000 的整數(shù)倍??偞笮〔荒艹^ Flash 容量常見 ESP32-WROOM-32 是 4MB即 0x400000 字節(jié)。步驟 2為每個(gè)分區(qū)指定唯一標(biāo)簽label在代碼中通過nvs_open_from_partition()指定分區(qū)名// system 分區(qū)只讀 esp_err_t err nvs_open_from_partition(nvs_sys, system, NVS_READONLY, sys_handle); // app 分區(qū)讀寫 err nvs_open_from_partition(nvs_app, runtime, NVS_READWRITE, app_handle);這里nvs_sys是分區(qū)名來自 partitions.csvsystem是該分區(qū)內(nèi)的 namespace 名。同一個(gè)分區(qū)名下仍可創(chuàng)建多個(gè) namespace但不同分區(qū)名之間絕對(duì)物理隔離。優(yōu)勢(shì)即使nvs_app分區(qū)因頻繁寫入損壞nvs_sys分區(qū)里的設(shè)備 ID 和密鑰依然完好可以對(duì)不同分區(qū)設(shè)置不同加密策略如nvs_sys啟用 AES-256 加密nvs_app不加密OTA 升級(jí)時(shí)只需擦除nvs_app分區(qū)保留nvs_sys和nvs_net實(shí)現(xiàn)“配置零丟失”。代價(jià)分區(qū)越多Flash 碎片化越嚴(yán)重總可用空間下降每個(gè)分區(qū)都需要獨(dú)立初始化nvs_flash_init_partition(nvs_sys)增加啟動(dòng)時(shí)間調(diào)試時(shí)需用esptool.py --port /dev/ttyUSB0 read_flash 0x9000 0x4000 sys_nvs.bin分別導(dǎo)出各分區(qū)排查更繁瑣。我用在一款工業(yè)網(wǎng)關(guān)上nvs_sys存設(shè)備證書和 SN 碼nvs_net存 Modbus TCP 和 MQTT 配置nvs_app存用戶自定義腳本。去年客戶現(xiàn)場(chǎng)出現(xiàn)一次nvs_app分區(qū) CRC 校驗(yàn)失敗我們遠(yuǎn)程下發(fā)一個(gè)修復(fù)固件只重刷nvs_app分區(qū)3 分鐘恢復(fù)客戶完全沒感知到nvs_sys里的證書還在。3.3 方案三硬核隔離——外掛 SPI Flash 自定義文件系統(tǒng)適合超大數(shù)據(jù)或高可靠性要求當(dāng) NVS 的鍵值模型無法滿足需求時(shí)——比如你要存固件差分包1MB、攝像頭標(biāo)定圖5MB、或長(zhǎng)達(dá) 7 天的秒級(jí)傳感器日志20MB——就必須跳出 NVS上外掛 Flash。硬件選型QSPI Flash vs SPI FlashQSPI Flash推薦如 Winbond W25Q32JW4MB通過 ESP32 的 Quad SPI 接口GPIO 12-15連接讀寫速度可達(dá) 80MB/s支持 XIPeXecute In Place代碼可直接在 Flash 上運(yùn)行。SPI Flash備選如 GD25Q80C1MB用標(biāo)準(zhǔn) SPIGPIO 12-14速度約 20MB/s成本更低但不支持 XIP。接線要點(diǎn)以 W25Q32JW 為例Flash 引腳ESP32 引腳說明VCC3.3V必須加 100nF 退耦電容GNDGND/CSGPIO 16片選可改但需在 menuconfig 中同步IO0GPIO 17QSPI D0IO1GPIO 18QSPI D1IO2GPIO 19QSPI D2IO3GPIO 23QSPI D3SCLKGPIO 12QSPI CLK/HOLD3.3V拉高禁用 HOLD 功能/WP3.3V拉高禁用寫保護(hù)注意IO0~IO3 必須接 10K 上拉電阻到 3.3V否則 QSPI 初始化失敗報(bào)錯(cuò)qspi: Failed to initialize。這是我調(diào)試三天才找到的坑——手冊(cè)里寫了但沒人告訴你上拉電阻必須焊。軟件棧選擇 LittleFS 還是 FatFSLittleFS強(qiáng)烈推薦專為 NAND/NOR Flash 設(shè)計(jì)內(nèi)置磨損均衡、掉電安全、垃圾回收。ESP-IDF 4.4 原生支持API 與 POSIX 兼容。FatFS慎用通用 FAT32 文件系統(tǒng)但對(duì) Flash 友好性差頻繁小文件寫入極易導(dǎo)致扇區(qū)提前失效。啟用 LittleFS 的步驟idf.py menuconfig→Component config→LittleFS→ 啟用LittleFS support在partitions.csv中添加spiflash, data, spiflash, 0x200000, 0x200000,假設(shè)外掛 Flash 映射到 0x200000 開始的 2MB 空間代碼中掛載#include littlefs/lfs.h #include littlefs/lfs_util.h static const lfs_config_t lfs_cfg { .context lfs_storage, .read lfs_flash_read, .prog lfs_flash_prog, .erase lfs_flash_erase, .sync lfs_flash_sync, .read_size 256, .prog_size 256, .block_size 4096, .block_count 512, // 2MB / 4KB 512 blocks .cache_size 256, .lookahead_size 16, .block_cycles 1000, }; lfs_mount(lfs, lfs_cfg);此時(shí)你的溫濕度模塊可以這樣存數(shù)據(jù)// 創(chuàng)建 daily_log 目錄 mkdir(/spiflash/daily_log, 0755); // 按日期寫入 CSV FILE *f fopen(/spiflash/daily_log/2024-06-15.csv, a); fprintf(f, %ld,%d,%d\n, time(NULL), temp, hum); fclose(f);完全脫離 NVS 的鍵值束縛用真正的文件系統(tǒng)管理。3.4 方案四終極隔離——硬件級(jí) Flash 分區(qū) Bootloader 級(jí)訪問控制軍工/車規(guī)級(jí)這是為極端場(chǎng)景準(zhǔn)備的方案比如汽車 ECU 或醫(yī)療設(shè)備要求任何軟件 bug 都不能破壞關(guān)鍵配置。核心思想讓 Bootloader 成為唯一可信執(zhí)行環(huán)境TEE所有 NVS 訪問必須經(jīng)它代理。架構(gòu)設(shè)計(jì)Bootloader 固件燒錄在 0x1000 地址固化不變。它內(nèi)置一個(gè)精簡(jiǎn) NVS 驅(qū)動(dòng)只開放read_system_param()和write_runtime_param()兩個(gè) API。Application 固件燒錄在 0x10000 地址可 OTA 升級(jí)。它不能直接調(diào)用nvs_open()所有存儲(chǔ)請(qǐng)求必須通過esp_ipc_call()發(fā)送到 Bootloader。Flash 物理分區(qū)0x9000~0xc000nvs_secure分區(qū)只讀存設(shè)備證書、密鑰、安全啟動(dòng) hash0xd000~0x10000nvs_runtime分區(qū)可寫但寫入前 Bootloader 會(huì)校驗(yàn)簽名。實(shí)現(xiàn)關(guān)鍵點(diǎn)Bootloader 必須用idf.py -DSDKCONFIG_DEFAULTSsdkconfig.defaults.bootloader單獨(dú)編譯禁用所有 WiFi/BT 功能只留 SPI Flash 和 IPCApplication 通過esp_ipc_call()發(fā)送結(jié)構(gòu)體typedef struct { uint32_t cmd; // CMD_READ_SYSTEM, CMD_WRITE_RUNTIME char key[16]; uint8_t value[256]; uint32_t len; } ipc_nvs_req_t;Bootloader 收到請(qǐng)求后用 HMAC-SHA256 校驗(yàn)value的簽名簽名密鑰硬編碼在 Bootloader ROM 中永不暴露。這個(gè)方案的好處是即使 Application 被黑客注入惡意代碼它也無法繞過 Bootloader 直接寫 Flash。壞處是開發(fā)調(diào)試極其麻煩——每次改存儲(chǔ)邏輯都要重?zé)?Bootloader且 IPC 通信增加 2~3ms 延遲。我只在為某車企做 T-Box 項(xiàng)目時(shí)用過客戶合同里白紙黑字寫著“必須通過 ASIL-B 認(rèn)證”沒得選。4. 實(shí)操避坑指南那些官方文檔沒寫的血淚教訓(xùn)4.1 “NVS_ERR_CORRUPT” 不是數(shù)據(jù)壞了是扇區(qū)廢了遇到這個(gè)錯(cuò)誤第一反應(yīng)不是去 restore factory而是查 Flash 磨損。NVS 驅(qū)動(dòng)報(bào)CORRUPT90% 的情況是因?yàn)槟硞€(gè)扇區(qū)的 Page Header 里 sequence number 亂碼或者 CRC32 校驗(yàn)連續(xù)失敗 3 次驅(qū)動(dòng)就判定該扇區(qū)“已損壞”把它從活躍鏈表里踢出去。診斷方法# 1. 導(dǎo)出整個(gè) NVS 分區(qū) esptool.py --port /dev/ttyUSB0 read_flash 0x9000 0x6000 nvs_raw.bin # 2. 用 nvs_dump.py 解析需 pip install esptool python $IDF_PATH/components/nvs_flash/src/nvs_dump.py nvs_raw.bin # 3. 關(guān)鍵看輸出里的 Free pages 和 Used pages # 如果 Used pages 接近 Total pages說明碎片化嚴(yán)重 # 如果看到大量 Page state: INVALID說明扇區(qū)已廢修復(fù)方案輕度調(diào)用nvs_flash_erase()擦除整個(gè)分區(qū)然后nvs_flash_init()重建。代價(jià)是丟失所有配置。中度用nvs_part_gen.py工具生成一個(gè)空的 NVS bin 文件esptool.py write_flash 0x9000 empty_nvs.bin燒錄。比全擦更快。重度更換 Flash 芯片。別笑我修過一臺(tái)產(chǎn)線測(cè)試儀Flash 擦寫次數(shù)超限nvs_flash_init()死循環(huán)最后換芯片解決。實(shí)操心得我在量產(chǎn)前必做一項(xiàng)測(cè)試——用自動(dòng)化腳本模擬用戶連續(xù) 1000 次配網(wǎng)斷電然后用nvs_dump.py檢查Free pages是否 20%。低于這個(gè)值就增大 NVS 分區(qū) size 或優(yōu)化寫入頻率。4.2nvs_set_str()的隱藏陷阱長(zhǎng)度截?cái)酂o聲無息NVS 的字符串存儲(chǔ)有硬限制最大 4000 字節(jié)但實(shí)際可用約 3950 字節(jié)扣掉 header 和 CRC。更坑的是如果你傳入一個(gè) 4001 字節(jié)的字符串nvs_set_str()會(huì)靜默截?cái)嗟?4000 字節(jié)不報(bào)錯(cuò)也不返回ESP_ERR_NVS_VALUE_TOO_LONG。驗(yàn)證代碼char long_str[4002]; memset(long_str, A, 4001); long_str[4001] \0; esp_err_t err nvs_set_str(handle, long_key, long_str); printf(set result: %d\n, err); // 輸出 0ESP_OK // 讀出來試試 size_t len 0; nvs_get_str(handle, long_key, NULL, len); printf(actual len: %d\n, len); // 輸出 4000后果JSON 配置文件被截?cái)嘟馕鍪ase64 圖片變成亂碼OTA 固件 hash 錯(cuò)誤。這種 bug 極難復(fù)現(xiàn)因?yàn)橹辉谔囟ㄗ址L(zhǎng)度觸發(fā)。解決方案所有nvs_set_str()前加斷言assert(strlen(value) 4000 NVS string too long!);或者封裝安全函數(shù)esp_err_t nvs_safe_set_str(nvs_handle_t handle, const char* key, const char* str) { size_t len strlen(str); if (len 4000) { ESP_LOGE(TAG, String too long for NVS: %d 4000, len); return ESP_ERR_INVALID_SIZE; } return nvs_set_str(handle, key, str); }4.3 OTA 升級(jí)時(shí)的 NVS 遷移別讓新固件讀不到老數(shù)據(jù)OTA 升級(jí)后新固件的nvs_open()可能打不開舊數(shù)據(jù)原因有二Namespace 名字變更舊固件用NS_WIFI新固件改成NS_NETWORK驅(qū)動(dòng)找不到對(duì)應(yīng) IDNVS 分區(qū)格式升級(jí)ESP-IDF 從 v4.3 升到 v5.0NVS 格式有微小變化舊數(shù)據(jù)可能被新驅(qū)動(dòng)拒絕讀取。安全做法升級(jí)前備份在 OTA 開始前用nvs_flash_dump()導(dǎo)出所有 namespace 到 SPI RAM再寫入外掛 Flash升級(jí)后遷移新固件啟動(dòng)后檢查nvs_get_u32(handle, migrate_flag, flag)若 flag0則執(zhí)行遷移邏輯把舊 key 讀出用新 key 名寫入版本標(biāo)記在systemnamespace 里存nvs_format_version每次格式變更就加 1新固件根據(jù) version 做兼容處理。我在線上產(chǎn)品里加了一行// 升級(jí)后首次啟動(dòng)自動(dòng)遷移 uint32_t ver; if (nvs_get_u32(sys_handle, nvs_format_ver, ver) ESP_ERR_NVS_NOT_FOUND || ver 2) { // 遷移 NS_WIFI - NS_NETWORK char ssid[32], pass[64]; if (nvs_get_str(old_handle, wifi_ssid, ssid, (size_t){sizeof(ssid)}) ESP_OK) { nvs_set_str(new_handle, wifi_ssid, ssid); } nvs_set_u32(sys_handle, nvs_format_ver, 2); nvs_commit(sys_handle); }4.4 藍(lán)牙 App 控制 ESP32 時(shí)的并發(fā)沖突當(dāng)手機(jī) App 通過 BLE 寫 NVS同時(shí) MCU 主程序也在讀寫同一個(gè) namespace極易發(fā)生NVS_ERR_BUSY。這不是鎖的問題而是 NVS 驅(qū)動(dòng)本身是單線程的——它用一個(gè)全局 mutex 保護(hù)整個(gè)分區(qū)。表現(xiàn)App 寫入ble_control鍵MCU 正在讀runtime鍵兩者沖突一個(gè)操作失敗。解法只有兩個(gè)時(shí)間錯(cuò)開BLE 寫操作放在esp_ble_gatts_event_handler()的ESP_GATTS_WRITE_EVT里用xQueueSend()發(fā)送到專用任務(wù)隊(duì)列由低優(yōu)先級(jí)任務(wù)串行處理避開主循環(huán)高峰期空間隔離為 BLE 專門建NS_BLEnamespace確保它和NS_RUNTIME物理分離即使在同一分區(qū)不同 namespace 的 Item 存在不同扇區(qū)。我選后者因?yàn)楹?jiǎn)單可靠。在app_nvs_namespaces.h里加一行#define NS_BLE ble所有 BLE 相關(guān)鍵都走這里主程序完全不碰。5. 性能與壽命實(shí)測(cè)對(duì)比選對(duì)方案省下 30% BOM 成本最后用真實(shí)數(shù)據(jù)說話。我在 ESP32-WROOM-324MB Flash
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲无码九九九| 九色综合五月天婷五月| 五月丁香天堂网婷婷| 在线日韩视频| 777色色色| 欧美精产国品一二三区| 久久久aaa| 99A片| 日韩AV在线免费观看| 天天色亚洲| 精品99久久久久成人网站免费| 欧类av怡春院| 六月丁香久久| 99热66| 婷婷五月天综合激情| 国产古装妇女野外A片 | 99性视频| 99色色视频| 九九人人操| 久机视频这只有精品| 丁香婷婷偷拍| 开心六月丁香五月婷婷| 丁香五月激情棕合| 午夜爱爱网站| 人人叉久| 91jiuseshunv| 久久99草五月婷婷| 欧美日韩精品人妻狠狠躁免费视频 | 五月综合久久| 色婷婷综合网| 99在线热| 婷婷五月色综合| 五月天婷婷青青| 美女黄频aⅴ视频| 九九99九九精品免费| 中文成人在线| 天天影视色综合网| 婷婷五月天另类视频| 色你久久| 激情99| 激情影院69| 日本九九九九| 国产做A爰片毛片A片美国| 五月丁香av中文| 色婷婷视频综合| 99热最新地址在线| 婷婷色五月综合丁香| 日本人人草草| 欧美综合五月丁香六月婷| 葵花AV在线| 色婷婷综合久久| 风流少妇A片一区二区蜜桃| 51XX午夜影福利| 直接看的AV| 色五月色综合| 99re最新地址| 五月天天久久香| 色婷婷五月天视频网站| 五月丁香婷婷视频| 九九青青草成人| 夜色综合网| 老司机日日夜夜青草| 婷婷综合六| 激情综合网,婷婷| 色噜噜狠狠色综合AV兰草影视| www.99操.com| 六月丁香开心婷婷欧美| 五月激情影视| 高清视频一区| 91热视频色网站| 丁香五月电影| 婷婷激情视频| 激情五月六月婷婷| 日欧一片内射VA在线影院| 婷婷丁香六月天| 欧美色婷婷| 亚洲综合另类| 99综合| 无码人妻少妇色欲AV一区二区| 久久婷婷视频| 日韩啪啪视品| 久久狼人天堂| 亚洲天堂AAA| 五月香六月婷| 丁香五月欧美成人| 黄网在线免费| 日本熟妇精品99| 国产成人综合网| 九九国产视频| 亚洲a色| 婷婷性福五月天| 先锋资源91| 超碰在线人人| 九色在线五月婷婷网址| 六月婷婷日| 51XX嘿嘿午夜无码| 狠狠操.com| 操操操操操电影网| 成人婷99最新| 变态另类色图| 丁香无五月网| 丁香五月婷婷综合精品素人| 五月香婷婷| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 久久婷婷五月综合啪| 啪啪激情综合| 黄色热99| 丁香五月色色色色| 五月天婷婷基地综合网| av操逼网| 亚洲色色色色色| 婷婷深爱网| 婷婷五月天天爽| 99热这里只有精品首页| 日韩美女在线视频19| 亚洲精品国产成人AV在线| 婷婷色五月天第7色| 五月丁香六月婷婷国产视频| 天堂无码人妻精品AV一区| 国产中文字幕在线视频免费观看| 安息电影在线观看完整版| 欧美激情五月| 婷婷激情五月综合| 久久 婷婷 五月天| 五月婷婷六月丁香在线| 久久人妻少妇嫩草AV| 99热资源在线| 韩国天天婷婷| 久久婷婷五月天大香蕉| 天天爽天天爽天天爽天天爽天天爽| 亚洲精99| 婷婷网五月天| 色99欧洲色19| 人人草人人爱| 亚洲午夜av| 天天干天天爽天天操| 婷婷伊人网| 青吴乐视频| 色五月xxx| 99热地址| 亚洲AVwwwwwww| 婷婷久久五月| 激情五月婷婷丁香| 亚洲精品国产成人AV在线| 这里只有精品免费视频在线观看 | 思思9久久| 91热视频色网站| 天天操夜夜玩!| 五月激情婷婷丁香| 亚洲色区17| 久久婷婷丁香五月一二三| 婷婷五月激情中文字幕| 99热全是精品| 日本色视| 亚洲成人av在线播放| 色五月激情基地| 狠狠综合| 五月天五月色婷婷综合| 伊人久久艹| 毛片新网地| 99久久性爱| 丁香五月婷婷欧美性爱| 日日日天天干| 丁香婷婷五月人体| 久久五月婷婷丁香| 九九精品综合| 99精品久久| www.jiujiujiu| 五月天丁香婷婷视频网址| 91人妻人人做人碰人人爽九色| 丁香五月婷婷香| 丁香五月 无码| 26UUU精品一区二区Com| 超碰2021| 五月天成人免费视频| 久碰久| AAA亚洲AV| 一起草AV入口| 婷婷情爱五月天6| 亚洲视频在线网| 色五月婷激情| 先锋资源婷婷| 亚洲精品视频在线播放| 五月丁香六月婷婷久久久综合| 在线看的免费网站| 色色色色色网站| 亚洲成人无码片| 五月天综合区| 影音先锋天天日| 久久大香蕉同僚| 久久婷婷五月综合成人d啪| 激情图片婷婷| 五月开心六月婷婷在线播放网站| 97男人天堂| 天天干,天天日| 玖玖在线| 曰韩少妇内射免费播放| 欧美色爱五月天| 超碰网站在线观看| 9久热| 午夜九九电影| 手机旧版看人妻1025| 99色色网| 九九热视频免费| 婷婷之玖玖| 久久9热综合| 久久丁香五月| 色色色在线免费视频| 性做爰1一7伦| 日本激情五月天‘| 天天久久狠狠色综合| 色噜噜狠狠色综合日日| 丁香五月综合网亚洲综合欧美狠狠| 大香蕉在线观看9| 色婷久| 丁香色婷婷| 九九色情网站| 婷婷五月色| 另类婷婷丁香| 91狠狠色| 亚洲色五月婷婷| 亭亭五月色男人| 影音先锋 婷婷| 在线看黄色| 色婷婷香蕉| 情趣视频66| 99热九九这里只有精品| 久久嘟嘟丁香| 婷婷婷狠狠| 成人在线视频一区| 婷婷五月天婷婷| 国产av基地| 国产乱妇无乱码大黄AA片| 婷婷色狠狠| 色婷婷av在线观看| 久久999久久999久久999久久| 亚洲超碰在线| 99爱视频在线| 伊人久久大香网| 俺去也在线视频| 啪啪操超碰| 777米奇影视第四色| 五月天婷婷成人| 中文久久久人妻| 密臀av无码人妻精品| 久久人妻精品| 九九热黄色| 综合五月天完整| 人妻系列久久久久久久久久久| 99热色婷婷| 日本一级黄色片。| 无码激情AAAAA片-区区| 五月婷婷色| 丁香六月婷| 色五月综合婷婷| 伊人丁香六月婷婷| 欧美欧盟性爱网| 婷婷激情在线| 成人一级片| 久久99久久99www| 日本人妻伦在线中文字幕| 日本久久高清| 亚洲成人一区| 色色色色五月天| 99精品网| 啪啪操超碰| 99热这里只有精品18| 天天在线久久综合 | 日韩艹比| 性爱网五月婷婷| 九九碰九九爱97超碰| 久久婷婷色色| av九九| 激情综合激情综合| 亚洲激情另类| 青青草原伊人网| 色综合色综合色综合色综合| 婷婷天天婷婷天天澡| 婷婷五月六月激情| 26uuu亚洲精品国产| 操嫩逼电影| 婷婷偷拍网| 综合色情网| 91成人电影| 丝袜激情网| 欧美日韩成人在线免费| 色六月婷婷| 久久性刺激| 五月婷婷久久久久| 99操逼| 中文字幕在线日亚州9| av国产精品偷| 丁香综合伊人| 天天做 天天爱| 久久久久久丁香五月| 五月丁香无码| 国产 亚洲 在线| 久久久18| 色青青电影色五月| 91九色超碰正在播放| 激情丁香久久| 国产免费一区二区在线A片视频| 女婷久久| 五月欧美色色五月| 五月色综合| 91日本在线观看| 狠狠色丁香| 9久精品| 天天激情站| 九月婷婷综合在线| 91啪啪| 丁香月五月天婷婷久久| 五月丁香婷婷五月| 99色婷婷| 无码橾| 九九热中文| 99婷婷五月天| 成人丁香五月天| 五月天婷婷av| 婷婷5月久久综合网站| 色丁香五月婷婷综合久久| 久久嘟嘟丁香| 色婷綜合网| 色婷婷www| 99欧州偷拍视频| 91色久| 日本玖玖在线| 激情五月天婷婷| 亚洲啪啪视频| 色婷婷精品视频在线播放| 五月丁香婷婷成人版| 久久久婷婷婷| 99精在线| 丁香五月花| 香蕉乱插| 99爱无码| 成人做爰高潮A片免费视频| 亚洲国产黄色电影| 青青操avbb| 99热精品在这里| 色99视频| 99色婷婷视频| 亚洲情色一区| 丁香五月婷婷激情中文| 综合激情五月丁香| 激情网五月| 九九色黄色| 丁香色六月| 综合成人小说婷婷| 97色精品视频| 色亭亭五月天网扯| 久久人妻视频| 97视频久久| 精品三区影院| 欧美内射AAAAAAXXXXX| 99热伊人综合| 五月天社区狠狠| 操一区| 激情综合九月| www.91在线观看| 超碰国产在线播放| 久久九九99字幕| 激情六月综合| 99视频自拍| 六月丁香五月婷婷| 九九九午夜视频| 99热这里精| 色色色综合网| 麻豆科斗777| 色色色成人网| 日本色噜| 青草视频在线播放| 色五月成人在线| 欧美性生交XXXXX无码小说| 丁香激情网| 中文字幕久久婷九女同| 伊人网色婷婷五月天| 亚洲日本韩国| 亚洲激情免费视频| 久久日韩婷婷五月| 久热只有精品| 综合九色| av在线激情| 亚洲久久日| 久久婷婷婷| 亚洲啪啪网| 蜜臀99精品| www.91九色| 亚洲无码播放| 亚洲精品操一操、噜一噜、摸一摸、爽| 超碰在线成人| WWW.色婷婷.COM| 99在线视频观看| 丁香涩涩爱| 五月婷婷97| 日本成人噜噜噜| 久婷婷五月综合欧美| 九九热婷婷| 超碰二区| 国产精品久久久久9999小说| 五月天激情啪啪| 1769在线观看欧美国产| 久色网址| 丁香六月成人网| 青青久久五月天丁香婷婷| 婷婷五月情天| 婷婷丁香在线| 欧美天堂婷婷日韩| 五月色婷婷中文字幕| 99热福利| 超碰A V在线| 久久久久久9| 婷婷激情五月天综合| 性欧美大战久久久久久久83| 五月狠狠| 天天 日综合| 久久这里只有精品网| 精品爱欲五| 九九热只有精品| 九九色婷婷| 99色看| 99在线精品视频免费观看20| 91精品久久久久久综合五月天| 天天摸,天天爽| 桃色五月婷婷| 五月婷婷无码| 亚洲小视频| 色欲色天天香综合| 色婷婷啪啪综合网| 日本三级日本三级99| 丁香网五月天激情| 深爱五月激情综合| 国产三级片91| OYIWbGcPu8H| 丁香五月天啪啪| 婷婷五月天激情五月天网站| 玖玖五月丁香| 波多婷婷久久| 激情深爱五月天| 丁香五月天堂网| 五月丁香婷色| 婷婷丁香五月天婷婷| 成人免费超碰| 激情五月激情综合网| 欧美激情VA永久在线播放| 九月婷婷综合八月丁香在线观看| 久久婷婷五月丁香网| 伊人婷婷福利网| 99婷婷| 五月天六月婷婷| 色婷婷电影网| 激情综合网五月| 草榴视频黄色网| 青青草五月天| 99超级碰免费视频| 97人人做| 超碰资源在线| 丁香五月Av| 久久精彩视频99| 激情深爱五月婷婷| 996热| 中文字幕性爱视频| 五月天色站| 亚洲视频一区| 五月婷婷六月色| 操逼五月天| 婷婷五月天成人| 99这里有精品视频| 成人av在线网站| 一起草性爱不卡视频| 日日夜夜青青草| 99热无码精品| 99热精在线九九久久保| XXXX岛国| 色七色九九| 丁香五月AV综合| 婷婷香香五月| 再次出发二| 婷婷丁香视频在线观看免费| 99这里只有精品视频在线| 五月丁香啪啪婷婷| 青青.com| 五月丁六月香av| 欧洲日韩一区二区三区| 婷激情五月| 99热99这里有免费的精品| www.狠狠操.con| 天天人人天天爽| 五月永久激情| 人人爱国产| 伊人国产婷婷五月天| 五月青青草综合| 婷婷深爱五月亚洲综合| 99er精品视频| 激情综合九月| 99无码视频| 国产精品久久久爽爽爽麻豆色哟哟 | 天天射影院| 亚洲免费观看高清完整版AV线| AA丁香综合激情| 91超碰在线播放| 狠狠干婷婷| 婷婷中文字幕| 91丨九色丨国产打屁股网站| 九九自拍网| 五月香婷婷| 最新午夜理论片| 丁香色情五月综合网站| 99九九视频精彩在线| 99热这里只有精品4| 激情 婷婷| 丁香五月天综合| 97精品人人A片免费看| 大香伊人久色| 久久总和99| 狠狠操.com| 婷婷色五月情| 996热re视频精品视频| 91丨九色丨43老版熟女| 9999热精品| 亚洲激情综合网| 激情五月综合ì香亚洲| 婷婷五月天社区| 亚洲综合色网| 婷婷色基地在线看| 久热这里只有精品性色AV| 丁香婷婷五色月| 色丁香五月| 婷婷丁香色五月天久久88| 天天爽天天摸| 激情五月天色播| 婷婷丁香黄色| 激情婷婷五月天伊人在线观看| 亚洲天码视频www蛋播视频| 欧美日朝成人| 色综合久久综合| Av性爱网站| 深爱五月婷婷| 欧美激情综合五月色丁香| 中文久久婷婷| 99在线视频免费| 激情五月色婷婷| 99国产精品久久久久久久久久久| 久久精品五月天| 久久网思思| 91性高潮久久久久久久久| 玖玖99婷婷| 热99国产精品| 激情五月综合网最新| 超碰成人影视| 五月婷婷之六月丁香| 亚洲综合色色| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 4399亚洲视频| 伊人久热91| 免费试看小视频 99| 日本色婷婷| 日韩无码人妻一区二区| 欧美色色色色色色色| 操一区| 五月丁香啪啪激情| 79色色色色| 精品夜夜澡人妻无码AV| 久久6这里只有精品| 99久久久久久| 91婷婷丁香五月| 久久538| 久久密臀婷婷| 激情五月天激情综合网| 五月停性愛| 337p午夜影院| 狠狠CAO日日穞夜夜穞AV| 丁香五月自拍| 色综合99| 婷婷六月天精品| 99久久综合网| 五月天播播综合| 综合激情五月天| 五月丁香网视频| 99操99| 婷婷伊人75| 色五月成人| 影音先锋五月婷婷| 亚洲第一精品成人999久久精品| 婷婷五月天97干| 婷婷永久在线| AV在线免费观看不卡| 丁香丝袜五月| 在线综合91| 天天摸天天做天天爱天天爽| 大香蕉 伊人夜| 99亚洲视频| 在线sebiav精品视频| 婷婷五月情天| wWW九九在线播放| 伊人色综合久久久| 99热九九这里只有精品| 欧美性猛交99久久久久99按摩| 秋霞网在线观看理论91| 婷婷六久久| 无码色色色| 久99久精品| 操逼巨乳91| 97中文在线| 五月婷婷色| 色五月婷婷婷婷| 激情婷婷五月天丁香| 五月婷婷五月天| 99在线观看| 日韩二区搞逼插逼毛片| 色婷婷丁香五月| 91久久九色| 夜夜撸天天操| 日本激情五月| 婷婷久久婷婷色五月| 91无码视频| 婷婷五月天激情综合| www天堂99| 婷婷五月色惰| 丁香五月成人论坛| 欧美啪啪五月天| 色色色色色色网站| 婷婷五月天综合色| 大香蕉啪啪啪| www.韩日视频| 久久a热| 夜丁香五月婷婷| 日本美女上人| 久久婷婷青青| 五月天com| 天天干天天爽天天操| 99自拍视频网站| 欧美成人一区二区三区在线视频| 中文字幕色色色| 六月丁香大香蕉| 色欲五月丁香| 91色婷婷综合久久中文字幕二区| 激情五月小说婷婷| 色五月婷婷激情五月| 九月婷婷激情| 91无码一起草| 九九热在线精品视频| 日韩精品二三区| 亚洲色五月| 91碰九色| 五月久久丁香| 亚洲成av人影院| 亚洲AV中文在线| 日韩操| 色色99色色| 久久婷狠狠色| av五月丁香| 日韩中文字幕| 99无码| 97性视频| 国产精品色| 丁香五月停停av| 激情婷婷五六月天| 五月天婷婷色在线视频免费观看| 久久精品91视频| 成人精品网站在线观看| 少妇伦子伦精品无吗| 五月天婷婷激情小说电影| 日日干天天| 色婷婷丁香香香蕉视频| 蜜乳国产网站| 影音先锋 91工厂| 激情五月天久久丁香| 婷婷久久内射| 五月婷婷导航| 久人操| 婷婷五月天天激情| 五月婷婷亚洲综合在线| 91狼友视频在线观看| 最新高清无码专区| 少妇真实被内射视频三四区| 99热免费| 202丰满熟女妇大| 婷婷久久综合| 成人片在线播放| 天天操天天操天天操天天操天天操| 丁香五月在线自慰| 996er热| 超碰在线精品| 亚洲九区| 伊人久久艹| 九九亚洲| 五月天婷婷综合网| 五月丁香激情综合网| 深爱激情五月天| 欧美精品XXXXBBBB| 97日韩无套内| 超碰成人在线免费观看| 色婷在线视频| 97视频久久| 26uuu青青| 色五月激情问网站| 亚洲九九99精品视频在线播放| Www.婷婷五月| 丁香婷婷六月男男| 超碰在线国产| av国产精品| 三级av在线| Av在线不卡一区| 大香婷婷| 俺来也综合网精品一区| 99精品在| 婷婷成人五月天成人文学| 99riAv1国产在线观看| 五月天精品视频| 日本精品久久久久中文字幕| 182.t午在线观看| 久久久久久久久久久44| 蜜臀AV在线成人| 白天AV月月| 日韩AAAAA| 91欧美| 无码成人播放器| 9久久精品视频| 综合狠狠伊人| 欧美激情综合色丁香婷婷五月天 | 日本少妇裸体做爰高潮片| 大香蕉AV电影在线| 欧美色久| 婷婷五月天亚洲激情戏精品| 色色色色综合| 色色婷婷丁香| 色天堂操| 99热这里只有精品21| 在线可以看的av网址| 久久与婷婷| 无码人妻精品一区二区蜜桃色欲| 日本黄色精品| 丁香五月婷婷姐| 九九免费精品| 97精品综合久久| 五月丁香久久婷| 亚洲综合新99视频| 丁香婷婷九月| 婷婷影视久久| 九九精品在线视频观看| 人妻操逼视频| 亚洲经典三级| 91操片| 热思思| 色婷婷基地| 操碰久| 久久99色色| 超碰久热| 婷婷狠狠97| 精品99爱免费视频在线观看| 久热9| 午夜日韩久久久网站| 五月激激网w'w'w| 丁香婷婷性爱| 69综合在线| 婷婷日日天天| 五月天大香蕉| 日本91在线| 天天日 天天草| 日本人妻伦在线中文字幕 | 婷婷在线网| 亚洲视99| 色婷婷操逼| 色噜久| 另类图片激情五月天| 亚洲成人高清在线| 久热精品在看| 丁香五月天在线| 在线视频区| 天天综合色丁香| 99啪啪视频| 91九色精品| 色色色色av777| 九九亚洲| 亚洲第一色网站| 激情五月久久| 色五月婷婷中文字幕| 国产三级片91| 久久久婷婷五月亚洲97号色| 五月婷婷五月天激情网| 九九精品大香蕉| 免费观看的AV| 婷婷五月天99综合网站| 丁香五月天五码婷婷| 亚洲无AV在线中文字幕| 美妞av| 操91| 丁香五月激情站| 99热国品| 99爱免费在线视频| 男女av免费看| 五月色俺婷婷| 色色色丁香| 婷婷射婷婷舔| 欧美日韩中国| 天天日天天插| 综合99久久| 久久久久久欧美精品se一二三四| 丁香五月天啪啪| 色偷偷五月天| a69在线视频| 噼里啪啦完整版中文在线观看| 婷婷另类开心| 亚洲另类在线观看| 亚洲 小说 欧美 激情 另类| 99精品视频播放| 精品人妻久久久久| 99热综合色图| 综合网五月| 人妻videos人妻高清| 亚洲激情五月| 我爱婷婷五月天综合88| 色婷婷亚洲综合天堂| 久久久久思思热| 91在线操| 激情网五月天| 深爱女色婷婷丁香五月亚洲图区| 四川女人毛多水多A片| 婷婷五月丁综合| 婷婷激情五月视频| 婷婷99狠狠| 美女婷婷六月色| 97操操| 深爱五月日韩| 午夜成人网站在线观看| 五月婷婷六月激情| 六月五月婷婷| 综合久久五月天| 99精品网| 婷婷狠狠操| 亚洲小视频免费看| 影音先锋91在线资源站| 丁香五月婷婷在线| 天天草人人摸| 97se在线视频| 婷婷色中文字幕| 丁香婷婷久久老熟女综合网| 欧美色97| 河北真实伦对白精彩脏话 | 久久久亚洲精品一区二区三区浴池 | 亚洲在线操| 六月婷婷色五月| 欧美久人人| 午夜丁香婷婷| 五月婷婷婷婷婷婷艺术| 六月婷婷综合激情| 免费无码毛片一区二区A片| 五月天淫乱视频| 日本va欧美va精品发布视频| 色情开心五月| 久久久一级AAA| 亚洲综合婷婷| 婷婷五月综合亚洲| 激情婷婷综合| 亚洲在线操| 色操综合| www.yw尤物| 九月色婷婷综合| 九九爱看亚洲| 丁香婷婷激情综合五月激情| 97婷婷五月激情六月丁香伊人| 五月天另类激情在线| 色 色 色综合com| 日本在线免费中文com.| 夜夜资源站| 7777久久亚洲中文字幕| 五月丁香六月婷| 精品久久9| 婷婷综合成人五月天| 九九五月天| 婷婷影院欧美| 97搞在线| 成人精品视频99在线观看免费| 亚洲中文字幕av| 五月婷婷 婷婷五月 一区二区 久久久 | 婷婷丁香五月,狠狠综合| 久久9精品| 色婷婷香蕉在线| 开心五月深爱五月| 大香蕉综合网| 久久久性爱视频| 婷婷激情图片| 激情五月天在线视频| 性爱网久久| 九九色综合网| 欧美性爱一区| 影音先锋天天日| 丁香婷婷久| www.com久久久久久久久久久久久久久久久| www.婷婷| 色99视频| 色婷婷综合网站| 丁香五月在线| 91久久久久久| 天天插综合| 天天色天天色天天色天天色天天色| 99精品这里只有免费视频 | 超碰人人操在线| 久久精品婷婷| 99re免费精品视频| 另类综合激情| 激情黄色小说色五月| 色婷婷88| 香蕉综合在线| av九九| 综合97五月| 婷婷色操| 五月婷婷激情性爱| 色99在线视频| 日韩啪啪视频| 99色综合| 色情五月丁香| 色婷婷手机在线| 激情深爱综合| 五月天婷婷网站| 麻豆123区| 免费视频这里只有精品| 自拍盗摄 另类| 久久偷拍综合五月天| 天天久| 99精品久久久| 激情五月天网站| 欧美电影在线播放| 色综合久久久无码中文字幕999| 91久女| 色情成人五月天| 丁香五月黄色| 中文字幕成人| 亚洲婷婷丁香五月天激情小说| 五月婷婷久久网| 99热成人在线观看| 蜜桃人妻无码AV天堂三区| 免费黄色片子| 无码少妇高潮喷水A片免费| 久久久91精品| 殴美97色| 99自拍视频网站| 激情综合自拍五月婷婷色五月| www·五月天| av操一操| 91操人视频| 色哟呦av| 九月婷婷激情| 国产99精品免费视频| 久久这里只有精品16| 激情五月天婷婷在线网址发给我| 五月天婷婷影院| 开心久久xxx色| 婷婷丁香一月| A久久| 婷婷导航| 人妻五月天激情开心网| 婷婷五月大| 亚洲成人噜噜| 九九视频在线观看| 91 久热| 99操视频| 天天日天天摸天天| 九九无码| 超碰9799| 99在线热| 激情小说五月欧美亚洲丁香| 丁香五月在线播放| 亚洲精品亚洲人成人网| 免费99色| 停停色综合伊人| 9l视频自拍9l视频自拍九色学生| 五月丁香六月婷婷网| 99久久婷婷国产综合亚洲| 99精品激情| 99在线小视频| 日韩中文字幕| 激情五月综合色| 色亚洲欧洲| 成人综合视频在线| 婷婷五月天成人小说| 五月丁花色综合网| 91一起艹| 伊人大蕉香| 狠狠搞综合色| 五月丁香婷婷中文| 免费看欧美成人A片无码| 久久多色| 五月激情婷婷国产精品久久久久久| 激情网五月天| 亚洲超碰在线| 亭亭玉月丁香| 操逼视频网址| www.五月天性.com| 91操操| 色综合狠狠色| 婷婷丁香综合| 最近中文字幕2019视频1| 五月婷婷久久综合| 激情五月天开心| 中文婷婷狠狠| 插插五月天| 国产成人片| 五月天无码| 乱码操操| 91精品综合久久婷婷九色| 久久久精品人妻录| 国产毛片精品一区二区色欲黄A片| 丁香五月久久| 99精品久久久| 97偷拍对白视频| 五月婷深深爱激情网| 公的粗大挺进了我的密道| 日本99热| a网站免费观看| 97色婷婷五月天| 日韩另类在线观看| 91操在线| 这里只有久久精99| 日韩啪啪自拍| 五月丁香亚洲婷婷| 91女人18毛片水多国产| 五月丁香色婷婷综合| 综合AV网| 严洲天天插| 综合色在线| 激情五月六月丁香| 97色五月婷婷在线| 婷婷激情五月天天天开心| 亚洲久久激情| wwW天天干| 国产毛片精品一区二区色欲黄A片 极品人妻VIDEOSSS人妻 | 国产精品久久久久久五月天加勒比| 亚洲激情综合| 婷婷亚洲丁香五月| 97热这里只有精品| 五月伊人综合| 嫩BBB槡BBBB搡BBBB| 国产日韩欧美性生活| 狠狠精品干练久久久无码中文字幕| 这里只有精品视频国产| 国产精自产拍久久久久久蜜 | 欧美婷婷丁香五月社区| 五月天婷婷基地| 婷婷开心青青草| 免费V片在线| 97人人做| 天天舔天天摸天天射| 第四色色六月色综合| 久久亚洲无码| 久热这里只有精品在线观看 | 久热一本| 色情综合| 婷婷娱乐丁香综合网| 九九色情网五月天| 九色PORNY自拍成人精彩视频| 丁香五月天堂| 玖玖综合色| jiZZdr| 99性爱无码| 婷婷五月丁香激情图片| 激情图片婷婷| 99高级会所久久| 影音先锋一区二区资源站| 五月婷色激情五月| 色情久久久| 秋霞免费视频| 99久久极情精品一区| 色综合婷婷| 91精品久久久久久久久久| 99久久6| 99亚洲天堂| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 97人妻碰碰碰久久| 99热精品中文字幕| 色婷婷亚洲在线| 少妇高潮呻吟A片免费看软件| 1024成人在线观看| 天天爽天天日| 少妇人妻综合色6699| 色婷婷中文在线| 欧洲电影在线观看免费版英语版| 人妻久久人妻久久第一区| 五月丁香成人网| 亚洲综合视频八| 色私五月婷婷| 婷婷色五月久久| 日本一毛片| 丁香五月手机在线| 九九九九这里只有精品| 天天想夜夜爽天天爽| 99久久婷婷国产综合亚洲| 99视频内射三四| 五月色婷婷综合丁香精品无遮挡| 丁香五月性爱爱五月| 极品少妇XXXX精品少妇偷拍| 天天艹夜夜艹| 六月丁香深深爱| 色婷婷色综合| 亚洲乱码日产精品BD| 91无码高清| 婷婷娱乐丁香综合网| 成人av免费观看| 天天操天天国产三级片处女学生妹| 丁香五月成人| 丁香五月婷在线| 第二色AⅤ| 日本婷久久| 人操91在线| 超碰v| 开心五月深爱五月| 热这里| 狠狠色婷婷在线| 一逼色综合| 久久与婷婷| 日本97在线| 热久69| 大香蕉75线| 五月天婷婷涩涩| 久久ri精品视频| 91九色PORNY大屁股| 国产精产国品一二三在观看| 久久综合99| 五月婷婷激情网| 色日本五月天| 99综合免费视频| 99热最新网址| 久热久| 五月婷婷六月丁香| 五月丁香人妻| 天天插天天插天天插天天插 | 性爱五月婷| AV变态另类一区二区| 真实熟女-91九色| 日本在线观看aaa 99| 七七色综合| 五他月天啪啪啪| 秋霞少妇毛片| 亚洲婷婷五月| 色色色综合色| 妇激情基地| 激情五月深爱五月| site:esunnet.com| 狠狠干在线视频| 午夜国产精品AV在线播放| 色播婷婷五月天| 另类综合婷婷五月天欧美视频| 九一99| 丁香婷婷激情六月五月开心| 婷婷五月天狠狠色| 亚洲午夜视频| 婷婷五月天开心网| 亚洲国产精品SUV| 丁香六月丁香婷婷激情| 天堂网亚洲色图| 亚洲精品在线视频| 99人人干| 少妇激情五月婷婷| 99热这里只有精品最新| 综合成人小说婷婷| 丁香九月久久| 人妻少妇色综合| 色色综合网www| 色婷成人狠干| 婷婷导航| 噜噜噜色噜噜| 五月丁香色六月激情干大屄| 久超超碰| 亚洲亚洲人成综合网络| 成人AV播放| 日韩 中文 欧美| 日日噜噜久久婷婷五月天| 99热中文字幕久久| 日本熟妇精品99| 丰满女老板BD高清A片| 十二区无码| 91人妻人人做人碰人人爽九色| 电影爱拉战争免费观看| 久久久精品人妻录| 激情五月综合网最新| 免费视频WWW在线观看网站| 99综合入口| 操人91| 99色免费视频| 日本色色色| 久久探花91swag| 九九热AV| 丁香成人色情五月天| 91九九| 国产乱轮一区二区三区| 噜噜干日本| 色综合综合网| 日韩成人精品中文字幕| 婷婷丁香日韩五月| 综合AV在线| 五月婷婷六月婷| 五月叮香啪| 99ri视频在线观看| 五月丁香美女| 色五月亚洲| 国产乱人偷精品人妻A片| 操人91| 五月婷婷丁香狠狠撸久久| 欧美性猛交99久久久99| 久久AAAA片一区二区| 伊人玖玖网| WWW.桔色成人.COM| 婷婷色色五月| www.五月婷| 激情五月丁香色婷婷| WWW.99视频| 丁香五月亚洲综合| 激情婷婷五月女| 免费播放片大片| 五月婷三级片| 激情五月开心五月在线视频| 天天日天天干天天操| 日韩成人影片网站| 日本九九九九| 九九无码| 丁香五月天影院| 开心五月婷婷六月丁香| 国产 亚洲 在线| 久久99免费视屏| 国产五月天激情小说| 99精品在线观看| 欧美 日韩 成人| 五月六月激情| 亚洲国产精品二二三三区| 91人妻人人做人碰人人爽九色| 99综合色| 日韩AC在线免费观看| 亚洲精品操一操、噜一噜、摸一摸、爽| 婷婷97碰碰| 亚洲在线视频321| 一本久道综合色婷婷五月| 欧美成人一区二区三区在线视频 | 色婷婷av综合网| RenRenSe在线视频网站| 91人妻PORNY九色大屁股| 丁香六月久久| 武则天精品久久| 七七九色| 五夜丁香| 9热在线观看| 激情六月婷婷| 九伊人网| 五月激情影院| 狠狠爱婷婷丁香| 激情五月丁香亭亭 | site:xiongshengzz.com| 久99热| 99久久99久久综合| 激情小说五月天| 色婷| 丁香婷婷色五月| 99 热国产在| 六月婷婷五月丁香| 熟女色专区| 色婷婷综合网站| 激情综合网络插| 亚洲视频在线观看| 婷婷亚洲五月丁香综合在线 | 操逼五月天| 激情五月天 婷婷| 亚洲精品成人片在线播| 五月丁香网站| 91黄址| 天天日夜夜| 婷婷五月激情片|