巧奪天工的kfifo竟然把MCU搞掛了?

原創 小飛哥玩嵌入式 2024-11-11 20:00

關注、星標公眾號,直達精彩內容

一 問題背景

最近部門時刻準備刪庫跑路的小兄弟調試CAN通訊的時候,遇到個MCU死機的問題,而負責這塊代碼的哥們已經跑路好幾年了,而這個設備也已經用了好幾年了,也沒有反饋過什么問題。但是在他那里測試MCU 100%會死機,進入hardfault,一時間CPU都被干燒了,祖傳的代碼這么不靠譜嗎....

最終問題定位在kfifo這部分出了問題,而kfifo是linux kernal里面非常經典的一段代碼,應該不至于吧,對此進行了分析驗證。

二 什么是kfifo

釋義摘自:https://blog.csdn.net/linyt/article/details/53355355 ?講解的很詳細,如有侵權,聯系刪除~

kfifo是內核里面的一個First In First Out數據結構,它采用環形循環隊列的數據結構來實現,提供一個無邊界的字節流服務,并且使用并行無鎖編程技術,即當它用于只有一個入隊線程和一個出隊線程的場情時,兩個線程可以并發操作,而不需要任何加鎖行為,就可以保證kfifo的線程安全。

kfifo代碼既然肩負著這么多特性,那我們先一敝它的代碼:

2.1 kfifo數據結構

struct?kfifo?{
????unsigned?char?*buffer;????/*?the?buffer?holding?the?data?*/
????unsigned?int?size;????/*?the?size?of?the?allocated?buffer?*/
????unsigned?int?in;????/*?data?is?added?at?offset?(in?%?size)?*/
????unsigned?int?out;????/*?data?is?extracted?from?off.?(out?%?size)?*/
????spinlock_t?*lock;????/*?protects?concurrent?modifications?*/
};

這是kfifo的數據結構,kfifo主要提供了兩個操作,__kfifo_put(入隊操作)和__kfifo_get(出隊操作)。 它的各個數據成員如下:

buffer:?用于存放數據的緩存

size:?buffer空間的大小,在初化時,將它向上擴展成2的冪

lock:?如果使用不能保證任何時間最多只有一個讀線程和寫線程,需要使用該lock實施同步。

in,?out:?和buffer一起構成一個循環隊列。?in指向buffer中隊頭,而且out指向buffer中的隊尾,它的結構如示圖如下:

+--------------------------------------------------------------+
|????????????|<----------data---------->|??????????????????????|
+--------------------------------------------------------------+
?????????????^??????????????????????????^??????????????????????^
?????????????|??????????????????????????|??????????????????????|
????????????out????????????????????????in?????????????????????size

當然,內核開發者使用了一種更好的技術處理了in, out和buffer的關系,我們將在下面進行詳細分析。

2.2 kfifo功能描述

kfifo提供如下對外功能規格:

  • 1 只支持一個讀者和一個讀者并發操作;
  • 2 無阻塞的讀寫操作,如果空間不夠,則返回實際訪問空間;

kfifo_alloc 分配kfifo內存和初始化工作

struct?kfifo?*kfifo_alloc(unsigned?int?size,?gfp_t?gfp_mask,?spinlock_t?*lock)
{
????unsigned?char?*buffer;
????struct?kfifo?*ret;

????/*
?????*?round?up?to?the?next?power?of?2,?since?our?'let?the?indices
?????*?wrap'?tachnique?works?only?in?this?case.
?????*/

????if?(size?&?(size?-?1))?{
????????BUG_ON(size?>?0x80000000);
????????size?=?roundup_pow_of_two(size);
????}

????buffer?=?kmalloc(size,?gfp_mask);
????if?(!buffer)
????????return?ERR_PTR(-ENOMEM);

????ret?=?kfifo_init(buffer,?size,?gfp_mask,?lock);

????if?(IS_ERR(ret))
????????kfree(buffer);

????return?ret;
}

這里值得一提的是,kfifo->size的值總是在調用者傳進來的size參數的基礎上向2的冪擴展,這是內核一貫的做法。這樣的好處不言而喻——對kfifo->size取模運算可以轉化為與運算,如下:

kfifo->in?%?kfifo->size?
可以轉化為?
kfifo->in?&?(kfifo->size?–?1)

在kfifo_alloc函數中,使用size & (size – 1)來判斷size 是否為2冪,如果條件為真,則表示size不是2的冪,然后調用roundup_pow_of_two將之向上擴展為2的冪。

這都是常用的技巧,只不過大家沒有將它們結合起來使用而已,下面要分析的__kfifo_put和__kfifo_get則是將kfifo->size的特點發揮到了極致。

__kfifo_put和__kfifo_get巧妙的入隊和出隊

_kfifo_put是入隊操作,它先將數據放入buffer里面,最后才修改in參數;__kfifo_get是出隊操作,它先將數據從buffer中移走,最后才修改out。你會發現in和out兩者各司其職。

下面是__kfifo_put和__kfifo_get的代碼

unsigned?int?__kfifo_put(struct?kfifo?*fifo,
?????????????unsigned?char?*buffer,?unsigned?int?len)

{
????unsigned?int?l;

????len?=?min(len,?fifo->size?-?fifo->in?+?fifo->out);

????/*
?????*?Ensure?that?we?sample?the?fifo->out?index?-before-?we
?????*?start?putting?bytes?into?the?kfifo.
?????*/


????smp_mb();

????/*?first?put?the?data?starting?from?fifo->in?to?buffer?end?*/
????l?=?min(len,?fifo->size?-?(fifo->in?&?(fifo->size?-?1)));
????memcpy(fifo->buffer?+?(fifo->in?&?(fifo->size?-?1)),?buffer,?l);

????/*?then?put?the?rest?(if?any)?at?the?beginning?of?the?buffer?*/
????memcpy(fifo->buffer,?buffer?+?l,?len?-?l);

????/*
?????*?Ensure?that?we?add?the?bytes?to?the?kfifo?-before-
?????*?we?update?the?fifo->in?index.
?????*/


????smp_wmb();

????fifo->in?+=?len;

????return?len;
}

奇怪嗎?代碼完全是線性結構,沒有任何if-else分支來判斷是否有足夠的空間存放數據。內核在這里的代碼非常簡潔,沒有一行多余的代碼。

l?=?min(len,?fifo->size?-?(fifo->in?&?(fifo->size?-?1)));

這個表達式計算當前寫入的空間,換成人可理解的語言就是:

l?=?kfifo可寫空間和預期寫入空間的最小值

使用min宏來代if-else分支

__kfifo_get也應用了同樣技巧,代碼如下:

unsigned?int?__kfifo_get(struct?kfifo?*fifo,
?????????????unsigned?char?*buffer,?unsigned?int?len)

{
????unsigned?int?l;

????len?=?min(len,?fifo->in?-?fifo->out);

????/*
?????*?Ensure?that?we?sample?the?fifo->in?index?-before-?we
?????*?start?removing?bytes?from?the?kfifo.
?????*/


????smp_rmb();

????/*?first?get?the?data?from?fifo->out?until?the?end?of?the?buffer?*/
????l?=?min(len,?fifo->size?-?(fifo->out?&?(fifo->size?-?1)));
????memcpy(buffer,?fifo->buffer?+?(fifo->out?&?(fifo->size?-?1)),?l);

????/*?then?get?the?rest?(if?any)?from?the?beginning?of?the?buffer?*/
????memcpy(buffer?+?l,?fifo->buffer,?len?-?l);

????/*
?????*?Ensure?that?we?remove?the?bytes?from?the?kfifo?-before-
?????*?we?update?the?fifo->out?index.
?????*/


????smp_mb();

????fifo->out?+=?len;

????return?len;
}

原來,kfifo每次入隊或出隊,kfifo->in或kfifo->out只是簡單地kfifo->in/kfifo->out += len,并沒有對kfifo->size 進行取模運算。因此kfifo->in和kfifo->out總是一直增大,直到unsigned in最大值時,又會繞回到0這一起始端。但始終滿足:

kfifo->in?-?kfifo->out?<=?kfifo->size

即使kfifo->in回繞到了0的那一端,這個性質仍然是保持的。

對于給定的kfifo:

