改變嵌軟開發(fā)思維方式之:狀態(tài)機的三種實現(xiàn)方法

嵌入式大雜燴 2021-09-15 22:53

關(guān)注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!

作者 | Alicedodo

上一篇推文:咱們是時候改變一下嵌入式軟件開發(fā)思維方式了!提到了狀態(tài)機。在之前的推文中:干貨 | 嵌入式之狀態(tài)機編程。有簡單介紹了狀態(tài)機的示例。這次我們一起來學習C語言實現(xiàn)狀態(tài)機的三種方法解析。

狀態(tài)機的實現(xiàn)無非就是 3 個要素:狀態(tài)事件響應(yīng)。轉(zhuǎn)換成具體的行為就 3 句話。

  • 發(fā)生了什么事?
  • 現(xiàn)在系統(tǒng)處在什么狀態(tài)?
  • 在這樣的狀態(tài)下發(fā)生了這樣的事,系統(tǒng)要干什么?

用 C 語言實現(xiàn)狀態(tài)機主要有 3 種方法:switch—case 法表格驅(qū)動法函數(shù)指針法

switch—case 法

狀態(tài)用 switch—case 組織起來, 將事件也用switch—case 組織起來, 然后讓其中一個 switch—case 整體插入到另一個 switch—case 的每一個 case 項中  。

「程序清單 List4  :」

switch(StateVal)
{
    case S0:
  switch(EvntID)
  {
   case E1:
    action_S0_E1(); /*S0 狀態(tài)下 E1 事件的響應(yīng)*/
    StateVal = new state value;/*狀態(tài)遷移,不遷移則沒有此行*/
    break;
   case E2:
    action_S0_E2(); /*S0 狀態(tài)下 E2 事件的響應(yīng)*/
    StateVal = new state value;
    break;
   ......
   case Em:
    action_S0_Em(); /*S0 狀態(tài)下 Em 事件的響應(yīng)*/
    StateVal = new state value;
    break;
   default:
    break;
  }
  break;
    case S1:
  ......
  break;
    ......
    case Sn:
  ......
  break;
    default:
  break;
}

上面的偽代碼示例只是通用的情況,實際應(yīng)用遠沒有這么復(fù)雜。雖然一個系統(tǒng)中事件可能有很多種,但在實際應(yīng)用中,許多事件可能對某個狀態(tài)是沒有意義的。

例如在程序清單 List4中,如果 E2、······ Em 對處在 S0 狀態(tài)下的系統(tǒng)沒有意義,那么在 S0 的 case 下有關(guān)事件E2、······ Em 的代碼根本沒有必要寫,狀態(tài) S0 只需要考慮事件 E1 的處理就行了。

既然是兩個 switch—case 之間的嵌套, 那么就有一個誰嵌套誰的問題, 所以說 switch—case法有兩種寫法:狀態(tài)嵌套事件事件嵌套狀態(tài)。這兩種寫法都可以, 各有利弊, 至于到底選用哪種方式就留給設(shè)計人員根據(jù)具體情況自行決斷吧。

關(guān)于 switch—case 法還有最后一點要說明, 因為 switch—case 的原理是從上到下挨個比較,越靠后,查找耗費的時間就越長,所以要注意狀態(tài)和事件在各自的 switch 語句中的安排順序,不推薦程序清單 List4 那樣按順序號排布的方式。出現(xiàn)頻率高或者實時性要求高的狀態(tài)和事件的位置應(yīng)該盡量靠前。

表格驅(qū)動法

如果說 switch—case 法是線性的,那么表格驅(qū)動法則是平面的。表格驅(qū)動法的實質(zhì)就是將狀態(tài)和事件之間的關(guān)系固化到一張二維表格里, 把事件當做縱軸,把狀態(tài)當做橫軸,交點[Sn , Em]則是系統(tǒng)在 Sn 狀態(tài)下對事件 Em 的響應(yīng)  。

如圖 4, 我把表格中的 Node_SnEm 叫做狀態(tài)機節(jié)點, 狀態(tài)機節(jié)點 Node_SnEm 是系統(tǒng)在 Sn狀態(tài)下對事件 Em 的響應(yīng)。這里所說的響應(yīng)包含兩個方面:輸出動作和狀態(tài)遷移。狀態(tài)機節(jié)點一般是一個類似程序清單 List5 中的結(jié)構(gòu)體變量 。

struct fsm_node
{

    void (*fpAction)(void* pEvnt);
    INT8U u8NxtStat;
};

程序清單 List5 中的這個結(jié)構(gòu)體有兩個成員:fpAction 和 u8NxtStat。fpAction 是一個函數(shù)指針, 指向一個形式為 void func(void * pEvnt)的函數(shù), func 這個函數(shù)是對狀態(tài)轉(zhuǎn)移中動作序列的標準化封裝。

也就是說, 狀態(tài)機在狀態(tài)遷移的時候, 不管輸出多少個動作、操作多少個變量、調(diào)用多少個函數(shù),這些行為統(tǒng)統(tǒng)放到函數(shù) func 中去做。

把動作封裝好了之后,再把封裝函數(shù) func 的地址交給函數(shù)指針 fpAction,這樣,想要輸出動作,只需要調(diào)用函數(shù)指針 fpAction 就行了。

再看看上面的 func 函數(shù),會發(fā)現(xiàn)函數(shù)有一個形參 pEvnt,這是一個類型為 void * 的指針, 在程序?qū)嶋H運行時指向一個能存儲事件的變量,通過這個指針我們就能獲知關(guān)于事件的全部信息,這個形參是很有必要的。事件一般包括兩個屬性:事件的類型和事件的內(nèi)容。

例如一次按鍵事件,我們不僅要知道這是一個按鍵事件,還要知道按下的到底是哪個鍵。事件的類型和狀態(tài)機當前的狀態(tài)可以讓我們在圖 4 的表格中迅速定位,確定該調(diào)用哪個動作封裝函數(shù), 但是動作封裝函數(shù)要正確響應(yīng)事件還需要知道事件的內(nèi)容是什么, 這也就是形參pEvnt 的意義。

由于事件的多樣性,存儲事件內(nèi)容的數(shù)據(jù)格式不一定一樣,所以就把 pEvnt 定義成了 void * 型,以增加靈活性。有關(guān) fpAction 的最后一個問題:如果事件 Em 對狀態(tài) Sn 沒有意義,那么狀態(tài)機節(jié)點Node_SnEm 中的 fpAction 該怎么辦?我的答案是:那就讓它指向一個空函數(shù)唄!前面不是說過么,什么也不干也叫響應(yīng)。

u8NxtStat 存儲的是狀態(tài)機的一個狀態(tài)值。我們知道, 狀態(tài)機響應(yīng)事件要輸出動作, 也就是調(diào)用函數(shù)指針 fpAction 所指向的那個封裝函數(shù), 函數(shù)調(diào)用完畢后程序返回主調(diào)函數(shù), 狀態(tài)機對事件的響應(yīng)就算結(jié)束了, 下一步就要考慮狀態(tài)遷移的問題了。

可能要保持本狀態(tài)不變, 也可能要遷移到一個新的狀態(tài),該如何抉擇呢?u8NxtStat 存儲的狀態(tài)就是狀態(tài)機想要的答案!

圖 4 的這張表格反映在 C 語言代碼里就是一個二維數(shù)組,第 1 維就是狀態(tài)機的狀態(tài),第 2維就是統(tǒng)一分類的事件,而數(shù)組的元素則是程序清單 List5 中的結(jié)構(gòu)體常量。如果程序中使用表格驅(qū)動法,還需要注意一些特別的事項。要將狀態(tài)當做表格的橫軸,那么就要求狀態(tài)值集合必須滿足以下條件:

(1) 該集合是一個遞增的等差整數(shù)數(shù)列

(2) 該數(shù)列初值為 0

(3) 該數(shù)列等差值為 1

“事件” 作為縱軸,其特點和要求與用來做橫軸的“狀態(tài)” 完全一致。在 C 語言提供的數(shù)據(jù)類型中, 沒有比枚舉更符合以上要求的可選項了, 極力推薦將狀態(tài)集合和事件類型集合做成枚舉常量表格驅(qū)動法的優(yōu)點:調(diào)用接口統(tǒng)一 ,定位快速。

表格驅(qū)動法屏蔽了不同狀態(tài)下處理各個事件的差異性,因此可以將處理過程中的共性部分提煉出來,做成標準統(tǒng)一的框架式代碼,形成統(tǒng)一的調(diào)用接口。根據(jù)程序清單 List5 中的狀態(tài)機節(jié)點結(jié)構(gòu)體,做成的框架代碼如程序清單 List6 所示。

表格驅(qū)動法查找目標實際上就是一次二維數(shù)組的尋址操作,所以它的平均效率要遠高于switch—case 法。

「程序清單 List6  :」

extern struct fsm_node g_arFsmDrvTbl[][]; /*狀態(tài)機驅(qū)動表格*/
INT8U u8CurStat = 0/*狀態(tài)暫存*/
INT8U u8EvntTyp = 0/*事件類型暫存*/
void* pEvnt = NULL/*事件變量地址暫存*/
struct fsm_node stNodeTmp = {NULL0}; /*狀態(tài)機節(jié)點暫存*/
u8CurStat = get_cur_state(); /*讀取當前狀態(tài)*/
u8EvntTyp = get_cur_evnt_typ(); /*讀取當前觸發(fā)事件類型*/
pEvnt = (void*)get_cur_evnt_ptr(); /*讀取事件變量地址*/
stNodeTmp = g_arFsmDrvTbl[u8CurStat ][u8EvntTyp ];/*定位狀態(tài)機節(jié)點*/
stNodeTmp.fpAction(pEvnt ); /*動作響應(yīng)*/
set_cur_state(stNodeTmp.u8NxtStat); /*狀態(tài)遷移*/
.....

表格驅(qū)動法好則好矣,但用它寫出來的程序還有點兒小問題,我們先來看看按照表格驅(qū)動法寫出來的程序有什么特點 。

前面說過,表格驅(qū)動法可以把狀態(tài)機調(diào)度的部分做成標準統(tǒng)一的框架代碼,這個框架適用性極強, 不管用狀態(tài)機來實現(xiàn)什么樣的應(yīng)用, 框架代碼都不需要做改動, 我們只需要根據(jù)實際應(yīng)用場合規(guī)劃好狀態(tài)轉(zhuǎn)換圖,然后將圖中的各個要素(狀態(tài)、事件、動作、遷移,有關(guān)“條件”要素一會兒再說)用代碼實現(xiàn)就行了,我把這部分代碼稱作應(yīng)用代碼。

在應(yīng)用代碼的.c 文件中, 你會看到一個聲明為 const 的二維數(shù)組, 也就是圖 4 所示的狀態(tài)驅(qū)動表格, 還會看到許多彼此之間毫無關(guān)聯(lián)的函數(shù), 也就是前面提到的動作封裝函數(shù)。這樣的一份代碼, 如果手頭上沒有一張狀態(tài)轉(zhuǎn)換圖, 讓誰看了也會一頭霧水, 這樣的格式直接帶來了代碼可讀性差的問題。

如果我們想給狀態(tài)機再添加一個狀態(tài),反映到代碼上就是給驅(qū)動表格再加一列內(nèi)容,同時也要新添加若干個動作封裝函數(shù)。如果驅(qū)動表格很大, 做這些工作是很費事兒的, 而且容易出錯。如果不小心在數(shù)組中填錯了位置, 那么程序跑起來就和設(shè)計者的意圖南轅北轍了,

遠沒有在 switch—case 法中改動來得方便、安全。上面說的只是小瑕疵, 其實最讓我不爽的是表格驅(qū)動法不能使用干貨 | 嵌入式之狀態(tài)機編程 中 g_stFSM那樣的 Extended State Machine(對這個詞組還有印象吧?)!Extended State Machine 的最大特點就是狀態(tài)機響應(yīng)事件之前先判斷條件,根據(jù)判定結(jié)果選擇執(zhí)行哪些動作,轉(zhuǎn)向哪個狀態(tài)。

也就是說,系統(tǒng)在狀態(tài) Sn 下發(fā)生了事件 Em 后,轉(zhuǎn)向的狀態(tài)不一定是唯一的,這種靈活性是 Extended State Machine 的最有價值的優(yōu)點。

回過頭來看看程序清單 List5 中給出的狀態(tài)機節(jié)點結(jié)構(gòu)體,如果系統(tǒng)在狀態(tài) Sn 下發(fā)生了事件 Em, 狀態(tài)機執(zhí)行完 fpAction 所給出的動作響應(yīng)之后, 必須轉(zhuǎn)到 u8NxtStat 指定的狀態(tài)。

表格驅(qū)動法的這個特性直接杜絕了 Extended State Machine 在表格驅(qū)動法中應(yīng)用的可能性, 所以表格驅(qū)動法的代碼實現(xiàn)中不存在“條件” 這個狀態(tài)機要素。ESM,你是如此的優(yōu)秀,我怎么舍得拋棄你 ?!

再看圖 4 所示的表格驅(qū)動法示例圖,如果我們把表格中的代表事件的縱軸去掉,只留下代表狀態(tài)的橫軸,將一列合并成一格,前文提到的問題是不是能得到解決呢?不錯!這就是失傳江湖多年的《葵花寶典》 ——閹割版表格驅(qū)動法 !!

閹割版表格驅(qū)動法,又名壓縮表格驅(qū)動法,一維狀態(tài)表格與事件 switch—case 的合體。壓縮表格驅(qū)動法使用了一維數(shù)組作為驅(qū)動表格,數(shù)組的下標即是狀態(tài)機的各個狀態(tài)。

表格中的元素叫做壓縮狀態(tài)機節(jié)點, 節(jié)點的主要內(nèi)容還是一個指向動作封裝函數(shù)的函數(shù)指針, 只不過這個動作封裝函數(shù)不是為某個特定事件準備的, 而是對所有的事件都有效的。

節(jié)點中不再強制指定狀態(tài)機輸出動作完畢后所轉(zhuǎn)向的狀態(tài), 而是讓動作封裝函數(shù)返回一個狀態(tài), 并把這個狀態(tài)作為狀態(tài)機新的狀態(tài)。

壓縮表格驅(qū)動法的這個特點, 完美的解決了 Extended State Machine 不能在表格驅(qū)動法中使用的問題 。

程序清單 List7 中的示例代碼包含了壓縮狀態(tài)機節(jié)點結(jié)構(gòu)體和狀態(tài)機調(diào)用的框架代碼。

「程序清單 List7:」

struct fsm_node /*壓縮狀態(tài)機節(jié)點結(jié)構(gòu)體*/
{

 INT8U (*fpAction)(void* pEvnt); /*事件處理函數(shù)指針*/
 INT8U u8StatChk; /*狀態(tài)校驗*/
};
......
u8CurStat = get_cur_state(); /*讀取當前狀態(tài)*/
......
if(stNodeTmp.u8StatChk == u8CurStat )
{
 u8CurStat = stNodeTmp.fpAction(pEvnt ); /*事件處理*/
 set_cur_state(u8CurStat ); /*狀態(tài)遷移*/
}
else
{
 state_crash(u8CurStat ); /*非法狀態(tài)處理*/
}
.....

