嵌入式設備系統日志記錄方法

混說Linux 2023-03-28 11:32

點擊左上方藍色“混說Linux”,選擇“設為星標

第一時間看干貨文章



?1

在嵌入式設備應用場景中,系統日志時??梢员O控設備軟件的運行狀態,及時記錄問題點以及關鍵信息,方便開發人員后期定位以及解決問題。本文將講述一種簡易的系統日志記錄方法,用于保存設備的系統日志,視具體嵌入式設備情況而定,可存儲在MCU內部Flash、外部Flash、EEPROM等,本文采用外部Flash作為示例展開介紹。

?

思路分析

對于系統日志可以當成文件系統,可以劃分為三個重要部分:目錄區、參數區、日志區。目錄區:根據日期進行歸類,記錄當天的日志的存儲地址、日志索引、日志大小,通過目錄可以獲取整個日志文件的概況;參數區:存儲記錄日志寫位置、目錄項個數、寫狀態等參數;日志區:這是我們主要的存儲區,記錄系統的日志,支持環寫。這三個區域都需要占用部分內存,可以自行分配大小。


實現的效果如下圖所示,設置通過指令可查詢到整個日志目錄區的概況。

查詢系統日志目錄:AT+CATALOG?
LOG_ID: 存儲日志按日期分類,該ID用于查詢對應日期日志,從1開始計數;
LOG_DATE: 系統日志存儲日期;
LOG_ADDR: 系統日志存儲外部FLASH地址;
LOG_OFFSET: 系統日志存儲偏移量(各日期日志大小,單位:字節)。


查詢指定日期系統日志:AT+CATALOG=

LOG_ID:在查詢系統日志目錄時獲取,當LOG_ID為0時,為查詢整個系統日志。


另外提供移除系統日志(清除日志目錄)指令:AT+RMLOG,后面將講述具體實現。

?

FLASH內存劃分

FLASH內存需要看具體設備進行合理劃分,目錄區、參數區與日志區實現環形存儲,延長擦寫壽命。
#define?FLASH_SECTOR_SIZE???((uint32_t)0x001000)
#define?FLASH_BLOCK_32K_SIZE??((uint32_t)0x008000)
#define?FLASH_BLOCK_64K_SIZE??((uint32_t)0x010000)
#define?SECTOR_MASK?????????????(FLASH_SECTOR_SIZE?-?1)?????????/*扇區掩碼?------*/
#define?SECTOR_BASE(addr)???????(addr?&?(~SECTOR_MASK))????????/*扇區的基地址?--*/
#define?SECTOR_OFFSET(addr)?????(addr?&?SECTOR_MASK)???????????/*扇區內的偏移?--*/

#define?BLOCK_32K_BASE(addr)??(addr?&?(~(FLASH_BLOCK_32K_SIZE)))
#define?BLOCK_64K_BASE(addr)??(addr?&?(~(FLASH_BLOCK_64K_SIZE)))