數據空間長度為:kfifo->in - kfifo->out

而剩余空間(可寫入空間)長度為:kfifo->size - (kfifo->in - kfifo->out)

盡管kfifo->in和kfofo->out一直超過kfifo->size進行增長,但它對應在kfifo->buffer空間的下標卻是如下:

kfifo->in?%?kfifo->size?(i.e.?kfifo->in?&?(kfifo->size?-?1))

kfifo->out?%?kfifo->size?(i.e.?kfifo->out?&?(kfifo->size?-?1))

往kfifo里面寫一塊數據時,數據空間、寫入空間和kfifo->size的關系如果滿足:

kfifo->in?%?size?+?len?>?size

那就要做寫拆分了,見下圖:

????????????????????????????????????????????????????kfifo_put(寫)空間開始地址
????????????????????????????????????????????????????|
???????????????????????????????????????????????????\_/
????????????????????????????????????????????????????|XXXXXXXXXX
XXXXXXXX|????????????????????????????????????????????????????
+--------------------------------------------------------------+
|????????????????????????|<----------data---------->|??????????|
+--------------------------------------------------------------+
?????????????????????????^??????????????????????????^??????????^
?????????????????????????|??????????????????????????|??????????|
???????????????????????out%size???????????????????in%size?????size
????????^
????????|
??????寫空間結束地址??????????????????????

第一塊當然是: [kfifo->in % kfifo->size, kfifo->size]

第二塊當然是:[0, len - (kfifo->size - kfifo->in % kfifo->size)]

下面是代碼,細細體味吧:

/*?first?put?the?data?starting?from?fifo->in?to?buffer?end?*/???
l?=?min(len,?fifo->size?-?(fifo->in?&?(fifo->size?-?1)));???
memcpy(fifo->buffer?+?(fifo->in?&?(fifo->size?-?1)),?buffer,?l);???

/*?then?put?the?rest?(if?any)?at?the?beginning?of?the?buffer?*/???
memcpy(fifo->buffer,?buffer?+?l,?len?-?l);??

對于kfifo_get過程,也是類似的,請各位自行分析。

kfifo_get和kfifo_put無鎖并發操作

計算機科學家已經證明,當只有一個讀經程和一個寫線程并發操作時,不需要任何額外的鎖,就可以確保是線程安全的,也即kfifo使用了無鎖編程技術,以提高kernel的并發。

kfifo使用in和out兩個指針來描述寫入和讀取游標,對于寫入操作,只更新in指針,而讀取操作,只更新out指針,可謂井水不犯河水,示意圖如下:

???????????????????????????????????????????????|<--寫入-->|
+--------------------------------------------------------------+
|????????????????????????|<----------data----->|???????????????|
+--------------------------------------------------------------+
?????????????????????????|<--讀取-->|
?????????????????????????^?????????????????????^???????????????^
?????????????????????????|?????????????????????|???????????????|
????????????????????????out???????????????????in??????????????size

為了避免讀者看到寫者預計寫入,但實際沒有寫入數據的空間,寫者必須保證以下的寫入順序:

往[kfifo->in,?kfifo->in?+?len]空間寫入數據
更新kfifo->in指針為?kfifo->in?+?len

在操作1完成時,讀者是還沒有看到寫入的信息的,因為kfifo->in沒有變化,認為讀者還沒有開始寫操作,只有更新kfifo->in之后,讀者才能看到。

那么如何保證1必須在2之前完成,秘密就是使用內存屏障:smp_mb(),smp_rmb(), smp_wmb(),來保證對方觀察到的內存操作順序。

三 kfifo在工程中的移植應用

上面已經詳細介紹了kfifo的實現原理以及讓人驚嘆的代碼簡潔之道,接下來在MCU工程中實際去應用,看看效果如何。

直接上代碼:

kfifo.h

#ifndef?__KFIFO_H

#define?__KFIFO_H

??

#include?"stdint.h"

#include?"stdlib.h"

#include?"string.h"

#include?"stdio.h"

??

#define?MAX(a,?b)?(((a)?>?(b))???(a)?:?(b))

#define?MIN(a,?b)?(((a)?(b)
)???(a)?:?(b))

??

#define?is_power_of_2(x)?((x)?!=?0?&&?(((x)?&?((x)-1))?==?0))

??

typedef?struct?{

unsigned?char?*buffer;?/*?the?buffer?holding?the?data*/

unsigned?int?size;?/*?the?size?of?the?allocated?buffer*/

unsigned?int?in;?/*?data?is?added?at?offset?(in?%?size)*/

unsigned?int?out;?/*?data?is?extracted?from?off.?(out?%?size)*/

}?kfifo;

??

/**

*?@brief?CAN?Rx?message?structure?definition

*/


??

#define?CAN_FIFO_SIZE?(2?*?1024)

typedef?struct?
{

uint8_t?FifoBuf1[CAN_FIFO_SIZE];

//?uint8_t?FifoBuf2[CAN_FIFO_SIZE];

??

uint8_t?FpStep;

??

}?CAN_STA_TYPE;

??

/*?USER?CODE?BEGIN?Prototypes?*/

typedef?struct?{

uint32_t?StdId;

uint32_t?ExtId;

uint32_t?IDE;

uint32_t?RTR;

uint32_t?DLC;

uint8_t?Data[8];

uint32_t?Timestamp;

uint32_t?FilterMatchIndex;

}?MyCanRxMsgTypeDef;

??

extern?kfifo?gFifoReg1;

extern?kfifo?gFifoReg2;

??

void?kfifo_init(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?size);

unsigned?int?kfifo_put(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len);

unsigned?int?kfifo_get(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len);

??

unsigned?int?can_fifo_get(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len);

??

void?kfifo_reset(kfifo?*fifo);

unsigned?int?kfifo_len(kfifo?*fifo);

??

#endif

kfifo.c

#include?"kfifo.h"

kfifo?gFifoReg1;
kfifo?gFifoReg2;

/*
?*?kfifo初始化
*/

void?kfifo_init(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?size)
{
????if?(!is_power_of_2(size))
????{
????????return;
????}
????fifo->buffer?=?buffer;
????fifo->size?=?size;
????fifo->in?=?fifo->out?=?0u;
????memset(fifo->buffer,?0,?size);
}

/*
?*?__kfifo_put?-?puts?some?data?into?the?FIFO,?no?locking?version
?*?@fifo:?the?fifo?to?be?used.
?*?@buffer:?the?data?to?be?added.
?*?@len:?the?length?of?the?data?to?be?added.
?*
?*?This?function?copies?at?most?'len'?bytes?from?the?'buffer'?into
?*?the?FIFO?depending?on?the?free?space,?and?returns?the?number?of
?*?bytes?copied.
?*
?*?Note?that?with?only?one?concurrent?reader?and?one?concurrent
?*?writer,?you?don't?need?extra?locking?to?use?these?functions.
?*/


unsigned?int?kfifo_put(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len)
{
????unsigned?int?l?=?0;

????len?=?MIN(len,?fifo->size?-?fifo->in?+?fifo->out);
????/*?first?put?the?data?starting?from?fifo->in?to?buffer?end*/

????l?=?MIN(len,?fifo->size?-?(fifo->in?&?(fifo->size?-?1)));
????memcpy(fifo->buffer?+?(fifo->in?&?(fifo->size?-?1)),?buffer,?l);

????/*?then?put?the?rest?(if?any)?at?the?beginning?of?the?buffer*/

????memcpy(fifo->buffer,?buffer?+?l,?len?-?l);
????
????fifo->in?+=?len;

????return?len;
}

/*
*?__kfifo_get?-?gets?some?data?from?the?FIFO,?no?locking?version
*?@fifo:?the?fifo?to?be?used.
*?@buffer:?where?the?data?must?be?copied.
*?@len:?the?size?of?the?destination?buffer.
*
*?This?function?copies?at?most?'len'?bytes?from?the?FIFO?into?the
*?'buffer'?and?returns?the?number?of?copied?bytes.
*
*?Note?that?with?only?one?concurrent?reader?and?one?concurrent
*?writer,?you?don't?need?extra?locking?to?use?these?functions.
*/

