久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码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 開(kāi)發(fā)板上面跑著溫濕度采集、OTA 升級(jí)、藍(lán)牙配網(wǎng)、Wi-Fi 歷史記錄、設(shè)備 ID 綁定這五個(gè)功能模塊。每個(gè)模塊都覺(jué)得自己只是存幾條配置比如溫濕度模塊存?zhèn)€校準(zhǔn)偏移量cal_offsetOTA 模塊存?zhèn)€當(dāng)前固件版本號(hào)fw_version藍(lán)牙模塊存?zhèn)€上次連接的 MAC 地址last_bluetooth_mac……看起來(lái)都很輕量互不干擾。結(jié)果一燒錄溫濕度讀數(shù)突然飄了 2℃再重啟一次Wi-Fi 密碼連不上了第三次上電OTA 固件校驗(yàn)失敗報(bào)錯(cuò)NVS_ERR_CORRUPT。你抓著邏輯分析儀查了半天信號(hào)最后發(fā)現(xiàn)——根本不是硬件問(wèn)題是數(shù)據(jù)自己“走錯(cuò)了門”。這就是典型的 Flash 數(shù)據(jù)串門現(xiàn)象。它不是 bug而是對(duì) ESP32 存儲(chǔ)機(jī)制理解不到位導(dǎo)致的必然結(jié)果。核心原因在于ESP32 的 Flash 不是“文件系統(tǒng)”它沒(méi)有目錄樹(shù)、沒(méi)有權(quán)限隔離、沒(méi)有進(jìn)程上下文。你寫(xiě)的每一個(gè)鍵值對(duì)key-value本質(zhì)上都是直接寫(xiě)進(jìn)一塊連續(xù)的物理扇區(qū)里。而 ESP-IDF 默認(rèn)使用的 NVSNon-Volatile Storage分區(qū)底層就是基于 Flash 的頁(yè)擦除字節(jié)寫(xiě)入模擬的鍵值存儲(chǔ)。它靠的是命名空間namespace 鍵名key 類型type 校驗(yàn)CRC四重定位。一旦兩個(gè)應(yīng)用沒(méi)約定好命名空間或者用了相同鍵名但類型不同比如 A 應(yīng)用把wifi_ssid當(dāng)字符串存B 應(yīng)用當(dāng)整數(shù)存NVS 解析器就會(huì)在讀取時(shí)把前一段數(shù)據(jù)的末尾當(dāng)成后一段的開(kāi)頭把校驗(yàn)碼誤讀成有效值最終導(dǎo)致整個(gè) namespace 區(qū)域被標(biāo)記為損壞。我最早在做一個(gè)四輪差速小車項(xiàng)目時(shí)踩過(guò)這個(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í)際寫(xiě)入的是0x000000FF。后來(lái)用nvs_flash_dump.py工具導(dǎo)出原始 Flash 數(shù)據(jù)才發(fā)現(xiàn)PID 模塊寫(xiě)入的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è)問(wèn)題本質(zhì)不是問(wèn)“怎么寫(xiě)代碼”而是問(wèn)“怎么設(shè)計(jì)存儲(chǔ)契約”。它涉及三個(gè)層面第一層是物理層——Flash 的擦除/寫(xiě)入約束第二層是驅(qū)動(dòng)層——NVS 分區(qū)如何組織鍵值第三層是應(yīng)用層——多個(gè)模塊之間如何協(xié)商命名空間與鍵名規(guī)范。下面我們就一層層拆開(kāi)看不講虛的只說(shuō)你在實(shí)際開(kāi)發(fā)中必須知道、必須檢查、必須寫(xiě)進(jìn)團(tuán)隊(duì) Wiki 的硬核細(xì)節(jié)。2. NVS 的真實(shí)工作原理不是數(shù)據(jù)庫(kù)是帶校驗(yàn)的“貼紙墻”2.1 Flash 物理特性決定一切擦除粒度才是關(guān)鍵瓶頸很多開(kāi)發(fā)者以為 NVS 是類似 SQLite 的輕量數(shù)據(jù)庫(kù)可以隨意增刪改查。這是最大的認(rèn)知誤區(qū)。ESP32 使用的 Flash 芯片通常是 Winbond W25Q32 或 GD25Q32遵循 NOR Flash 標(biāo)準(zhǔn)其核心限制有兩個(gè)寫(xiě)入只能將 1 變 0不能將 0 變 1這意味著每次寫(xiě)新值前必須先擦除整個(gè)扇區(qū)Sector把所有位恢復(fù)成 1才能重新寫(xiě)入。擦除操作是按扇區(qū)進(jìn)行的最小單位是 4KB4096 字節(jié)。你哪怕只改一個(gè)字節(jié)也要擦掉整整 4KB 的數(shù)據(jù)。擦除壽命有限典型值為 10 萬(wàn)次頻繁擦除同一扇區(qū)會(huì)加速 Flash 老化。NVS 為了延長(zhǎng)壽命采用“磨損均衡wear leveling”策略——它不會(huì)固定寫(xiě)死某個(gè)扇區(qū)而是維護(hù)一個(gè)“活躍扇區(qū)鏈表”每次寫(xiě)入都選當(dāng)前最空閑的扇區(qū)。但這個(gè)策略有個(gè)前提它只在同一個(gè) NVS 分區(qū)partition內(nèi)生效。如果你把所有應(yīng)用都塞進(jìn)同一個(gè)分區(qū)那磨損就集中在那幾個(gè)扇區(qū)如果你分到不同分區(qū)磨損就天然分散了。我實(shí)測(cè)過(guò)在默認(rèn) 20KB NVS 分區(qū)里連續(xù)寫(xiě)入 1000 次test_key每次寫(xiě)入 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 次寫(xiě)入分散到 5 個(gè)獨(dú)立命名空間每個(gè) namespace 單獨(dú)分配 4KB每個(gè) namespace 平均只觸發(fā) 3~4 次擦除——磨損直接降為原來(lái)的 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ū)開(kāi)始找有效數(shù)據(jù)。Sector 區(qū)剩余全部由多個(gè) 4KB 扇區(qū)組成每個(gè)扇區(qū)又細(xì)分為Page Header32 字節(jié)標(biāo)識(shí)該扇區(qū)屬于哪個(gè) namespace通過(guò) 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)來(lái)了namespace ID 是 1 字節(jié)無(wú)符號(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)失敗則跳過(guò)該 Item。這意味著只要兩個(gè)應(yīng)用用了相同的 namespace ID它們的鍵就完全混在一起沒(méi)有任何隔離。你調(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)用沒(méi)調(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ó)”的憲法很多教程說(shuō)“用不同 namespace 就能隔離”這沒(méi)錯(cuò)但沒(méi)說(shuō)清代價(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ù)太多而是管理開(kāi)銷太大。我做過(guò)極限測(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ù)——幾乎永不更改寫(xiě)入一次讀取千次networknamespace存 Wi-Fi SSID/密碼、MQTT 服務(wù)器地址、TLS 證書(shū)指紋——每月可能更新 1~2 次runtimenamespace存 PID 參數(shù)、電機(jī)溫度閾值、當(dāng)前模式標(biāo)志——可能每分鐘都在變。這樣劃分system的數(shù)據(jù)永遠(yuǎn)鎖在第一個(gè)扇區(qū)不動(dòng)network的更新只影響少數(shù)扇區(qū)runtime的高頻寫(xiě)入被磨損均衡算法分散到多個(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 有明確歸屬和訪問(wèn)契約。步驟 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。別聽(tīng)某些博客說(shuō)“8KB 夠用”那是沒(méi)算上磨損均衡預(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 訪問(wèn) #define NS_OTA ota // 藍(lán)牙配網(wǎng)信息手機(jī) APP 寫(xiě)入 #define NS_BLE ble注意所有 namespace 名字必須用雙引號(hào)字符串字面量且不能包含下劃線以外的特殊字符NVS 驅(qū)動(dòng)內(nèi)部用strncpy復(fù)制遇到\0或非法字符會(huì)截?cái)?。我?jiàn)過(guò)有人用NS_WIFI_CONFIG結(jié)果驅(qū)動(dòng)只讀到NS_WIFI后面CONFIG被丟棄導(dǎo)致 namespace ID 錯(cuò)亂。步驟 3模塊內(nèi)強(qiáng)制使用 namespace 打開(kāi)句柄以溫濕度傳感器模塊為例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; // 打開(kāi) system namespace只讀 err nvs_open(NS_SYSTEM, NVS_READONLY, s_system_handle); if (err ! ESP_OK) return err; // 打開(kāi) runtime namespace讀寫(xiě) 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)無(wú)校準(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è)模塊只打開(kāi)自己需要的 namespace絕不打開(kāi)NS_SYSTEM以外的寫(xiě)權(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ī)范最重要光有代碼不夠必須寫(xiě)進(jìn)開(kāi)發(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 名必須小寫(xiě)下劃線禁止駝峰wifiSsid、禁止大寫(xiě)WIFI_SSID、禁止空格或點(diǎn)號(hào)wifi.ssid。NVS 驅(qū)動(dòng)內(nèi)部比較 key 名時(shí)用的是strncmp大小寫(xiě)敏感且長(zhǎng)度超過(guò) 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ù)倍??偞笮〔荒艹^(guò) Flash 容量常見(jiàn) ESP32-WROOM-32 是 4MB即 0x400000 字節(jié)。步驟 2為每個(gè)分區(qū)指定唯一標(biāo)簽label在代碼中通過(guò)nvs_open_from_partition()指定分區(qū)名// system 分區(qū)只讀 esp_err_t err nvs_open_from_partition(nvs_sys, system, NVS_READONLY, sys_handle); // app 分區(qū)讀寫(xiě) err nvs_open_from_partition(nvs_app, runtime, NVS_READWRITE, app_handle);這里nvs_sys是分區(qū)名來(lái)自 partitions.csvsystem是該分區(qū)內(nèi)的 namespace 名。同一個(gè)分區(qū)名下仍可創(chuàng)建多個(gè) namespace但不同分區(qū)名之間絕對(duì)物理隔離。優(yōu)勢(shì)即使nvs_app分區(qū)因頻繁寫(xiě)入損壞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è)備證書(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ù)客戶完全沒(méi)感知到nvs_sys里的證書(shū)還在。3.3 方案三硬核隔離——外掛 SPI Flash 自定義文件系統(tǒng)適合超大數(shù)據(jù)或高可靠性要求當(dāng) NVS 的鍵值模型無(wú)法滿足需求時(shí)——比如你要存固件差分包1MB、攝像頭標(biāo)定圖5MB、或長(zhǎng)達(dá) 7 天的秒級(jí)傳感器日志20MB——就必須跳出 NVS上外掛 Flash。硬件選型QSPI Flash vs SPI FlashQSPI Flash推薦如 Winbond W25Q32JW4MB通過(guò) ESP32 的 Quad SPI 接口GPIO 12-15連接讀寫(xiě)速度可達(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 引腳說(shuō)明VCC3.3V必須加 100nF 退耦電容GNDGND/CSGPIO 16片選可改但需在 menuconfig 中同步IO0GPIO 17QSPI D0IO1GPIO 18QSPI D1IO2GPIO 19QSPI D2IO3GPIO 23QSPI D3SCLKGPIO 12QSPI CLK/HOLD3.3V拉高禁用 HOLD 功能/WP3.3V拉高禁用寫(xiě)保護(hù)注意IO0~IO3 必須接 10K 上拉電阻到 3.3V否則 QSPI 初始化失敗報(bào)錯(cuò)qspi: Failed to initialize。這是我調(diào)試三天才找到的坑——手冊(cè)里寫(xiě)了但沒(méi)人告訴你上拉電阻必須焊。軟件棧選擇 LittleFS 還是 FatFSLittleFS強(qiáng)烈推薦專為 NAND/NOR Flash 設(shè)計(jì)內(nèi)置磨損均衡、掉電安全、垃圾回收。ESP-IDF 4.4 原生支持API 與 POSIX 兼容。FatFS慎用通用 FAT32 文件系統(tǒng)但對(duì) Flash 友好性差頻繁小文件寫(xiě)入極易導(dǎo)致扇區(qū)提前失效。啟用 LittleFS 的步驟idf.py menuconfig→Component config→LittleFS→ 啟用LittleFS support在partitions.csv中添加spiflash, data, spiflash, 0x200000, 0x200000,假設(shè)外掛 Flash 映射到 0x200000 開(kāi)始的 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); // 按日期寫(xiě)入 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í)訪問(wèn)控制軍工/車規(guī)級(jí)這是為極端場(chǎng)景準(zhǔn)備的方案比如汽車 ECU 或醫(yī)療設(shè)備要求任何軟件 bug 都不能破壞關(guān)鍵配置。核心思想讓 Bootloader 成為唯一可信執(zhí)行環(huán)境TEE所有 NVS 訪問(wèn)必須經(jīng)它代理。架構(gòu)設(shè)計(jì)Bootloader 固件燒錄在 0x1000 地址固化不變。它內(nèi)置一個(gè)精簡(jiǎn) NVS 驅(qū)動(dòng)只開(kāi)放read_system_param()和write_runtime_param()兩個(gè) API。Application 固件燒錄在 0x10000 地址可 OTA 升級(jí)。它不能直接調(diào)用nvs_open()所有存儲(chǔ)請(qǐng)求必須通過(guò)esp_ipc_call()發(fā)送到 Bootloader。Flash 物理分區(qū)0x9000~0xc000nvs_secure分區(qū)只讀存設(shè)備證書(shū)、密鑰、安全啟動(dòng) hash0xd000~0x10000nvs_runtime分區(qū)可寫(xiě)但寫(xiě)入前 Bootloader 會(huì)校驗(yàn)簽名。實(shí)現(xiàn)關(guān)鍵點(diǎn)Bootloader 必須用idf.py -DSDKCONFIG_DEFAULTSsdkconfig.defaults.bootloader單獨(dú)編譯禁用所有 WiFi/BT 功能只留 SPI Flash 和 IPCApplication 通過(guò)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 被黑客注入惡意代碼它也無(wú)法繞過(guò) Bootloader 直接寫(xiě) Flash。壞處是開(kāi)發(fā)調(diào)試極其麻煩——每次改存儲(chǔ)邏輯都要重?zé)?Bootloader且 IPC 通信增加 2~3ms 延遲。我只在為某車企做 T-Box 項(xiàng)目時(shí)用過(guò)客戶合同里白紙黑字寫(xiě)著“必須通過(guò) ASIL-B 認(rèn)證”沒(méi)得選。4. 實(shí)操避坑指南那些官方文檔沒(méi)寫(xiě)的血淚教訓(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說(shuō)明碎片化嚴(yán)重 # 如果看到大量 Page state: INVALID說(shuō)明扇區(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 芯片。別笑我修過(guò)一臺(tái)產(chǎn)線測(cè)試儀Flash 擦寫(xiě)次數(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)化寫(xiě)入頻率。4.2nvs_set_str()的隱藏陷阱長(zhǎng)度截?cái)酂o(wú)聲無(wú)息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 // 讀出來(lái)試試 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()可能打不開(kāi)舊數(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 開(kāi)始前用nvs_flash_dump()導(dǎo)出所有 namespace 到 SPI RAM再寫(xiě)入外掛 Flash升級(jí)后遷移新固件啟動(dòng)后檢查nvs_get_u32(handle, migrate_flag, flag)若 flag0則執(zhí)行遷移邏輯把舊 key 讀出用新 key 名寫(xiě)入版本標(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 通過(guò) BLE 寫(xiě) NVS同時(shí) MCU 主程序也在讀寫(xiě)同一個(gè) namespace極易發(fā)生NVS_ERR_BUSY。這不是鎖的問(wèn)題而是 NVS 驅(qū)動(dòng)本身是單線程的——它用一個(gè)全局 mutex 保護(hù)整個(gè)分區(qū)。表現(xiàn)App 寫(xiě)入ble_control鍵MCU 正在讀runtime鍵兩者沖突一個(gè)操作失敗。解法只有兩個(gè)時(shí)間錯(cuò)開(kāi)BLE 寫(xiě)操作放在esp_ble_gatts_event_handler()的ESP_GATTS_WRITE_EVT里用xQueueSend()發(fā)送到專用任務(wù)隊(duì)列由低優(yōu)先級(jí)任務(wù)串行處理避開(kāi)主循環(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ù)說(shuō)話。我在 ESP32-WROOM-324MB Flash
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美精品亚洲精品日韩传电影| 少妇一区二区三区高速| 色婷婷成人综合| 色嗨嗨在线| 大香蕉2017| 国产精品久久久久亚洲av| 影音综合网| 日本丝袜人妻内射| 国产精品一区二区a| 精品一久久久| 亚洲古典另类欧美在线| 欧美性爱精品七区| 91丰满| 超碰碰97| 日韩三四五区| 一本久道久久综合狠狠爱| 亚洲AV成人精品网站在AV| 人妻天天爽夜夜爽2| 久久一二三四不卡 | 人妻丝袜一区二区三区在线| 97久久久网站| 肉丝网站91| 亚洲超碰在线| 强奸乱亚洲| www.99色| 国产无码三级视频在线观看| 久久久久白虎| 欧美黑人与女人91| 久久人妻办公室视频| 综合久久久久久久综合网| 中文字幕精品码亚洲| 中文一区在线日| 绯色AV粉色AV蜜臀AV| 人妻少妇久久久| 日韩999| 久久国产免费激情视频| 亚洲欧洲精品视频发布| 91社操逼| 色婷婷丁香五月| 丝袜美腿制服人妻二区中文字幕| 午夜福利av电影在线| 92性色国产午夜福利在线661| 日韩欧视频| 亚洲激情久久久伊人综合| 精品97久久综合| 亚洲午夜福利在线影院| 亚州AV无码国产精品| 熟女五十路一区二区三| 日本福利二区视频| 99国产在线绯色一区| 学生妹天天看| 亚洲精品丝袜-不卡成人免费……| 天堂av2019| J?P?NESEHD熟女熟妇伦| 欧美少妇大量自拍视频在线观看| 色悠久| 精品国产乱码久久久久A| 精品国产a∨一区天美传媒| www.狠狠| 欧洲一级性爱视频在线观看| 乱伦日本中文自拍| 伊人欧美大香蕉视频| 亚洲色色色| 国产精品激情久久久久久久| 好爽视频在线观看视频 | 色欲三区| 色吊丝 日日骚 清纯唯美| 最新av在线| 亚洲成人综合在线| 日本高清_区二区三区 | 国产JDAV无码视频在线观看| 国产午夜视频| 强奸乱亚洲| 一区二区播放| 国产 日韩 欧美 人妻 熟女 中文 69人妻精品一区二区绯色 | .精品人妻一区二区三| 国产精品色| 国产精品女生av| 东北女人高潮视频| 久久老熟女| 天天天操天天天爱| 婷婷色五月激情| 日韩精品一区二区日韩| 中国AV美女| 亚洲丝袜诱惑| 少妇被c 黄 免费观看| 蜜臀精品1区2区| 亚洲男人久久综合天堂| 黄人人操人人操| 国产一区二区在线播放量| 伊人在线大香蕉视频久久| 无码人妻精品一区二区三区九九 | 日曰骚久久精品| 日韩欧美三级| 久久这里只| 色狠狠一区二区三区香蕉| 欧美少妇性乱| 小骚逼被操的爽不爽| 情色五月天久久久| 欧美一区二区三熟女剧情| 久久久久久中文| 亚洲骚逼少妇| 熟女人妻一区二区三区免费看| 日韩丨制服丨中文|在线| 久久超碰亚洲人| 亚洲无码色| 日韩欧美字幕亚洲一区二区| 亚洲成人福利电影免费| 亚洲日产专区婷婷| 国产传媒日韩| 八戒午夜福利理论片| 91东京热男人的天堂| 国产亚卅97| 天天综合网一91网| 国产午夜福利视频在线| ...日韩成人一区二区三区字幕| 91爱| 色婷婷五月综合| 亚洲在高跟鞋自慰久久在色线| 少妇丝袜在线观看AV| 有码免费观看| 五月天婷婷社区| 日韩免费中文字幕视频| 中 文字幕一区二区三四 五 区日 日 骚| 久久草大香蕉| 久这精品中文在线观看视频| 日韩黄片影院| 丁香五月婷婷色| 综合91网| 波多野结衣被操50分钟免费视频| 久久欧美按摩999| 人人摸人人干人人拍97| 综合啪啪| 91av天美性媒精品视频| 亚洲双插| 国产又操| 日韩三级在线观看mp4| 色臀AV| 日韩激情啪啪| 国产免费一区二区三区最新不卡| 青青草日韩免费观看高清在线| 蜜乳av一区二区| 亚洲色图图片| 91老妇女| 一区,二区,三区视频| 另类天堂| 青椒国产97在线熟女| 日韩中文字幕精品一二三事国产精品| 日韩精品.久久精品.AV女优.天美传媒| 欧美激情久久久久| 97色操| 老熟女乱子伦中文字幕一区二区| 人妻激情另类| 国产女人91精品嗷嗷嗷嗷| 日本九九久久99播| 男人的天堂.com| 巨爆乳肉感一区二区三区竹菊影视 | silk lablo在线观看一区二区| 久久视频,这里只有精品| 免费日韩黄片| 日本在线视频导航| 91在线丝袜| 婷婷视频在线免费观看| 五月情色天| 无码WWW免费视频网站| 欧美日韩亚洲高清不卡一区二区三区| 亚洲自拍97| 激情欧美日韩女同久久| 中文字幕一区二区三区蜜臀| 亚洲中文字母在线播放| 男人高清无码一区二区| 欧洲视频在线| 特色a在线上| 欧美亚洲影视| 丁香五月天久久精品视频一区二区三区| av资源在线播放天堂| ,成人免费啪啪视频| 欧美日韩狠狠爱| 中文字幕天天天天天| 91中文在线| 国产宅男宅女在线观看| 乱伦熟妇一区二区| 日韩一级二级三级免费看完整版| 九九热国产| 久久精品无码不卡| 精品人妻一二三| 亚洲综合图片在线| 九一国产精品| 中出人妻中文字幕91在线| 一,爱啪啪,在线免费视频| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 91老熟女91老女人| 久久久久久裸体| 色爽——AV| 久久原创中文| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 久久久久久久久久9| 精品日日人妻| juliaann欧美丝袜办公室| 青青青草伊人精品| 伊人网在线点播| 天天cao在线| 日本久久女同性恋视频| 99久国产精品午夜性色福利| 欧美极度丰满熟妇hd| 日本一级一级一级一级| 日韩无码专区| 中文字幕精品资源在线| 三级片网站在线播放| 亚洲成av人片色午夜乱码| 欧美丝袜激情| 人妻偷拍一区二区三区| 99国产精品久久久久久久成人热| 午夜性刺激视频免费观看| 婷婷久久大香蕉| 超碰社区97| 啊啊啊无码| 岛国在线免费视频| 五月婷亚洲精品天堂| 久99热| 狠狠热这里都是精品| 男人的天堂三级| 亚州免费啪啪视频| 欧美亚洲高清不卡| 韩国一级AAA| 欧美美女自慰一区二区三区| 在线综合网| 99精品丰满人妻| 亚洲砖码砖专无区2023| 日本孕妇一区二区视频操逼免费看 | 啊啊啊久久久视频| 97射欧美| 久久激情婷婷| 啊啊啊想要| 久久久久久久强迫| 国产高清在线观看欧美| 无码精品蜜桃一区二区三区ww| 亚洲天堂AV在线播放| 色噜噜精品一区二区三| 无码人妻精品一区二区中文| 91精品伊人久久久大香线蕉91| 青青操狠狠撩| 亚洲熟妇丝袜在线观看| 精品一区二区2| 亚洲色图8| 91精品91久久久久77777俄罗斯老妇姓x| 亚洲成人免费中文字幕| 久久久久久精品免费看A级| 无码操逼网| 色99在线| 91影视亚洲| 亚91网| 国产精品不卡av免费在线观看| 性爱乱伦视频免费| 三级片网站在线播放| 激情综合婷婷| 蜜臀国产AV中文字幕| 爱干爱射网啊啊啊| 久久久久96| 人妻性爱一区二区| 国产高清成人mv在线观看| 九九在线视频| 久草在| 欧综合网| 无码不卡亚洲成?人片| 九九综合久久中文字幕| 精品久久一区二区三区四区五区| 99蜜桃臀亚洲成人在线观看| 夜夜欢天天干| 欧美国产伊人久久久久| 青苹果影院男人的天堂| 欧美78P| 亚洲超碰97| 精品成人动漫一区二区| 久久国模av| 伦理第一页| 乱论91| 欧美 亚洲 制服 精品| 亚洲精品欧洲精品| 欧美乱欲| av操操不卡| 91欧美综合| 亚洲激情网| 中国熟女91| 香蕉大久久久| 欧美色吧综合| 成人一道本免费视频| 国产精品久久久久久无码红治院| 99热这里只有精品8| 97视频网站在线观看| 一区久久久二区| 欧美性爱一区二区三区| 国产AV久久久蜜爱影集| 成人十八禁日韩欧美一二三| 中文字幕高清精品一区| 丝袜综合| 在线播放成人高清免费视频| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 熟啊v色欧美热| 欧美激情高清性猛交| 久久久免费一级黄片| 330Dv国产女人终合视频极品人与兽| 屌妞视频久久久久久久久久久久| 电家庭影院午夜69久久夜色精品国产69乱| 99国内精品| www欧美91| 99精品在线| 99re这里| 国产精品日本无码A片| 精品无码一区二区| 狠狠色噜噜狠狠狠狠2018| 天美一二三在线观看Av| 韩国一级婬片A片无码天美| 九九成人精品| 日本熟女免费視颖| 国产又大又粗又长视频在线| 亚洲欧美高清| 99re这里| 最新国产亚洲精品精品国产亚洲综合 | 日韩中文字幕二区| 日日躁夜夜躁狠狠躁超爽| 色玖玖| 农村女一级毛卡片| 中文字幕艹艹| 久久九色| 日韩少妇在线视频| 欧美久热| 人妻无一区二区三区| 人妻乱仑一区二区三区| 久久久999国产精品| 五月丁香综合| 大二网站亚洲| 久久久久人| av大香蕉| AV和黑人在线播放| 日韩91网| 久久最新视频免费观看| 国产精品96| 超碰97最新人妻| 免费中文在线| 国产农村妇女毛片精品久久| 啊啊啊啊啊在线视频| A级片日韩欧美国产欧美视频精选观看 | 69XX一中文字幕人妻91| 亚洲涩图欧美| 久久久久久久 九九九九九九九| 高潮毛片无遮挡高清免费| 欧美激色| 久久久久9久久久久| 在线视频 亚洲精品| 日影院久久婷婷夜夜网| 18啪啪手机免费性爱| 伊人久久久日韩一区| 超碰99在线观看| 成人性爱AV在线免费观看| 天天干美少妇一区| 看一级特黄a大一片| 亚洲有码视频二区| 亚洲天堂少妇| 欧美中字不卡| 久久久草成人网站久久久草成人久久久草久久久| 中文字幕人妻资源在线| 无码久| 国产精品女同| 一道本久久棕合爱| 乱伦熟女区| 强奸乱伦AV一天堂网| 美女骚尻视频| 亚洲男人的天堂AV| 日韩性爱人人爱人人操| 欧美中出| 青青草大香蕉视频| 果冻传媒A片一二三区| 久久久中文| 玖玖爱免费观看视频| 亚洲欧洲日本精品中文a∨| 午夜噜噜噜| 欧美久久婷婷| 亚洲综合色婷婷| 色婷婷视频| 可以免费看黄片的视频| 欧美日韩插逼视频| 国产强奸乱伦无码视频| JuliaAnn丝袜熟女系列| 干B网| 97操97色| 99re69| 免费看污网站| AV天堂男人的天堂| 久久久久久国产无码精品| 大香蕉琪琪日本女优不卡| 日本久久99| 神马午夜久久久| 国产馆| 亚洲视频中文一区| 亚洲精品第一| 九色 人妻 大香蕉| 高潮精品| 成人性爱av.com| 91网站视频在线观看| 91欧美丝袜| 国产无马视频| 久久神马影院| 污污汅18禁网站在线永久免费观看| 人人摸人人摸人人干| 91色艳| 大香蕉伊然在亚洲91| 久久精品国产亚洲AV无码做| 超碰久久网| 操B在线观看| 久久噜| 丁香五月电影| 色99999| 插日本熟女视频| 日本天天色| 亚洲情色综合| 国产第二页| 亚洲综合婷婷| 久久久久久亚洲Av无码精| 亚洲一区深夜| 偷拍亚洲熟女视频播放| 蜜桃午夜视频一区二区| 99久久e免费热视| 黄呦呦在线| 日韩操人| 亚洲综合影院| 亚洲AV无码天美传媒一区| 午夜啊啊| 中文字幕一区二区三四五区日日骚| 国产AV激情无码久久无码| 久久老熟女| 最新中文字幕av| 开心激情站| 秋霞无码av鲁丝片一区| 亚洲欧美日韩偷拍色图| 99蜜桃臀久久久欧美精品网站| 中文字幕日本久久| 久久中文字幕一区不卡| 超碰97精品| 老熟女综合网| 青青久久久| 97精品久久久久中文字幕| 大稥蕉免费视频这里只有精品| 新久久AV| 日本色色色色色视频| 大香蕉综合网| 大香蕉中文在线| 欧美色997| 日本不卡码黄色| 国产一区二区三区中文字幕| 偷拍伦理视频| 亚洲丝袜二区| 日韩精品一二三四| 大香蕉在线视频15| 大香蕉免| 精品人妻一区春色| 精品二999| 秋霞鲁丝午夜无码一区二区三| 91久久午夜无码鲁丝片久久人妻| 91久久精品蜜臀| 国产精品久久久久久片| 日韩精品黄片免费观看| 少妇高潮流水av免费| 无码操逼视频一下| 91成人在线免费视频| 国产白丝精品在线观看| 亚洲日韩精品久久久久一区壹牛 | 国产精品一级片在线看| 乱论91| 国语对白在线播放视频| 国产精品无码av| 久久久久婷婷| 国产免费大片| 超碰偷拍| 久久岛国| 欧美色97| 人人操人人操人人操人人操人人操人人人11.CM | 亚洲一区二区在线观看91| 搡老熟女免费视频| 国产高清成人mv在线观看| 美國A片| av在线播放国产一区| 日韩激情无码影院| 超碰97 线线 在现| 日日夜夜天天| 日韩97超碰中文字幕| 精品免费视频国产一区| 九九九九日本 | 黄色免费一级在线毛片| 中出789在线视频| 色色色色电影网| 97视频免费在线| 亚州国产精品乱| 亚洲伊人a线观看视频| 国产精品色片一区二区| 国产精品一区二区 尿失禁| 中文字幕乱碼在线| 国产9 9在线 | 亚洲| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 天天色综亚洲91污| 国产精品久久久久久久免牛肉蒲团| 最新9久久久9免费视频| 中文字幕人乱码中文字的预防方法| 91无码人妻| 久久久久久亚洲中文| 超碰人妻中文在线| 国产美女91| 蜜臀中文无码午夜| 国产精品久久久吖| 国产一区二区三区免费视频在性观看 | 精品人妻一区二区三区不卡断 | 精品国产72| 午夜男人的天堂| 屌逼麻豆| 国产女人视频三四五区| 国产亚洲中文不卡二区| 疯操AV| 天天爽天天操| 国产精品久久久久无码A√| 午夜毛片高清免费不卡| 免费看欧美美女黄色大片| 国产精品伦理| 国产精品一区午夜福利| 97色在线| 嗯啊抽插大香蕉网页| 91精品婷婷国产综合久久| 欧美日韩91| 天天射天天操天天干天天吃2018 | 久久女人视频| 殴美大黄片| 成·人免费午夜在线观看| 国产精品久久久久绯色| 美女尤物人人操| 久久久91| 欧美综合亚洲| 久久日本熟女精品一区| 夜色五月天| 91精品人妻一品二品三品| 久久久无码精品人妻二区| 91三级理论片播放器| 国产精品午夜精品| 中文字幕一区日韩精| 99超碰网| 蜜臀AV一区二区三区激情综合| 大香蕉欧美| 99色悠悠| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 久久肏大逼| 91亚洲黄色网| 超碰日本97美女人妻人人玩人人爱| 蜜臀AV午夜精品久| 亚洲色图 欧美热图 清纯唯美 另类自拍| 情色五月天久久久| 又大又长又粗又爽又黄| 欧洲大香蕉| 欧美一级色| 亚洲天在线| 人妻天天爽夜夜爽爽| 无码久久亚洲高清,| 99蜜桃臀亚洲成人在线观看| 静品嫩模一区二区| 久热精品在线| 中文字幕视频2区| 人人人人插| 久久久精精精| 久久久久国产精品人妻aⅴ天堂| 婷婷五月天基地| 亚洲综合大片| 久久久久久久久久久久久久久乱码| 久久精品国产亚洲AV清纯| 97精品国产精品免费观看| 六月婷激情福利天堂69| 日韩国产精品人妻无码久久久| 亚洲欧美中日韩| 日韩乱插| 日韩性爱网址| 男人天堂网站| 亚洲欧美激情小说| 素颜老阿姨乱情色| 99999精品成人| 久草成人福利导航| 99这里有精品| 欧美九9 9 9| 国产精品久久久鸭无码的功能| heyZO天然素人无码AⅤ专区| 日韩av性爱在线播放| 欧综合网| 99青青草国产视频| 香蕉久久国产AV一区二区| 欧美亚洲国内自拍| 偷窥自拍亚洲色图| 国产午夜视频| 久久久久久久少妇| 天天拍天天操| 伊人久久综合精品欧美| 色欧美天天| 91热色| 青青草久久在线| 日韩欧美女求操每天更新| 欧美精品黑人猛交高潮| 成人精品无码| 免费看日产一区二区三区| 亚洲成人网站在线观看| 超碰天天久久79| 老女人综合网| 最新欧洲欧美日本激情网站| 北野未奈加勒比av| 国产91精品福利在线| 亚州再线| 加勒比aⅴ| 久久久久亚洲av综合波多野制衣| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 亚洲精品丝袜| 伊人精品视频| 日韩一级久久毛片| 一牛影视久久久一区二区三区| 大鸡巴久久| 国产黄色剧情影片麻豆免费播放| 国产精品一二三区福利| 欧美激情精品久久久久久| 久久98| 26uuu国产免费观看| 在线中文字幕| 日本一级婬片试看三分钟| 手机在线视频国内精品| 91精品亚洲内射孕妇| 亚洲成熟国产精品美女| 欧美影院一区二区三区| 亚洲成人美女无吗| 九九视品黄色| 亚州高清av| 黑人免费福利视频| 日本成熟少妇A∨网站| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 91精品人妻| 夜夜草天天| 综合一区中亚洲国产成人综合精品| 久热超碰| 久久久久日本视| 亚洲图片偷拍视频区| 中文字幕日产av人| 无码外流操逼视频| 九九九九97| aaa一级黄片| 2020中文字幕在线| 久热91| 久久人妻一区二区三区高清| 九九亚洲视频| A级片日韩欧美国产欧美视频精选观看 | 操B久久| 天天操天天干一区二区 | 丰满人妻一区二区中文| 日韩精品1区2区中文字幕| 天天碰久久入| www.91色综合| 欧美亚洲色图另类国产| 抽插一区二区视频| 91女神在线视频| 一区操逼日比视频| 97资源站日韩| 99re这里| 国产真实野战在线视频| 久久久久久免费电影| 婷色五月| 操逼视频亚洲| 色亚洲欧美| 欧美伦乱爱| 欧美熟妇视频| 高清不卡国产| 三级片大波波| 综合网欧美在线| 亚洲婷婷五月天| 最新三级网址| 超碰在线人人射| 九九九九97| 啊啊啊啊二区好大| 亚洲国产剧情少妇激情| 久久鲁干| 久久香蕉国产线看观看猫咪av| 亚洲乱码精品一区二区| 人人操,操人人| 97在线看| 亚洲图片欧美| 噜噜噜亚洲精| 人妻天天爽夜夜爽2| 五月天丁香| 日本十八禁免费看污网站| 久久久久久九九九| 亚洲久久东京热一二三四五区视频| 久久人妻四季| 亚洲天堂东京热| 丝袜 亚洲 偷拍| 国产欧美伊人| 精品国产乱码久久久兰草影视| 天天影视91看看| 欧美性爱第一页久久| 性videos欧美熟妇hdx| 亚欧免费观看视频| α√在线| 按摩中文字幕| 超碰到97情色| 2020中文字幕| 激情啪啪拍91| 乱日视频| 人妻少妇精品久久久久久| 极品少妇久久久| 日本人妻中文字幕精品| 日本3级一区二区免费| 国产一区二区三区中文字幕| 国产不卡中文字幕免费avi| 国产丝袜啪啪| 久久亚洲AV成人精品无码| 青青操97| 欧美做爰无码A片视频| 亚洲91亚洲| 日韩三A大片在线观看 | 亚洲一二三四区在线免费看视频| 色噜噜综合在线| 青草精品视频日本久久久久网站在线| 91亚洲欧美激情| 国内一级精品| 精品午夜福利导航| 日韩黄片视频试看| 三级三久久线久久99久目本WW| 五月丁香啪| 日韩9999| 免费视频观看60秒| 秋霞怕怕片| 亚洲制服aⅴ中文字幕| 国产伦乱91| 天天天天天干夜夜夜夜夜操| 久久黄黄| 亚洲图片欧美制度| 久久久96精品| 肏逼视频日本| 温婉少妇玩3p| 极品综合| 一本一道波多野毛片中文在线| 97国产精品一区| 国产剧情在线| 亚洲无吗在线视频| 91狠| 96久久久精品| 秋霞操逼片| 五月丁香激情综合网| 曰本91情色| 九九九九精| 国产精品久久99日日| 国语人妻精彩刺激| 少妇一级婬片免费放一级a性色.| 日韩中文字幕在线视频观看| 久久日本熟女精品一区| 国产高清成人mv在线观看| 干b在线性社区| 日韩免费福利在线观看| 亚洲丝袜色图| 色噜噜狠狠色综合日日| 强奸乱伦Av网| 麻豆天美传媒在线视频天堂| 精人妻一区二区三区| 三级网色| 久久AV无码1区2区3区| 99热18这里只有精品| 91丨人妻丨国产丨丝袜| 久操凹凸视频| 超碰人人色| 欧美日韩亚洲电影| 強姦亂倫a| 极品粉嫩一区二区| 91美女视屏| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 色九久| 3p国产色噜噜一区| 欧美色图 人妻| 无码丰满熟妇一区二区浪潮AV| 欧美亚洲玖玖玖| 久操免费观看| 999亚洲国产视频| 亚洲三级网址久久最新| 欧美一级黄色免费专区| 91xingse| 亚洲av噜噜噜噜噜噜| 人妻AV 中文字幕的| 久久久久久99999国产精品| 亚洲国产ⅴ高清在线观看| 久久一区无码| 九七超碰| 精品人妻一区二区免费蜜桃| 少妇一区二区三区| 国产11页| 葡萄牙性视频一二区| 日本日皮视频逼| 操b网站亚洲无码| 日本道不卡| 99久久久无码| 囯产精品久久久久久久久久梁医生 | 蜜桃久久久久久| 日韩欧美亚洲自拍偷拍| 一区二区三区四区姦女| 国产丝袜美女在线一区| 青青草日本中文字幕| 天天激情综合站| 久久综合女优| 18禁免费视频| 欧洲亚洲人妻无码中字久久三区四区| 超碰色老头| 久久精彩视频| 伊人嫩草| 婷婷中文字幕| 欧美特大AA级黄片| 久久 亚洲 日韩 人妻| 中文字幕五月婷婷免费| 亚欧精品久久久久久久久久久| 九九九九精品| 国产性刺激| 欧洲欧美视频一区二区| 国产乱码精品久久久久久| 亚洲古典另类欧美在线| 台湾佬中文娱乐自偷自拍| 日韩一级性爱无码| 久草精品一区 | 舔人妻中文免费视频| 日本99视频| 无码操逼视频一下| 中文字幕一区二区三四五区日日骚| 欧美大香蕉专区网| 91内射| 99热导航| 激情五月天丁香社区| 男人天堂东京热| 热久日综合| 性做久久久久久免费观看软件| 亚洲欧洲自拍| 国产乱弄免费在线视频。| 久久这里只精品99re66图| 久久有码视频| 婷婷激情丁香| 色哟哟AⅤ| 狠狠 91| 97超碰色屌| 女上位精品在线| 亚洲日韩电影| 人人操人人插人www| 一区二区偷拍拍视频| 天天爽夜夜爽夜夜爽精| 冬京热男人的天堂| 人人贴人人摸| 久9爱精品| 日产狠狠干| 亚洲男人天堂网站| 9/A片 | 97超级色碰碰| 嗯嗯嗯嗯啊啊啊好紧好大| 国产无码高清操逼视频| 高精欧美色| 97 九色| 乱人伦 国语对白:视频直接看| 亚洲国产av中文字幕久久 | 国产极品久久久| 日韩丰满熟妇| 午夜国产综合视频在线观看| 久久久久久免费电影| 97色爱| 夜夜中出国产| 日本污ww视频网站| 欧美精品日韩久久久九| 久久青青草在线视频| 日韩射图| 第45页一区二区| 天天淫人人妻日日色| 99只有精品| 精品一区二区人妖| 操婢日韩| 欧美亚洲激情| 大香蕉草草| 女上位精品在线| 色色99| 老女人爆菊| 色播丁香| 啪啪啪大香蕉| 制服乱伦| 99操视频| 国产东北女人在线视频| 欧美成人性爱视频在线播放| 亚洲欧美清纯| 丰满人妻一区| AV色图| 国产一区二区三区中文字幕| 久99视频| 亚洲熟女av日韩熟女| 天堂种子在线www网资源| 无码精品一区二区三区潘金莲| 人人操人人干xxx| 亚洲日韩精品久久久久一区壹牛| 99精品人妻| 亚洲图片另类| 欧美精品97| 性色A∨91| 国产精品一区二区a| 天天综合网网欲色| 天天综合网日韩| 91性片| 亚洲福利影院一区久久| 夜夜夜爽www精品视频| 成人夜夜| 国产成人啪一区二区| 欧美性视频二区三区| 深夜激情| 亚洲春色欧美| 亚洲色宗合| 天天综合网~91| 综合亚洲欧美| 天天综合网在线观看| 亚洲九九九| 色哟哟综合| 亚洲最大成人a毛毛片| 日本性爱少妇| 激情色播| 性色乱AV一区二区| 午夜福利在线合集| 日日嗷| 中国91AV| 韩国免费播放一级毛片| 国产特级毛片AAAAAA高潮流水| 在线播放一级无码视频| 国产成年女人免费视频播放a| 中国一级操逼视频| 久久久久国产精品喷潮免费观看臀| 久草视频在线视频在线视频在线观看 | 蜜臀精品1区2区| 诱惑人妻欧美一区在线播放| 香蕉av一区二区三区| 亚洲高清少妇| 欧美色图片91| 天堂涩涩| 国产精品一区二区三区免费视频| 欧美色另类| 加勒比综合九九99视频在线播放| 操婷婷逼| 青草视频在线看看看看看看看看看| 嗯嗯啊在线视频| 色婷视频| 最新中文字幕在线亚洲| av大香蕉| 国产精品suv一区| 久热99999| 手机在线中文字幕国产| 欧美日韩国产中文精品字幕自在自线,| 97色色国产视频| 天天欧美| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 综合性视频99| 亚洲最新Av| 国产欧美一区激情交| 麻豆精品天美| 久草免费福利在线播放| 97超碰免费人人性爱| 国产无码精品成人| 欧美午夜色妇色鬼| 日韩兔费看黄片| 青青草在线成人视频| 色偷偷人人玩人人舔人人操人人摸人人爽 | 亚洲天堂久久| 国产夜夜艹| 欧美做爰无码A片视频| av一区二区三区不卡| 天天视频综合在线观看视频| 91久青| 久艹99| 久久久久亚洲AV无码专区少妇| 五月丁香色综合| Julia Annxxxxx| 国产又黄又粗的视频| 老司机福利青青草| 久久精品中文字幕无码l| 天美av在线观看| 天天综合色电影| 国产在线激情| 另类 日韩 熟女| 久久夜夜夜夜| 亚洲丝袜综合| 久久婷色| 国产蜜臀精品一区二区尤物| 日韩一级性爱无码| 91美女在线精品视频| 欧美色乱| 天堂种子在线www网资源| 丰满人妻一区| 国产精品 久久久精品一牛| www.国产高潮精品| 爱爱动态试试看6 0秒| 超碰97综合| 欧美成va视频网站| 九九九九九九九九九九九九九九九女| 久久精品国产亚洲妲己影视| 中文字幕老熟妇黄色视频| 后入精品| 丰满人妻一区二区三区大胸懂色 | 欧亚日韩一区在线| 国产原创自拍| 日欧毛片久久| 中国少妇XXXX做受| 91嫩草在线| 免费一级特黄特色大片在线观看看| 亚洲官网在线| 成人无遮挡毛片免费看| 亚洲日韩av一区二区三区百合| 日韩猛交| 日本三级黄页| 亚洲欧美日韩不卡人妻| 国产人妻天天干精品| 天天操天天日天天干| 777奇米影视777四色| 99爱爱| 中国国国产一级特黄毛片| 亚欧操逼片在线观看| 激情五月天社区| 性色高清..……| 太久视频| 国产精品成人午夜福利| 艳美熟妇先锋一二三区| 欧美不卡五十路| 性性欧美| 久久久久久AV无码免费网站| 99国产在线绯色一区| 日本色婷婷| 亚洲国产高清福利视频| 国产二区三区免费视频| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | av网站在线观看了| 2017天天拍大香蕉| 国产欧美另类久久久精品课程| 日韩午夜国产| 国产欧美日韩女同性恋ww喷水精品| 亚洲激情综合| 国产精品无码在线| 亚洲啪啪视频一区二区| 美女一区二区国产精品| 一区二区视频在线播放| 亚洲成熟国产精品美女| 国产操逼逼网| 成人性爱全视频观看| www.久久99| 97人人干| 目产99999久久999| 97在线观看免费| 夜夜高潮夜夜爽夜夜爱爱一区| 97操碰| 国产熟女一区二区| 91中文字幕| 人人艹亚洲| 黑人白女精品一区| 亚洲欧美精品福利在线| 色999人与兽| 欧美中文字幕一区| 后入合集| …亚洲黄色厕厕女女在线播…| a片偷拍视频| 综合在线导航一区| 人妻激情偷乱视频一区二区三区| 久久久久无码| 鸥美极品| 国产精品高潮久久久无码| 人妻二区| 亚洲欧洲综合视频在线| 操一区| 操淫穴亚洲五月丁香 | 97欧美精品| 日韩人妻一区二区精品| 四虎影库国产精品免费| 粉嫩久久久极品| 又大又长又粗又爽又黄| 在免费jIzzjIzz在线视频| 大奶啊啊好爽 | 97在线视频观看| 欧美国产一区二区三区麻豆传媒| 97视频网站| 亚洲精美粉嫩嫩泬在线观看| 亚洲图片欧美制度| 亚洲国产精品V?在线播放| 亚洲……91| 熟女久久久| 亚洲黄片免费在线播放| 亚洲中文制服诱惑| 亚洲激情欧美色图| 色综合V| 9999九九九久久久| 可以在线观看的黄色网址| 爱爱动态120秒| 草B在线| 尤物网站91| 丝袜无码a片| 色在线亚洲视频www| 91熟女.com| 日本123区操B视频| 91痴汉| 蜜桃成人1区2区3区| 丁香婷婷激情五月天无毒不卡| 大香蕉手机在线| 日本 色 导航| 91天天爱| 亚洲精品国产无码高清| 熟妇艹鸡八| 欧美极品性爱天天射| 精品乱码在线观看| 亚洲av淫乱| 亚洲一区制服诱惑| 五月丁香综合啪啪| 久操免费在线| 高树玛利亚无码流出| 手机在线视频国内精品| 亚洲。日韩。欧美| 99热在线观看| 精品日韩| 五十路人妻在线| 国产黄a三级三级三级av在线看| 91热色| 射综合网| 日韩丨制服丨中文|在线| AAA久久| 日韩在线一区二区| 日韩精品一区,二区 九九...老司机| 精品久久一区二区三区四区五区| 一级性爱视频免费在线| 天综合网欧美| 操操操操操操| 97人人操人人干| 国产操操日韩三级黄| 伊人黄色片| 香蕉黄色一级视频| 男人午夜天堂| 五十路熟女工口| 九九热精品视频在线观看| 操逼网免费无码视频| 97欧美色| 亚洲女人毛茸茸91| 污到发麻的视频 国产| 91xingse| 国产精品肉丝自拍| 91蜜臀熟女| 亚洲av无码成人精品国产| av天堂电影网| 99re98| 国产辣妈在线视频福利| 色欧美综合| 蜜桃传媒视频第一区入口在线看| 综合 青草 伊久久 影院 综合| 四虎永久在线精品免费网址| 国产AV超爽| 再深点灬舒服灬太大了好硬好爽| 精品人体无圣光凹凸| 5278欧美一区二区三区| 色官网在线| 婷婷伊人网| 亚洲青青青视频在线| 国产久久一区二区三区野外在线| 欧美亚洲日韩16色| 九九九九免费视频| 欧美偷拍| 天天草夜夜草高潮片|