免费国产精品自在自线-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
返回資訊列表
丁香婷婷六月激情综合| 天天粽合合合合| 婷婷色无码| 激情五月综合网| 五月色色色| 农村熟妇高潮精品A片| 狠狠色婷婷丁香六月| 婷婷五月开心六月AV| 五月丁香六月婷婷激情网| 天天日夜夜欢| 色五月婷婷天堂| 激情婷婷久久| 天天摸人人摸| 狠狠88综合久久久久噜噜噜| 91激情五月开心| JAPANRCEP老熟妇乱子伦视频| 五月天另类视频| 丁香五月天婷婷在线视频| 九色综合网| 国产精品色色| 精品人妻伦一二三区久久| 91久久婷婷人人澡草| 丁香五月在线人妻| 九九综合色| 国产亚洲99久久精品熟女| 99无码视频| 婷婷成人AV| 五月开心深爱激情网| 操笔无码| 五月婷婷六月丁| 婷婷 伊人 久久| 天堂伊人干| 午夜天堂啪啪| 色情五月丁香| 五月丁香六月婷| www.色五月| 热久久视频99| 激情综合色| www.婷婷网| 久热综合| 夜夜爽天天| 色五月色五天色情网| 97超级碰碰碰| 五月婷婷激情综合| 五月婷婷与六月丁香图片激情| 婷婷99狠狠躁天天躁中文| www.色情五月天.com| 91av传媒高清在线视频网| 成人无码髙潮喷水A片| 久久激情五月婷婷| 超碰免费人| 极品少妇XXXX精品少妇偷拍| 色综合久久之分久久| 狠狠精品干练久久久无码中文字幕 | 97五月天婷婷综合激情网| 色色色九九九五月婷婷| 亚洲有码在线视频| 色情五月丁香| 亭亭五月激情亚洲在线| 色五月播五月| 天天日夜夜| 色无码| 久久丁香五月| 欧美色男人网站| 高潮毛片又色又爽免费| 一级无码作爱片| 亚洲激情Av| 丁香综合久久| 久久这里这里有精品免费视频| 激情网第九色| 婷婷色丁香六月| 日本婷婷色日| 97人人草| 天堂久久大香蕉| 综合激情五月婷婷| 婷婷播播五月天| 精品成人无码A片观看香草视频 | 丁香婷婷久久综合在线| 午夜爱插插| 97资源碰碰| 丁香色情五月综合激情| 日日爽日日爽| 99精品在线| 亚洲成人无码专区| 九九色影院| 天天摸,天天爽| 丁香五月天无码| 狠狠干综合网| 啪啪91| 99热草草| 色色精品色| 丁香五月综合在线播放 | 国产精品五月天婷婷| 婷婷五月天免费视频| 一起草Av| 六月婷在线| 超碰com| 我要色综合五月婷婷| 九九色视频| 久久作爱| 夫妻超碰在线| 婷婷五月丁香五月天| 青青草成人网| 91久女| 色噜噜狠狠色综合网| 婷婷五月天激情文学小说| 丁香五月天激情网| AA片在线观看视频在线播放| 亚洲婷婷五月天在线激情综合网| 99色在线观看视频| 热久91| 婷婷综合久久| 成人视屏在线观看| 97欧美在线| 天天日天天操天天干| caop在线| 黑人无码一区| 96五月丁香熟女| 五月天婷婷久久视频| 国产综合丁香五月天| 激情综合女人网五月播播| 婷婷天天色| 国产精品美女久久久久AV超清 | 国产精品成人av在线观看春天| 丁香五月先锋| 神马欧美精| 996热re视频精品视频这里| 亚洲成人在线播放| 五月天激情小说| 五月婷亚洲精品| 性做爰1一7伦| 久久开心五月婷婷| 色五月丁香91| 色婷婷丁香香香蕉视频| 9999热在线| 66久久视频在线| 久久人操| 综合欧美五月婷婷| 天天爽天天干| 色情激情五月| 亚洲AV成人精品网站在线播放| 好好干Av| 色综合久久久久| 亚洲色色色色色色色色色| 色五月激情网| 操久久网| 99re久久| 婷婷色日本| 97色婷| 五月天久久久| 激情五月天色播| 婷婷激情五月吧| 欧美25p| 中文字幕在线日亚洲9| 91丁香五月| 国产亚洲99久久| 日本狠狠色| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 国产这里只有精品| 四色女婷婷| 欧美色片中文字幕久久久久| 色狠狠色噜噜AV天堂五区消防| 色域五月丁香| 97色天堂| 婷婷在线五月天观看| 久久99热这里只频精品6学生| 婷婷五月天堂网| 97干在线视频| 久青操| 天天开心婷婷丁香五月| 日本女人久久| 美女被操一区二区| 五月天亚洲色| 99精品视频偷拍| 九九大香蕉黄色影院| 免费成人网在线观看| 激情五月天婷婷丁香| 热久久这里只有三级视频| 五月综合六月婷婷| 亚洲在线视频321| 丁香色婷婷五月天| 色综合网址| 曰曰久久| 99精品这里只有免费视频| www.久久爱| 欧美性丁香色色五月天综合爱爱| 伊人激情综合| 色婷婷伊人| 120分钟婬片免费看| 久久婷婷色| 99re热| 伊人在线视频| 久久婷婷五月| 天天搽天天射| 日本97人人| 日本va欧美va国产激情| www色婷婷久久综合久色 | 欧美97p| 婷婷中文综合网| 久久亚洲激情五码| 九九精品网站| 国产av第一专区| 五月婷婷视频| 综合激情网五月激情| 综合色色五月| 国产激情AV| 久久综合激情五月天| 大香蕉久久视频久久视频 | 久久婷婷青青| 五月天综合久久| 色五月婷婷五月丁香五月激情五月视频| 亚洲V国产V欧美V久久久久久| 噜噜噜精品欧美成人在线观看| 性爱五月婷| 99九九玖玖| 久久永久网址| 综合网啪| 538在线精品| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 亚洲国产精品成人午夜| 殴美日比视频| 五月婷婷综合精品| 天天拍夜夜撸| 日本在线视频播放91| 这里只有精品久久| 欧洲一区二区| 五区毛片七区毛片| 看黄的网站18禁| 五月丁香久久激情综合| 九九99精品| 深爱婷婷丁香五月激情| 久久这里只有精品07| 成人 九九九九| 99综合视频一体| 九九精品视频在线6| 婷婷综合激情| 五月婷激情影院| 欧洲色区| 亚洲人妻av| 色五月婷婷五月丁香五月| 99人人干| 色九月婷婷丁香| 五月丁香六月片| 97在线/亚洲| 色五月天成人在线| 国内裸舞二区| 亚洲综合在线伊人婷| 热久久这里只有三级视频| www.夜夜操| 色婷婷电影网| 婷婷五月天六点丁香五月| AV色五月婷婷| 色五月首页| 97人人操人人操人人操人人| 91人人爱| 五月天久久色| 熟女人妻一区二区三区免费看| www.henhenl| 久热这里只有精品视频免费观看| 五月伊人视频在线看| 天天爽在线视频| 高清成人综合| 欧美、日韩、中文、制服、人妻| 成人午夜在线视频| 996热re视频在线观看视频| 色噜噜狠狠色综合日日| 99热国产免费| 丁香五月伊人| 五月天亭亭俺也| 在线另类视频| 色色综合网站| 九九九九这里只有精品| 久久丁香五月婷婷| 99色婷婷视频| 激情小说婷婷| 爱射综合| 无遮挡国产高潮视频免费观看 | 丁香五月天激情视频| 天天综合网在线| 久久婷婷五月综合色和| 俺去也五月天婷婷| 久久美女五月天| 久久激情五月网| 精品九九视频| 99爱视频免费看| 婷婷五月丁香五月天| 色久在| 狠狠色丁香五月婷巨| 五月婷婷三级| 五月激情丁香六月狠狠干| 人妻操逼视频。| 久久激情五月| 狠狠操之狠狠操| 99婷婷五月天| 丁香六月婷婷色XXXX| 五月婷婷久久内射| 九九热这里只有精品31| 九九激情| 五月天激情小说| 久久综合干| 午夜色婷婷| 91九色首页| 狠狠色综合网站久久久久| 99热在这里只有精品| 激情九月婷婷| BBWCUCKOLD精品熟妇| 久久人妻超碰一区| 久久婷婷六月综合综合| 國語久久婷| 综合色五月| 全亚洲最大的婷婷五月天网站COM| 丁香五月婷婷六月婷婷| 日本噜噜色网| 日日干日日| 久久激情五月婷婷| 色情综合网| 国外亚洲成AV人片在线观看| 五月婷av| 中文字幕永久在线| 色丁香久久久| 丁香色五月 97干| 精品婷婷| 亚洲欧洲小视频9| 色九月婷婷丁香| 婷婷丁香五月天婷婷| 天天做天天要天天爽| 五月丁香婷婷潮喷中文字幕| 日韩久久视频| 超碰人人摸人人操| www.99热视频| 九九综合五月欧美| 久久九九网| 六月婷婷私欲| 丁香花五月天激情| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 精品婷婷| 熟妇高潮一区av| 色欲影香| 99性感视频| 色爱99| 五月婷丁香| 四色五月婷婷| 伊人五月天日日夜夜久久久天天| 丁香五月Av| 51XX午夜影福利| 激情又色又爽又黄的A片| W色综合| 久99视频在线观看| 九一99| 欧美人人操| 五月天色婷婷激情| 伊人激情| 婷婷色情网| 开心五月婷婷激情网| 综合网激情| 五月丁香影院| 亚洲99综合| 五月丁香六月婷婷的女人| 99精品久久久| 伊人丁香五月婷婷潮吹| 狠狠做五月婷婷| 另类激情综合| 丁香六月婷婷激情| www.久久五月天.com| 99热精品在线在线| 超碰2021| 青青福利网| 婷婷丁香色五月| www.久久色.com| 国产Va视频| 成人在线网| 六月婷婷日| 久久99激情| 那里有AV网址| 亚洲AV综合网| 超碰国产av| 欧美日本一区二区三区| 国外亚洲成AV人片在线观看| 婷婷爱在线观看| 五月天综合久久| 欧美 色婷婷| www。狠狠干。com| 日韩无码色色| 亚洲另类婷婷综合| 91婷婷丁香五月| 沈娜娜av| 天天情色综合网| 日产精品久久久久久久蜜臀| 五月天婷亚洲天综合网综合| 五月丁香色| 久久丁香五月| 97婷婷狠狠| 久艹伊| 激情五月天www| 色噜噜狠狠色综无码久久合欧美| 99热国产在| 啄木鸟黑丝一区二区| 99这里只有精品|v| 色狠狠五月天| 国产亚洲99久久精品| 五月天婷婷av| 另类视频五月天| 99视频自拍| 色五月婷婷在线| 成人资源在线| 久久综合五月天| 亚洲小电影在线观看黄999| 涩涩涩五月天| 伊人婷婷五月天av| 日韩欧洲亚洲| 色色综合色视频| 怡红院视频| 亚洲超碰在线| 香蕉久久国产AV一区二区| 99免费视频久久| 婷婷五月激情丁香| 五月天开心婷婷久久| 99热自拍| 99热99精品在线观看| 欧美色爱五月天| 亚洲操女| 人妻久久人妻久久第一区| 色婷综合| 91色在线/日韩| 另类专区在线| 五月丁香在线| 丁香六月天婷婷开心综合| 五月精品99综合| 激情五月天激情综合网| 在线资源av-超碰中文在线-成人AV| 五月色综合| 99热主页日本| 女人高潮内射99精品| www.人人操人人看人人想人人摸 人人人人操,COM | 五月天性色| 日韩久久系列| 91色在线 | 日韩| 五月丁香婷婷久久| 97色婷婷| 饮料下药迷倒漂亮女同事强干| 成人网在线视频| 色综合婷婷| 欧美熟女视频 色婷婷| 五月激情偷拍| 玖玖国产视频一区| 伊综合蕉| 开心五月激情网| 天天色天天爱天天舔| www.韩日视频| WWW久久久| 丁香婷婷五月天亚洲| 毛片九九九九九九九九18| 婷婷丁香18| 玖玖综合色| 欧美性色A片免费免费观看的| 日撸夜撸日操| 婷婷丁香97| 99ER热精品视频| 色综合久久五月天| 五月婷成人网| 亚洲久久日| 五月天婷婷久久| 九九亚洲视频| 五月香蕉综合| 青青草原伊人网| www色婷婷| 国产激情在线| 日韩av变天就操逼不卡区| 伊人五月天在线| 狠狠搞五月天| 色婷婷最新域名 | 五月丁香亚洲婷婷| 六月欧美综合色情| 伊人玖玖精品| 婷婷字幕在线| 在线另类| 婷婷午夜精品久久久| er99免费视频在线| www.99久| www.com任你艹| 噼里啪啦在线观看免费完整版视频 | 天天天天干| 激情五月丁香亭亭| w婷婷五月婷婷w| 五月婷婷激情性爱| 欧美超碰亚洲| 色狠狠色综合久久久绯色aⅴ影视| 久久总和99| 欧美性色五月天| 欧美成人猛片AAAAAAA| 国产色网站| 五月丁香亭亭天天舔| 色欲丁香| 9999热在线免费观看| 激情文学综合婷婷五月天丁香花| 色播丁香| 久久女人天堂| 2025天天日爽| 99er精品视频| 亚洲色欲AAAAAA| 色噜噜狠狠色综合AV兰草影视| 51XX嘿嘿午夜无码| 九九九九九九九九九九九九九九九九九九九在线视频 | 婷婷五月天开心网| 亚洲精色| 六月婷婷网站| 色香五月天| 婷婷六月丁香激情| 亚洲激情av| 久婷婷色| 日本99视频精品免费播放| 密着浓厚中出乚交尾GvG935| www.婷婷五月天| 婷婷五月天影视| 亚洲色情久久| 五月婷婷无码| 九热视频| 这里只有精品视频222| www.婷婷.com| 视频一二区| 91久久九色| 色护士综合| 久久久日韩特色特黄AAAA| 超碰亚洲欧美| 亚洲欧美日韩VIP| 风流少妇A片一区二区蜜桃| 激情综合五| 成人丁香五月天| 久久久久婷婷| 丁香六月在线| 五月婷婷丁香五月| 五月丁香综合| 亚洲午夜在线视频| 97亚洲精品| 久久性爱激情| 秋霞AV美国| 中文AV在线观看| 久久五月婷婷丁香| 超碰在线成人| 伊人九热| 激情五月天福利| 日本久久极品| WWW.久久久久久久| 99九色视频在线观看| 99色色网| 天天摸天天爽| 九九精品在线网| 九九性视频| 婷婷丁香五月天激情| 丁香婷婷五月综合| 五月婷在线观看| 九月丁香婷婷| 在线五月婷| 亚洲成人中文字幕| 激情丁香社区| 99热思思在线观看| 九九热经典视频在线观看| 亚州色色色| 色色无码| 成人看片网站| 成人AV播放| 99久在线精品99re5热视频| 五月天开心色情网| 九九热思思热| 色色A| 久久久中文| 成人性爱精品视频| 狠狠色五月天| 五月婷婷激情综合| yirenjiqingshiping| 久久婷婷夜| 天天做天天爱天天爽夜夜揉| 热久久国产视频| 婷婷情爱五月天6| 久久综合丁香激情五月| 好吊兆人妻| 五月天狠狠色| 婷婷五六日| 婷婷婷婷色| 91九色精品熟女内射| 国产成人一区二区三区在线观看| 亚洲在线播放| 色五月xxx| 人人草人人视| AAA久久| 色色综合网。| 噜噜噜狠狠色综合| 综合久久五月天| 久久这里只有精品8| 男女av免费看| 狠狠操.com| 六月激情婷婷| 99噜噜噜在线播放| 五月婷婷啪啪啪| 色色九九五月天| 九九九九九无码| 五月丁香激情综合久久| 狠狠精品干练久久久无码中文字幕| 婷婷五月激情综合啪啪| 玖玖在线资源视频| www.五月天婷婷| 激情5月婷婷| 7超碰自拍| 色五月成人在线| 久草五月| 日亚二欧美| 亚洲mm色| 久久六月综合| 狠狠色噜噜狠狠| 狠狠色五月| 九九av| 99草视频在线观看| WWW.99热| 国产精品18久久久| 激情久久五月天| 婷婷色正月| 亚洲亚洲人成综合网络| 久久婷婷五月| 97色97干| 婷婷色五月天色| 这里只有精品99www| 九九热超碰| 婷婷丁香无码专区| 激情五月天综合图片小说网站| 天天爽天天操| 久久五月天丁香| 97婷婷丁香五月| 色婷五月天| 插逼综合网| 五月丁香六月激情在线| AV亚洲在线| 无码人妻一区二区三区四区| 色婷婷电影网| www.婷婷五月天,com| 成人在线综合| 九色无码| 99久久久久久www| 日本A片一区| 99热精品综合| 成人.在线日韩| 久热2025无码| 这里只有精品久久| 激情婷婷五月女| 亚洲综合激情五月久久| 久久性爱视频| 九九热只有精品| 99九九在线| 97香蕉久久超级碰碰高清版 | 色婷婷小说| YJLZZJLZZ亚洲乱熟无码| 日本久久人| 激情綜合W W W,激情五月天| AV在线中文| 五月激情啪啪啪| 色玖玖爱| 色婷婷五月在线| 丁香婷婷老司机久操| 婷婷色系婷色| 色色五月婷| 97操碰| 欧美va视频| 久婷婷婷| 色噜噜狠狠色综| 久久久久人妻| 六月婷婷狠狠色在线观看| 狠狠操天天干| 色五月综合婷婷| 丁香婷婷六月| 五月综合在线| 综合AV在线| 欧美这里只有精品| 第六色在线| 久久精彩视频18| 五月天网站亭亭| 久久免费丁香| 人人爱人人草| 色五月成人网| 亚洲色综久久五月| 色综合99| 思思热热久久| 丁香 亚洲 久久| 成人 在线 日韩| 成人天天爽| 国产成人综合电影| 五月天国产| 色欲婷婷五月天| 激情99| 丁香色综合| 97人人爱人人操| 夜夜撸夜夜骑| 丁香九月婷婷色| 99在线视频免费| 婷婷综合激情| 九九热思思| 色碰碰视频| www.色五月| 综合久久99| 亚洲婷婷视频| 91婷婷丁香五月亚洲| www.maotanji.com| 婷婷六月婷婷| 中日韩狠狠色| 伊人无码高清| www.99热精品| 亚洲五月天综合| 色9月| 欧美 日韩 人妻 高清 中文| 六月婷婷中文字幕| 日日日日做夜夜夜夜无码| 26uuu成人网| 亚洲天堂热| 丁香五月激情性色郤| 亚洲婷婷丁香| 色色色九九九五月婷婷| 丁香婷婷五月天激情四射| 五月丁香亚洲五月| av久热| 天天日色情| 综合久久婷婷| 婷婷丁香五月高清| 成年AAAA色情| 大香av| 婷婷在线中文字幕| 色婷婷丁香五月| 丁香六月在线| 婷婷丁香五| 九九这里是免费的视频5| 欧美婷婷色| 婷婷久久久| 婷婷五月六| 丁香五月综合福利视频导航| 99热这里只有精品1025| 日本偷拍九九九| 色啪网| 97干在线观看视频| 99av视频| 呦呦v线| 色五月色五天色情网| 久久丁香婷婷色情综合| 国精产品一区一区三区免费视频| 综合久久影院| 思思热视频| 久久这里99| 狠狠色噜噜狠狠色噜噜噜999| h亚洲| 久久久潮喷-久久久九九-成人AV| 2018国产大陆天天弄| 五月丁香六月婷综合成人综合| 天天噜噜| 激情五月婷婷丁香综合网 | 色综合色综合色综合色综合| 99这里只有精品在线| 五月婷丁香花| 日本欧美在线| 97热精品| 97久久五月丁香婷婷| 超碰人人在线观看| 亚洲乱码日产精品BD| 九九色逼| 婷婷91| 国产激情视频在线观看| 超碰二区| 操逼视频一区| 国产97色在线 | 日韩| www.99热这里精品| 噜噜色婷婷| 色深爱五月| 综合五月天完整| 婷婷视频在线| 五月深爱激情网| 久久AV电影| 色情免费视频播放| 五月天玖玖狠狠色色| 久久婷婷五月综合色播| 五月丁香久久综合精品| 婷婷丁香五月激情图片| 亚洲五月天伊人| 色五月婷婷、老熟女| 亚洲激情高潮| 五月婷婷五月天天| 五月丁香九九九综合| 青青草婷婷综合五月| 99热99免费| 久久这里只有精品16| 丁香六月成人网| 日本性激情色播| 六月丁香社区| 婷婷五月天天天| 欧美日韩成人在线网| 天天肏天天肏天天肏| 国产97色在线| 亚洲免费婷婷| 国产精品a无线| 精品一二三区久久AAA片| 大香蕉综合视频在线| 无码碰碰| 4438国产免费看| 国产97色在线| 天天摸天天舔在线视频| 无码中文一区二区三区| 五月丁香六月婷婷手机无线| www夜夜操com| 99干日本| www.激情| 99操九九网| 美国天天操无码| 久9久9热久热| 天天插天天草人人玩| 伊人久久五月天| 婷婷丁香五月婷婷| 99热综合| 97久久久久久久久久久| 日韩性爱无码| 99色在线| 五月天婷婷丁香视频| 亚洲狠狠干| 亚洲综合网 665566| 色综合久| 色丁香五月婷婷综合久久| 99啪99| 久热这里这里有精品| 我要看激情五月天| 97影院一级片| 风流少妇A片一区二区蜜桃| 五月婷九月| 亚洲熟女色| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 亚洲色激情| 97色婷| 三级毛片视频| 亚洲婷婷婷| 天天综合插插| 五月香婷婷| 天天干天天拍| 大香蕉欧美在线| 精品一二三区视频立| 色婷婷综合视频| 五月婷婷激情网| 亚洲综合碰| 日日干五月天婷婷| 播四月婷婷六月丁香| 天天操天天曰| 另类图片五月天激情| 异能之下短剧免费观看全集| 天天爽日日爽夜夜爽| 99久久久| 69人人操人人爽| 天天射夜夜爽| 激情噜噜噜| 国产欧美性成人精品午夜| 碰碰人人漕| 久热最新视频| 99久久6| 五月婷天堂视频| 天天日日人| 色色国产| 久久婷婷免费| 五月婷婷丁香成人网| 99热这里只有精品免费| 免费无码毛片一区二区A片| 久99在线视频| 久久久精品色色色| 国产成人精品一区二三区熟女在线| 婷婷激情综合色五月久久图片| 色狠狠六月| 久久久久9999| 91啪啪啪啪| 亚洲色色色色| www激情| 五月丁香激情怕怕| 婷婷综合精品视频97| 国产精自产拍久久久久久蜜| 啪啪激情综合| 天天色噜| 天啪天啪天啪天啪| 婷婷五月天影视| 九九热只有精品| 人人干女人| 天天操夜夜橾| 亚洲激情四谢| 激情网站综合五月天| 99热在线精品观看| 五月激情网站| 五月婷婷成人| 色婷婷无吗| 亚州AV超碰人人操| 精品香蕉99久久久久网站| AA丁香综合激情| 日本一级| 狠狠色丁香久久| 日本五月婷婷| 91主播在线| 婷婷丁香激情五月天色色| 激情综合网激情五月天| 五月丁香| 激情伊人五月天| 五月丁香激情婷婷| 婷婷九月亚洲| 天堂成人久久| 视频一二区| 成人在线网站| 天天综合精品| 狠狠色丁香久久婷婷综合五月| 《蜘蛛女》梁铮1995| 婷婷激情五月天桃花网| 六月婷婷激情小说网| 成人做爰高潮A片免费视频| 色欲婷婷夜夜| www.天天干.com| 亚洲五月婷婷| 再綫Av免费視品| 色婷婷五月综合| 思思久久精品视频| 免费看欧美成人A片无码 | 操比激情五月| 丁香色婷婷| WWW·色色色·COM| 狠狠干在线| 久久超级碰碰| AV中文在线| 激情四射五月天偷偷看婷婷| 五月天色五月| 色婷婷丁香五月天在线视频| 亚洲精品又粗又大又爽A片| 丁香伊人综合| 精品热九九| 99这里只有精品|v| 一起草av在线观看| 大香蕉九操| 99热九九这里只有精品| 婷婷久久色| 亚洲中文无码成人| 日逼影音先锋男人AV资源站| 五月丁香六月香综合激情| 九九久99免费视频| www.9797国产| 久久之人妻| 亚洲经典三级| 96五月丁香熟女| 日韩美女羞羞网站在线观看| 丁香五月区| 国产中文亚洲欧美日韩性交| 在线看的免费网站| 婷婷综合五月天亚洲综合| 香蕉网久久| 99热最新| 99热99这里有免费的精品| 中文字幕久久婷九女同| 狠狠爱婷婷爱| 丁香五月天色| 国产首页在线| 成人版视频在线观看| www久久五月com| 91色五月在线观看| 99a级片| 蜜臀A∨在线水帘洞| 久久免费高| 97色天堂| 婷婷丁香五月精品| 天堂网色婷婷| 激情网五月| 天天五月情| 亚洲AV日韩无码| 婷婷五月花| 这里只有精品免费 | 日韩野外 无套| 伊人网碰碰| 天天色综合色| 99视频在线观看网址| 精品人妻一区二区| 狠狠狠夜夜夜| 开心五月婷婷五月| 色九月综合| 色色色图| 五月婷婷影| 亚洲婷婷五月天在线激情综合网| 99热每日| 久久激情视频| 丁香五月a| 久久视屏这里只有久久| 天堂va久久久噜噜噜久久Va| 激情欧美五月丁香| 操人妻视频91| 婷婷基地成人五月天| 免费在线a| 天天干,夜夜爽| 激情综合网激情五月天| 五月花成人网| 激情综合五| 精品九九久久| 97色色婷婷| 五月综合激情网| 五月丁香亚洲五月| 九月婷婷久久| 99免费青青蜜臀| 日韩中文字幕| 免费黄色片子| 天天日,天天干,天天操| 丁香五月天天日| 九热精品| 大香蕉娱乐| 久久综合久色欧美综合狠狠| 中文字幕永久免费| 婷婷五月天伊人网| 五月婷婷中文网| 婷婷五月在线免费| 性爱五月丁香| 婷婷五月天综合久久日美女| 色婷婷视频| 天天综合网91| 久久综合人妻| 亚洲色a| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 丁香九月激情在线视频| 搡BBBB搡BBB搡18| 日韩久久视频| 欧美激情VA永久在线播放| 色五月天视频| 插插干干干色| 精品99这里有| 五月婷婷av| 欧美在线视频免费播放| AV网在线观看| 97人碰人操| 日欧一片内射VA在线影院| 久久六月综合| 色欲av伊人久久大香线蕉影院| 丁香五月婷婷香| 久久性爱视频这里只有精品| 森林影视大全,最好看的2019年视频 | 亚洲精品久久久久久久久久吃药| 五月色网| 色婷| 色婷久九| 一级二级色大片| 人妻久久人妻久久第一区| 亚洲最大五月六月丁香婷婷| 6080av| 丁香婷婷六月激情| 《战争与艾拉》完整版| 99热欧美在线观看| 97色婷婷| 婷婷香香五月| 青青.com| eeuss人妻| 色五月天影视| 色婷婷手机在线| 亚州精品色情无码A片| 99久久网站| 色色色欧美| 色 免费网站视频| 久久久久妻| 五月天丁香啪啪综合| 大功率国产在线| 六月丁香五月婷婷首页| 99精品这里只有免费视频| 亚洲天堂亚洲色色色| 精品一二三区视频立| 婷婷五月天激情偷拍| 丁香婷婷久久激情| 日日噜狠狠色综合久久| 天天操夜夜肏| 99精品小视频| 人人摸人人澡人人| 99在线免费视频| 99啪啪视频| 狠狠综合网| 99热这里有精品| 亚洲三A| 在线不卡AC| 综合网色综合| 在线天堂9| 五月丁香婷婷综合网| 色热久资源| 丁香婷婷六月天| 日日爽天天| 亚洲综合五月| 99热99在线| 狠狠综合| 激情六月婷婷啪啪| 色月丁| 97视频91| 丁香六月色婷婷欧美| 第六色在线| 亚洲第79页| 久久 婷婷 五月天| 久久综合婷婷| 亚洲日本三级片| 人橾人| 五月丁香六月婷婷,婷| 久久婷婷五月综合色播| 婷婷五月天色| 五月婷婷色情| 亚洲精品久久久无码| 欲色人妻| 亚洲天堂爱爱| 五月丁香久久久日婷婷久久婷婷日| 激情五月丁香六月婷婷| 久久五月婷婷丁香| 五月丁香在线| av免费在线观看0| 激情婷婷久久| 99er6| 婷婷五月天无码| 五月丁香婷婷综合网| 90色免费视频| 大香蕉伊人99| 丁香五月在线观看综合| 青青草原伊人网| 九月婷婷| 色婷婷四色| www.天天干.com| 99视频在线精品免费观看2| 九九aV| 久婷婷视平| 欧美在线操| 爱婷婷久久视频| 9999三级片| 色欧美一级| 欧美色宗和激情| 日本九九热| 91一起操| 五月九九综合| 久久这里精彩免费在线观看| 欧洲免费视频色| www色色色com| 九九在线91| 激情婷婷五月女| 99综合| 日本4399天堂中出| 97干欧美| 国产婷婷五月天| 深爱婷婷网| 久草九九| 草婷婷在线| 亚洲操操| 激情婷婷综合网| 日 日干 日日做| 99久久网站| 成人免费视频一区| 中国AV性爱观看| 五月香婷婷| 99免费青青蜜臀| 天天舔天天| 亭亭五月丁香五月天激情| sewuyuetingtingiii| 五月天婷爱综合| 五月天综合视频| 9999热在线免费观看| 丁香丝袜五月| 久热超碰| 成人网址在线观看| 亚洲综合五月天婷婷| 中文字幕有多少字| 777色婷婷爱五月| 婷婷激情视频| 99啪啪骑| 99爱免费视频| 荫道BBWBBB高潮潮喷| 五月丁香成人网| 9九色首页| 日本欧美999久久久三级片| 五月天久久成人| 国产一级片| 91欧美| 嫩草视频在线观看| 91人人操人人看| 天天激情| 丁香五月欧美婷婷| 久久草婷婷丁香网站| 激情五月天婷婷| 操操操操操操婷婷五月天| 丁香色成人| 色色日本欧美| 九九婷婷网五月天| 免費观看aV在线网址| 婷婷丁香基地在线| 粉嫩AV久久一区二区三区| 色色精品色| 思思re99视频在线观看| 色久女| 丁香五月综合激情性爱| 91丨九色丨老农村| 色色色色色综合| 久久五月婷综合网| 五月婷婷在线综合| 久久99激情五月天| 我要看激情五月天| 丁香激情综合| 色丁香久久久| 91久女| 婷婷五月天天aV| 精品热九九| 99日这里只有精品| 色婷婷综合久久久久| 九九热区一区二区三区| 久久五月综合| 色情·com| 中文字幕在线免费观看视频| 99视频色在线观看| www.婷婷五月| aaaaa不卡| 五月婷婷深深爱| 激情综合5月| 色婷婷丁香A片区毛片区女人区| 这里只有在线精品| 99精品视频在线观看| 草AV9999| 影音先锋五月婷婷| 99热无码| 伊人久久中文网| 六月婷久久| www色色色com| 91日韩在线| 色播五月丁香婷婷| 狠狠噪| 久久这里有精品视频| 丁香熟女乱| 中文字幕,综合,91| 99久久综合| 五月婷婷六月天| 婷婷五月天亚洲图片| 91干99| 色婷婷AV在线| www.zbzhongsen.com| 五月天综合| 开心五月色婷婷综合开心网| 日日噜噜久久婷婷五月天| 另类精品视频在线观看| 色综合夜夜| 天天射天天插天天干| 久久99激情丁香婷婷小说网| 91九色 婷婷| 色综合99| 影音先锋 婷婷| 免费成片在线观看| 色999五月色| 丁香伊人激情| 青青999| 丁香五月婷婷啪啪啪| 成人片久久网站| 九九爱精品网站| 天堂久久婷婷| 这里只有精品热| 婷婷不卡基地| 99在线69| 五月婷色丁香| 色综合香蕉视频| 久久婷婷视频| 色色免费网战视频| 国产精品99久久久久久猫咪| 婷婷五月天综合网| 色 色 色综合com| 妇激情基地| 亚洲无码影音| 97碰| 丁香婷婷久久老熟女综合网| 麻豆精品| 1000部毛片A片免费观看| 99热这里全是精品| 99久久99久久综合| 亚州男人天堂婷婷五月| 午夜亚洲国产精品av一区二区| 婷婷丁香五月激情中文字幕版| 99色.com| 日本不卡高字幕在线2019|