對照程序清單 List5,就會發(fā)現(xiàn)程序清單 List7 中 struct fsm_node 結(jié)構(gòu)體的改動之處。首先, fpAction 所指向函數(shù)的函數(shù)形式變了,動作封裝函數(shù) func 的模樣成了這樣的了:

INT8U func(void * pEvnt);

現(xiàn)在的動作封裝函數(shù) func 是要返回類型為 INT8U 的返回值的,這個返回值就是狀態(tài)機要轉(zhuǎn)向的狀態(tài), 也就是說, 壓縮表格驅(qū)動法中的狀態(tài)機節(jié)點不負責狀態(tài)機新狀態(tài)的確定, 而把這項任務(wù)交給了動作封裝函數(shù) func, func 返回哪個狀態(tài), 狀態(tài)機就轉(zhuǎn)向哪個狀態(tài)。

新狀態(tài)由原來的常量變成了現(xiàn)在的變量,自然要靈活許多。上面說到現(xiàn)在的動作封裝函數(shù) func 要對當前發(fā)生的所有的事件都要負責, 那么 func 怎么會知道到底是哪個事件觸發(fā)了它呢?看一下 func 的形參 void * pEvnt 。

在程序清單 List5 中我們提到過,這個形參是用來向動作封裝函數(shù)傳遞事件內(nèi)容的,但是從前文的敘述中我們知道, pEvnt 所指向的內(nèi)存包含了事件的所有信息, 包括事件類型和事件內(nèi)容 , 所以通過形參 pEvnt , 動作封裝函數(shù) func 照樣可以知道事件的類型。

程序清單 List7 中 struct fsm_node 結(jié)構(gòu)體還有一個成員 u8StatChk , 這里面存儲的是狀態(tài)機 的一個狀態(tài),干什么用的呢?玩 C 語言數(shù)組的人都知道,要嚴防數(shù)組尋址越界

要知道,壓縮表格驅(qū)動法的驅(qū)動表格是一個以狀態(tài)值為下標的一維數(shù)組, 數(shù)組元素里面最重要的部分就是一個個動作封裝函數(shù)的地址。

函數(shù)地址在單片機看來無非就是一段二進制數(shù)據(jù), 和內(nèi)存中其它的二進制數(shù)據(jù)沒什么兩樣,不管程序往單片機 PC 寄存器里塞什么值,單片機都沒意見。假設(shè)程序由于某種意外而改動了存儲狀態(tài)機當前狀態(tài)的變量,使變量值變成了一個非法狀態(tài)。

再發(fā)生事件時, 程序就會用這個非法的狀態(tài)值在驅(qū)動表格中尋址, 這時候就會發(fā)生內(nèi)存泄露,程序拿泄露內(nèi)存中的未知數(shù)據(jù)當函數(shù)地址跳轉(zhuǎn),不跑飛才怪!

為了防止這種現(xiàn)象的發(fā)生, 壓縮狀態(tài)機節(jié)點結(jié)構(gòu)體中又添加了成員 u8StatChk 。u8StatChk中存儲的是壓縮狀態(tài)機節(jié)點在一維驅(qū)動表格的位置, 例如某節(jié)點是表格中的第 7 個元素, 那么這個節(jié)點的成員 u8StatChk 值就是 6。

看一下程序清單 List7 中的框架代碼示例, 程序在引用函數(shù)指針 fpAction 之前, 先檢查當前狀態(tài)和當前節(jié)點成員 u8CurStat 的值是否一致,一致則認為狀態(tài)合法,事件正常響應(yīng),如果不一致,則認為當前狀態(tài)非法,轉(zhuǎn)至意外處理,最大限度保證程序運行的安全。當然,如果泄露內(nèi)存中的數(shù)據(jù)恰好和 u8CurStat 一致,那么這種方法真的就回天乏力了。

還有一個方法也可以防止狀態(tài)機跑飛,如果狀態(tài)變量是枚舉,那么框架代碼就可以獲知狀態(tài)值的最大值, 在調(diào)用動作封裝函數(shù)之前判斷一下當前狀態(tài)值是否在合法的范圍之內(nèi), 同樣能保證狀態(tài)機的安全運行。

壓縮表格驅(qū)動法中動作封裝函數(shù)的定義形式我們已經(jīng)知道了,函數(shù)里面到底是什么樣子的呢?程序清單 List8 是一個標準的示例。

「程序清單List8:」

INT8U action_S0(void* pEvnt)
{
 INT8U u8NxtStat = 0;
 INT8U u8EvntTyp = get_evnt_typ(pEvnt);
 switch(u8EvntTyp )
 {
  case E1:
   action_S0_E1(); /*事件 E1 的動作響應(yīng)*/
   u8NxtStat = new state value; /*狀態(tài)遷移,不遷移也必須有本行*/
   break;
   ......
  case Em:
   action_S0_Em(); /*事件 Em 的動作響應(yīng)*/
   u8NxtStat = new state value; /*狀態(tài)遷移,不遷移也必須有本行*/
   break;
  default:
   ; /*不相關(guān)事件處理*/
   break;
 }
 return u8NxtStat ; /*返回新狀態(tài)*/
}

從程序清單 List8 可以看出, 動作封裝函數(shù)其實就是事件 switch—case 的具體實現(xiàn)。函數(shù)根據(jù)形參 pEvnt 獲知事件類型, 并根據(jù)事件類型選擇動作響應(yīng), 確定狀態(tài)機遷移狀態(tài), 最后將新的狀態(tài)作為執(zhí)行結(jié)果返回給框架代碼。

有了這樣的動作封裝函數(shù), Extended State Machine 的應(yīng)用就可以完全不受限制了!到此,有關(guān)壓縮表格驅(qū)動法的介紹就結(jié)束了。

個人認為壓縮表格驅(qū)動法是相當優(yōu)秀的,它既有表格驅(qū)動法的簡潔、高效、標準,又有 switch—case 法的直白、靈活、多變,相互取長補短,相得益彰。

函數(shù)指針法

上面說過,用 C 語言實現(xiàn)狀態(tài)機主要有 3 種方法(switch—case 法、表格驅(qū)動法、函數(shù)指針法), 其中函數(shù)指針法是最難理解的, 它的實質(zhì)就是把動作封裝函數(shù)的函數(shù)地址作為狀態(tài)來看待。不過,有了之前壓縮表格驅(qū)動法的鋪墊,函數(shù)指針法就變得好理解了,因為兩者本質(zhì)上是相同的。

壓縮表格驅(qū)動法的實質(zhì)就是一個整數(shù)值(狀態(tài)機的一個狀態(tài))到一個函數(shù)地址(動作封裝函數(shù))的一對一映射, 壓縮表格驅(qū)動法的驅(qū)動表格就是全部映射關(guān)系的直接載體。在驅(qū)動表格中通過狀態(tài)值就能找到函數(shù)地址,通過函數(shù)地址同樣能反向找到狀態(tài)值。

我們用一個全局的整型變量來記錄狀態(tài)值,然后再查驅(qū)動表格找函數(shù)地址,那干脆直接用一個全局的函數(shù)指針來記錄狀態(tài)得了,還費那勞什子勁干嗎?!這就是函數(shù)指針法的前世今生。

用函數(shù)指針法寫出來的動作封裝函數(shù)和程序清單 List8 的示例函數(shù)是很相近的, 只不過函數(shù)的返回值不再是整型的狀態(tài)值, 而是下一個動作封裝函數(shù)的函數(shù)地址, 函數(shù)返回后, 框架代碼再把這個函數(shù)地址存儲到全局函數(shù)指針變量中。