unsigned?int?kfifo_get(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len)
{
????unsigned?int?l?=?0;

????len?=?MIN(len,?fifo->in?-?fifo->out);?

????/*?first?get?the?data?from?fifo->out?until?the?end?of?the?buffer*/
????l?=?MIN(len,?fifo->size?-?(fifo->out?&?(fifo->size?-?1)));
????memcpy(buffer,?fifo->buffer?+?(fifo->out?&?(fifo->size?-?1)),?l);

????/*?then?get?the?rest?(if?any)?from?the?beginning?of?the?buffer*/
????memcpy(buffer?+?l,?fifo->buffer,?len?-?l);

????fifo->out?+=?len;
????return?len;
}

unsigned?int?can_fifo_get(kfifo?*fifo,?unsigned?char?*buffer,?unsigned?int?len)
{
????//__disable_irq();
????
????len?=?kfifo_get(fifo,?buffer,?len);
????
????//__enable_irq();

????return?len;
}

/*
?*?__kfifo_reset?-?removes?the?entire?FIFO?contents,?no?locking?version
?*?@fifo:?the?fifo?to?be?emptied.
?*/

void?kfifo_reset(kfifo?*fifo)
{
????fifo->in?=?fifo->out?=?0;
}

/*
?*?__kfifo_len?-?returns?the?number?of?bytes?available?in?the?FIFO,?no?locking?version
?*?@fifo:?the?fifo?to?be?used.
?*/

unsigned?int?kfifo_len(kfifo?*fifo)
{
????return?fifo->in?-?fifo->out;
}

因為是單線程讀寫,所以沒有進行加鎖操作。

回到問題背景所說的,之前用的時候一直沒問題,現在測試100%把CPU干冒煙,為何會有如此大的差別?

回顧了下測試環境,“跑路的工程師”調試的時候使用的上位機是自定義的數據發送間隔時間,對與kfifo來說,發個間隔時間較大,kfifo進出次數不會差太多,kfifo是“反應的過來”的,實際使用過的時候,上位機替換成了APP,數據發送間隔更大,所以沒有出問題。

現在,“準備刪庫跑路的工程師”,用的是固定間隔的上位機,而且數據發送頻率很高,接收使用的CAN中斷接收,發送的時候是使用的任務輪詢,任務運行周期是100ms,創建的buffer緩沖為2048字節,發送一會兒就會死機,100%復現,增大buffer,不過是死的時間晚了點,雖遲但到~~~

void?can_nbbus_entry(void?*parameter)
{
?nbbus_can_init();
?while?(1)
?{
??nbbus_poll(&nbbus_can,?NB_BUS_BATDIAG_ID);
??rt_thread_mdelay(100);
?}
}

于是對數據幀進行了分析,can接收到的原始數據幀是沒問題的,前面沒出問題的數據一直沒問題,MCU崩潰的時候,CAN接收到的原始數據依然是沒問題的,原始數據既然沒問題,問題應該出在后面解析轉發流程了,分析最終定位在數據幀出現了錯位,CAN數據幀的數據出現了移位,導致can數據長度字節取了一個比較大的數,數據拷貝的時候出現了越界,擦出了內存中的一些數據,進入了hardfault

那么為什么CAN數據幀出現了錯位呢,并且似乎出現在某一固定時刻?

can數據接收數據如下,can的結構體有36字節,每次kfifo_put傳入的len為36字節,剩余空間與36字節進行比較

typedef?struct
{
????uint32_t?StdId;
????uint32_t?ExtId;
????uint32_t?IDE;
????uint32_t?RTR;
????uint32_t?DLC;
????uint8_t?Data[8];
????uint32_t?Timestamp;
????uint32_t?FilterMatchIndex;
}?MyCanRxMsgTypeDef;

void?HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef?*hcan)
{
????HAL_StatusTypeDef?HAL_RetVal;
????if?(hcan?==?&hcan1)
????{
????????HAL_RetVal?=?HAL_CAN_GetRxMessage(hcan,??CAN_RX_FIFO1,?(CAN_RxHeaderTypeDef?*)&gCanRxMsg11,??gCanRxMsg11.Data);
????????if?(?HAL_OK?==?HAL_RetVal)
????????{
????????????kfifo_put(&gFifoReg1,?(uint8_t?*)&gCanRxMsg11,?sizeof(gCanRxMsg11));

????????????__HAL_CAN_ENABLE_IT?(hcan,?CAN_IT_RX_FIFO1_MSG_PENDING);
????????}
????}
}

接下來著重分析下數據是如何產生錯亂的,前面說到定義了2048字節的buffer緩存空間,對存儲空間結構分組如下:

總共2048字節緩存空間,可以劃分為36*56 = 2016 + 32 = 2048,也就意味著最后一幀數據32字節存儲在尾端32字節空間,剩余4字節存儲在隊列頭部4字節空間

那么一個循環之后,后面剩余2048-4=2044字節,可以劃分為36*56 = 2016 + 28 = 2044字節,同理循環之后,最后一幀數據28字節存儲在隊列尾部28字節空間,8字節數據存儲在隊列頭部8字節空間

如此循環往復,不再贅述.......

然后軟件層面進行了模擬測試 測試代碼如下:

CAN_STA_TYPE?gCanStaReg?=?{0};
MyCanRxMsgTypeDef?gCanTempMsg?=?{0};
MyCanRxMsgTypeDef?gCanRxMsg20?=?{0};

int?main()?{
?uint16_t?fifo_len?=?0;
?MyCanRxMsgTypeDef?gCanRxMsg10?=?{
??0,?0x01B0AABF,?0x56,?0x78,?0x8,?{1,?2,?3,?4,?5,?6,?7,?8},?0x77,?0x44};

?kfifo_init(&gFifoReg1,?gCanStaReg.FifoBuf1,?CAN_FIFO_SIZE);
?int?i?=?0,?j?=?0;
?while?(1)?{
??i++;
??if?(i?%?5?==?0)?{
???kfifo_put(&gFifoReg1,?(uint8_t?*)&gCanRxMsg10,?sizeof(gCanRxMsg10));
?}
?j++;
?if?(j?%?10?==?0)?{
??if?((fifo_len?=?kfifo_len(&gFifoReg1))?>=?sizeof(gCanTempMsg))?{
??can_fifo_get(&gFifoReg1,?(uint8_t?*)&gCanTempMsg,?sizeof(gCanTempMsg));
??printf("stdid?=?%04x\n",?gCanTempMsg.StdId);
??printf("exdid?=?%04x\n",?gCanTempMsg.ExtId);
??printf("ide?=?%04x\n",?gCanTempMsg.IDE);
??printf("rtr?=?%04x\n",?gCanTempMsg.RTR);
??printf("DLC?=?%04x\n",?gCanTempMsg.DLC);
??printf("data:\n");
??for?(int?i?=?0;?i?8;?i++)?{
???printf("%02x?",?gCanTempMsg.Data[i]);
??}
??printf("Timestamp?=?%04x\n",?gCanTempMsg.Timestamp);
??printf("FilterMatchIndex?=?%04x\n\n\n\n",?gCanTempMsg.FilterMatchIndex);
?}
?printf("in_index?=?%d,out_index?=?%d,index_diff?=?%d\n",?gFifoReg1.in,
?gFifoReg1.out,?gFifoReg1.in?-?gFifoReg1.out);
?printf("-----arr----\n\n");
?for?(i?=?0;?i?2048;?i++)?{
??if?(i?%?36?==?0)?{
???printf("%d?\n",i/36);
??}
??printf("%02x?",?gFifoReg1.buffer[i]);
?}
?printf("\n\n");
?if?(gCanTempMsg.DLC?>?8)?{
??printf("-----error----\n\n");
??printf("in_index?=?%d,out_index?=?%d,index_diff?=?%d\n",?gFifoReg1.in,
??gFifoReg1.out,?gFifoReg1.in?-?gFifoReg1.out);
??return?0;
?}
}
?Sleep(10);
}
?return?0;
}

使用上面的測試代碼復現了問題,出現了數據的錯位,相差4個字節,本來應該是長度的字節,被數據區四字節給填充了,導致數據長度異常變大,數據copy過程中覆蓋了部分ram空間,導致程序崩潰

四 解決方法

1、方法1