typedef?enum?{
????FLASH_BLOCK_4K??=?0,??????????/**
????FLASH_BLOCK_32K?=?1,??????????/**
????FLASH_BLOCK_64K?=?2???????????/**
}flash_block_t;

/*?flash?空間索引?*/
typedef?enum{
????FLASH_CATALOG_ZONE?=?0,
????FLASH_SYSLOG_PARA_ZONE,
????FLASH_SYSLOG_ZONE,
????FLASH_ZONEX,
}flash_zone_e;

typedef?struct{
????flash_zone_e?zone;
????uint32_t?start_address;
????uint32_t?end_address;
}flash_table_t;

/*?地址劃分?*/
static?const?flash_table_t?flash_table[]?=?{
??{?.zone?=?FLASH_CATALOG_ZONE,???????.start_address?=?0x03200000,?.end_address?=?0x032FFFFF},??
??{?.zone?=?FLASH_SYSLOG_PARA_ZONE,???.start_address?=?0x03300000,?.end_address?=?0x033FFFFF},??
??{?.zone?=?FLASH_SYSLOG_ZONE,????????.start_address?=?0x03400000,?.end_address?=?0x03FFFFFF},??
};


Flash底層實現擦除、讀寫操作接口,由讀者自行實現。

flash_table_t?*get_flash_table(flash_zone_e?zone)
{
??int?i?=?0;
??for?(i?=?0;?i?????if?(zone?==?flash_table[i].zone)?
??????return?(flash_table_t?*)&flash_table[i];
??}
??
??return?NULL;??
}

int?flash_erase(flash_zone_e?zone,?uint32_t?address,?flash_block_t?block_type)
{
??flash_table_t?*flash_table_tmp?=?get_flash_table(zone);
??
??if?(flash_table_tmp?==?NULL)
????return?-1;
????
??if?(address?start_address?||address?>?flash_table_tmp->end_address)?
????return?-1;

??return?bsp_spi_flash_erase(address,?block_type);
}

int?flash_write(flash_zone_e?zone,?uint32_t?address,?const?uint8_t*data,?uint32_t?length)
{
??flash_table_t?*flash_table_tmp?=?get_flash_table(zone);
?????
??if?(flash_table_tmp?==?NULL)
?????return?-1;

??if?((address?start_address)?||((address?+?length)?>?flash_table_tmp->end_address))
?????return?-1;

??return?bsp_spi_flash_buffer_write(address,?(uint8_t?*)data,?length);
}

int?flash_read(flash_zone_e?zone,?uint32_t?address,?uint8_t*buffer,?uint32_t?length)
{
??flash_table_t?*flash_table_tmp?=?get_flash_table(zone);
??
??if?(flash_table_tmp?==?NULL)
????return?-1;

??if?((address?start_address)?||((address?+?length)?>?flash_table_tmp->end_address))
????return?-1;
????
??bsp_spi_flash_buffer_read(buffer,?address,?length);
??return?0;
}

?

參數與結構體定義

日志數據存儲時間戳,便于問題定位,需要實現RTC接口調用。
typedef?struct?{
????uint16_t??Year;??/*?年份:YYYY?*/
????uint8_t??Month;??/*?月份:MM?*/
????uint8_t??Day;??/*?日:DD?*/
????uint8_t?????Hour;??/*?小時:HH?*/
????uint8_t?????Minute;??/*?分鐘:MM?*/
????uint8_t??Second;??/*?秒:SS?*/
}time_t;???

int?bsp_rtc_get_time(time_t?*date);


參數區應當保證數據的正確性,應加入參數校驗存儲,定義校驗結構體。

#define?SYSTEM_LOG_MAGIC_PARAM??0x87654321?/*?日志參數標識符?*/
typedef?struct?{
????uint32_t?magic;??/*?參數標識符?*/
????uint16_t?crc;??/*?校驗值?*/
????uint16_t?len;??/*?參數長度?*/
}?single_sav_t;


參數區需記錄當前日志記錄的寫位置,以及目錄項個數,還有日志區和目錄區環寫狀態,并且存儲最新時間等等。

/*?日志區參數?*/
typedef?struct?{
????uint32_t???write_pos;????????????/*?寫位置?*/
????uint32_t???catalog_num;???????????/*?目錄項個數?*/
????uint8_t????log_cyclic_status;???/*?系統日志環形寫狀態?*/???
????uint8_t????catalog_cyclic_status;?/*?日志目錄環形寫狀態?*/
????time_t?????log_latest_time;????/*?存儲最新時間?*/
}system_log_t;

/*?目錄區參數?*/
typedef?struct?{
????uint32_t?log_id;????/*?日志索引?*/?
????uint32_t?log_addr;????/*?日志地址?*/
????uint32_t?log_offset;??/*?日志偏移大小,單位:字節?*/
????time_t???log_time;????/*?日志存儲時間?*/
}system_catalog_t;

/*?系統日志參數?*/
typedef?struct?{
????single_sav_t?crc_val;
????system_log_t?system_log;
????system_catalog_t?system_catalog;
}sys_log_param_t;

typedef?struct?{
????uint8_t?system_log_print_enable;?/*?系統日志打印使能?*/
????uint16_t?system_log_print_id;????/*?打印指定id系統日志?*/
????uint32_t?system_log_param_addr;??/*?當前日志寫地址?*/
}?sys_ram_t;

sys_ram_t?SysRam;
sys_log_param_t?SysLogParam;

sys_ram_t?*gp_sys_ram?=?&SysRam;
sys_log_param_t?*gp_sys_log?=?&SysLogParam;

?

實現接口說明

CRC校驗接口,可以自定義實現。
/*?16位CRC校驗高位表?*/
static?const?uint8_t?auchCRCHi[]={
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,

0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40,0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,
0x00,0xc1,0x81,0x40,0x01,0xc0,0x80,0x41,0x01,0xc0,0x80,0x41,0x00,0xc1,0x81,0x40
};

/*?16位CRC校驗低位表?*/
static?const?uint8_t?auchCRCLo[]={
0x00,0xc0,0xc1,0x01,0xc3,0x03,0x02,0xc2,0xc6,0x06,0x07,0xc7,0x05,0xc5,0xc4,0x04,
0xcc,0x0c,0x0d,0xcd,0x0f,0xcf,0xce,0x0e,0x0a,0xca,0xcb,0x0b,0xc9,0x09,0x08,0xc8,
0xd8,0x18,0x19,0xd9,0x1b,0xdb,0xda,0x1a,0x1e,0xde,0xdf,0x1f,0xdd,0x1d,0x1c,0xdc,
0x14,0xd4,0xd5,0x15,0xd7,0x17,0x16,0xd6,0xd2,0x12,0x13,0xd3,0x11,0xd1,0xd0,0x10,
0xf0,0x30,0x31,0xf1,0x33,0xf3,0xf2,0x32,0x36,0xf6,0xf7,0x37,0xf5,0x35,0x34,0xf4,
0x3c,0xfc,0xfd,0x3d,0xff,0x3f,0x3e,0xfe,0xfa,0x3a,0x3b,0xfb,0x39,0xf9,0xf8,0x38,
0x28,0xe8,0xe9,0x29,0xeb,0x2b,0x2a,0xea,0xee,0x2e,0x2f,0xef,0x2d,0xed,0xec,0x2c,
0xe4,0x24,0x25,0xe5,0x27,0xe7,0xe6,0x26,0x22,0xe2,0xe3,0x23,0xe1,0x21,0x20,0xe0,

0xa0,0x60,0x61,0xa1,0x63,0xa3,0xa2,0x62,0x66,0xa6,0xa7,0x67,0xa5,0x65,0x64,0xa4,
0x6c,0xac,0xad,0x6d,0xaf,0x6f,0x6e,0xae,0xaa,0x6a,0x6b,0xab,0x69,0xa9,0xa8,0x68,
0x78,0xb8,0xb9,0x79,0xbb,0x7b,0x7a,0xba,0xbe,0x7e,0x7f,0xbf,0x7d,0xbd,0xbc,0x7c,
0xb4,0x74,0x75,0xb5,0x77,0xb7,0xb6,0x76,0x72,0xb2,0xb3,0x73,0xb1,0x71,0x70,0xb0,
0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,
0x9c,0x5c,0x5d,0x9d,0x5f,0x9f,0x9e,0x5e,0x5a,0x9a,0x9b,0x5b,0x99,0x59,0x58,0x98,
0x88,0x48,0x49,0x89,0x4b,0x8b,0x8a,0x4a,0x4e,0x8e,0x8f,0x4f,0x8d,0x4d,0x4c,0x8c,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40
};

/*?實現crc功能函數?*/
static?uint16_t?CRC16(uint8_t*?puchMsg,?uint16_t?usDataLen)
{
????uint8_t?uchCRCHi=0xff;
????uint8_t?uchCRCLo=0xff;
????uint16_t?uIndex;
????
????while(usDataLen--)?{
????????uIndex=uchCRCHi^*(puchMsg++);
????????uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
????????uchCRCLo=auchCRCLo[uIndex];
????}
????
????return?uchCRCHi<<8|uchCRCLo;
}


保存系統日志參數,每實現寫日志操作后都需要保存當前的參數值,防止意外丟失。

void?save_system_log_param(void)
{
????uint32_t?i?=?0;
????uint32_t?addr?=?0;
????uint32_t?remainbyte?=?0;
????uint32_t?start_addr;
????int?len?=?sizeof(sys_log_param_t);
????uint8_t?*pdata?=?(uint8_t?*)&SysLogParam;
????flash_table_t?*flash_tmp?=?get_flash_table(FLASH_SYSLOG_PARA_ZONE);
????
????/*?校驗參數?*/
????gp_sys_log->crc_val.magic?=?SYSTEM_LOG_MAGIC_PARAM;
????gp_sys_log->crc_val.len?=?sizeof(sys_log_param_t)?-?sizeof(single_sav_t);
????gp_sys_log->crc_val.crc?=?CRC16(&pdata[sizeof(single_sav_t)],?gp_sys_log->crc_val.len);

????start_addr?=?gp_sys_ram->system_log_param_addr;
????/*?剩余內存不夠寫,則重新從起始地址開始寫,實現環形存儲功能??*/
????if?((start_addr?+?len)?>?flash_tmp->end_address)?{?
????????start_addr?=?flash_tmp->start_address;
????}
????gp_sys_ram->system_log_param_addr?=?start_addr?+?len;
????/*?首地址存儲,擦除整個系統日志參數存儲區,如果劃分的內存較大,可能出現第一次擦寫等待時間較長,
???????但實際應用嵌入式設備應該不會占用太多的內存存儲系統日志,只當為輔助使用,有額外應用可自行實現?*/

????if?(flash_tmp->start_address?==?start_addr)?{
????????/*for?(i?=?flash_tmp->start_address;?i?end_address;?i+=?FLASH_SECTOR_SIZE)?
????????????flash_erase(FLASH_SYSLOG_PARA_ZONE,?SECTOR_BASE(i),?FLASH_BLOCK_4K);
????????*/

????????addr?=?flash_tmp->start_address;
????????do?{
????????????if?((addr?+?FLASH_BLOCK_64K_SIZE)?<=?flash_tmp->end_address)?{
????????????????flash_erase(FLASH_SYSLOG_PARA_ZONE,?BLOCK_64K_BASE(i),?FLASH_BLOCK_64K);
????????????????addr?+=?FLASH_BLOCK_64K_SIZE;
????????????}?else?if?((addr?+?FLASH_BLOCK_32K_SIZE)?<=?flash_tmp->end_address)?{
????????????????flash_erase(FLASH_SYSLOG_PARA_ZONE,?BLOCK_32K_BASE(i),?FLASH_BLOCK_32K);
????????????????addr?+=?FLASH_BLOCK_32K_SIZE;
????????????}?else?if?((addr?+?FLASH_SECTOR_SIZE)?<=?flash_tmp->end_address)?{
????????????????flash_erase(FLASH_SYSLOG_PARA_ZONE,?SECTOR_BASE(i),?FLASH_BLOCK_4K);
????????????????addr?+=?FLASH_SECTOR_SIZE;
????????????}?else?{
????????????????break;
????????????}
????????}?while?(addr?end_address);?
????}

????remainbyte?=?FLASH_SECTOR_SIZE?-?(start_addr?%?FLASH_SECTOR_SIZE);
????if?(remainbyte?>?len)?{
????????remainbyte?=?len;
????}
????while?(1)?{
????????flash_write(FLASH_SYSLOG_PARA_ZONE,?start_addr,?pdata,?remainbyte);
????????if?(remainbyte?==?len)?{
????????????break;
????????}?else?{
????????????pdata?+=?remainbyte;
????????????start_addr?+=?remainbyte;
????????????len?-=?remainbyte;
????????????remainbyte?=?(len?>?FLASH_SECTOR_SIZE)???FLASH_SECTOR_SIZE?:?len;
????????}
????}
}


導入系統日志默認參數接口,初始化默認參數或者移除日志。

void?load_system_log_default_param(void)
{
????/*?系統日志默認參數?*/
????/*?目錄環寫狀態標志?*/
????gp_sys_log->system_log.catalog_cyclic_status?=?0x00;
????/*?目錄項個數?*/
????gp_sys_log->system_log.catalog_num?=?0;
????/*?日志環寫標志?,?1:環寫狀態?*/
????gp_sys_log->system_log.log_cyclic_status?=?0;
????/*?設置默認值,實際會重新從RTC獲取最新時間?*/
????gp_sys_log->system_log.log_latest_time.Year?=?2019;
????gp_sys_log->system_log.log_latest_time.Month?=?5;
????gp_sys_log->system_log.log_latest_time.Day?=?8;
????gp_sys_log->system_log.log_latest_time.Hour?=?13;
????gp_sys_log->system_log.log_latest_time.Minute?=?14;
????gp_sys_log->system_log.log_latest_time.Second?=?10;
????/*?日志寫位置從0開始?*/
????gp_sys_log->system_log.write_pos?=?0;
????
????gp_sys_log->system_catalog.log_addr?=?0;
????gp_sys_log->system_catalog.log_id?=?0;
????gp_sys_log->system_catalog.log_offset?=?0;
????gp_sys_log->system_catalog.log_time.Year?=?2019;
????gp_sys_log->system_catalog.log_time.Month?=?5;
????gp_sys_log->system_catalog.log_time.Day?=?8;
????gp_sys_log->system_catalog.log_time.Hour?=?12;
????gp_sys_log->system_catalog.log_time.Minute?=?12;
????gp_sys_log->system_catalog.log_time.Second?=?14;
????
????gp_sys_log->crc_val.magic?=?SYSTEM_LOG_MAGIC_PARAM;

????/*?導入默認參數后進行保存?*/
????save_system_log_param();
}


設備開機或者復位都會進行導入系統日志參數操作,恢復日志讀寫參數,參數區為頻繁讀寫操作區域,每一次寫操作都會進行一次偏移,有效的導入參數方法是從參數區結束地址到起始地址進行掃描,掃描不到合法的參數則會導入默認日志參數。

/*?參數初始化,在終端啟動時調用?*/
int?load_system_log_param(void)
{
????uint32_t?i?=?0;
????single_sav_t?psav;
????uint32_t?end_addr;
????uint32_t?interal?=?sizeof(sys_log_param_t);
????int?data_len?=?sizeof(sys_log_param_t)?-?sizeof(single_sav_t);
????uint8_t?*pram?=?(uint8_t?*)&SysLogParam;
????flash_table_t?*flash_tmp?=?get_flash_table(FLASH_SYSLOG_PARA_ZONE);
????
????end_addr?=flash_tmp->end_address?-?(flash_tmp->end_address?-?flash_tmp->start_address)?%?interal;
????for?(i?=?end_addr?-?interal;?i?>?flash_tmp->start_address;?i?-=?interal)?{
????????flash_read(FLASH_SYSLOG_PARA_ZONE,?i,?(uint8_t?*)&psav,?sizeof(single_sav_t));
????????if?((psav.magic?==?SYSTEM_LOG_MAGIC_PARAM)?&&?(psav.len?==data_len))?{???
????????????flash_read(FLASH_SYSLOG_PARA_ZONE,?i?+?sizeof(single_sav_t),?&pram[sizeof(single_sav_t)],?data_len);
????????????if?(psav.crc?!=?CRC16(&pram[sizeof(single_sav_t)],?data_len))?
????????????????continue;
????????????gp_sys_ram->system_log_param_addr?=?i;
????????????log_info("Load?System?Log?Param?Addr[0x%08x]!",?gp_sys_ram->system_log_param_addr);
????????????return?0;
????????}
????}
????
????/*?掃描不到合法的參數,導入默認系統日志參數?*/
????load_system_log_default_param();
????/*?獲取日志寫地址?*/
????gp_sys_ram->system_log_param_addr?=?flash_tmp->start_address;
????log_info("Load?System?Log?Param?Addr(Default)[0x%08x]!",?gp_sys_ram->system_log_param_addr);
????return?1;
}


讀寫系統日志目錄接口,讀寫指定日志索引目錄信息。實際實現會定義最新的目錄信息存儲在日志參數區,當日期發生改變,則表示當前目錄信息已經完結,將最新的目錄信息錄入日志目錄區保存,最多每天寫入一次目錄區。

/*?讀取日志目錄區指定日志索引目錄信息?*/
int?system_catalog_read(system_catalog_t?*catalog,?uint32_t?id)
{
????uint32_t?addr;
????int?rlen?=?sizeof(system_catalog_t);
????uint8_t?*pbuf?=?(uint8_t?*)catalog;
????flash_table_t?*flash_tmp?=?get_flash_table(FLASH_CATALOG_ZONE);

????if?(0?==?id)?
????????return?-1;
????addr?=?flash_tmp->start_address?+?(rlen?*?(id?-?1));
????if?(addr?>?flash_tmp->end_address)?
????????return?-1;
????????
????return?flash_read(FLASH_CATALOG_ZONE,?addr,?pbuf,?rlen);
}

/*?寫日志目錄區目錄信息?*/
int?system_catalog_write(system_catalog_t?*catalog,?uint32_t?id)
{
????uint32_t?start_offset;
????uint32_t?start_addr;
????uint32_t?start_base;
????uint32_t?remainbyte;
????int?wlen?=?sizeof(system_catalog_t);
????uint8_t?*pdata?=?(uint8_t?*)catalog;
????flash_table_t?*flash_tmp?=?get_flash_table(FLASH_CATALOG_ZONE);
????
????if?(0?==?id)?return?-1;
????start_addr?=?flash_tmp->start_address?+?wlen?*?(id?-?1);
????if?((start_addr?+?wlen)?>?flash_tmp->end_address)?{
????????start_addr?=?flash_tmp->start_address;
????}
????
????/*?本扇區剩余空間大小?*/
????remainbyte?=?FLASH_SECTOR_SIZE?-?(start_addr?%?FLASH_SECTOR_SIZE);
????/*?寫入數據長度小于本扇區剩余長度,直接寫入?*/
????if?(remainbyte?>?wlen)?{
????????remainbyte?=?wlen;
????}
????/*?寫目錄次數不會太頻繁,視具體情況改寫操作實現?*/
????while?(1)?{
????????start_base?=?SECTOR_BASE(start_addr);
????????start_offset?=?SECTOR_OFFSET(start_addr);
????????flash_read(FLASH_CATALOG_ZONE,?start_base,?sector_buf,?FLASH_SECTOR_SIZE);
????????flash_erase(FLASH_CATALOG_ZONE,?start_base,?FLASH_BLOCK_4K);
????????memcpy((char?*)§or_buf[start_offset],?pdata,?remainbyte);
????????flash_write(FLASH_CATALOG_ZONE,?start_base,?sector_buf,?FLASH_SECTOR_SIZE);
????????if?(remainbyte?==?wlen)?{
????????????break;
????????}?else?{
????????????pdata?+=?remainbyte;
????????????start_addr?+=?remainbyte;
????????????wlen?-=?remainbyte;
????????????remainbyte?=?(wlen?>?FLASH_SECTOR_SIZE)???FLASH_SECTOR_SIZE?:?wlen;
????????}
????}
????
????return?0;
}


打印系統日志目錄區信息,可實現通過指令查詢到目錄區信息。

int?system_catalog_all_print(void)
{
????int?i?=?0;
????system_catalog_t?catalog;

????printf("System?Log?Command?Information:\r\n");
????printf("Query?Specifies?Log?:?AT+CATALOG=\r\n");
????printf("Query?All?Log?:?AT+CATALOG=<0>\r\n\r\n");
????printf("Query?All?System?Catalog:\r\n");
????printf("LOG_ID??LOG_DATE??LOG_ADDR??LOG_OFFSET?\r\n");
????for?(i?=?0;?i?system_log.catalog_num;?i++)?{
????????/*?當前最新目錄信息?*/??
????????if?(i?==?(gp_sys_log->system_catalog.log_id?-?1))?{
????????????catalog?=?gp_sys_log->system_catalog;?/*?獲取當前最新目錄信息?*/
????????}?else?{
????????????system_catalog_read(&catalog,?i?+?1);
????????}
????????printf("%d??%04d-%02d-%02d??0x%08X??%d?\r\n",?
????????????catalog.log_id,?catalog.log_time.Year,?catalog.log_time.Month,?catalog.log_time.Day,?
????????????catalog.log_addr,?catalog.log_offset);
????????memset((char?*)&catalog,?0,?sizeof(system_catalog_t));
????}
????return?0;
}


讀取指定日志目錄索引信息接口,可指定日志索引或者讀取全部日志數據。

int?system_log_task(int?argc)
{
????int?rlen?=?0;
????uint32_t?offset,?start_addr,?end_addr;
????system_catalog_t?catalog;
????flash_table_t?*flash_tmp?=get_flash_table(FLASH_SYSLOG_ZONE);
????
????if?(0?==?gp_sys_ram->system_log_print_enable)?
????????return?1;

????gp_sys_ram->system_log_print_enable?=?0x00;
????if?(gp_sys_ram->system_log_print_id?==?ALL_LOG_PRINT)?{
????????/*?log回環寫標志,打印整個LOG存儲區?*/
????????if?(0x01?==?gp_sys_log->system_log.log_cyclic_status)?{?
????????????start_addr?=?flash_tmp->start_address;
????????????end_addr?=?flash_tmp->end_address;
????????????offset?=?end_addr?-?start_addr;
????????}?else?{
????????????start_addr?=?flash_tmp->start_address;
????????????end_addr?=?start_addr?+?gp_sys_log->system_log.write_pos;
????????????offset?=?gp_sys_log->system_log.write_pos;
????????}
????}?else?{?/*?讀取指定ID日志?*/
????????if?(gp_sys_ram->system_log_print_id?==?gp_sys_log->system_catalog.log_id)?{
????????????catalog?=?gp_sys_log->system_catalog;
????????}?else?{
????????????system_catalog_read(&catalog,?gp_sys_ram->system_log_print_id);
????????}
????????start_addr?=?catalog.log_addr;
????????offset?=?catalog.log_offset;
????}?

????if?(0?==?offset)
????????return?1;

????while?(1)?{
????????rlen?=?(offset?>?512)???512?:?offset;
????????system_log_read(sector_buf,?start_addr,?rlen);
????????HAL_Delay(80);
????????/*?目錄信息通過調式串口打印?*/
????????bsp_debug_send(sector_buf,?rlen);
????????start_addr?+=?rlen;
????????offset?-=?rlen;
????????if?(0?==?offset)?
????????????break;
????}
????return?0;
}


存儲系統日志接口,實現更新存儲日期,當寫位置為扇區地址,則擦除一個扇區作為存儲日志,這樣避免每寫一次就擦除一次。

int?system_log_write(uint8_t?*wbuf,?int?wlen)
{
????uint32_t?start_addr;
????uint8_t?*pdata?=?wbuf;
????uint32_t?remainbyte;
????int?system_catalog_max_id;
????flash_table_t?*flash_tmp?=get_flash_table(FLASH_SYSLOG_ZONE);
????
????/*?計算目錄區的最大存儲目錄項個數?*/
????system_catalog_max_id?=?((flash_tmp->end_address?-?flash_tmp->start_address)?/?sizeof(system_catalog_t));
????start_addr?=?flash_tmp->start_address?+?gp_sys_log->system_log.write_pos;
????/*?存儲數據地址大于規劃內存地址范圍處理?*/
????if?((start_addr?+?wlen)?>?flash_tmp->end_address)?{?
????????start_addr?=?flash_tmp->start_address;
????????/*?寫位置偏移量重置?*/
????????gp_sys_log->system_log.write_pos?=?0;
????????/*?LOG回環存儲標志置位?*/
????????gp_sys_log->system_log.log_cyclic_status?=?0x01;?
????}
????/*?寫位置偏移?*/
????gp_sys_log->system_log.write_pos?+=?wlen;?

????if?((gp_sys_log->system_log.log_latest_time.Year?!=?gp_sys_log->system_catalog.log_time.Year)?||
????????(gp_sys_log->system_log.log_latest_time.Month?!=?gp_sys_log->system_catalog.log_time.Month)?||
????????(gp_sys_log->system_log.log_latest_time.Day?!=?gp_sys_log->system_catalog.log_time.Day))?{

????????/*?日期改變,記錄目錄信息,當log_id為0,則不寫入?*/
????????system_catalog_write(&gp_sys_log->system_catalog,?gp_sys_log->system_catalog.log_id);
????????/*?記錄存儲日期?*/
????????gp_sys_log->system_catalog.log_time?=?gp_sys_log->system_log.log_latest_time;
????????
????????if?((gp_sys_log->system_catalog.log_id?+?1)?>=?system_catalog_max_id)?{
????????????gp_sys_log->system_log.catalog_num?=?system_catalog_max_id;?/*?目錄循環寫,目錄數應為最大?*/
????????????gp_sys_log->system_log.catalog_cyclic_status?=?1;?/*?目錄回環寫標志?*/
????????}?else?{
????????????if?(0?==?gp_sys_log->system_log.catalog_cyclic_status)?{
????????????????/*?獲取目錄數?*/
????????????????gp_sys_log->system_log.catalog_num?=?gp_sys_log->system_catalog.log_id?+?1;?
????????????}
????????}
????????
????????/*?存儲最新目錄項信息?*/
????????gp_sys_log->system_catalog.log_id?=?(gp_sys_log->system_catalog.log_id?+?1)?%?system_catalog_max_id;
????????gp_sys_log->system_catalog.log_addr?=?start_addr;
????????gp_sys_log->system_catalog.log_offset?=?wlen;?
????}?else?{
????????gp_sys_log->system_catalog.log_offset?+=?wlen;?
????}
????
????/*?寫位置為存儲起始地址并且不為扇區首地址?*/
????if?((flash_tmp->start_address?==?start_addr)?&&?(SECTOR_OFFSET(flash_tmp->start_address))){
????????flash_read(FLASH_SYSLOG_ZONE,?SECTOR_BASE(start_addr),?sector_buf,?FLASH_SECTOR_SIZE);
????????flash_erase(FLASH_SYSLOG_ZONE,?SECTOR_BASE(start_addr),?FLASH_BLOCK_4K);
????????/*?將扇區頭部至起始地址區間的數據回寫?*/
????????flash_write(FLASH_SYSLOG_ZONE,?SECTOR_BASE(start_addr),?§or_buf[0],?SECTOR_OFFSET(start_addr));?
????}
????/*?寫位置為扇區首地址,則擦除一個扇區的存儲區????*/
????if?(0?==?SECTOR_OFFSET(start_addr))?{
????????flash_erase(FLASH_SYSLOG_ZONE,?SECTOR_BASE(start_addr),?FLASH_BLOCK_4K);
????}

????/*?本扇區剩余空間大小?*/
????remainbyte?=?FLASH_SECTOR_SIZE?-?(start_addr?%?FLASH_SECTOR_SIZE);
????/*?寫入數據長度小于本扇區剩余長度,直接寫入?*/
????if?(remainbyte?>?wlen)?{
????????remainbyte?=?wlen;
????}
????while?(1)?{
????????flash_write(FLASH_SYSLOG_ZONE,?start_addr,?pdata,?remainbyte);
????????if?(remainbyte?==?wlen)?{
????????????break;
????????}?else?{
????????????pdata?+=?remainbyte;
????????????start_addr?+=?remainbyte;
????????????wlen?-=?remainbyte;
????????????remainbyte?=?(wlen?>?FLASH_SECTOR_SIZE)???FLASH_SECTOR_SIZE?:?wlen;
????????????/*?扇區首地址則擦除整個扇區,該扇區數據不保存?*/
????????????if?(0?==?SECTOR_OFFSET(start_addr))?{
????????????????flash_erase(FLASH_SYSLOG_ZONE,?SECTOR_BASE(start_addr),?FLASH_BLOCK_4K);
????????????}
????????}
????}

????/*?環形存儲參數?*/
????save_system_log_param();
????return?0;
}
?
系統調試對接

為了更好記錄系統日志,將應用調試等級結合一塊,實現記錄錯誤調試信息以及需要保存的關鍵信息。定義的調試等級有:關閉調試等級、錯誤調試等級、警告調試等級、關鍵調試等級、debug調試等級,而LOG_RECORD_LEVEL將主動保存日志并輸出信息,LOG_ERROR_LEVEL會存儲對應的日志信息,但需要根據應用調試等級輸出信息。設置與讀取應用調試等級由讀者自行定義。
#define?LOG_CLOSE_LEVEL????0x00?/*?關閉調試信息?*/
#define?LOG_ERROR_LEVEL????0x01?/*?錯誤調試信息?*/
#define?LOG_WARN_LEVEL????0x02?/*?警告調試信息?*/
#define?LOG_INFO_LEVEL????0x03?/*?關鍵調試信息?*/
#define?LOG_DEBUG_LEVEL????0x04?/*?debug調試信息?*/
#define?LOG_RECORD_LEVEL???0x10?/*?保存日志并輸出信息?*/?
#define?LOG_PRINT_LEVEL????0xff

#define?SET_LOG_LEVEL(LEVEL)??(gp_sys_param->system_print_level?=?LEVEL)
#define?GET_LOG_LEVEL()????(gp_sys_param->system_print_level)

#define?log_debug(fmt,?args...)??log_format(LOG_DEBUG_LEVEL,?fmt,?##args)
#define?log_info(fmt,?args...)??log_format(LOG_INFO_LEVEL,?fmt,?##args)
#define?log_warn(fmt,?args...)??log_format(LOG_WARN_LEVEL,?fmt,?##args)
#define?log_error(fmt,?args...)??log_format(LOG_ERROR_LEVEL,?fmt,?##args)
#define?log_record(fmt,?args...)?log_format(LOG_RECORD_LEVEL,?fmt,?##args)
#define?printf(fmt,?args...)??log_format(LOG_PRINT_LEVEL,?fmt,?##args)

typedef?struct?{
????int?level;
????char?*fmt_str;
}system_print_fmt_t;

system_print_fmt_t?system_print_fmt_list[]?=?{
????{?.level?=?LOG_ERROR_LEVEL,???.fmt_str?=?":"},
????{?.level?=?LOG_WARN_LEVEL,????.fmt_str?=?":"},
????{?.level?=?LOG_INFO_LEVEL,????.fmt_str?=?":"},
????{?.level?=?LOG_DEBUG_LEVEL,???.fmt_str?=?":"},
????{?.level?=?LOG_RECORD_LEVEL,??.fmt_str?=?":"},
};

int?log_format(uint8_t?level,?const?char?*fmt,?...)
{
????#define?TIME_PREFIX_SIZE?(21)
????#define?PRINT_MAX_SIZE??(1024?+?TIME_PREFIX_SIZE)
????
????va_list?args;
????int?num?=?0,?i?=?0,?fmt_index?=?0;
????int?fmt_str_len?=?0,?ret?=?-1;
????int?file_str_len?=?0,?line_str_len?=?0;
????char?line_buf[20]?=?{0};
????static?char?buf[PRINT_MAX_SIZE];
????static?QueueHandle_t?sem?=?NULL;
????time_t?time?=?{0};
????
????/*?針對os系統?*/
????if?(NULL?==?sem)?{
??????????sem?=?xSemaphoreCreateCounting(1,?1);?/*?always?think?of?success?*/
????}
????
????xSemaphoreTake(sem,?portMAX_DELAY);

????ret?=?-1;
????fmt_str_len?=?0;
????if?(level?!=?LOG_PRINT_LEVEL)?{
????????if?((GET_LOG_LEVEL()?????????????goto?exit_end;

????????for?(i?=?0;?i?????????????if?(level?==?system_print_fmt_list[i].level)?{
????????????????fmt_index?=?i;
????????????????break;
????????????}
????????}
????????if?(i?>?SYSTEM_PRINT_FMT_LIST_MAX)?{
????????????goto?exit_end;
????????}

????????fmt_str_len?=?strlen(system_print_fmt_list[fmt_index].fmt_str);
????????strncpy((char?*)&buf[TIME_PREFIX_SIZE],?system_print_fmt_list[fmt_index].fmt_str,?fmt_str_len);
????}

????va_start(args,?fmt);
????num?=?vsnprintf((char?*)&buf[fmt_str_len?+?TIME_PREFIX_SIZE],?PRINT_MAX_SIZE?-?fmt_str_len?-?TIME_PREFIX_SIZE?-?2,?fmt,?args);
????va_end(args);

????if?(num?<=?0)?{
????????goto?exit_end;
????}

????if?(level?!=?LOG_PRINT_LEVEL)?{
????????num?+=?fmt_str_len;
????????buf[num?+?TIME_PREFIX_SIZE]?=?'\r';
????????buf[num?+?TIME_PREFIX_SIZE?+?1]?=?'\n';
????????num?+=?2;
????}

????if?((GET_LOG_LEVEL()?????????//do?nothing
????}?else?{
????????ret?=?bsp_debug_send((uint8_t*)&buf[TIME_PREFIX_SIZE],?num);?
????}

????if?((LOG_ERROR_LEVEL?==?level)?||?(LOG_RECORD_LEVEL?==?level))?{
????????bsp_rtc_get_time(&time);
????????sprintf(&buf[0],?"[%04d-%02d-%02d?%02d:%02d:%02d",
????????????time.Year,?time.Month,?time.Day,time.Hour,?time.Minute,?time.Second);
????????buf[TIME_PREFIX_SIZE?-?1]?=?']';
????????gp_sys_log->system_log.log_latest_time?=?time;
????????system_log_write((uint8_t?*)buf,?num?+?TIME_PREFIX_SIZE);
????}?

exit_end:
????xSemaphoreGive(sem);
????return?ret;
}

?

結語

本文提供的一種簡易嵌入式設備系統日志記錄方法,代碼量不多,實現簡單,針對不同的設備需要合理規劃內存使用,根據軟件運行狀態,合適加入調試信息并保存對應的日志信息,方便開發人員了解系統或軟件運行狀況,協助開發分析數據資源從而更好完善系統,提高定位以及解決問題的效果。


原文:http://t.csdn.cn/gFDSG

本文系網絡轉載,版權歸原作者所有,如有侵權,請聯系刪除。





往期推薦

華為一名19級專家離職時留下的7000字|肺腑真言,令人深思!

一個單片機驅動 LCD 的編程思路

校招進大疆了!

如何一步一步成為一個技術領域專家

混說Linux 百度研發工程師,分享Linux干貨,和大家一起學習!
評論
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 501瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128642瀏覽
  • 文:杜杰編輯:侯煜當地時間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設備——境外生產的先進機器人設備、境外生產的聯網電力逆變器。FCC在官方情況說明書中明確,該類境外制造產品,“會對美國國家安全或美國民眾的人身安全構成無法承受的風險”。本次新規設置明確豁免機制:經美國國防部(DoW)、電力逆變器品類經美國國土安全部(DHS)審核并授予“有條件批準”,認定對應設備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 325瀏覽
  • 產品使用18V供電,配套4串鋰離子電池,需要設計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關型的充電控制芯片不穩定。嘗試自行設計一個。整體采用分立三極管 + TL431架構,分4個功能單元:使能控制回路、限流環路、TL431 精密恒壓反饋環路、PNP 功率管主功率輸出回路;實現完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經 R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導通,對地拉低 R1、R2 組成的分壓控制節點電位;該節點直
    southcreek 2026-08-07 13:45 316瀏覽
  • 在前六期中,我們已經分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務、風險評估與技術文檔證據鏈、第三方組件與 SBOM 供應鏈治理,以及產品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業已經能夠回答幾個核心問題:產品是否落入 CRA 適用范圍,產品由哪些組件構成,企業如何證明自己在設計、開發和上市前采取了必要的安全措施,以及產品上市后如何持續維護和安全下線。但對于真正準備落地 CRA 合規的企業來說,還有一個更現實的問題:CRA 的法規條文相對原則化,企業應當如何把“網絡安
    虹科云科技 2026-08-03 16:51 151089瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌?;赝^去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及??扇缃?,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128872瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網和狀態上報。三件事拆開,早先的常規做法是音頻藍牙一顆料、數傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創知音語音芯片 2026-08-06 15:14 284瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 102190瀏覽
  • 導語在現代高速數字電路設計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關鍵屏障,其核心挑戰在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態脈沖干擾,這類干擾持續極短,卻足以在高速鏈路中引發誤觸發。然而,傳統函數發生器受限于采樣率與邊沿速率,根本無法忠實復現如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 在物聯網從“萬物互聯”邁向“萬物智聯”的進程中,LTE Cat.1憑借其在速率、成本與網絡覆蓋之間的完美平衡,正成為中低速物聯網市場的絕對主力。隨著2G/3G網絡的逐步退網以及新國標對終端設備智能化、定位功能的強制要求,Cat.1模組迎來了爆發式的增長窗口。在這一關鍵節點,基于華為海思Hi2131芯片設計的LTE Cat.1模組,憑借其在能效、射頻、架構及物理規格上的底層創新,成功打破了“高性能必高功耗”的傳統魔咒,為行業提供了極具競爭力的連接最優解。核心技術優勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 169瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩定起振的成品,要經過十幾道精密工序。它內部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產過程里哪怕0.1微米的誤差,都會直接廢掉整批產品,這也是小尺寸晶振過去長期依賴進口,國內廠商花了十幾年才啃下量產硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 377瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 精灵梦叶罗丽第四季| 给你我的独家宠爱电视剧在线观看| 木府风云电视剧| 缺宅男女大结局| 空乘2023法版在线观看| 摩登时代免费| 军棋玩法| 爱我几何电影完整版在线播放免费观看莫尼卡影院 | 二阶堂梦作品在线观看| 躁动的荷尔蒙2| 我怀了你的孩子电视剧免费观看| 替夫还债电影| 美食的俘虏141| 来自地狱下载| 精绝古城免费观看| 大清盐商剧情介绍| 插曲的痛中文| 汉宫clan| 视频电影在线观看免费观看完整版| 利刃出鞘3电影| 沙漠行动2007俄罗斯满天星| 公主嫁到剧情介绍| 锦绣未央超长片花| 火云传奇| 希望爸爸播种| 七夜雪电视剧免费观看完整版| 我们高清在线观看免费观看| 秘密花园2.9.7最新版本更新时间| 德国炸毁最现代化电厂| 漂浪青春插曲| 斗鱼静宝宝| 满天星护士学校在线看| 隔壁邻居很美味电视剧在线观看免费高清| 花样年华电影未删减完整版| 大熊和熊二全集免费观看| 商务旅行中戴绿色帽子的女老板同行台词 | 女人是男人的未来免费观看| 盗墓笔记12集| 黄色仓库在线电影| 外出免费观看| 疯狂动物城完整版中文| 渣男的本愿真人版| 斗罗大陆免费完整观看207| 电影《千金女神》郝板丽| 艾跃进三个不解之谜| 我的离开也是爱 歌词| 秀婷程仪公欲息肉婷在线观看| 南京将军山碎尸案| 憨豆特工1| 《销售秘密》3| 大叔爱上小姑娘韩剧| 好雨时节吻戏| 新加坡战争2011很差导演:彭禺厶主演:金九拉 金利娜 李硕薰 GREE简介:主角Sara | 战狼7高清版999加拿大版 | 蓝色忧郁论坛| 家族荣誉5| 一个好妈妈9字头强华驿演员表| 动漫烟花| 余罪电视剧第二季| 酒店强奸电影| 你是我的荣耀免费观看完整版西瓜| 大话西游之大圣娶亲 电影| 公车乱欲| 极乐宝鉴电影免费观看在线播放中文| 落魄贵族琉璃川1-2集在线播放| 情罪男声撕心裂肺完整版| 电影《珍妮弗》完整版| 法国空姐2019观看完整免费高清原声满天星 | 卖房子的女销售员在线 | 魔弹战记| 《女子护卫队》完整版| 电锯人第一季在线观看完整版高清| 陆贞传奇百度影音| 朴妮唛28部电视剧在线观看| 那小子真帅电影国语版| 一虎一席谈 孔庆东| 法国高压监狱伦理片| 阿浅来了电视剧免费观看| 美国儿子要妈妈播种电视剧的电影在线观看 | 西游记新版动画片| 《兄弟换麦子4国语中语》| 丈夫的陷阱| 你好星期六策驰影院| 火口的二人完整版在线观看电影| 方块大背头| 年轻的母亲10观有限中字| 中国式离婚 电视剧| 占狼六| 强奸女护士| 仓井空电影网| 荣誉守则成人在线观看| 笑傲江湖更新| 不当军事行为 (2017)| 武庚纪 动漫| 完全婚姻手册| 傻瓜猫全集| 未来的儿子全集观看| 《惊变28年》| 荷尔蒙少女3高清完整版| 地牢围攻2电影| 战神3中文版下载| 终极对决电影| 英国空姐在线观看完整免费高清原声满天星奔跑吧ep | 租个女友回家过年12| 吉泽眀步犯美人女教师| 《夫妻快乐宝典》完整| 新倾国倾城免费版完整版| 精英部队| 电视剧锦衣之下全集在线观看免费| 猎毒人全集| 甜蜜家园在线观看完整版| 高清《狂飙2》《兰飙》| 再来一次在线观看完整视频| 现代情欲篇之换妻档案| 戴拿奥特曼在线观看| 秘密的爱| 舔B拨弄深入抽插上司| 产科男医生电视剧32| 龙与虎下载| 韩剧妈妈爱上儿子同学剧情| 小碗干炸| 邻居的老婆在线| 年轻漂亮的邻居瘦子4| 《东京出租车》| 看了又看第三部| 加勒比女海盗完整版| 绝密543电视剧| 非洲和尚| 武乡县| 大明风华多少集| 妻子的新世界免费看电视剧| 千金奴隶在线观看免费版电视剧| 《蜜桃成熟时2》| 破地狱粤语| 神雕侠侣电影| 战狼6免费播放网站| 与僧侣交合| 上错花轿嫁对郎电视剧全集观看 | 我和姪女小婷上下耸动| 韩国小电影男子获得遥控器控制女领导 | 儿童动画片猫和老鼠| 张帝问答演唱会| 江南1970| 《租借女友》第一季| 马志明相声下载| 沙漠行动满天星版| 甄嬛传63集剧情| 朝国年经继10免费版播放| 机器人危机| 无忧公主| 美国禁忌5睫毛膏高清版 | 男女愁愁愁免费观看电视剧| 京华烟云| 《黛比达拉斯》1978| 《部长出差的日子》在哪里看| 一又二分之一的夏天| 牙医姐妹完整版观看| 地狱乐动画在线观看| 大石桥市| 电视连续剧剑谍| 广东省| 友人母在线播放BD高清| 新金银悔5普通话版免费观看| 下南洋三毛钱看| 《可疑诊疗室:特殊待遇》中文版 电影《香醇的绣感》男主吴绮珊 欧式少女第16集全集高清版观看网站 | 女佣变凤凰| 火之迷恋在线观看免费观看| 澡堂老板家的男人们全集| 你给我的喜欢电视剧免费| 杰克·布莱克| 我为爱狂意大利版| 农民伯伯下乡记| 曲剧清风亭全场| 爆操老妈48集| 擦枪走火电影完整版| 日本电影出轨维修工| 宇宙的奇迹| 嘎啦电影节| 忘羡第一次草地完整版| 高清《他是谁》电视剧| 仁医11| 炉火纯青是什么工艺| 《千金赤子板栗》完整版| 亲爱的在线观看| 《总统夫人》星克莱尔观看| 小鸡快跑中文版| 锦月如歌电视剧36集全| 老公怎么弄你们的| 大长今之尚宫天下| 黑土无言在线电视剧免费观看| 我的母亲2| 《高级特工满天星》| 僵尸电影国语高清| 偶然与想象| 范冰冰 电影| 打工仔的梦想房sp| 金刚葫芦娃动漫| 电视剧一起来看流星雨| 绿色椅子在线| 中国新说唱第三季| 迷离时空免费观看| 踏血寻梅电影| 人脉王韩剧在线观看星辰| 花与罪电影在线观看免费高清完整版| 我独自升级第二季在线免费观看 | 星克莱尔的《第一夫人》| 乔家大院全集| 白峰电影高清在线观看| 贤妻良母| 《私人航空》在线观看免费| 3d肉铺团在线播放| 酒店1-75集免费全集| 土豆粉培训| 孤男寡女免费观看电视剧战狼43集 | 韩剧 2014| 今夜无眠电影在线观看完整版免费| 中华警花| 巜交换上司的秘书3中字| 铁憨憨全部视频| 我的xl司令第2季无马赛免费播放全集| 西域男孩mylove| 家庭分歧麦乐迪| 伦理厨房的岳 BD神马在线观看 | 贞观之治电视剧全集免费观看| 酒店1-90集免费观看中文| 差一分的美味电视剧免费播放| 商务旅行戴绿色帽子电影迅雷在线观 | 泰剧是你| 一起愁愁愁在线观看免费版| 强奸女护士| 凯里市| 属猪2024年有大喜缠身| 妈妈的男朋友5集理论| 特警屠龙| tube8| 一吻定情动画版| 泰国版还珠格格| 大开眼界剧情深度解析| 以家人之名电视剧免费观看| 《巨茎挺进李淑芬的体内视频》高清| 《借种》电影| 三年中国中文高清免费观看 | 芈月传电视剧免费观看全集 | 满清十大酷刑完整片| 关中往事30集连续剧免费播放| 玫瑰故事电视剧免费视频| 电视剧爱了散了| 拉娜罗迪斯满天星免费观看| 义母的吐息1在线动漫| 丈夫出差的三天,被讨厌的| 名侦探柯南728| 男神爱上:暗恋成真全集免费| 《特殊的治疗》中字| 情事2014| 仙逆第122集在线观看| 泰版浪漫满屋12| 《爱我几何》正版美国| 南海归墟16集在线播放免费| 免费动画电影| 邓家佳除却巫山无删减版 | 《不良一族寻爱记》未删减| 白峰在线免费观看| 霍元甲全集| 十一人的贼军免费观看高清| 风味人间第五季全集免费观看| 大宾的寝室免费在线观看 | 扬思敏1一5集国语版免费| 罪恶都市4| 杨思敏电影| 木下柚花| 新版娃娃脸9在线观看| 梅花三弄水云间| 年轻的小姨子在线观看完整版| 大独裁者电影| www. ddd| 小宝闯情关| 危险关系未删减版电影完整版| 国风按摩院1-5季电视剧免费观看| 闺蜜爱人| 终极对决电影| 罗曼史在线观看| 善良的妈妈中字开头9个字是什么 沙漠行动2满天星版2023最新版本介绍 | 日本修理工的艳遇| 刀剑神域爱丽丝篇异界战争| 博尔特200米赛会纪录被破| 圣特洛佩斯的姑娘们在线观看| 贞观之治所有演员表| 铜陵华谊兄弟| 世界第一的初恋第二季| 在线看连续剧| 太阳的后裔 迅雷下载| 鬼灭之刃第五季无限城篇免费观看| 堂梦电影| 许我耀眼16集| 只是结婚的关系免费观看| 壮志凌云满天星女版在线| 沉睡花园一共多少集| 中华英雄电影免费国语在线观看 | 赌博默示录国语版| 公之浮之中字| 韩剧天使的诱惑| 垂涎台剧全集免费播放| 插曲的痛在线观看免费播放电影| 柳云龙风筝电视剧全集| 我要成名在线观看| 梁家辉情人完整版| 水电修理工艳遇电影| 胸前的大兔子蹦了出来作文| 最终幻想15王者之剑| 安姨《房屋售楼员》| 三年电影在线手机免费看| 扫黑风暴全集观看| 义子的侵犯电影| 电影猩猩王| 《肉奴赤坂丽》未删减| 死心的理由| 胜者为王张智霖| 冷案第二部免费观看| 功夫熊猫电视剧| 缘之空2| 《玛丽!玛丽!》满天星中文 | 别墅ova无修版国语版| 戴手铐脚镣的美女| 建党大业| 华晨宇打响内娱反黄牛第一枪 | 青春荷尔蒙电影2| 村上沙的兽皇四全部演员表介绍图片 | 黑白人生电视剧| 潘多拉之镜| 电影善良的妻子| 大男当婚 优酷| 人体蜈蚣2彩色| 黄色仓库电影在线免费观看| 温柔的谎言片尾曲| 韩国电影雏妓| 兄弟换麦子4中字版演员表| 电影《越南女兵》免费观看| 乌云之上免费播放在线观看| 王力宏有什么歌好听| 哇嘎嘎在线观看完整版免费| 虎胆女儿红电影| 《哪吒2:魔童闹海》完整版| 特殊飞行| 三大队电影免费| 女搜查官| 无可奈何| 《丈夫离开的日子》观看| 《修理工的艳遇》接丈夫电话还在做爱 | 逃狱犯入室暴行电影免费观看| 免费保姆| 红唇原唱完整版| 检察官白峰美羽复仇的电影观看| 女扮男装闯江湖短剧全集| 韩版《甄嬛传》| 黎明前的抉择免费观看| 《满天星》陈宝莲免费观看| 邝美云大悲咒歌词| 浪漫偶像第三季| 万花开遍不及你归来短剧大结局| 女版黑鹰坠落| 月上柳梢头的下一句是| 将错就错电影完整版| 小唐横情史| 咱们结婚吧全集| 精油按摩电影在线观看| 证言未删减| 记得我电影完整版| 大明风华电视剧| 丰满的岳和女胥HD| 蝴蝶梦越剧| 终极斗士3在线观看完整版免费| 八戒八戒七| 你是我的荣耀在线观看完整版免费| 中科院院士:长新冠是基本事实| 徐锦江大内密探| 黑白配国语版在线看| 君九龄电视剧| 布里奇顿 第四季全集观看| 手机在线观看高清完整版电影| 《机械师6》电影在线看| 《克里斯蒂的秘密》电影在线观看 | 和讨厌的部长一起去出差| 女儿的朋友2韩国电影| 恋空电影版| 星辰大海电视剧| 拿下丈夫的下属| 失笑电视剧沈月在线观看| 伊丽莎白·坎贝奇《无憾》播放| 小丑1电影| 美丽高解像粤语全集| 恋爱先生电视剧免费观看网站| 法国空乘5免费在线观看| 人生切割术电视剧| 一只狗的使命| 黑日危机完整版在线| 《《女警坠落2》完整版》中文字幕高清完整版免费在线观看-光影影视 | 精装追女仔2004国语| 猎狼连线| 今生有你电视剧在哪里可以看| 农场保卫战1| 女扮男装当校草全集免费| 锦鲤少女:旺夫旺家旺全族全集免费| 王贵与安娜| 《娃娃脸》MV| 十二生肖电视剧| 京东2019全年财报| 梦魇绝镇第二季在线观看| 荣誉代码满天星在线观看| 年轻的母亲3完整版| 怡红院在线 视频免费| 《龙之战》电影美国在线看| 特殊的美容美发师| 龙梅子mv| 文豪野犬第五季在线观看| 国模思思| 美容院:特珠待遇4| 余烬之上电视剧观看| 何需杀人灭口打一字| 《水润女人》刘志贤演| 韩国式家庭禁忌结局-3| 家庭计划免费观看完整版电影| 珠海35人死亡事故原因| 水手服饲养1小时42分原版视频| 十万人出头天| 小炸jackson| 白丝学生羞涩被弄喘不停视频| 村妓2电影完整版| 新水浒传高清| 爱我几何电影在线观看免费莫尼卡 | 非诚勿扰20120407| 法国电影私人航空在线观看| 迷离时空免费观看| 《回响》电视剧| 翁虹任达华| 六月的日记| 美国版荷尔蒙6观看| 神雕侠侣全集| 暮光之城4破晓下完整版| 伪装者电视剧全集免费观看| 我女友的妈妈韩国| 终极一班3完整版| 斗罗大陆198免费完整观看| 叛逆者1-42集完整| 大湾仔的夜第二季在线观看| 龙虾店老板深夜崩溃把店砸了| 末代御医粤语| 西班牙电影《体检》在线观看| 叶玉卿卿本佳人| 肢体的绣感在线看完整版免费观看 | 大学生按摩推油3| 学警狙击粤语| 黑白禁区在线观看| 私人助理2法国版免费观看| 《特殊游泳课》波多野结衣| 卧龙6驴友收罚单| 两个妈妈韩剧电视剧免费观看全集| 战狼8高清免999| 大兵的寝室电影在线免费观看 | 高智能方程式国语| 周生如故全集免费观看| 电视剧嫦娥| 维修工的艳遇4| 天降之物14集| 第三只眼| 好看的短剧推荐几部 前十名| 《公的浮之手中字》免费在线观看| 入青云免费观看全集完整版| 女儿不认真学习被妈妈拖进大海| 善良的嫂嫂2| 麦乐迪马斯克女超人在线高清免费观看| 风吹过的街道| 电影《魔女3》超清在线观看| 侠客行不通免费观看| 妻子的陷阱大结局| 新闻女王电视剧粤语在线观看| 奇妙的朋友 综艺| 《太平年》免费观看| 下属的妻子去社长家吃饭在线 | 酒醉的探戈动力火车| 法国空乘10| 主妇的战争电视剧免费观看全集| 电影《恋爱之瘾》免费观看| 斯诺登电影| 黑白配美国版在线播放| 女人的抉择全集百度影音| 奔跑吧兄弟4| 怒剑狂花| 凌云壮志(欧美)满天星法国版云盘| 高清《法利赛人》在线观看播放| 珍娜詹森| 请好好疼爱第8集免费播放| 办公室糟蹋秘书在线观看| 天地无伦在线观看视频| 《汤摇庄的幽奈同学》| 女超人麦乐迪 在线| 一不小心爱上你歌曲| 《特殊飞行》电影| 限制级贴身高手| 渔夫荒野史1987台湾| 电视剧蝶影全集免费观看下载| 《搜索》| 我老公的家庭教师在线观看| 爱唯侦察9集免费观看| 《伦敦牛郎》在线观看| 多大点事免费观看全集| 关于史蒂夫的一切| 歼灭天际线1-112集免费| 洪兴大飞哥| 洪熙官 甄子丹| 飞翔吧 战机少女| 女员工5的付出中字| 电影《需要爸爸播种美国》| 女人的抉择在线观看| 男女一起愁愁愁免费全集| 特种兵火凤凰| 鬼马保镖贼美人| 鸿雁简谱| 八尺夫人满天星版英文版观看 | 猎毒人电视剧全集免费观看完整版| 超人归来国语| 按摩3一4| 新上海滩国语| 广东碧桂园学校| 五十度灰在线观看如如影视| 禁忌2,4年转一代禁忌| 死神来了8免费高清播放下载| 风间由美女上司| 猎狼者 电视剧| 邯郸县| 电影伊波拉病毒完整版在线观看| 龙狱天棺电影免费观看| 法证先锋5电视剧全集在线观看| 盒装美人| 周弘| 维多利亚一号电影| 算计七天的死亡游戏| 名侦探学院第八季| 19岁大学真人免费播放电视剧| 爱情公寓3 19集| 王者好气啊| 烈火军校电视剧免费播放全集| 迷雾电影在线观看免费完整版全集 | 致命弯道4高清全集| 爱我几何无删减版在线观看| 你给我的喜欢电视剧免费观看全集| 凯·帕克《家庭聚会》| 赘婿电视剧| 安新县| 某小说家的日记未删减| 女王之剑| 丰满的继牳3小早川怜子-高清完整无删| 校长称邯郸男孩的死亡是个意外| 《酒醉的玫瑰》免费观看| 内蒙古高考状元| 妈妈的职业5完整版结局在线看免费| 杀杀人跳跳舞| 追踪者第二季电视剧| 《裸乳按摩》在线免费观看| 窈窕淑女免费观看完整版| 杀生在线观看| 村里有个姑娘叫小芳| xl司令全集免费观看完整版| 《法国空乘4》在线观看外国色情电影| 法国版《灭火宝贝》中文翻译| 星际之门亚特兰蒂斯第五季 | 母亲肖复兴| 公的浮之手中字电影完整版| 年轻母亲在线免费观看| 电视剧当婆婆遇到妈妈免费观看| 离婚前规则 主题曲| 惊天大劫案电视剧全集在线观看| 渔夫的荒野史记高清海报| 末日村庄电影| 埃洛伊塞| 黑日危机完整版在线| 《旷野之物》朴智炫观看什么时候上| 护士交换粗吟配乱大交| 樱花动漫免费观看完整版| 一只跳蚤的自传1976年版| 客服| 男和女一起愁愁愁电视剧在线观看| 出租车3| 爱情公寓盗墓笔记| 大染房电视免费观看| 村姑2| 公主恋人ova| 五亿探长雷洛传1粤语版免费观看| 一元一串的钵钵鸡是什么梗| 拍的不错| 动感之星小玲108集全集免费| 超级肥妻| 麻辣隔壁电视剧| 挑战象棋残局被骗| 高压监狱完整免费高清原声奔跑吧| 女房东的秘密电视剧| 海陆丰虎狮| 漂亮的保姆7免费播放| 龙帅都市归来:再掀风云短剧全集| 漂亮的廋子3| 我唾弃你的坟墓在线| 大宋少年志2免费完整版| 小时代在线观看| 拆弹专家 粤语| 天海翼香汗女教师在线播放-手机高清免费国语メイリン モデルコレクション-SL2 | 插曲的痛30集全集免费观看第二季 | 天狼星行动电视剧全集40集 | 阿宾游记| 私人教练1982年美国帕克| 三八大案| 玉浦团电影在线观看| 电影《需要爸爸播种美国》电影完整| 医妃不好惹短剧全集| 像乔丹一样打球| 墨西哥剧千金和保镖真爱| 神奇公司在哪里综艺免费观看| 潜伏29| 怪物转生在线观看| 按摩男技师电影| 完美状妈| 评书三国演义袁阔成播讲365集| 超凡的诺曼| 侵犯高傲美丽的女教师| 激战丛林电影完整版在线播放| 杨丽花歌仔戏王伯东| 恐怖旅馆 电影| 无染电视剧| 泰罗 奥特曼| 《一对二》姜汉娜出场时| 夏奇拉mv| 落花时节又逢君电视剧全集观看| 从你的指尖传出的热情| 成版《古墓丽影》| 伦理片女律师的坠落免费观看| 功夫熊猫3中英双字幕| 高清《纵情欲海》1无删减 | 爱 死亡和机器人| 女人生小孩全过程| 美国娃娃脸4(经典版)在线观看| 太子妃武:武林高手完整版观看| 我的中国心 伴奏| 西游记之孙悟空三打白骨精下载| 仁显王后的男人预告片 | 翻来覆去1v2漓巫| 夏目彩春57部在线电影| 巴以冲突历史根源简述| 白峰电影在线播放免费版最新章节| 苍老师电视剧36集全免费播放| 《课后辅导女教师》电视剧动漫| 刘亦菲晒38岁生日照| 恋爱超男女| 卖房子的女销售电影| 爱丫爱丫影院最新电视剧免费观看| 英语老师在线观看| 美版假面骑士龙骑 | 兄弟的妈妈双字ID怎么设置| 《部长出差的日子木鱼》中文字幕无删减在线观看_努努影院 | 女超人麦乐迪迅雷下载| 传说中的七公主国语版全集| 湄公河大案全集在线观看| 大洼县| 男生女生一起相愁愁愁电视剧在线观观 | 《我的健身锻炼2》| 请回答1997电视剧| 刺客伍六七第5季免费观看| 《僵尸叔叔》国语版免费观看| 一个完美结局电影完整版在线观看 | 夏目友人帐 第一季| 爱欲狂潮| 法国空姐3在线看| 命定之爱电视剧| 老鲁夜夜老鲁| 卢旺达玫瑰原版免费观看| 奥特曼大电影中文版| 奇怪的理发店在线播放| 学警雄心国语| 房奴试爱《高潮》4观看| 冰冷少帅荒唐妻全文免费阅读| 边缘行者在线观看高清完整版| 《西部通缉令》1986在线观看 | 香港奇案| 一起愁愁愁全集免费观看方法 | 台剧《亲密之海》在线播放| 电影风声未删减版在哪里可以看 | 报告老板之豪言壮旅6| 特殊游泳教练电视剧免费观看| 落翅女的黄昏| 你是我爱人电视剧全集| 天海翼护士在线| 安妮特海雯电影无删减版| 善良的嫂子2韩国| 需要爸爸的种子播种电影| 毒舌律师 电影| 东北往事之黑道风云二十年电视剧| 《和部长出差的日子》免费看| 《卿卿我心》电视剧免费观看| 《倔强的驱魔师》1-4集| 釜山行2在线观看完整版免费| 桃花在线| 美剧家庭禁忌3| 2对1:三人一次性体检韩国伦理| 田纳西ARI和JAY| overflew真人高清免费看| 转世传说| 摧花狂魔小说完整版| 巜人妻初次按摩2在线免费观看| 梦想天空分外蓝 陈奕迅| 豹在线观看| 红龙电影| 1PPD%82女友巨乳姐内电影 | 朋友的妻子2| 毛东东现任职务简历| 公之浮之中字| 六一儿童节布置作业犯法吗| 东北富婆25分钟对白| 法国版《办公室》角色分析| 演员赵立新现状| 幻影丹尼| 双人调情按摩| 红颜知己短剧免费观看| 婴儿独自爬出客厅猫咪警觉守护| 高冷搜查官白峰美羽遇上猪队友| 朴妮唛迅雷种子| 黑暗阴影在线观看| 站着再来一次26集全在线观看| 我的家庭女教师| 朋友的妈妈2在完整有限中字第5| 美乃雀| 情深深雨蒙蒙48集全集免费看| 决战丛林| 《壮志凌云》凯登.克劳丝 | 银魂200| 禁室培欲电影| 特殊交易| 最美的安排电视剧| 高清《外出》免费观看完整| 插曲的痛60集全免费观看百度云资源| 扫黑风暴 720P 下载| 现世因果教育| 禁止的爱未删减版在线观看下载| 继女要用爸爸的种子| 电影我的错误免费观看完整版| 巴萨0-4皇马| 男女在一起愁愁愁在线观看| 代号花木兰在线观看| 蜜桃成熟2全集高清| 成人哇嘎视频| 信仰电视剧在线观看全集免费| 闪婚大佬后免费全集在线观看| 少女6少女大人演员表高清版| 《亮剑》电影| 震撼性丑闻| 疯狂啦啦队完整版| 越狱全集| 哈利波特1普通话版| 《以法之名》电视剧全集免费观看| 修理工的艳遇日本| 最美时光电视剧| 不良人第7季在线观看全集免费高清| 男性按摩师| 王牌大间谍| 红箭 电视剧| 朝鲜金雪美| 浪漫女家教未删减| 特殊精油按摩3电影 | 逃亡者planb| 金瓶梅电影在线完整版观看| 壮志凌云女版满天星高清完整版| 黑帮大佬和我365天第二部在线| 牛魔王和铁扇公主| 仁粹大妃| 女性治疗营1| 需要浪漫电视剧| 朋友的女儿2| 宜君县| 《维修工》电影王李丹妮在线观看| 食人鱼3d第二部| 汪小菲直播承认未婚妻已怀孕| 好男儿之情感护理| 三年大片大全在线观看免费国语 | 新金梅瓶2 国语完整版| 《再去温泉吧!》第一季| 再度重相逢伍佰| 壮志凌云满天星法版免费| 中国棉花事件| 农场保卫战完整版免费观看| 花田喜事93粤语| 笨蛋你在做什么第11集| 维修工的艳遇韩国电影 | ps搭档| 少女情怀免费播放| 王在山轻音乐团| 法国空乘1980版在线播放| 《渔夫的荒野史记》在线观看免费中| 僵尸道长第一部国语高清全集| 魔剑生死棋电视剧| 海员记录在杜苏芮影响下航行遭遇 | 花子vs倔强驱魔师全集免费看| 达菲林的副作用| 野花免费观看高清视频| 爱情而已电视剧免费观看全集完整版| 杰西简的电影在线播放| 爱情公寓45| 宫瀬里子| 法国空姐4在线| 修理工的诱惑| 综艺免费观看| 沙漠神枪| 周弘版《村姑》完整版| 《需要爸爸播种子》电影免费在线观看,高清完整版美国倫理片_努努影院 | 美女神枪手| 斗罗大陆51集| 黄陵县| 美女扒精光秘 免费观看| 斗罗大陆211集免费看| 水浒之英雄本色| 青禾男高电影| 《荣誉之战》满天星版在线观看 | 御岭秘录电影| 黑色的眼泪| 《伊波拉病毒第二部在线播放| 大决战49集在线播放影院| shoushoumen| 你是我的氧气| 侯玉洁讲道视频2017| 虎哥说车得了什么病| 恶作剧之吻1台湾版| 《指尖传出的温度》| 保罗5妈妈| 中印冲突来龙去脉| 我曾侍候过英国国王| 无上神帝全集免费观看| 《激战丛林》| 木下凛凛子未删减版电影在线观看 | 青梅竹马是消防员未增删E站| 法国空乘理论5HD| 肯兰德桑德兰满天星电影| 蝙蝠侠 猫女| 沉默的羔羊在线观看| 大清药王| 金银悔5一1手机版| 中国vs法国| 机器总动员| 《夏洛特烦恼》免费观看| 最棒的爱人诏免费观看| 五妹电影在线观看| 天使追魂| 《爱我几何》原版高清免费看| 书屋的激情性事| 科学怪妓在线观看| 地爆天星| 那些花儿王菲|