相比壓縮表格驅(qū)動法,在函數(shù)指針法中狀態(tài)機的安全運行是個大問題,我們很難找出一種機制來檢查全局函數(shù)指針變量中的函數(shù)地址是不是合法值。如果放任不管, 一旦函數(shù)指針變量中的數(shù)據(jù)被篡改,程序跑飛幾乎就不可避免了。

小節(jié)

有關(guān)狀態(tài)機的東西說了那么多,相信大家都已經(jīng)感受到了這種工具的優(yōu)越性,狀態(tài)機真的是太好用了!其實我們至始至終講的都是有限狀態(tài)機(Finite State Machine 現(xiàn)在知道為什么前面的代碼中老是有 fsm 這個縮寫了吧!), 還有一種比有限狀態(tài)機更 NB 更復(fù)雜的狀態(tài)機, 那就是層次狀態(tài)機(Hierarchical State Machine 一般簡寫為 HSM)。

通俗的說,系統(tǒng)中只存在一個狀態(tài)機的叫做有限狀態(tài)機,同時存在多個狀態(tài)機的叫做層次狀態(tài)機(其實這樣解釋層次狀態(tài)機有些不嚴謹, 并行狀態(tài)機也有多個狀態(tài)機, 但層次狀態(tài)機各個狀態(tài)機之間是上下級關(guān)系,而并行狀態(tài)機各個狀態(tài)機之間是平級關(guān)系)。

層次狀態(tài)機是一種父狀態(tài)機包含子狀態(tài)機的多狀態(tài)機結(jié)構(gòu),里面包含了許多與面向?qū)ο笙嗨频乃枷耄?所以它的功能也要比有限狀態(tài)機更加強大, 當一個問題用有限狀態(tài)機解決起來有些吃力的時候, 就需要層次狀態(tài)機出馬了。

層次狀態(tài)機理論我理解得也不透徹, 就不在這里班門弄斧了,大家可以找一些有關(guān)狀態(tài)機理論的專業(yè)書籍來讀一讀。要掌握狀態(tài)機編程,理解狀態(tài)機(主要指有限狀態(tài)機)只是第一步,也是最簡單的一步,更重要的技能是能用狀態(tài)機這個工具去分析解剖實際問題:劃分狀態(tài)、 提取事件、 確定轉(zhuǎn)換關(guān)系、規(guī)定動作等等,形成一張完整的狀態(tài)轉(zhuǎn)換圖,最后還要對轉(zhuǎn)換圖進行優(yōu)化,達到最佳。

把實際問題變成了狀態(tài)轉(zhuǎn)換圖, 工作的一大半就算完成了, 這個是具有架構(gòu)師氣質(zhì)的任務(wù),剩下的問題就是按照狀態(tài)圖編程寫代碼了,這個是具有代碼工特色的工作。

本文來源網(wǎng)絡(luò)版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進行刪除。

往期推薦:

往期推薦



咱們是時候改變一下嵌入式軟件開發(fā)思維方式了!

什么是不完全類型?

C語言、嵌入式中幾個非常實用的宏技巧

干貨 | 淺析程序開機自啟動


嵌入式大雜燴 專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學習筆記,同時,內(nèi)包含大量的學習資源。歡迎關(guān)注,一同交流學習,共同進步!
評論
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產(chǎn)業(yè)園區(qū)里,暖通空調(diào)運行著廠商私有協(xié)議,照明系統(tǒng)遵循專屬通信標準,變配電、門禁安防各成體系——設(shè)備間數(shù)據(jù)壁壘森嚴,上位平臺對接全靠定制化 “翻譯” 開發(fā),不僅成本高企,交付周期也難以管控。這就是樓宇自控行業(yè)多年的痛點:協(xié)議林立、封閉林立。而破局的鑰匙,早在30多年前就已經(jīng)寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標準協(xié)議,BACnet是如今全球樓宇自控系統(tǒng)(BAS)互聯(lián)互通的“通用語言”。新風機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 279瀏覽
  • 摘要東莞市恒創(chuàng)連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產(chǎn)替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發(fā)。公司面向工業(yè)自動化、新能源儲能、BMS、汽車電子、AI服務(wù)器、GPU供電、通信設(shè)備、醫(yī)療設(shè)備和智能家居等場景,提供從產(chǎn)品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創(chuàng)可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產(chǎn)替代評估。常見替
    HC003 2026-08-07 10:14 250瀏覽
  • 一、方案簡介在Buildroot構(gòu)建的嵌入式Linux系統(tǒng)中部署Flutter應(yīng)用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發(fā)需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現(xiàn)渲染,無需依賴桌面環(huán)境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 234瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 224901瀏覽
  • 在物聯(lián)網(wǎng)從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進程中,LTE Cat.1憑借其在速率、成本與網(wǎng)絡(luò)覆蓋之間的完美平衡,正成為中低速物聯(lián)網(wǎng)市場的絕對主力。隨著2G/3G網(wǎng)絡(luò)的逐步退網(wǎng)以及新國標對終端設(shè)備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關(guān)鍵節(jié)點,基于華為海思Hi2131芯片設(shè)計的LTE Cat.1模組,憑借其在能效、射頻、架構(gòu)及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術(shù)優(yōu)勢:重塑Cat.1能效與連接標桿海
    用戶1778981989717 2026-08-05 21:04 211瀏覽
  • 在前六期中,我們已經(jīng)分別討論了 CRA 的適用范圍、整體影響、漏洞通報義務(wù)、風險評估與技術(shù)文檔證據(jù)鏈、第三方組件與 SBOM 供應(yīng)鏈治理,以及產(chǎn)品上市后的支持期、安全更新、用戶說明和終止支持管理。到這里,企業(yè)已經(jīng)能夠回答幾個核心問題:產(chǎn)品是否落入 CRA 適用范圍,產(chǎn)品由哪些組件構(gòu)成,企業(yè)如何證明自己在設(shè)計、開發(fā)和上市前采取了必要的安全措施,以及產(chǎn)品上市后如何持續(xù)維護和安全下線。但對于真正準備落地 CRA 合規(guī)的企業(yè)來說,還有一個更現(xiàn)實的問題:CRA 的法規(guī)條文相對原則化,企業(yè)應(yīng)當如何把“網(wǎng)絡(luò)安
    虹科云科技 2026-08-03 16:51 254611瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質(zhì)譜等實驗中,真正需要測量的信號往往只出現(xiàn)在一個很短的時間窗口內(nèi),卻被淹沒在遠大于它的噪聲和背景之中。 針對這類穩(wěn)定重復(fù)的微弱脈沖與瞬態(tài)信號,賽恩科儀為OE2052雙通道數(shù)字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數(shù)字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 35877瀏覽
  • 導(dǎo)語在現(xiàn)代高速數(shù)字電路設(shè)計中,信號的完整性已不僅是理想波形推演,而是一場與物理非理想特性正面博弈的工程實踐。濾波器芯片作為凈化傳輸鏈路的關(guān)鍵屏障,其核心挑戰(zhàn)在于:能否有效識別并濾除那些隱匿在電平跳變過程中的亞納秒級瞬態(tài)脈沖干擾,這類干擾持續(xù)極短,卻足以在高速鏈路中引發(fā)誤觸發(fā)。然而,傳統(tǒng)函數(shù)發(fā)生器受限于采樣率與邊沿速率,根本無法忠實復(fù)現(xiàn)如此狹窄且陡峭的異常波形。針對此困境,德思特TS-AWG7000系列任意波形發(fā)生器以17 GS/s采樣率與50 ps原生邊沿速度,為瞬態(tài)脈沖提供精細刻畫,配合SPG
    德思特測試測量 2026-08-05 14:06 5瀏覽
  • 做藍牙音箱的工程師大概都碰過這個局面。產(chǎn)品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網(wǎng)和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍牙一顆料、數(shù)傳藍牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 418瀏覽
  • 產(chǎn)品使用18V供電,配套4串鋰離子電池,需要設(shè)計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關(guān)型的充電控制芯片不穩(wěn)定。嘗試自行設(shè)計一個。整體采用分立三極管 + TL431架構(gòu),分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經(jīng) R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導(dǎo)通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 519瀏覽
  • 文:杜杰編輯:侯煜當?shù)貢r間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯(lián)邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設(shè)備——境外生產(chǎn)的先進機器人設(shè)備、境外生產(chǎn)的聯(lián)網(wǎng)電力逆變器。FCC在官方情況說明書中明確,該類境外制造產(chǎn)品,“會對美國國家安全或美國民眾的人身安全構(gòu)成無法承受的風險”。本次新規(guī)設(shè)置明確豁免機制:經(jīng)美國國防部(DoW)、電力逆變器品類經(jīng)美國國土安全部(DHS)審核并授予“有條件批準”,認定對應(yīng)設(shè)備品類不存在重大安全風險,即可獲得準入豁免。同時政策嚴格執(zhí)行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 371瀏覽
  • 做儲能項目,你是怎么選控制器的?隨著工商業(yè)儲能、電網(wǎng)側(cè)儲能的規(guī)模化落地,作為儲能EMS“大腦”的嵌入式控制器,直接決定了整套系統(tǒng)的運行穩(wěn)定性、數(shù)據(jù)可靠性與項目落地效率。不少從業(yè)者都踩過類似的坑:接口數(shù)量不足要額外加裝擴展模塊、戶外高溫導(dǎo)致設(shè)備宕機、電磁干擾引發(fā)數(shù)據(jù)丟包、軟件生態(tài)薄弱拖慢開發(fā)周期……選對儲能控制器,核心要盯準四個關(guān)鍵維度。首先看接口能力:全鏈路覆蓋,才是降本的核心。一套完整的儲能系統(tǒng),需要同時對接PCS、BMS、智能電表、溫濕度傳感器、除濕機、煙感消防主機,還要連接急停開關(guān)、斷路器
    飛凌嵌入式 2026-08-11 08:46 198瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學應(yīng)該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節(jié) 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應(yīng)該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創(chuàng)知音語音芯片 2026-08-07 14:44 248瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經(jīng)過十幾道精密工序。它內(nèi)部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產(chǎn)過程里哪怕0.1微米的誤差,都會直接廢掉整批產(chǎn)品,這也是小尺寸晶振過去長期依賴進口,國內(nèi)廠商花了十幾年才啃下量產(chǎn)硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 568瀏覽