出現上面問題的核心原因是數據放的速度遠大于取得速度,導致數據存儲扣圈出現錯位,這種用法可能背離了kfifo原本的設計使用場景,導致出現問題。

這個方法最簡單,只需要調整kfifo_get的調用周期即可,結合kfifo_put的調用周期,保持在不高于kfifo_put的調用周期應該都是可以的,實測改為了10ms取數據之后,不再出現數據異常,MCU進入hardfault的問題。

2、方法2

上面提到數據取得慢了,出現了扣圈的情況,數據存儲與讀取出現了“內存錯位”,那我們可以從空間剩余的情況考慮,假設剩余空間不足以放下一幀數據,等一等取數據的指針。

代碼優化,增加忙判斷,空間不足,認為是忙,但這種情況可能會導致一些數據幀的丟失,響應滯后,對于實時性特別高的場景可能不太適用,實際測試也不會出現數據內存錯位。

boolean?is_busy(kfifo?*fifo,?uint8_t?len)?{
?if?((fifo->in?-?fifo->out)???return?TRUE;
}
?return?FALSE;
}
int?main()?{
?uint16_t?fifo_len?=?0;
?MyCanRxMsgTypeDef?gCanRxMsg10?=?{
??0,?0x01B0AABF,?0x56,?0x78,?0x8,?{1,?2,?3,?4,?5,?6,?7,?8},?0x77,?0x44};
?kfifo_init(&gFifoReg1,?gCanStaReg.FifoBuf1,?CAN_FIFO_SIZE);
?int?i?=?0,?j?=?0;
?while?(1)?{
??i++;
??if?((i?%?5?==?0)?&&?is_busy(&gFifoReg1,?sizeof(gCanRxMsg10)))?{
??kfifo_put(&gFifoReg1,?(uint8_t?*)&gCanRxMsg10,?sizeof(gCanRxMsg10));
?}
?j++;

?if?(j?%?10?==?0)?{
?if?((fifo_len?=?kfifo_len(&gFifoReg1))?>=?sizeof(gCanTempMsg))?{
??can_fifo_get(&gFifoReg1,?(uint8_t?*)&gCanTempMsg,?sizeof(gCanTempMsg));
??printf("stdid?=?%04x\n",?gCanTempMsg.StdId);
??printf("exdid?=?%04x\n",?gCanTempMsg.ExtId);
??printf("ide?=?%04x\n",?gCanTempMsg.IDE);
??printf("rtr?=?%04x\n",?gCanTempMsg.RTR);
??printf("DLC?=?%04x\n",?gCanTempMsg.DLC);
??printf("data:\n");
??for?(int?i?=?0;?i?8;?i++)?{
???printf("%02x?",?gCanTempMsg.Data[i]);
??}
?printf("Timestamp?=?%04x\n",?gCanTempMsg.Timestamp);
?printf("FilterMatchIndex?=?%04x\n\n\n\n",?gCanTempMsg.FilterMatchIndex);
}
?printf("in_index?=?%d,out_index?=?%d,index_diff?=?%d\n",?gFifoReg1.in,

?gFifoReg1.out,?gFifoReg1.in?-?gFifoReg1.out);

?//?printf("-----arr----\n\n");
?//?for?(i?=?0;?i?
?//?if?(i?%?36?==?0)?{
?//?printf("%d?\n",i/36);
?//?}
?//?printf("%02x?",?gFifoReg1.buffer[i]);
?//?}
?//?printf("\n\n");
?if?(gCanTempMsg.DLC?>?8)?{
??printf("-----error----\n\n");
??printf("in_index?=?%d,out_index?=?%d,index_diff?=?%d\n",?gFifoReg1.in,
??gFifoReg1.out,?gFifoReg1.in?-?gFifoReg1.out);
??return?0;
?}
}
?Sleep(10);
}
?return?0;
}

綜上所述,為了保證數據的實時性要求,存儲和讀取的周期配合尤為重要,為最優解,實時性要求不高的,可以考慮增加忙判斷的方式。

問題解決掉,刪庫跑路的小哥暫時不用跑了,又可以一塊愉快的寫代碼了~

五 經驗交流

歡迎關注公眾號“小飛哥玩嵌入式”,一起解鎖更多的嵌入式開發技能。


