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

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
返回資訊列表
五月丁香六月合| 色丁香五月综合网| 91热久| 婷婷丁香五月综合| 五月婷婷婷| 色色成人網| 欧美婷婷综合网| 99热这里只有精品66| 操日本人妻视频| 999婷婷综合| 婷婷的五月天另类视频| 久久久久9| 亚洲天天| 天天爽天天日天天舔| 日韩婷婷| 99久在线| 亚洲色区17| 岛国AV网| 思思热精品在线| 开心激情播播五月天| 国产成人综合网| 久热一区| 无码激情AAAAA片-区区| 五月婷丁香| 97人人操人人| 狠狠干综合| 九九热思思热| 狠狠色性| 色五月丁香一区在线| 综合激情专区| 人人操人| YW无码| 五月丁香六月| 成人视频网| 91精品婷婷国产综合久久| www天天色天天射| 青青草蜜臀| 久久久久网站| www.婷婷五月天,com| 色色五月天丁香| 人人干人人操人人摸| 五月婷婷开心爱| 99ri国产| 五月色在线| 99热在线精品播放| 91一起艹| 91操色| 国产在线中文字幕| 女同激情久久av久久| 九九久久腿| 夜夜嗨一区二区三区直播内容| 狠狠做婷婷| 中文字幕不卡+婷婷五月| www.夜夜操| 久久五月天激情| 天天做 天天爱| 五月婷婷乱| 五月丁香AV、伊人业余、性色熟妇| 永久无码色| 91丨九色丨高潮丰满日本| 丁香婷婷久久综合在线| 九九干视频| 欧美人人女女精品综合五月天| 六月丁香开心婷婷欧美| 激情文学第四色婷婷丁香五月| 色欧美日| 影音先锋色婷婷| 国産精品| 女人天堂av| 密臀久久| 橾逼网| 日韩视频99| 九九精品视频在线观看| 五月婷婷色情| 色情·com| 99久热这里有精品| 五月天成人小说网| 亚洲色碰| 免费视频WWW在线观看网站| 午夜天堂一区人妻| 婷婷丁香五月在线观看91| 久久久久9久无码视频| 色婷五月天| 国产精品99久久久久久久女警 | 色婷婷六月性| 色婷婷五月综合网| 日韩99视频| 九九五月天| 婷婷色导航| 欧美天天干五月丁香| 99热这里只有在线播放| 久久人妻视步| 丁香六月啪啪| 欧美人人草草| jiujiu热在线视频| 五月婷精品| 亚洲五月天激情| 深爱激情丁香| 国产人人操| 日本三久久| 欧美日综合| 久久黄色免费视频| 色综合色| 91|疯狂丨高潮丨对白| 色爱爱综合网| 蜜臀av无码久久久久久久久| 久热这里只有精品视频免费观看| 99无码| 97超级啪啪在线观看| 亚洲成片在线观看| 9久热这里只有精品视频| 五月天色社区| 无码人妻AV久久久一区二区三区 | 大香蕉婷婷色| 中文AV网站| 色七七九九| 97视频久久| 一根材五月婷成人| 91狠狠色丁香| 97大香蕉五月天| 热99免费在线| 丁香六月五月婷婷| 国产精产国品一二三在观看| 久久免费9| 青青热久精品视频在线观看| 五月婷婷69| 五月丁香六月婷婷久久肏| 伊人玖玖网| 激情综合网五月婷婷| 欧美大片| 五六月婷婷| 777丁香六月青青草婷婷综合久月| 99色在线观看| 99视频精品| 天天日天天久久青青| 五月天婷婷基地综合网| www.久久| 婷婷五月天激情综合网| 婷色五月| 丁香五月综合激情啪啪| 嫩模aV在线| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 丁香六月婷婷久久综合八月| 五月婷婷天堂| 99WWW免费视频| 五月丁香六月色婷婷| 九九人人操| 9在线9在线婷婷在线国产| 国产色色网站网址| www.婷婷亚洲基地| 99久久高清视频| 五月婷婷丁香大陆免费| 日本久久精品| 第四色色六月色综合| 另类激情综合| 色婷婷在线影院| 亚洲99在线| 久久香蕉网| 激情伊人| 五月丁香婷婷综合网| 国产亚洲99久久| 99精品爱| 久99999热视频在线观看免费| 99热自拍| 色婷婷五月天偷拍| 激情无码五月天| 99热这里只有精品免费| 丁香五夜激情四射夜夜夜| 激情丁香婷婷六月天| 这里只有精品网| 激情床戏| 亚洲婷婷综合视频| 天堂va久久久噜噜噜久久Va| 久久九九热re6这里有精品| 在线中文字幕视频| 久99在线视频| 久久五月激情| 欧美日韩一a.无| 激情五月婷婷在线观看| 丰滿爆乳一区二区三区| SESE无码AV| 丁香五月婷婷社区| 色色AV色色色东莞| 九九精品综合| 国产无套精品一区二区| 亚洲色婷婷99一9|| 九九综合影音先锋| 五月婷婷中文字幕| 玖玖无码中文| 玖玖爱伊人| 丁香天堂夜| 96五月丁香熟女| 日韩有码一区| 激情综合网激情五月天| www.99热日韩.com| aV直接看| 日韩淑女人妻luan伦激情精品一区二| 久久婷综合| 久久只有18视频| 久久婷婷五月综合97色一本| 丁香五月av| 黄色99视频| 国产av天堂| 婷婷深爱五月亚洲综合| 亚洲精品又粗又大又爽A片| 超碰在线人妻| 九久9精品| 二色av| 色狠狠综合| 五月天婷婷丁香花| 婷婷影院欧美| 九九色逼| 色色色无码| 婷婷激情性爱| 国产精产国品一二三在观看| 久久天堂| 丁香五月aV| 日韩国产AV播放| 婷婷娌伦网| 超碰在线人妻| 超碰人人摸AV| 99热6这里只有精品| 色婷婷操逼| 五月花免费视频| tingting五月天亚洲| 五月丁香亚州综合网| 六月丁香婷婷综合狠狠爱夜夜爱| 免费精品66| 久久久久久婷| 久久思思热| 色丁香婷婷| 99热播放| 色婷婷在线电影| 九九热视频在线观看| 9久精品视频| 国产精品色色| 亚洲第一黄网| 伊人久久五月天综合| 永久免费视频| 亚洲人成网站999综合| 丁香五月天啪啪| 久久性爱网站| 综合狠狠干| 91久久婷婷| 激情综合激情五月一起草| 97碰超级人人看| 五月天激情色色| 婷婷五月激情欧美| 人人摸人人搞| 色五月丁香激情| 亚洲黄网AV| 久久综合丁香| 亚洲色欲AAAAAA| 九热视频免费观看| 婷色天堂| 激情五月天婷婷| 人人草人人爱| 无码激情精品色婷婷久久久久| 国产激情在线| 91丨九色丨老熟女激情| se色婷婷视频| 第九色区av天堂| 激情网五月天| 婷婷基地爱| 激情五月天综合图片小说网站| 在线99色| 99干免费视频| 梁铮版蜘蛛女在线观看| 色婷婷aV四虎| 少妇搡BBBB搡BBB搡毛茸茸| 综合一区二区三区| 丁香婷婷成人在线播放| 五月婷婷六月丁香激情深爱| 婷婷伊人视婷婷婷| 亚洲精品V天堂中文字幕| 欧洲亚洲免费视频9| 久久成人人妻| 无码G高清天| 青青久久五月天丁香婷婷| 色婷网| 婷婷五月深爱五月| 可以免费看AV网站| 五月综合缴情网| 五月婷高清视频| 大香蕉啪啪啪啪啪啪| 日韩在线观看网址| 五月婷婷开心综合| 思思热在线精品视频网站| 在线播放成人网站| 99综合网| 久热精品视频在线观| 九九九九大香蕉| 亚洲欧洲中文日韩久久AV乱码| 色婷婷视频| 99久久久久久www| 色婷婷香蕉丁丁网| 婷婷五月花西瓜| 99热大片| 婷婷 月 丁香| www.狠狠| 亚洲色碰| 五月开心网| 丁香五月激情网| 99热思思| 婷婷成人综合| 六月丁香啪啪| 综合色图婷婷| 成人做爰黄A片免费看直播室男男| www色婷婷| 九九精品99| 五月激情啪啪| 国产国产乱老熟女视频网站97| 天天做天天爱| 丁香五月天啪啪| 亚洲综合激情五月久久| 亚洲激情视频网| av九九| 五月婷婷丁香啪啪| 99热老网站| 大香蕉精品视频| 久久ww| 99在线精品视频观看免费下载| 久久机热/这里只有精品| 亚洲综合色婷婷| 内射综合网| 五月婷婷免费在线观看视频| 久久久久婷 | 欧美va精品va老师va| 色五月中文字幕| 99 re视频一区| 精品国产va久久久久| 99爱在线| 五月天婷婷乱论小说| www.五月丁香| 可以看的av| 五月婷视频| 九九色婷婷五月天| 国产av基地| 亚洲激情综合色站| 天天干天天射色综合| 婷婷五月激情中文字幕| 丰满人妻一区二区三区| 99激情视频| 99九九这里有免费视频| 97丁香婷婷| 久久小视频免费| 五月香六月婷| 五月丁香999| 噼里啪啦在线观看免费完整版视频 | 狠狠久综合| 国产99久久久| 99成人精品| 激情六月色| 婷婷亚洲色| 国产精品第一国产精品| 九九热啪啪| 色噜噜狠狠色综合伊人| 久久激情五月婷婷| 久久精品国产一区二区三区四区| 五月天久久网站| 色色色综合视频| 开心激情网五月| 丁香婷婷大香蕉| 香蕉婷婷五月| 秋霞黄色一级久久| 日本色色网站| 五月天丁香久久综合| 婷婷久久内射| 中文乱子伦视频| 激情五月丁香婷婷| 亚洲无aV在线中文字幕| 色婷婷狠狠色| 综合五月婷婷| 色操综合| 第四色色六月色综合| 99性视频| 丁香婷婷五月份| 五月婷在线观看| 情欲综合网| 97色啪| 久久久久久久11111111111| 殴美97色| 久久这里只有国产视频| 国产精品久久久久久久久久| 丁香九月激情| 婷婷五月色综合| 精品久9| 9九热视频| 一级二级色大片| 欧美五月婷婷综合| 五月天在线视频尤物视频在线看| 202丰满熟女妇大| 99自拍视频网站| 激情婷婷丁香五月天小说| 久久成人天| 色婷婷99| 这里只有精品视频国产| 夜夜撸夜夜骑| 久久久久久久久久8888| 综合婷婷久久| 久久婷婷五月丁香网| 亚洲色欲欧美一区二区三区| 丁香五月久久| 午夜色色色极品视频| 碰碰91| 丁香五月伊人| 五月六月激情| 婷婷五月丁香四射| 毛片色五月| 日日干四虎| 这里只有精品99视频| 欧美在线干| 婷婷性爱五月天丁香网| 洗浴中心操B视频| 婷婷99综合| 黄色AAAAAAA| 人操91在线| 久热这里只有精品在线观看| 五月丁香激情啪啪| 久久伊人9| 激情五月婷婷综合色播小说| 字幕网AV中文字幕| 丁香网五月天激情| 97久操| 五月丁香六月婷婷综合网站| 激情熟女网| 丁香,开心成人,久久| 99久久黄色顶级视频| 狠狠色成人影片| 超碰av在线| 99热97| 人妻射精AV| 91精品91久久久中77777| 激情婷婷五月亚洲| 亚洲亚洲人成综合网络| 色综合网综合| 午夜色丁香| 色私五月婷婷| 久久久91| www.狠狠| 丁香五月狠狠综合欧美| 久久精品日| 激情综合一| 五月天婷婷免费| 99综合视频| 五月天日日操夜夜操 | 五月丁香久久综合色| 啪啪黄页网| 五月婷婷丁香综合| 成人无码精品1区2区3区免费看| 久久五月天激情视频| 婷婷久久五月| 亚洲AAAA网| 99操网站| 婷婷五月天小说网| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 精品导航在线x不卡| 99热久| 成人网在线视频| 亚洲日日操| 色五月丁香激情视频| 色婷婷色和| 网色99| 欧美日韩91| 色五月情| 久久色五月天| 天天上天天爽| 色婷在线视频| 欧美色五月| www.五月天社区| 一区操| 久久HD| 婷婷五月天激情亚洲小说| 色噜噜狠噜噜视频| 成人色五月天| 黄色片精品| 日本99视频| 五月激情婷婷在线| 婷婷五月综合婷婷| 久久久久久18| 午夜69成人做爰视频| 五月五丁香婷婷| 一本大道伊人AV久久综合| 五月天播播中文字幕 | 欧美色色色色色| 婷婷五月天深爱| 六月久久婷婷| 热99玖玖99玖玖99九九| 26uuu精品国产| 九九精品在线观看视频6| 狼人久草| 麻豆精品| 五月天丁香久久综合| 欧美久久婷婷| 丁香六月亚洲综合| 伊人综合婷婷| 久热精品免费视频4| 啪啪综合网| 欧美黄色AA片哗啦啦啦| 狠狠五月丁香色婷| 亚洲色图五月丁香| 色播色丁香五月| 97色色婷婷| 人人摸人人澡人人| 亚洲精久久| 色色影院黄大片| 思思热视频| 五月色天五月色| 色六月丁香婷婷啪啪啪| www.99热在线观看| 91丨人妻丨国产丨丝袜| 91狼友视频网页更新| 日日撸夜夜操| 五月丁香综合啪啪| WWW.婷婷| 很很干夜夜干| 丁香五月婷婷色播艳门照| 天堂中文国产| 色噜久| 七七色综合| 久久性爱视频| 79精品视频在线观看,| 安息电影在线观看完整版| 黄色五月婷婷| 亚洲精品成人片在线播| www.久操| WWW、日本色丁香、co m| 97在线观视频免费观看| 国产精自产拍久久久久久蜜 | 中文字幕综合网| 超碰人人操| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 丁香成人五月天| 五月天夜夜爱夜夜操| 免費亭亭成人| 婷婷五月情色| 五月丁香久久综合精品| 色欲丁香久久| 天天操九九插| 六月婷色六月| 激情五月无码| 色丁香久久久| 思思99热这里只有精品| 五月天婷婷色| WWW丁香五月| 天天天久久久| 婷婷五月天国产手机在线视频观看| 亚洲永久免费| 激情美女五月天| 丁香午月AV中文字幕| 丁香九月综合| 婷婷五月欧美综合| 精品久久久久久久久久久久人妻| 欧美综合丁香网| 色色色色色热| 天天色天天搡| 五月天综合久久丁香91| 996er热| 色情五月综合婷婷| 97操碰碰无码视频| 婷婷人人操| 六月99天天婷婷激情综合| 六月丁香婷| 六月亚洲婷婷6月中文字幕| 五月丁香激情五月天| 六月丁香射婷婷欧美色图片| 色日本网| 婷婷射图| 五月色综合| 精品人妻一区二区三区在| 内射 无码 伊人| 五月亭久久无码视频| 色五婷婷| 亚洲色激婷| 综合久久五月| 天天干天天干天天| 激情五月综合亚洲另类| 99亚洲精品综合在线| 黄色五月婷| 人人综合色| 丁香五月天操B| 在线18av | 婷婷激情四射五月天| 久热黄色| 激情黄色五月天| 欧美成人网99网| 亚洲最大在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 五月久久婷婷天堂视频| 亚洲免费看片| 青青草Avb在线| 婷婷爱爱蜜臀天天操| 激情 婷婷| 婷婷第一页| 久久丁香五月综合六月激情红杏视频| 婷婷天天综合| 久久99热在线观看| 欧美在线干| av电影在线播放| 91操网| 噜噜噜色噜噜| 99热这里只有精品1025| 伊人五月婷| 激情婷婷五月| 99热99这里免费的精品| 九九热99热| 大香蕉丁香五月| www.婷婷亚洲基地| 五月婷婷之美女图片| 亚洲激情网| 丁香五月之久操视频| 天啪色| 色五月激情综合| 夜夜操夜夜姧| 狠狠五月激情丁香六月| 99操| 综合网狠狠| 国产五月天激情小说| 日本激情91| 婷婷五月丁香四射| 色9色| 爆乳熟妇一区二区三区爆乳| 涩涩激情五月婷婷| 日日干日日s| 九九在线精品| 1级欧美日韩| av婷婷丁香 六月| 97se视频在线| 免费超碰在线| 激情婷婷五月天在线观看| 天天搞夜夜叫| 中文字幕97超级碰| 亚洲综人色综网| 亚洲激情综合色站| 日韩性视频| 色色五月婷| www.26uuu.com亚洲电影| 色婷婷AV五月天| 久久久精久人妻| 99超级碰碰| se色综合网| 亚洲日韩乱码一区二区三区四区| 丁香色成人| 欧美草久久五月天91| 天堂成人A片永久免费网站| 日本片日本片祼观看网站在线看中文版网页在线看 | 亚洲综合字幕色色| 国产精品人人妻人人爽| 九九综合影音先锋| 开心五月婷婷激情网| 六月婷婷色综合| 久久婷婷艹| 丁香五月激情视频在线| 国外亚洲成AV人片在线观看| 性 色 婷婷| 六月丁丁香| 五月天激情综合网俺也去| 五月丁香婷爱在线| YW无码| 激情综合综合综合| 久久久婷婷婷| 婷婷五月天成人动漫| 五月激情综合网| 丁香六月婷婷久久综合| 久久五月天婷婷| 99久久婷婷| 五月婷婷无码| 激情文学久久| 天天爱天天操| 婷婷舔| 夜夜爽天天爽| 熟女激情网| 五月丁香婷婷婷激情爱爱| 中文字幕黄色电影网址| 日韩有码久久| 久久66精品| 无套内射极品大美女| 久久曰曰| 婷婷五月天777| 亚洲婷婷五月天| 日韩激情婷婷五月天| 五月激情综合网| 丁香久色| 日日干日日| 入口五月婷婷六月香| 色五月av| aaa丁香五月天| 少妇性BBB搡BBB爽爽爽电影| 激情婷婷综合| www.99色在线| 九九热在线精品视频| 久久人妻熟女一区二区| 久热这里只有精品在线| 九九99男女视频在线观看| 亚洲五月天婷婷| 婷婷五月天激情四射| 1024日韩| 欧美色五月天| 超碰人人在线| 26UUU亚洲欧美| 婷婷丁香综合在线| 日本三级日本三级99| 激情五月第四色| 久99视频| 蜘蛛女免费观看完整版高清电影| 最新无码专区| 婷婷五月大香蕉| 婷婷丁香色五月天久久88| 综合久久激情久久| 亚洲天堂啪啪| 国产在线黄色| 小香蕉av| 五月丁香免费视频| 99re这里有精品手机在线| 67194中文在线| 色爱亚洲| 91在线日| 97干网站| 色五月天视频| 婷婷的99视频网站| 亚洲九九99精品视频在线播放| 丁香五月婷婷六月丁香| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 天天操天天曰天天射| 亚洲综合无码| 玖玖精品资源| 欧美日朝成人| 大香蕉天堂色| 激情五月综合| 久久婷婷五月综合啪| 人妻内射麻豆视频| 色五月婷婷影院| 欧美叉叉叉BBB网站| 丁香婷婷五月天色播| 五月天婷婷狠狠| 少妇性BBB搡BBB爽爽爽视頻| www.99日本| 婷婷色五月天综合网| 9久国产| 天天婷婷操| 日日做A爰片久久毛片A片英语| 激情深爱综合网| 亚洲无码yw| 五月停停大香蕉| 久久久久激情| 99视频地址| 丁香五月开心七月| 九九视频在线观看| 丁香五月人妻| 夜夜做夜夜愛| 久久五月婷综合网| 九九大香视频| 五月婷婷 激情按摩| 色综合网页| 九月丁香亭亭| 绿色小导航AV| 9|人妻人人操| 搡BBBB搡BBB搡18| 大香蕉啪啪| 五月婷婷成人w| 做爱夜夜干天天操| 玖玖婷婷视频| 香蕉99网| 九色婷婷| 丁香五月区| 国产婷婷五月色情综合| av在线色五月丁香婷区久| 亚洲第一色网站| 大鸡巴伊人网| 99热最新精品| 色婷婷综合网站| 99热日| 国产精品在线视频| 亚洲网站在线鸭子av| 色色激情网| 五月丁香花激情综合网| 色色色色色综合| www.狠狠| 五月婷婷丁香六月| 99热碰碰| 99久久玖玖| 精品爆操| 天天操中文字幕| 丁香婷婷情色五月天| 伊人丁香五月| 婷婷六月久久| 黄色三级毛片中字| 精品成人在线| 狠狠婷婷色| 久久您您综合网| 亚洲六月综合激情久久下卡| 婷婷伊人五月天| 天堂婷婷综合| 亚洲色99综合天堂| 色在线免费观看| 9l视频自拍九色9l黑人| 亚洲1区| 五月天伊人| 精品影院| 久久人妻视频| 另类激情综合| 狠狠干综合| 99热99极品观看| 五月丁香激情婷婷| 五月婷婷婷婷| 思思99热| 婷婷五月色| 国产真人做爰视频免费| 99热这里只有精彩| 999精品乱码77777| 婷婷五月天精品| 日韩999| 操老逼综合网| 丁香五月久久社区| 五月婷婷深深爱| 亚洲激情AV| 亚洲激情综合| 五月激情婷婷图片基地| 丁香五月手机在线| 91人碰| 久草大| 青青热久久综合| 99精品久久久久久久婷婷久久| 丁香五月婷婷88在线| 天天爽天天干天天| 九九热精品99| 91九色精品熟女内射| 99超超碰| 日本一级大片| 九九日本视频| 超黄亚洲瑟瑟网站| 七七九九色色| 激情五月婷在线精品| 五月花婷婷最新| 五月天五月色婷婷综合| 无码中文一区二区三区| 精品成人无码A片观看香草视频| 婷婷综合伊人丁香| 丁香网五月网| 热99这里只有精品视频| 婷婷久久五月天| 久热中文字幕在线线观看 | 婷婷五月色综合| 综合XX网| www.狠狠| 日韩在线视频9色| 五月婷久久久| 五月天色综合服务平台| 99.N在线视频| 无码AV久久久久久久久| 另类丁香综合| 成人精品在线| 五月天婷婷色播综合在线| 激情六月丁香综合| 99成人精品| 丁香五月激情在线| 97干在线视频| 美女91一起草| 啪啪啪啪五月天| 婷婷综合视频| 人妻日日日| 99久.| 97天堂| 日本VA视频| 天天插天天干| 99碰在线视频| 日 日干 日日做| 天天色亚洲| 图片区 小说区 区 亚洲五月 | 99婷婷综合| 五月天丁香六月综合| 婷婷五月综合婷婷| 亚洲男女激情| 丁香五月激情综合| 8090在线影视少妇| 99久久精品色老| 综合五月激情网| 久久婷色| 91综合色| 多精窝99在线视频| 成片免费播放| 97超碰欧美中文字幕| 婷婷五月天亚洲色| 91超级碰| 色九九九九| www.lingjunshare.com| 五月丁香成人网| 亚洲亚洲人成综合网络| 亚洲熟妇AV乱码在线观看| 综合网五月| 国产成人AV在线| 婷婷黄色五月| 99热在线免费| 99热碰碰热| 九热视频免费观看| 天天檫天天爽| 欧美大片免费播放器| 久久jiuwww| 五月播播| 国产真人做爰视频免费| 五月色情婷婷| 99在线精品观看99| 97人人搞| 亚洲激情综合免费| 97香蕉久久超级碰碰高清版| 成人午夜在线视频| 天天搞天天色综合| 97色射| 色婷婷五月天av在线| 91狠狠综合网| 国产AV一区二区三区最新精品| 99热最新精品| 亚洲综合激情五月久久| 五月丁香好婷婷A片网| 丁香六月婷月91婷月| 爱草视频在线观看| 性一交一乱一交A片久| WWW.激情| 丁香五月婷婷啪啪| 欧美成人热| 亚洲va综合va国产va中文| 成人精品人妻| 久久久ww| 色婷婷色| 五月天激情综合| 91人妻九色大屁股| 丁香五月婷婷手机| 婷婷天天五月天| 欧美美美女性色视频| 超碰2021| 深爱开心激情网| 日日夜夜天天| 日本三级色| 五月天婷婷婷| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 九九九九国产| 久久狼人天堂| 久久这里都是精品| 久9热| 开心激情婷婷| 久99精品视频| 久久婷狠狠色| 五月精品99综合| 色五月成人| 免费观看的av| 先锋资源996| 中文字幕不卡网站| 日本五月视频| 日韩激情网站| 91avse| 国产99热在线看| 久久精品99国产精品日本| 五月天婷婷深深爱| 欧美人人超级碰| 97色天堂| 色五月婷婷av| 无码色色色| 国产永久一黄| 欧美婷婷丁香五月社区| 五月噜噜噜色综合| 性爱久久| 亚洲婷婷激情888精品久| 一本九九色| 国产 亚洲 在线| 五月婷婷无码| 国外亚洲成AV人片在线观看| 黄色激情五月天| 26.uuu丁香五月婷婷| 99爱视频| 操逼巨乳91| 五月婷婷丁香六月在线| 99热销国产这里有精品| 丁香五月色| 快色t v在线入口| 国产精品丝| 久久98| 人人爱人人摸人人澡| httpwww色com日本| 色玖玖爱| 最新亚洲色色网| 在线超碰91| 婷婷午夜| 综合丁香婷婷五月天| 九色亚洲| 99热偷拍| 人人操人av| 丁香婷婷五月色成人网站| 香蕉久久国产AV一区二区| 五月婷综合性中心| 男人的天堂在线婷婷| 毛片色五月| 日本一毛片| 久热婷婷| 丁香五月婷婷成人综合| 日本三级99人妇网站| 亚洲激情网| 色宗合,宗合网| 亚洲av无码精品色午夜| 婷婷五月天影院| 天天噜| 五月丁香五月激情综合色综合| 日本97在线观看| 深爱五月天| 婷五月丁香| 日本人人超碰| 天天日狠狠| 久99久精品视频| 婷婷五月天av| 色五月影视| 热热久久精品视频| 亚洲网站999| 日本韩国视频在线观看社区免费的9| 欧洲综合视频| 丁香五月婷婷姐| 色五月婷婷操逼| 超碰成人影视| 久久9久| 天天爽夜爽| 激情网开心网| 五月丁香婷婷婷激情爱爱| 亚洲操b| 婷婷五月丁香成人| 色欲天天综合网| 一区二区传媒视频| 色欲午夜无码久久久久久张津瑜| 五月婷婷内射网| 91人操| 91婷婷五月丁香碰| 免费观看的av| 五月丁香成人| 极品色丁香| 久久色情| 色婷婷网| 九九热10| 久久婷五月综合色| 玖玖国产视频一区| 婷婷人人操| caopeng97人人| 亚洲色五月| 第四色五月天| 婷婷久久色| 日日日天天干| 婷激情五月| 丁香五月婷婷啪| 亚洲综合在线播放| 中文字幕丰满孑伦无码专区 | 99亚洲天堂| 久久9视频欧美| 99热这里只有精品官网| 五月丁香久久激情网| 激情99。| 中文字幕在线观看视频www| 视频一二区| 爱iii做iiii日日| 五月天社区婷婷| 天堂成人A片永久免费网站| 色久婷婷五月| 亚洲国产网站| 99性爱视频| 天天摸人人摸| 亚洲色综合性| 五月开心婷婷网| 91婷婷| 国产精品色婷婷久久久精品| 久久亚洲天堂| 九九偷拍网| 91久久久久| 农村熟妇高潮精品A片| 久热 91| 激情九九这里只有精品| 伊人色综在线| 五月天,激情四射,婷婷频道| 岛国AV网站| 九九精品在线网| 丁香五月婷婷色偷偷| 久久婷婷亚洲五月天| 五月婷婷精品无在线| 性爱综合网| www.com.色色| 久久五月丁香| 熟妇人妻中文字幕无码老熟妇| 五月丁香婷婷基地| 9热视频在线观看| 色婷婷99| 五月天激情日色在线| 色伊人婷婷| 亚洲av成人一区二区电影在线| 丁香五月婷婷激情蜜桃| 色五月婷婷五月天激情综合| 色丁香五月| 六月婷婷色综合| 婷婷激情五月天激情在线| 亚洲婷婷丁香五月亚洲| 久久这里99| 日韩啊啊啊| 欧美天堂久久| 婷婷色香六月综合激情| 久久伊人日日夜夜| 99热这里只有免费精品| 五月丁香六月婷婷久久肏| 97超碰人人操| 五月婷婷,狠狠操| 亚洲欧洲另类| 丁香五月成人社区| 青青草婷婷五月天| 亚洲AVwwwwwww| 狠狠色丁香| 成人做爰A片免费看视频| 激情婷婷| 伊人婷婷五月天| 九月丁香很很色| 精品9l九九九九九77777| 日韩AV一区二区三区| 99热这里都是精品| 五月婷成人网| 久久精品66| 丁香五月激情婷婷婷婷在线观看| www.91久久| 99视频| 婷婷激情四射网| 久久综合网免费视频| 五月激情丁香久久综合网| 俺也去婷婷五月天第五色| 激情小说五月天| site:picc-up.com| 六月丁香五月激情网| 五月天婷婷社区| 婷婷激情四射| 久久99jiu9| 婷婷久久丁香五月| 久热伊人| av免费人人| 亚洲AV免费在线| 啪啪日热| 久久丁香五月婷婷| 婷婷五月天亚洲综合| www,色中色| 99在线视频播放| 中文字幕婷婷9月天| 久久婷婷久久| 五月综合六月丁| 99九色视频在线观看| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 大香蕉 伊人夜| 色综合久久88色综合天天人守婷| 免费视频99| 婷婷五月天色播| 偷偷与邻居做爰完整视频| 被强行糟蹋的女人A片| 婷婷香草网| 色色五月丁香| 五月婷婷激情综合网| 亚洲日日操| 夜夜AVV| 99在线观看精彩视频| 五月天丁香婷| 丁香九月婷婷| 丁香婷婷激情网站| 久久精品系列| 日本激情五月天‘| 九九aV| 六月婷婷久久| 欧美va欧美va差| 99色热视频| www,99色| 天天草天天日| 久/久精品99看9| 91操片| 激情五月综合| A片试看120分钟做受视频红杏 | 色婷婷成人五月| 无遮羞AV| 五月婷婷与六月丁香图片激情| 丁香五月六月综合激情| 97色五月婷婷在线| 91九色在线| 五月丁香色婷婷熟女| 99欧美| 欧美日本VA| 51XX午夜影福利| 丰滿爆乳一区二区三区| 丁香五月宝贝激情网| 偷偷操99| 婷婷久久图片| 深爱五月网| 九九九九九九热| 丁香六月色婷婷欧美| 激情婷婷六月天| 五月丁香狠狠爱婷婷综合| 影音先锋男士资源网一区| WWW、日本色丁香、co m| 亚洲激情av| 六月色婷婷色| 99热91| 97碰免费视频在线| 婷婷月综合| 一区三区视频有限公司| 狠狠人妻色综合| 丁香密臀AV激情网| 五月丁香六月激情综合欧美| 久激情网| 9色免费网| 婷婷六月五月| 色婷婷播放| 99成人小视频| 五月婷婷丁香日韩在线| 五月婷婷开心深| 性爱视频久久| 亚洲AV电影美洲AV电影| 婷婷五月天激情网站| 天啪天啪天啪天啪| 九九色热| 夜夜爽天天爽| 五月天激情综合网站| 99成人在线观看| 久xxxx| 26UUU在线观看| 色五月丁香五| 激情5月婷婷狠狠干| 俺去也五月天婷婷| 九九久久9 9在线观看| 五月婷婷深爱六月| 丁香六月丁香婷婷激情| 亚洲小视频免费观看| 久久99久久99久久99人受| 思思视频这里是精品| 噼里啪啦完整版中文在线观看 | 91chinese在线| 激情五月图| 免费看欧美成人A片无码| 五月色婷婷综合丁香精品无遮挡| 开心五月激情网| 热九九精品| 狠狠色综合网| 久久久婷| 亚洲精品国产熟女久久久| 五月婷婷激情中心| 999九九九久久久99HD| 殴美日韩成人| 色婷婷影| 婷婷久久综合久| 色9色| 人妻有码乱操| 天天做天天爱天天做| 啪啪操超碰| 97碰| 激情伊人五月婷婷久久| 99久| 91青娱乐青青草| 亚洲国产精品成人免费一区久久久在线观看AAAA | 9191avse| 色综合久久天天综合网| 婷婷五月色花丁香社区| 色吧婷婷五月亚洲| 99精品视频网| 日韩无码专区| 内射在线CHINESE| 五月伊人婷婷| 综合大香蕉| 精品无码久久久久久久久| 五月天婷婷无码视频| 9福利性视频欧美| 亚洲综合激情五月久久| 这里只有精品2| 伊人久久婷婷| 91无码一起草|