我要評論
1
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 高清《奇迹》克劳| 锦鲤少女:旺夫旺家旺全族全集免费 | 绣春刀在线观看| 一起愁愁愁全部免费播放| 人口普查2021公布结果| 白峰电影正版免费观看平台| 妈妈的味道中文HD免费| 21世纪大君夫人全集观看| 韩日R| 成瀬心美| 苹果浴室3分钟视频| 夫妻交换电影| 派出所的故事| 《康体水疗》1978完整版在线观看| 七天电影| 牧神记40集全免费播放| 酒店实生3美国| ps搭档| 哇嘎电影免费播放高清| 幸福最晴天| 速度与激情2高清版| 芭比之森林公主| 激战丛林完整版免费国语在线观看| 《慢性呕吐实验室》高清免费完整| 神话优酷| 妈妈爱上儿子同学的结局| 黑势力国语| 最年轻的小妻子| 《激战丛林》电影在线观看意大利 | 妻子替夫还债| 夏天全集在线观看免费| 我朋友瘦子4| 感官的世界| 哇嘎电影免费看全集| 高清侦探先生,你的背包开着呢| 哆啦a梦礼物| 爱丫爱丫免费高清全集| 《主播女孩重度依赖》| 台湾版黛比浪漫家教第一季在线看 | 新白发魔女传主题曲叫什么| 这里的黎明静悄悄 电影| 一起愁愁免费观看完整版| 《他过分野》短剧全集完整免费| 木下檀檩子在线电影| 指环王在线观看| 大博弈电视剧免费播放| 活着韩国免费观看| 刑讯女烈| 向风而行免费观看全集| 少年派2全集免费观看完整版高清| 村妓经典k8| 恶魔幸存者第二季动漫| Ovflower全集免费观看| 国家命运电视剧全集在线观看| 娼 韩国电影| 混血儿的摇篮曲在线观看完整版| 怪医黑杰克剧场版| 爱我几何网址| 菲律宾玩火在线看完整版电影| 深海狂鲨3| 魔法圣婴百度影音| 我的女神室友| 我的错误第二季| 《法国少女农场》在线电影| 泰剧在线观看| 男女一起愁愁愁电视剧| 黑衣人3在线观看| 女大学生按摩在线观看| 《野外情欲》在线观看| 请用我的手指打扰你吧| 3d柔铺团之极宝乐鉴宝鉴电影虞书欣| 且试天下第45集全集免费| 一个好妈妈的d5申字中头| 黄飞鸿与十三姨| 妖精的尾巴02| 三线轮回电影| 午夜日皮| 维修工的绝遇3| 灭门惨案之孽杀电影| 4s44-cn战狼6免费高清版999加拿大版 | 使徒行者1电影版国语| 独孤天下电视连续剧免费观看 | 金瓶梅2电影在线观看| 愈快乐愈堕落粤语| 机器侠电影| 法国电影亲密| 姐姐动漫| 法国航空6| 成何体统动漫第二季| 同学的妈妈电影| 粉红的窗帘| 夫妻那些事在线| 大冰小将| 一路上有你2| 幸福美丽绽放剧情| 民国往事下载| 泗洪县| 我是特种兵2片尾曲叫什么| 女战狼6免费高清版| 希崎杰西卡 空姐| 《幸福花园》双男主动漫免费看 | 富兰克林 电影| 骄阳似我赵今麦电视剧全集 | 《约定》台剧| 长月烬明首播5集| 白月梵星高清免费电视剧| 爱我几何莫妮卡电影完整版| 灯草和尚聊斋| 秋瓷炫《生死决断》完整版 | 正在播放:#刘亦菲 情欲少妇与隔壁大爷的往年恋 - 17 | 行尸走肉第二季12集| 家庭瑜伽教师| 黄金瞳1-56集免费观看| 美国式保罗2 免费| 彩翼儿童美术| 小凤新婚下集精彩片段| 第八种爱情| 少女6少女大人| 敢梦有爱| 聊斋志异电影香港高清版| 辽宁卫视手机在线直播高清版| 天使的诱惑| 电影《青蛇》在线观看| 许我耀眼16集| 黑白配1080完整版免费观看 | 郡守与里长| mm的职业2免费观看完整版电影| 甜心特工| 满江红完整版观看免费| 郭达小品大全| 魔术师库诺看得见一切电视剧| 困惑的LANGM| 金大班电视剧| 电影 第一次| 美人龙汤全集| 行尸走肉第二季第二集| 张云熙电影在线观看| 漂亮的保姆韩国电影观看免费版 | 汉江怪物国语| 龙门镖局11| 东方不败在线观看| 巨星嫁到| 好好说话免费观看40集完整版| 我和黑帮大佬的365天无删节| 南洋十大邪术在线看| 1—5集普通话版免费播放下载 | 丁巴度电影在线看| 闪耀的她1-36集免费观看| 黄色影院| 速度与激情| 电影在线观看高清完整免费观看| 旋转的爱全集| 一人之下剧场版在线观看| 宁安如梦电视剧免费播放在线西瓜| 地铁惊魂2009| 电影八尺夫人 意大利 完整版免费观看 | 博人传292集在线观看| 无极电影高清免费观看| 美谷朱里| 八段锦完整口令教学| 廊桥遗梦在线观看| 囧妈免费播出| 史蒂夫乔布斯传 pdf| xl司令第一赛季真人版播放| 播放阿宝| 可爱多微电影| 激战后厨1至5外出| 钻石王老五的艰难爱情全集| 万王之王电影| 雨果 百度影音| 《朋友的娇妻》HD| 雷速登闪电冲线第3部全集| 《法国空乘8》观看| 小姐韩国免费观看完整版电影| 妈妈屈身儿子同学电影| 电影爱的色放在线观看| 边缘行者在线观看| 韩国情书第二季| 蜡笔小新电影国语| 妈妈14中字头强华驿大结局视频 | 两个母亲中字ID演员表爱人| 加索尔三兄弟| 《英雄》电影完整版| 霜花店电影完整版| 宫锁沉香结局| 洪真英被躁B在线观看| 万茜被曝遭遇婚姻危机| 逆天狂妃:邪王靠边站全集免费 | 天师钟馗3| 黑白配4黑白配在线观看免费高清| 葡萄姐姐| 吕秀菱心锁| 网球王子128| 关中枪声电视剧| 龙门镖局| 新福尔摩斯 第二季| 生化危机:战神再生| 重庆废弃红太阳幼儿园发生了什么| 咱村书记是明星| 阿黛尔的生活未删| 黄健翔疯狂解说| 维修工与丰腴女子中文字幕电影 | 销售的秘密在线观看| 官媒辟谣苹果手机被远程引爆| 《我家那小子2026》| 调值公式法| 功夫电影国语版免费播放| (已屏蔽)| 快播韩国电影| 女超人麦乐迪满天星免费观看完整版| 女皇陵下的风流娘们| 密室大逃脱第一季免费| 印度三级偷妻| 斗罗大陆209| 爱唯侦察dvd| 幻女13集全免费观看| 不死者之王第四季在线播放| 电影《卢旺达的玫瑰》在线观看 | 瓜达卢佩的玫瑰墨西哥电视剧| 南少林荡倭英豪 电视剧| 女律师替丈夫还债| 家族正名:恩怨了结短剧全集| 云雨生死恋国语完整版免费观看 | 中国好声音直播现场| 美貌的社长夫人第三季剧情简介| 爱之色放| loveme枫和铃声樱花| 漂亮的瘦子10免费观看完整版| 中国梦之声第一季| 猫和老鼠在线观看| 如是非迎| 妖精的尾巴45| 浮之手| 赵奕欢上位电影全集| 抓娃娃演员表| 请用你的手打扰我| 老师去学生家家访的电影| 英吉沙县| 勇敢者游戏1决战丛林在线观看| 盛夏晚晴天有多少集| 做aj的电视剧大全免费观看下载| 初体验3在线| 网球王子128| 哈哈哈哈哈 第六季| 从前的光景| 斯巴达(大人版)HR版| 一起来睡觉动漫| 韩国电视剧大长今| 《禁忌5》无删减| 爱的奴隶| 非诚勿扰20111112| 校园甜宠短剧全集| 雪中悍刀行50集免费观看2季| 3个大学生的特殊按摩| 菠萝菠萝蜜视频| 高清《建军大业》电影高清在线观看 | 俘虏之锁无删| 满清十三皇朝之血染紫禁城| 新济公活佛电视剧| 爱情公寓3预告片完整版| 宫13集| 《法国空姐2019法版》中文版| 危机公关 电影| 岳飞传刘兰芳| 按摩师男| 张译以法之名免费观看| 电视剧日出在线观看完整版| 卢麒元进京担任什么职务| 斗罗大陆240集免费观看全集在线| 别墅攻略HD完整版| 无人区在线观看免费版| 苹果电影未删减版| 她很漂亮电视剧韩国| 新猛龙过江 电视剧| 欢乐颂第四部50集在线观看免费| 完美先生| 女员工的付出 中文| 大地10中文在线观看免费版高清| 俄罗斯女儿国| 以为宋小宝去举重了| 爸爸要播种子美国电视剧禁忌| 《特殊面试2》| 玉观音孙俪| 好看的大陆电视剧| 黄圣依小儿子庆生| 周香允《外卖奇遇》| 诺斯费拉图| 韩剧公司下属的老婆| 新乌龙院之笑闹江湖| 爱 回家| 男子买22面镜子挂阳台反击邻居| 安妮特海雯电影无删减版| 壮志凌云满天星女版在线观看| 电视剧《下海》| 男女一起愁愁愁全集下载| 大地8中文在线观看免费高清成全| 和部长一起去出差旅行在线观看| 神勇武工队传奇2017任帅| 男生女生向前冲2023| 恐怖游轮高清| 与凤行电视剧在线观看60集| 《农场保卫战》满天星| 《另一个贝内特家的姐妹》| 法国女子高压监狱完整版在线观看完整免费高清原声 | 男女一起愁愁愁在线| 跛豪原型人物| 一国两制的核心| 强奷皇后娇呻浪吟前后夹击| 王佳怡的在线观看免费观看电视剧| 旧日之罪完整版在线观看| 黑暗荣耀韩剧| 西游之诸神之战免费播放在线观看| 让她降落下载| 大鲨鱼电影| 《常盘贵子恶魔之吻》| 喜爱夜蒲快播观看| 姐妹牙医完整版高清| 同在屋檐下电视剧全集在线观看| 19岁大学生真人观看 | 复仇行动电影免费观看完整版| 破密 电视剧| 荒野渔夫| 课中坏事 韩国| 桃色凶器在线观看器| 无间免费观看40集全集| 坏性:被强奸的妻子| 惊弦电视剧免费完整版| 姐妹牙医电影手机在线| 不完美的受害人| 一起愁愁愁前两集免费看| 蜜桃成熟了| 陆贞传奇7| 单恋未删减| 变种dna1| 插曲的痛30集全免费观看中文版| 龙八夷在线观看| 双女任务电影免费观看完整版| 魔道祖师全集免费观看高清| 禁忌5电影| 毛阿敏北京演唱会| 法国空乘2016完整版中文翻译英文 | 夫妇互换之木下凛凛子| 离婚大战| 公公的浮生手中字电影完整版| 万万没想到短剧全集 | 野蛮女友2插曲| 妻子的背叛3集| 天使的契约| 19岁姑娘电视剧免费观看| 瓜达卢佩玫瑰完整版| 我的罪恶人生电影免费观看经典| 香港之夜免费观看| 桃花小妹2| 我想和你好好| 《美容院待遇》酷客| 隔山有眼2| 酒店1-50集免费观看完整版| 山丹丹开花红艳艳简谱| 白峰美羽主演的为父报仇| 微微一笑很倾城4k画质在线观看| 妈妈看上儿子的同学韩剧叫什么| 孩子王电影| 天使追魂| 命中住定我爱你| 沉香如屑共多少集| 迪亚哥全集| 换伴11| 姜昕言吻戏| 阳光卫视 子夜| 西野翔qvod| 印度剧继承者| 纳粹女人集中营惊天秘密| 王牌保镖电影| 沙漠行动2007俄罗斯满天星| 野花免费观看高清视频| 隔壁的邻居免费完整版电视剧| 暮光之城 新月| 大道朝天国漫免费观看| 高清另一个贝内特家的姐妹| 不当军事行为在线| 拆弹专家电影| 美国女兵电影完整版在线观看| 爱在日落之前吻戏| 青春正能量我是女神| 爱我几何在线视频| 乌云之上电视剧全集剧情| 五月天激情小说| 森田优子| 再造之恩电视剧免费观看| 金太狼幸福生活电影| 齐天大剩| 高压监狱伦理法国| 打狗棍大结局| 电视剧大宅门全集| 赤壁下电影完整版高清在线观看| 梦幻西游五庄观副本| 阳阳电影| 东成西就粤语无删减高清网盘| 曰本jiZZ| 演员李桓| 日本熟睡中被义子侵犯| 需要爸爸播种伦理电影| 我的23岁女老板免费观看完整版| 免费影院| 闪耀吧中华文明| 赢钱专家| 哆啦a梦免费观看全集中文版| 四个少妇全身稞体精油按摩| 契卡百度影音| 战狼6免费观看三人剧情| 守护解放西纪录片| 深圳街拍| 密室大逃脱第2季| 《热带雨》完整版| 我强睡年轻漂亮的继坶BD| 学园默示录第一季| 莫妮卡版《爱我几何》在线| 无限复活粤语| 我是歌手 谭晶| 一梦枕星河电视剧免费观看| 扫黑风暴15集在线观看 | 斗破苍穹年番第168集更新| 姚安县| br397| 《神与律师事务所》| 电影种马猎人在线观看完整版| JIZZ学生妺| 幸福的照相馆| 安斋拉拉电影躲雨在线观看| 薛平贵与王宝钏电视剧全集下载 | 亲爱的热爱的免费版全集| 扫黑风暴28集在线观看完整版| 解放海南岛39| 电视剧烈火| 《交换3》无删减| 百万富翁的初恋下载| 大牛荷尔蒙美国版6| 舅妈的丝袜| 鬼宿舍电影| 枫与铃结局第二季免费| 电影《金悔瓶》高清完整版免费| 奇妙发型屋| 山豹电视剧| 想耍爸爸播种| 王者清风电视剧| 台湾《小凤新婚下》| 再来一次第7集| 功夫熊猫命运之爪| 大白胸按摩电影| 《海洋之恋》电影| 一个添下面P一个添上面P| 满清极乐酷刑| 迷人的保姆线观高清| 品味人生无憾在线观看| 临终老人要走的6个手势| 舔B拨弄深入抽插上司| 我弟弟的女朋友 电影| 淫媒传奇| 火山口电影高清在线观看| 垂涎13集| 热辣披萨女孩电影解说| 为歌而赞第二季在哪看| 漂流欲室 在线观看| 电视剧爱情睡醒了| 《寒武纪》| 宇佐美舞| 千金与佣人日剧电影免费观看| 神探狄仁杰电视剧| 的士速递4| 名侦探柯南剧场版16| 商务旅行戴绿帽在线观看| 阳光灿烂的日子高清| 憩园电影| 二龙湖爱情故事2020| 4大学生| 《玛丽!玛丽!》满天星中文| 一朵莲花两边翻 夹住| 蛮好人生免费看看| 守株待兔免费| 《义姐是不良姐第一季全集免费》| 花开山乡电视剧免费观看完整版 | 扫黑行动电视剧| 种马猎人美国1982| 假面骑士000全集| 最后一枪百度影音| 中国交通频道| 六人轮换电影免费播放| 欢乐家长群2电视剧观看| 白峰美羽在线| 大唐女巡按| 处女夜记| 《昭和系列》电影全部导演| 乡村爱情第8部| 谍影重重4高清完整版| 评书田连元| 豪门恩怨| 斗罗大陆漫画77| 珠海体育中心撞人事件| 秘密搜查官天海翼在线观看| 庆余年第一季特别版| 办公室特殊服务在线观看| 翁止熄痒禁伦短文合集免费视频| 六德女员工在工作中作弊5_午夜电影全集_完整版免费在线观看-天天影院 | 中国达人秀卓君稻草人| 安吉拉怀特在线观看| 恶人传记| 1977满天星版女学生| 我是mt第三季| 森奈奈子在线 | 人猿泰山1995免费观看完整版| 非常人贩| 侯马市| 樊振东看霉霉演唱会| 精英律师48集全免费| 《依然闪亮》| 激战运钞车国语| 好姑娘1全集观看免费高清| 无声谎言短剧免费观看| 中文字Dl幕岳 和女胥A| 美国忌讳1–5| 电视剧长相思第二部| 金瓶梅2在线观看mi| 妹妹轮到你了韩剧| 驯服上司的女社长| 小麦进城百度影音| 加勒比女海盗完整版| 胜者为王4争霸国语| 美丽的小蜜蜂美国版5娃娃脸| 卖房子的销售电影| 5个孩子的妈妈要努力| 插曲的痛30集全播放下载| 知几未来| 魔兽动漫无删减在线播放完整版| 猎杀之后电影| 超能机器女友| 二十一世纪性指南| 狂飙电视剧全集免费在线观看 | 清风阁我爱干视频| 暖暖的微笑在线观看免费完整版| 院人全年无休计划免费观看| 喜爱夜蒲演员| 萌宝当家爹地妈咪是特工| 《婚礼的前一天与前男友》| 幸福爱人全集| XL司令第一季全集免费完整版| 电影《默杀》免费观看高清版| 央视反腐大片| 男生女生一起愁愁愁电视剧观在现观看 | 白雪公主意大利成版1995中字| 鸡宝厨房| 韩国《维修师傅的艳遇》| 农心杯最新消息2024| 小汤圆正式出院| 地球脉动纪录片中文免费观看| 葡萄姐姐| 战狼10免费完整电影在线观看高清| 速度与激情9在线观看完整版免费| 祥仔更多大片访问| 童颜不老三公主| 女员工的付出 中字5| 乘风破浪5免费观看| 爸爸的3次婚礼| 落魄贵族琉璃川免费观看| 赏金猎人粤语版| 辣椒酱的制作方法及配料| 肯纳詹姆斯《空乘》| 相亲相爱一家人| 无尽的尽头电视剧免费看的| 卖百科全书的人完整版免费观看| 寻龙传说电影| 囡囡电影完整版百度影音| 银川市| 哈德威尔| 沙漠战争| 银河护卫队满天星免费观看 | 东游记电视剧| 决战风铃渡全集免费观看| 《丛林肉搏》在线播放| 妈妈的职业免费完整版在线观看| 包哥记录生活| 克拉运河计划| 风流才子唐伯虎| 特殊诊所| 后厨完整版在线观看免费| 地震局称银川进入地震窗口期| 奇门遁甲2017在线观看| 克莱尔《总统之夜》| 私人助理在线看| 名侦探柯南621| 咱们结婚吧邓佳佳结局| 朋友的妈妈电影| 小小水蜜6全集电视剧| jojo黄金之风在线看完整版免费| 钢铁侠 电影| 魔女2在线播放免费观看完整版| 钢琴家在线观看免费完整版电影| 《浪漫女家教》HD-免费在线观看完整版[1线]-被窝电影网 | 内衣推销员2中字在线观看| 爱我的请过来| 三女休夫高清完整版| 丈夫的下属HD| 年轻的小姐姐| 诱人的教师在线完整版| 《xl司令》第一季| 今天的她们电视剧免费观看 | 成全免费视频在线观看| 宝乐婶的烦心事全集| 我要当空姐| 闫凤娇 第二季| 《厨房激战2》苍井空| 很想很想你电视剧在线观看免费版 | 美乃雀替夫还债无删减在线观看免费| 《黑暗面》| 大人物免费观看完整版| 甄子丹锦衣卫| 两人互换麦子3| 高清《老医馆》全集免费| 精绝古城 下载| 好事多磨19楼| 电影香江之功夫世家| 酒店1-70集| 虎胆龙威5百度影音| 重庆时尚频道| 哈萨克阿肯弹唱| 重生之爱泰剧| 小凤新婚下| 老舅1-40集全免费播放| 支配的意思| 淘宝公布2023年度丑东西 | 男人女人一起愁愁愁电视剧观看在看 | 甘联珠大破红莲寺| 美国《爱上儿子》电影| 小蜜桃4[电视剧]免费观看高清| 鬼2动漫全集在线观看 中文版| 电视剧与狼共舞2| 我的妻子免费观看| 激情从林未删减版免费播放| 三妹43集播放| 关于未知的我们 电视剧| 穿越小兽:兽夫粘人短剧全集| 僵尸道长1高清国语版在线观看| 杰西简《荣誉守则》电影免费观看 | jizz日本在线观看| 奶酪陷阱 韩剧| 四季歌简谱| 快乐星球第5部| 真心电影网| 本乡爱电影合集在线观看完整版| 还珠格格第三部天上人间| 小草青青免费观看完整版| 致命诱惑2015美版在线看| 善良的儿媳妇在线播放| 陈宝莲《满天星》全集免费看| 公之孚| 叶问3在线观看国语高清完整版 | 萌宝找妈咪:仙帝奶爸全集免费| 彩礼谈崩后转身嫁给豪门大佬 | 木下檀檩子电影在线观看2023年上映时 | 斗罗大陆观看免费完整版| 易经风水涣| 东北警察故事 2| 有夫之妇4| 白嫖者联盟在线观看免费| 五福临门在线观看| 我们都要好好的电影| 第四片甲骨全集| 纯情房东俏房客游戏| 奇怪的美容院2 女主角是谁| 天衣无缝的她 电影| 皇后进宫电视剧| 深州市| 写意人生国语| 爱情睡醒了28| 高清《惜花芷》| 美国电影想要爸爸播种电影免费观看| 铿铿锵锵锵免费观看在线观看| 惊艳一枪国语| 修真高手在校园短剧全集| 囧妈电影完整版免费| 牧神记1—40集免费观看| 保险公司的推销员8中字手机| 奥特曼大电影中文版| 一江春水向东流| 流星花园日版| 平凡的世界1-56集免费观看| 女律师替夫还债完整版| 渔夫荒淫史电影在线观看| 美丽的小蜜桃9| 广场舞社员都是向阳花| 女大学生的沙龙卧室| 我年轻瘦子的8| 满天星版《黑鹰坠落》女主| 夫妻那些事全集播放| 慈禧秘密生活高清完整K8| 韩剧热播| 星语心愿伴奏| 6080蓝雨| 女婿爱上母娘免费版电视剧2| 鬼楼 林心如| 大男当婚女主角| 回娘家简谱| 日本战狼12免费国语| 售楼小姐的销售秘密在线观看| 疯狂旅程许君聪在线观看完整版| 全职高手2电视剧官宣| 纸醉金迷电视剧下载| 半是蜜糖| 我需要爸爸播种| 七个世界一个星球| 逆流而上的你剧情| 法政先锋第三部粤语| 新妈妈免费在线观看| 美国满天星《无法无天》2006| 女版战狼6免费观看| 孤舟免费观看完整版电视剧| 龙非龙凤非凤电视剧| 年轻气盛| 哈利波特与密室国语| 0verflower第一季免费观看| 女性3对1:三人一次性体检电影| 爱情有点蓝| 爱情是什么在线观看国语版全集| 黑莲花攻略手册免费阅读完整版| 雪豹坚强岁月免费观看| 香港三年大片免费观看完整版高清在 | 庆帝到底想把皇位给谁| 精忠岳飞全集| 《意大利夫人》| 女超人法国版高清无删减| 新手包粽子的简易方法| 沧元图第二季59集完整版| 缉毒警察绝不会输动漫免费观看 | 男女一起愁愁愁在线观看全集高清免费 | 在丈夫面前被别人欺负日语| k8s经典版(老经典版)全集免费| 《法国空乘10》| 大冶风云网| 开门红扇子舞| 广场舞尕撒拉| 风情小鸟电影网| 电影《需要爸爸播种美国》相似的片段| 义姐不是良妈ova观看方式| 幸福演算法全集观看韩剧| 一起来看流星雨35| 张钰 录像| 天堂执法者15| 妈妈的职业2在线观看 | 康熙来了2009| 梦幻华尔兹| 电视剧百万新娘之爱无悔| 插曲的痛30集全集免费播放完整剧情| 年轻的瘦子5| 《长安如故》电视剧免费观看| 追球在线观看免费完整版| 历劫惊途 第二季全集观看| 兵在哪马在哪俑在哪导游你在哪| 花与蛇2麻醉牙医诊所| 瓜达卢佩玫瑰在线播放| 西安大学生兼职网| 红场阅兵2025| 6708杏色水蜜桃| 窃听风云3高清下载| 麦乐迪 在线| 想耍爸爸播种| 你终于做了别人的小三| 功夫足球全集| shameless第三季免费观看| 雪中悍刀行31集在线观看| 黑白配高清完整版| 要爸爸播种子电影| 爱与魔法| 目光所及免费观看电视剧| 多情成仁高清影视首页| 杨玉环1987版台湾| 女扮男装当太子短剧全集| 诈欺猎人| 女帝夺江山:拥美男入怀全集免费| 善良的妈妈中字开头9个字是什么两个| 夏洛特烦恼在线观看| 变形金刚2百度影音| 少年派2电视剧完整版| 《天星术》免费| 如懿传3在线看全集免费观看高清 后宫 | 两个人的世界全集免费观看完整版| 男子被关押1349天后无罪释放| 刻命裕也| 国风按摩院在线看| 韩国电影火热的邻居| 筱崎美沙| 斗罗大陆206集免费观看| 战狼6手机免费电影版| 大湾仔的夜免费观看| 电视剧青春无季免费观看西瓜影视| 女版战狼10普通话版免费播放下载| 农民伯伯下乡2国| 高清《亲爱的》在线观看电视剧免费 | 女战狼6免费观看在线播放高清 | 《驯服小峓子2免费观看| 电视剧门当户对| 灾女变福妻:全家都宠我全集免费| 长武县| 日本天字号监狱电影叫什么名字| 女人的战争之肝脏的交易中字| 龙咁威2之皇母娘娘呢| 漂亮娇妻被社长驯服| 《帕克》| 新醉打金枝优酷| 破晓之战电影免费高清完整版| 酒店1—60全集观看在线看| 二十一天电视剧| 潜规则电影| 猛龙过江高清| 替夫还债女律师| 神奇四侠2国语版| 打开你会回来感谢我的在线播放| 恋爱暴君2动漫| 台剧《黛比浪漫女家教》哪年上映| 妻子被房东欺负是哪一集| 东北奇缘在线观看完整版 | 年经继拇| 上海电视台节目表| 《朴亚珍蓝色隐身帽子》| 玉女心经3电影免费观看完整版| 秦腔戏曲大全mp3| 我的继母电影| b哥全集| 一起愁愁愁电视剧全集播放 | 鹿晗脸上的疤| 五亿探长雷洛传2| 黑色眼泪1985原版| 回家的诱惑电视剧免费完整版| 拜托小姐国语| 豫剧程英救孤| 特殊治疗医护3| 功夫道电影| 地爆天星无删减版免费观看| 歌手在线观看免费完整版| 妈妈的学生5字ID | 高清花便当| 动感之星小玲236集全部剧情视频播 | 荣玉守则| 新金瓶玉梅玥菲完整版| 乱世三义高清全集| 法国电影《塔日酒店》正片在线观看| 女武神的终末动漫| 洪熙官 甄子丹| 电视剧决战江桥全集免费观看| 性辱女警2之未删减版| 白峰美羽网盘| 一路向西电影完整版国语| 奥巴马白宫记者晚宴|