小飛哥玩嵌入式 分享嵌入式開發相關知識,喜歡DIY分享
評論
  • 在EMC測試過程中,傳導發射(Conducted Emission,CE)超標是工程師最常遇到的問題之一。更令人頭疼的是,同樣的超標曲線背后,可能對應著完全不同的干擾機理:有的是差模噪聲沿電源回路傳播,有的是共模電流通過寄生路徑耦合,還有些問題甚至并非來自電源本身,而是負載、電纜布局或接地結構引起的連鎖反應。 · 150kHz~1MHz 超標:多為差模噪聲為主,干擾沿火線-零線回路傳輸。 · 1MHz~30MHz 超標:通常共模噪聲占主導,干擾通過火線/零線對地回路傳播。 如果條件允許,用電流探
    譽磁電磁兼容EMC 2026-07-31 18:45 365瀏覽
  • 在芯片總成本中占比不到 1%,卻可能因一處品質偏差導致整片晶圓報廢——半導體切割/研磨膠帶,正隨著先進封裝的爆發,成為封測產線選型中最謹慎對待的耗材之一。但鮮有人注意到,決定這層膠帶性能上限的,是上游一層更薄的基膜。這個長期由日本企業主導的隱形環節,正在出現國產突圍的信號。一、需求之變:先進封裝與“韜定律”重塑膠帶市場AI 算力芯片、HBM 高帶寬存儲、Chiplet 芯粒等先進封裝產品持續放量,國內封測產線擴產節奏不減。作為晶圓減薄與切割工序的必需耗材,晶圓膠帶的需求同步擴容。據 QYRese
    芯膜前沿 2026-07-31 16:35 294瀏覽
  • ?摘要:低價大流量卡正全面退市,政策收緊已成定局。面對傳統號卡的不確定性,隨身WiFi憑借穩定連接、多設備共享、獨立設備和靈活套餐等優勢,成為務實可靠的備選方案。1、流量卡黃金時代要結束了通信行業正迎來一場前所未有的“地震式”調整——曾讓無數用戶追捧的低價大流量卡,正在全速退出各大平臺。這早已不是一次普通的競合,而是一場趨勢性的行業洗牌。回望過去,19元200G的神卡,那時真是“睡著都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像隨便刷、隨便看,流量自由觸手可及。可如今,回頭再看,那種
    愛上電路設計 2026-08-03 10:21 128663瀏覽
  • 今年好幾個客戶都問過我同一件事。藍牙音頻產品到底用 WT2605 這種單芯片,還是老老實實 MCU 外掛藍牙模組。兩種方案我都落地過,說點實在的,WT2605 剛出來那陣我也犯嘀咕,怕是營銷噱頭,真拿來做完一版樣機才服氣。一、選型先看三個維度外圍數量。這是最直觀的。傳統做法是 MCU 加藍牙模組,再加音頻編解碼、功放、晶振和一堆阻容,板子上密密麻麻十幾二十顆料。WT2605 把藍牙、解碼、功放全收進一顆,外圍就剩少量被動件。開發周期。傳統方案得自己接藍牙協議棧,配網、A2DP 解碼、音頻通路一一
    唯創知音語音芯片 2026-07-31 16:35 384瀏覽
  • Synopsys 這次沒有再給行業看一條只能站在展臺邊圍觀的 demo。7 月 27 日,Synopsys 在 DAC 2026 期間公布兩條 autonomous EDA workflow:一條處理 debug closure,另一條處理 implementation and closure。客戶可以通過 Synopsys 申請在 Microsoft Discovery 上評估,AMD 正在評估這些工作流能否用于下一代產品開發。公告里最扎眼的是 25%–40%。Synopsys 稱
    麒芯說AI 2026-07-31 14:21 184瀏覽
  • 智能寵物用品這幾年快速普及,自動清理幾乎成了智能貓砂盆的標配。貓咪用完離場,設備自動翻轉清理,養寵家庭省去了每天彎腰清理的麻煩。但自動清理的第一步,是先準確判斷貓到底在不在盆里。這個看似簡單的問題,在小空間里并不容易做好。近場檢測的痛點:距離太遠反而誤事貓砂盆內部空間有限。如果傳感器的檢測距離設得偏大,盆外路過的貓、人甚至物品都會被誤判為貓在盆內,結果該清理時不清理、不該清理時亂清理,體驗直接崩壞。這類產品的核心訴求其實就一句話:近距離、小范圍、精準識別,不能有半點誤判。常規感應方案常因檢測距離
    唯創知音語音芯片 2026-07-31 16:51 243瀏覽
  • 摘要在防爆電氣設計中,只參照芯數選型而忽略額定載流量,長期滿負荷運行會出現插頭發熱、接觸面氧化、IP67 密封受熱老化等問題。結合常用 3 針 3 孔、4 芯、5PIN、8PIN 圓形防爆連接器,制作分級電流參數對照表,區分冷壓免焊接、焊接兩種接線結構的安全載流數值,設置合理電流冗余系數,搭配使用環境修正參數,規范防爆接近開關連接器、防爆法蘭插座的選型計算方式。關鍵詞圓形防爆連接器,載流參數表,防爆法蘭插座,防爆端子接頭,IP67 防爆防水接插件1 產品概述圓形防爆連接器觸點載流能力由插針直徑、
    kyfbest科迎法電氣 2026-08-03 09:18 128478瀏覽
  •     長期專注WiFi領域,也算是行業老兵了!同行閑聊中,時不時能提起我和我們!從疫情起,國產替代風生水起,起起落落,大浪淘沙,生存下來的都是強者!    WiFi模塊應用廣泛,對于高端市場和特定市場,要求WIFI模塊需要過CE/FCC之類的認證,也就是說沒有認證的模塊,不具備導入產品設計.接下來就和大家聊聊認證模塊選型參考!    WIFi模塊硬件方面主要考慮以下九點特性:    1
    納拓科技 2026-07-31 17:56 163瀏覽
  • 摘要防爆自控系統同時布設本安信號、工業總線、動力供電三類線路,僅依靠標識標牌管控插接極易出現人為錯插問題,高壓動力回路竄入本安弱電回路會突破安全柵限能標準,產生點火風險。依托 A、D、K 標準化機械防呆編碼體系,搭配護套顏色區分管理,適配 3 針 3 孔免焊接冷壓增安型防爆航插、5PIN 總線防爆航空插頭、8 芯焊接防爆法蘭插座的選型使用,從物理結構層面杜絕防爆接近開關連接器、防爆傳感器航插接頭混用插接問題,補齊防爆系統被動安全防護體系。關鍵詞圓形防爆連接器,防呆編碼防爆航插,防爆航空插頭,防爆
    kyfbest科迎法電氣 2026-07-31 18:29 306瀏覽
  • 光芯片,正在從光模塊的“配角”逆襲為AI產業鏈的“命門”2026年3月,英偉達一紙公告震動整個光通信行業——分別向Lumentum和Coherent各投資20億美元,合計40億美元。這哪是什么財務投資,這是一次對AI基礎設施關鍵環節的“掐尖式”卡位。光芯片,這個曾經被市場當作光模塊BOM表里一個標準配套元器件的東西,正在成為AI產業鏈上“卡位”最強、話語權最硬的環節。一、為什么是光芯片?老黃早就把話挑明了英偉達CEO黃仁勛的原話是:數據傳輸速度已成為人工智能發展的新瓶頸。AI集群從萬卡級往十萬卡
    用戶1774416745629 2026-07-31 11:22 292瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 浪漫女家教电影在线观看全集| 爱情公寓3 19| overflower原版| 剑神林峰1-100集免费看| 新杨门女将赵丽颖电视剧在线观看| 爸爸需要你的种子| 客厅享受的两小时| 战狼9欧式少女中文版| 高清《忠犬》在线观看| 蓝盔特战队电视剧全集免费观看| 欲望校园车永莉完整电影在线看视频 | 全是肉的糙汉文1v1| 坎贝奇品味人生未删减版在线| 墓道电视剧| 阿图什市| 深圳空姐艳照门| 滚滚红尘电影| 战狼6大牛免费观看全部| 工厂女孩| 躺床上丝袜老阿姨| 热带暴风雨行动满天星版| 菠萝菠萝蜜视频| 人民的正义| 《丛林激情》男女主| 少女免费观看完整电视电影 | 武警部队徽| 熊出没之环游世界| 娃娃脸3在线观看完整免费高清原声满天星百 | 电影 锦衣卫| 惠州核电站爆炸| 动感之星妖精179集高清免费观看| 一起来流星雨| 美国1~5普通话| 《灭火宝贝| 八尺夫人意大利免费观看完整版 | 双肥临门| 360天爱上我| 我们都要好好的| 饥饿的女儿国| 三生三世免费手机观看| 美容室的待遇5hd中文| 高黄软糯小受被C到哭| 色情版巜劳拉性放荡ID剧情| 夏炉冬扇| 冰与火之歌第七季| 《替夫还债》高清完整版中字| 色情玉蒲之玉女心经电影| 真破血国语版高清免费看| 希崎杰西卡 空姐| 杨敏版1-5集在线观看电视剧| 古装三圾片| 夏可可《爱我就别想太多》电视剧| 《已婚妇女的下午| 伦理厨房的岳 BD神马在线观看 | 今天开始当杀手| 电视剧胜算全集免费观看| 愈快乐愈堕落粤语| 孙杨事件| 美妙人生韩剧| 进击的巨人2| 尖叫之夜免费观看2023年电影 | 女鬼剑剑宗| 《售楼小姐5》在线观看| 归路电视剧免费完整版观看高清| 小斌斌事件| 国产在线观看免费全集电视剧网站有| 《借命而生》| 安迪怀特菲尔德| 高柳花嫁动漫全集樱花| 魔乳秘剑帖无修版01| 绿媒是什么意思| 突围全集播放| 算计七天的死亡游戏| 翁红的电影| 法证先锋6粤语版免费完整版高清| 首发电影论坛| 霞浦县| 神级选择:每次都选对短剧全集| 小蓝电影| 《女兵俘虏营》完整版免费观看| 鬼父1-16全集在线观看| 麦乐迪与父亲经典片段| 《功夫熊猫2》| 3d柔铺团在线观看免费观看大全| 西出玉门电视剧免费观看完整版| 美味的快递2| 缘分 电影| 李采潭特殊的治疗电影免费观看| 罗刹海市刀郎原唱完整版| 私人航空观看| 画江湖之天罡在线观看| 一女嫁三夫电视剧免费观看| 君心藏不住电视剧| 普宁市| 电影七月| 广东碧桂园学校| 酒法子空蝉之森原版| 三d肉蒲完整版| 以父之名| 《姐妹牙医》在线观电影| 桃花小妹2| 速递惊魂| 我的好妈妈5 在线播放| 鬼灭之刃游郭篇| 前途海量电影免费观看完整版| 台安县| 食人晚宴| 恋爱男孩泰剧| 《三更2之饺子》电影| 情事在线观看无删减完整版韩国| 情深深雨蒙蒙全集高清| 美容院特殊待遇2BT天堂电影 | 郭晶晶霍启刚离婚| 萨迪1980满天星在线看| 传闻中的陈芊芊| 桃花马请长缨短剧免费| 濑户之花嫁| 爹地追来了全集免费| 网民发布辱国等不当言论被刑拘| 女超人麦乐迪无删减在线观看| 合租男女1v1h| 公与媳2电视剧免费观看电影院| 爱在初春惊变时| 白峰电影在线观看550| 新居之约第9集| 《overflower》动漫全集免费! | 新版西游记白骨精| 爱的妇产科电视剧全集| tobu8XXⅩHD| 朋友的妈妈2电影| 漠风吟电视剧在线观看完整版免费| 《爱我几何》莫妮卡原版免费观| 澳门风云快播| 湘北小成| 县委大院电视剧全集免费观看| 金牌女销售3| 央媒评2.2亿彩票事件| 金刚在线观看| 免费国产电视剧在线观看 | 烧仙草和龟苓膏| 凯登克里斯版《壮志凌云》 | 警察故事3国语完整版免费观看| 韩国电影部长和老公来家| 电视剧大话西游| 男女愁愁免费剧| 八千里路云和月电视剧| 俄罗斯空姐在线观看完整免费高清原声满天星奔跑吧ep彩 | 电视剧嘎达梅林| 新员工2中字ID| 一拳超人第二季在线观看免费| 天体战士| 正在播放:中文本幕-亿万富翁的女儿 Anissa Kate,Sienn... - 17 | 隆林| 战魂电视剧全集观看免费播放| 大哥的宝库免费观看全集高清| 恩典电影| 美景之屋6版本| 人海孤鸿在线观看完整版| 全球风暴电影| 《over flow》真人版| 李丽珍爱的 精灵| 两个世界泰剧双男主电视剧在线看 | 鸟鸟主持星光大赏| 《四位妇女按摩完整版》| 梦想成为魔法少女2| 桂宝之爆笑闯宇宙| 插曲的痛免费观看高清版| 让我听懂你的语言电视剧免费观看| 《釜山行》| 江西省委书记赴火灾现场| 陈宝莲《武则天秘史》免费看全集| 漫画家与助手们| 伊甸园之东大结局| 电影水润女人在线观看| 汉尼拔第一季| 黄圣依 乳晕门| 部长出差的日子在线播放| 玄女心经2观看| 同志寓言电影| 电影《干柴烈火》| 一路狂奔电影完整版| XXXX 68美国| 苍蝇之母未删减| 舒淇的献身| 《新来的瑜伽教练》完整版在线观看视频| 回复术士的重来人生在线观看免费 | 斗罗大陆240集免费观看全集在线| 广场舞心在跳情在烧| 韩国修理工艳遇| 韩国大尺度吃奶真做爰| 天龙八部39| 韩国电影空调维修工的艳遇| 万能阿曼动画片全集| 一起愁愁30全集免费播放| 男爵夫人的调教| 满天星版《超女麦乐迪》1001满天星版| 刀郎金刚经歌曲播放| 82版杨敏思版本1-5电视剧免费观看| 活死人黎明1| 我和继夫做了爱一次有事吗| 秘密爱在线观看| 王府小丫鬟短剧全集| 赌石女王:帝王绿出全集免费 | 三年免费观看在线观看高清电影| 赖猫的狮子倒影全集在线观看| 漂亮人妻洗澡被强BD中文| 满天星在线| 判处勇者刑电视剧| 少林七崁| 法官李汉英| 坎贝奇《品味人生无憾》完整版免费在线观看| 王祖贤视频| 一起吃拉面吧韩国电影完整版| 灭火宝贝2美版免费播放| 农民伯伯乡下妺| 大侦探福尔摩斯| 法国农场全新正版| 高清《年轻护士》中文字幕| 流水迢迢电视剧免费观看完整版| 再来一次在线观看完整视频| 天将雄师 在线观看| 坂本真绫 铃村健一| 瑜珈教练| 白峰作品在线观看电影免费版| 夫妻二人世界免费观看第四季| 吕不韦传奇| 壮志凌云女版啄木鸟满天星在线观看免费版 | 爱情公寓43| 107g种子| 《七根心简》电视剧| 新乱世佳人小叔吃扔扔扔哪一集| 一笑随歌40集全免费播放| 豫剧吹牛| 白峰电影免费播放| 斯巴达克斯第四季| 生死时速| 双女任务在线观看| 男生和女生在一起愁愁愁电视剧在线观30集 | 2025《哪吒3》在线观看| 法国空姐3| 大侦探9免费观看| 踏血寻梅电影完整观看| 爱神救救我吧| 美国大片国语普通话| 大头绿衣斗僵尸粤语| 僵尸先生2| 法国空乘4完整版播放| 姐姐的妹夫线观高清2| 黄奕演过电视剧| 天蝎座之夜3| 横冲直撞的游泳教练在线观看| 英雄的黎明 简谱| 年轻人到底有多爱辣条| 义姐是| 高清《月老》电影完整剧情| 七时吉祥电视剧| 女官升职记:宫女到女相全集免费| 胶州市| 黑帮的老大和365天在线观看| 海边女人| 欧式少女18集全集观看视频| 孤零飘落燕| 变成黑皮辣妹后和朋友做了未删减| 《大学生按摩在线观看| 善良的医生在线观看| 伦理片女律师的坠落免费观看| 电视剧大话西游| 丰满的继牳5伦A片免费播放| 命中注定我爱你剧情分集介绍| 高压监狱2019伦理法国| 连续剧黑狐| 免费电影网站在线观看完整版| 潢川县| 快播云播放| 《品味人生无憾》坎贝奇英文| 环珠格格| 《五十度灰3》三部曲在线观看| 异装癖的女人| 好男人好资源好电影TV| 安拉拉斋电影在线观看免费播放西瓜| 年年岁岁年年电视剧| 不一样的美男子| 回复术士重启在免费观看| 男按摩师论理| 何以笙箫默免费观看全集| 《维修工》李丹妮| 狂飙在线观看免费完整观看| 智取威虎山电影完整版| 《士兵突击》主演私下聚餐| 残梦电影完整版| 今天明天动画片| 《女医生4》免费观看全集完整版| 无处藏身全集电视剧免费观看| 歌声飘过30年百首金曲演唱会下载| 顶尖飞行员2021完整版满天星 | 白鹿原做爰未删减片段| 美国十次| 拜登与特朗普通话| 恶之华在线观看| 牙医姐妹1986完整版资源| 电影《一步之遥》在线播放| 《我的游泳女教练》电影| 电视剧薄冰| 功夫3d电影| 《一对二》韩剧姜汉娜免费观看全集| 详细解读捷途旅行者| 养女电视剧全集| 安姨在线| 幸福二重奏免费观看完整版高清 | 盾牌第七季| 高清临租家庭未删减| melody 女超人在线| 史上最强太子爷短剧全集| 保时捷货拉拉| 为了皇帝迅雷下载| 《和部长一起去出差旅》免费观看完整版| 疯狂一夜| 郝板栗《千金小姐| 电视剧焦裕禄| xl司令,真人版| 广场舞林妹妹爱上贾宝玉| 年轻的瘦了5| 霍夫曼钢琴| 一念永恒52集完整版大结局| 甘孜县| 特殊精华油1-6集免费观看电视剧西瓜| 快乐方程式动漫| 黑皮辣妹是我的兄弟第一季免费 | 万家灯火养生2013| 美式忌保罗讳1-4| 黄沙武士2| 荣誉守则完整版在线观看| 女人不容易电视连续剧| 风中奇缘全集| 公之浮手5免费观看完整版| 与君歌免费观看完整版电视剧全集| 特利迦奥特曼全集免费观看| 江门厂房出租| 老公刚出门,义子就侵犯电影| 幸福爱人电视剧全集| 韩国伦理电影大全五月天 | 王爷追妻忙:王妃要和离全集免费| 女职员的付出5中字在线| 爱的蜜方片尾曲| 爱情醒来了| 玉屏| 大炕上泄欲老女人| 猛兽侠下载| 铿铿锵锵锵免费观看在线观看| 灌篮高手全国大赛完整版在线观看 | 练气十万年| 理发店里的特殊待遇电影| 聊斋志异三| 《河豚》| 陈宝莲满天星免费看| 扫毒2之天地对决| 法网柔情剧情| 一个好妈妈9中字头强华驿的演员表| 暴躁妹妹国语版bgm视频下载免费| 我是特种兵之火凤凰在线观看| 欧式少女第16集全集电视剧剧情介绍| 3d肉蒲在线观看| 生日快乐刘若英版电影| 神木丽2周年纪念完整在线观看 | 美梦成真电视剧| 爱欲天堂| 女教师被学生强伦女教师 | 箭在铉上| 坎贝奇第二部曲《无憾》完整版| 保罗波茨| 奔跑吧8免费观看完整版| 坎贝尔《无憾》| 爱的涟漪电视剧| 因法之名免费全集在线观看| 秦夫人找你离婚80全集| 《内衣销售秘诀》免费观看| 电影悬崖之上在线观看完整版免费 | 给我在线观看| 大道新火电视剧全集免费观看| 盗墓笔记电视剧免费观看| 金银瓶电影全集免费播放在线观看 | 《完美无瑕》莫妮卡满天星| 秦腔三娘教子| 秘密列车在线全集免费观看| 夏洛特烦恼完整版西瓜| 白峰高清在线观看免费| 地铁迷情| 凯登克罗斯HD版高清播放电影| 寂寞 谢容儿| another动漫| 《激战丛林》完整版在线观看电影| 魔女的考验日语| 《魔都精兵的奴隶 第二季》| 果戈里起点女的被劫走是多少分钟| 漂亮妈妈中字开头7个字| 智取威虎山电影下载| xl司令真人| 我是刑警全部演员表| 上海电视台节目表| 美国娃娃脸4| 从认错人开始恋爱日剧在线观看 | 黑塔利亚第一季免费观看| 梅丽莎的满天星三部曲| 三生三世枕上书全集免费观看| 熊出没之环球大冒险下载| 战狼6免费高清版999加拿大版免费观看| 直击宁夏银川震后现场| 嘉庆王朝56集免费观看电视剧| 疯狂小女生法国版| 花与蛇1| 智者无敌白鸽| 《美丽妻子替丈夫还债》| 刘国梁马琳喊醒陈梦| 战狼6免费观看下载高清| 可疑的美容院韩国电影| 一代名妓苏小小| 女律师替夫还债| 离经叛道| 寻龙传说免费观看完整版中文| 电影 《透视》在线观看| 唯爱侦查| 水饺皇后电影| 金银悔1-5普通话版免费观看下载| 整容日记下载| 少女免费观看完整电视电影 | 插曲的痛30集全免费观看中文版| 罪夜之奔| 彭于晏真帅是什么瓜| 替夫还债中文电影版在线观看| 叛逆的鲁鲁修第二部| 阁楼的拼音| 绥棱县| 猩球崛起4:新世界| 生日快乐电影| 痛爱当我遇上你| 男按摩师A片免费看 | 虚构推理第二季未删减在线观看| 新版娃娃脸9免费观看高清 | 欧式少女15集全观看视频| 我被在教室强了好爽在线观看| 禁止性爱2| 姐妹牙医在线电影播放| 古剑奇谭电视剧全集| 骨语2电视剧在线播放免费完整版 韩剧《家庭教师》免费观看全集 猎狼者 电视剧 | 小猪佩奇的动画片| 《家访老师》在线观看吴梦梦| 棋手颜成龙再回应肛珠作弊传言| 丁小芹孙协志| 行尸走肉第三季15集| 欧美激情小说在线观看| 禁止的爱 免费观看 百度百度| 缅甸北部的视频在哪里可以看| 木下凛凛子人妻未删版| sana哥布林的窑洞在哪看| 斗罗大陆240集| 女律师的堕落电影免费观看| 八角笼中2023在线观看| 仙逆109最新一集| 插曲的痛免费高清完整版| 爱的代价 原唱| 被闺蜜捆绑震蛋折磨调教| 特殊交易在线观看| 《新人类之毒医肥尸2》在线播放 变形金刚7国语HD免费完整版80 | 妻子6免费完整高清中文版电视剧欢迎光临 | 女友的妈妈女主演员是谁| 不要忘记我爱你电影免费观看| 刑事侦缉档案2电视剧| 战狼9免费高清999加拿大版在线观看 | 18岁电影| 名侦探柯南在线观看免费国语版| 美姐妹内牙医| 飞虎出征 刘安琪| 《星球大战:摩尔-暗影之王》| 美国要爸爸播种2全集免费观看| 富婆三姐妹免费播放电视剧| 猎罪图鉴2在线看高清| 啄木鸟:女版《壮志凌云》电免费观看 | 新闻女王国语电视剧在线观看免费| 芭比公主之十二| 比天堂还美丽| 卖百科全书的女人电影免费观看高清 | 电影双女任务怎么播放| 迷离时空免费观看| 《国色芳华》电视剧免费观看全集| 财阀阴谋| 俄罗斯空乘4完整版| 需要爸爸播种子类似电影| 玛露和她的情人| 监狱风云之夜囚| 娜塔莎电影| 《牙医郝坂丽1986版》西瓜视频| 狂飙全集免费高清| 女孩刮到男生车双方划拳私了| 犯罪都市3 电影| 伦理片女律师的堕落| 娘妻在线播放观看完整版| 奔跑吧兄弟| 蜡笔小新第一季国语在线观看| 水电工艳遇| 与老公上司偷情免费看| 炎亚纶和耀乐影片| 十二生肖电视剧| 胜女的代价2演员表| 美国电影禁忌4| 我的公主国语版| 分娩按摩4中文版免费观看| 澡堂老板家的男人们| 告诉我你想要什么 电影免费观看| 一生一世白鹿免费观看| 食物链9大尺寸| 高清直到黎明未删减| 向阳花电影在线观看免费版| 《乡情》罗丽·星克莱尔主演的 | 《保罗1980》完整版| 浪漫满屋泰国版| 竹马是消防员未增减资源| 高清我独自蜜月未删减| 1995年意大利| 初五启市录粤语版| 玉米地强免费观看| 一梦如初电视剧免费观看完整版| 北越暴行电影2| 姐姐的朋友5有翻译怎样免费观看| 快播韩国电影| 开放性成人交友网站| 嘉兴市| 麻生香织黑肌泣BD在线| 争宠之妃位攻略短剧全集| 我的中国心 伴奏| 电视剧流金岁月| 美丽的小蜜蜂3| 香港仔粤语免费观看完整版| 陆贞传奇在线观看免费全集高清| 跑男最新一季| 辉县市| 歼灭天际线日韩版最新消息 | 和你在一起乔任梁| 斗罗大陆145集| 《公的浮之手中字》| XL司令印度| 小狐狸发明记主题曲| 动漫烟花| 非人哉のエロ动漫| 家庭矛盾4麦乐迪在线 | 电视剧民国大侦探在线观看完整版| 愁愁愁电视剧高清免费观看| jizzm日本| 梅花三弄鬼丈夫电视剧免费观看| 不要向下看| 《瑜伽教练》无删减| 《高血压监狱3》电影法国版在线观看| 五感图 下载| 潜伏电视剧在线观看| 原来的神马电影在线观看免费| 榆树市| 胡志明市2高清免费观看| 张雨绮4分钟未删减版| 电影韩国太太的告白| 安倍中枪瞬间曝光:捂胸口跪地倒下| 凯登克劳斯电影大全在线观看完整版| 法国高压监狱3完整版| 仙踪林 在线观看| 渗透全集| 布鲁克读大学满天星版| 汪峰春天里| 连续剧甄嬛传| 有菜和枫哥共同演出叫什么| 《狂舞尸城》电影在线观看完整免费| 左宗棠电视剧20集全集免费观看| 阳光姐妹| 凯帕克63部电影合集在线观看| 荣誉守则成人版高清资源| 熊出没第一季免费观看| 星际传奇3高清| 学生的妈妈| 需要爸爸播种手机在线观看| 半夜被C醒是一种什么体验| 黑色星期五1电影| 我的妈妈日语| 地狱来的芳邻| 铿锵锵锵锵锵锵锵免费观看| 贞女烈女豪放女| 常在你左右免费观看国语| 《蛟龙行动》在线观看高清电影| 林正英僵尸电影全集国语高清| 荣誉守则在线| 神探狄仁杰 第四部| 上司侵犯人妻中文字幕熟女| 二人世界免费观看高清动画| 激战酒店1-9集全部播放时间| 销冠的秘密2在线看| 思春期s行| 单身妈妈3高清全集在线观看| 老赵抱着媛媛在厨房做饭视频大全| 酒店激战第1-5集免费观看李丽珍| R片| 我的ps搭档 完整版| 《花与蛇3》| 爱丫爱丫免费观看电视剧剧情| 《女律师替丈夫还钱》电影中文版 | 夫妻的世界完整版免费观看| 三年中国片在线高清观看| 时代少年团我们喜欢你| 超危保镖电影完整版免费| 太上天尊短剧免费观看| 冰冷热带鱼 手机在线观看| 蒋玲玲版《渔夫的荒野史记》电影医ww| 假面骑士免费看| 梦中犯人| 乡村爱情小夜曲第6部| 呼噜小精灵第3季全集| 动感之星视频全集观看| 匆匆那年| 勇者王粤语| 曾经想火| 审查元素| xl司令第二季全集免费观看动漫| 早田希娜4-0帕瓦德夺冠| 高清《当哒当:邪视》电影| 电竞国家集训队集体亮相| 只有你韩剧| 日本伦理片女律师的多落| 夫妻成长日记全集| 极品教师第三季在线观看完整版| 龙马精神免费高清观看完整版| 盗墓笔记电视剧| 激战丛林 在线| 保险女王的秘密| 西域男孩mylove| 枭起青壤在线免费观看| 死亡诗社| 本乡爱电影免费观看平台| 妲己np从小被c到大| 浪漫满屋泰国版12| 爱在旅途电视剧| 宴遇永安 电视剧 在线观看| 美妙发型屋韩国| 滴血玫瑰演员表| 粉红女郎百度影音| 新警事电视剧| 六扇门之沦陷| 义姐是| 《黏糊糊的你》| 龙兄鼠弟| 重生之商业帝国| 爱的解脱| 急诊护士电影免费观看完整版| 《混血摇篮曲》在线播放| 终极猎杀| 姐姐4韩国电影| dasd-409| 黎川县| 继拇做爰3| 骄阳似火电视剧全集在线观看| 人蛇欲血战之错体美女蛇| 斗罗大陆51集| 禅宗少林音乐大典| 巨茎进入李淑芬视频| 银魂200| 二人转全集正戏| 一千滴眼泪电视连续剧在线观看| 守卫者-浮出水面| 公之浮手| 凯登克罗斯的电影免费观看| 《我要再来一次》完整版在线观看 | 金钱帝国粤语高清| 《蛟龙行动》在线观看高清电影| 香港tvb粤语免费观看| 漂亮娇妻被社长驯服| 一起愁愁全40集免费观看高清| 麦香电视剧剧情介绍| 熊出没之过年全集| 农场主和他的三个女儿们| 让子弹飞解密| 女保镖丽萨满天星| 肉蒲团极乐宝鉴| 高清《亲爱的》在线观看电视剧免费| 韩国电影《归来的风》免费播放| 出租屋性事| 束缚游戏真人| 《可疑诊疗室:特殊待遇》8| 尼古拉斯凯奇电影| 火口的两人全集免费观看| 不被爱也没关系| 鮎川なお| 黑白配中文版全集在线观看免费| 朱茵全家上综艺| 光辉岁月无吉他伴奏| 都铎王朝第一季qvod| 东北黑道风云二十年电视剧| 黛比浪漫女家教1-6季 电视剧 | 巜交换性伴侣3中字| 盗墓笔记重启免费观看完整版| 终结的后宫| 秘密花园免费版| 《爱我几何》莫妮卡原版免费观看| 塔日酒店未删减版在线观看| 报告老板之豪言壮旅06| 擦枪走火电影完整版| 东京卍复仇者| 《偷香》未删减在线观看| 丰满的继牳5伦A片在线| 儿子妈妈免费观看电视剧| 马嘉祺刘耀文玩游戏VLOG| 切糕段子| 惊蛰之谍战深海| 朴亚珍| 马蒂达尔梅满天星| 沙琪玛妈妈吃蜡瓶糖冰| 网球王子全国大赛国语版| 人形少女 快播| 冬至电视剧黄景瑜孙千免费观看| 《倔强退魔师》| 绿草地免费| 美国队长4免费观看完整版| 凶猛的办公室| 我要看免费的| 满天星HD版女超人| 私人航空免费观看完整版| 牧神记第62集在线观看| 请别相信他免费喜剧电影在线观看| 直销堂网| 妈妈的男朋友5集理论| 《八尺夫人》完整版免费看| 交易凯登克罗斯的电影| 金钱帝国粤语版| 且试天下第45集全集免费| 《纣王妲己》全集观看| 二毛驴传奇 电视剧全集免费观看| 女超人满天星版在线观看| 369免费电影。你懂得| 电视剧产科男医生全集| 禁忌II| 杜十娘电影| nhdta系列媚药系列| omoflow第一季真人中语| 完美搭配2韩版| 光荣大地电视剧全集在线观看| 回复术士之重启人生| 《巡回检察组》在线观看| 《总统的蛋糕》| 姜素拉金牌销售的秘密2| 《上流社会》林智妍| 糟糠之妻不可欺| 恰好是少年在线观看| 午间天气预报| 一起愁愁愁免费观看完整在线看| 30分钟插曲视频大全免费播放国语| 我可能不会爱你 全集| 紫川第二季免费观看| 《活着2:丧尸危机》免费播放| 人间正道电视剧| xl司令免费全集观看| 战狼6免费观看完整版国语在线下载电影 | 一个真正的女人| 巨茎挺进李淑芬高清视频-迅雷看看在| 村妓K8经典网| 狂飙未删减电视剧全集免费播放| 大梦聊斋之婴宁| 年轻的阿姨5中字电影| 离婚协议电视剧全集| 《送醉酒同学回家》| 被侵犯的美女教师天海翼| 青春期失乐园全集| 可惜不是你陪我到最后| 香醇的绣感吴绮珊| 终极格斗| 薛佳凝淡出娱乐圈的原因| 樊振东爆冷出局| 无颜之月免费观看完整| 乌鲁木齐市| 分娩按摩在线| 高清《英雄百夜》电影| 薄冰 电视剧| 熊出没之夺宝熊兵电影| 《弗兰茨》| 电影《推油》完整版免费观看 | 《家属》| 花与蛇1全集| 1819treejron| 吵闹的邻居| 惊天桃色劫完整版高清国语电影| 娱乐百分百20130221| 满天星1980在线观看| 蓝色隐形帽子完整版在哪看 | 李大霄:今天A股行情不太正常| 梅西被巴黎停赛两周| 寂寞电影| 插曲的痛30集全集免费| 酒店1-100集完整版| 法式鹅肝为什么那么大| 我们恋爱吧第6季在线观看免费| 电影小字辈完整版免费观看| 《南京照相馆》完整版在线观看| 意大利《激战丛林》电影免费观看| 男生女生一起愁愁愁愁愁电视剧在线观看 | 生活中马玛丽| 笑功震武林 影音| 日剧大度免费观看完整版高清| 飞虎出征电影| 木子檀电影免费观看2023| 她被搬运工侵犯未删减版在线播放| 麻生希的种子| 《再会~沉默的真相~》| 我们都是超能力者完整版电影| 《美景之屋6》_完整在线观看免费观看 | 《理想之城》全集观看| 1-5普通话版免费播放| 无法传达给你在线观看日剧 | 明成皇后国语版| 安斋拉拉在线观看| 正在播放: 解决学生的性爱烦恼不穿内衣裤的美波老师硬硬教学 波汐里 中文本幕 | 下辈子做你的女人剧情简介| 电影不能错过的只有你免费观看| 朋友互换| 大胸姐姐3| 猩疯血雨未删减| 我的团长我的团全集下载| 下半场 微电影| 《我的老师中字ID》9| 女教师动漫全集ova无修| 正在播放: JUQ-150 五日无夫,命禁欲至初一夜。不想要的政治联姻,岳父的目标是 | 《朱雀堂》电视剧全集免费观看下载| 我在秋斩刑场当缝尸人那些 年| 爱情公寓第五季| 《酒店》1-90集免费观看| 《法国空乘10》| 斗罗大陆148集在线观免费观看| 绝密行动电视剧全集免费播放| 鬼吹灯之精绝古城在线| 一人之下第五季在线观看| 呈贡县| 美国电影《荒岛女儿国》在线观看 | 第八种爱情| 好男儿之情感护理| 姐妹牙医完整版 在线观看| 西游之诸神之战免费播放在线观看 | 学警雄心国语| 蒋玲玲版《渔夫的荒野史记》完整版| 已婚妇女的下午中字| 未成年在线观看播放| 斗破苍穹年番第四集| 爱不爱都是错| 异世刀剑笑| 你妈妈也一样| 女版壮志凌云hr法版| 古堡女仆在线观看| 少女免费高清在线观看| 高清《祝你好运》电影在线观看国语| 伊人网站在线观看| 足球小将初中篇|