嵌入式C語言防御性編程必知的15個黃金法則,讓你的代碼穩(wěn)如磐石!

小麥大叔 2025-05-29 07:50

點擊上方,選擇“置頂/星標公眾號”

福利干貨,第一時間送達

防御性編程

嵌入式產(chǎn)品的可靠性自然與硬件密不可分,但在硬件確定、并且沒有第三方測試的前提下,使用防御性編程思想寫出的代碼,往往具有更高的穩(wěn)定性。

防御性編程首先需要認清C語言的種種缺陷和陷阱,C語言對于運行時的檢查十分弱小,需要程序員謹慎的考慮代碼,在必要的時候增加判斷;防御性編程的另一個核心思想是假設(shè)代碼運行在并不可靠的硬件上,外接干擾有可能會打亂程序執(zhí)行順序、更改RAM存儲數(shù)據(jù)等等。

1 具有形參的函數(shù),需判斷傳遞來的實參是否合法。

程序員可能無意識的傳遞了錯誤參數(shù);外界的強干擾可能將傳遞的參數(shù)修改掉,或者使用隨機參數(shù)意外的調(diào)用函數(shù),因此在執(zhí)行函數(shù)主體前,需要先確定實參是否合法。

1. int exam_fununsigned char *str )   
2. 
{
3.       if( str != NULL )     //  檢查“假設(shè)指針不為空”這個條件 
4.       {
5.            //正常處理代碼               
6.       }
7.       else 
8.       {
9.           //處理錯誤代碼  
10.      }
11. }

2 仔細檢查函數(shù)的返回值

對函數(shù)返回的錯誤碼,要進行全面仔細處理,必要時做錯誤記錄。

1. char *DoSomething(…)  
2. 
{
3.     char * p;
4.      p=malloc(1024);
5.      if(p==NULL)          /*對函數(shù)返回值作出判斷*/
6.      {
7.         UARTprintf(…);   /*打印錯誤信息*/  
8.          return NULL;
9.      }
10.      retuen p;
11. }

3 防止指針越界

如果動態(tài)計算一個地址時,要保證被計算的地址是合理的并指向某個有意義的地方。特別對于指向一個結(jié)構(gòu)或數(shù)組的內(nèi)部的指針,當指針增加或者改變后仍然指向同一個結(jié)構(gòu)或數(shù)組。

4 防止數(shù)組越界

數(shù)組越界的問題前文已經(jīng)講述的很多了,由于C不會對數(shù)組進行有效的檢測,因此必須在應(yīng)用中顯式的檢測數(shù)組越界問題。下面的例子可用于中斷接收通訊數(shù)據(jù)。

1. #define REC_BUF_LEN 100  
2.unsignedchar RecBuf[REC_BUF_LEN];
3.//其它代碼  
4.void Uart_IRQHandler(void)  
5. 
{
6.     static RecCount=0;          //接收數(shù)據(jù)長度計數(shù)器  
7.     //其它代碼  
8.     if(RecCount< REC_BUF_LEN)   //判斷數(shù)組是否越界
9.     {
10.          RecBuf[RecCount]=…;     //從硬件取數(shù)據(jù)  
11.          RecCount++;
12.          //其它代碼  
13.     }
14.     else
15.     {
16.         //錯誤處理代碼   
17.     }
18.      //其它代碼 
19. }

在使用一些庫函數(shù)時,同樣需要對邊界進行檢查,比如下面的memset(RecBuf,0,len)函數(shù)把RecBuf指指向的內(nèi)存區(qū)的前l(fā)en個字節(jié)用0填充,如果不注意len的長度,就會將數(shù)組RecBuf之外的內(nèi)存區(qū)清零:

1. #define REC_BUF_LEN 100  
2.unsignedchar RecBuf[REC_BUF_LEN];
3.   
4.if(len< REC_BUF_LEN)
5. {
6.     memset(RecBuf,0,len);       //將數(shù)組RecBuf清零  
7. }
8.else
9. {
10.     //處理錯誤  
11. }

5 數(shù)學(xué)算數(shù)運算

5.1 除法運算,只檢測除數(shù)為零就可靠嗎?

除法運算前,檢查除數(shù)是否為零幾乎已經(jīng)成為共識,但是僅檢查除數(shù)是否為零就夠了嗎?

考慮兩個整數(shù)相除,對于一個signed long類型變量,它能表示的數(shù)值范圍為:-2147483648 ~+2147483647,如果讓-2147483648/ -1,那么結(jié)果應(yīng)該是+2147483648,但是這個結(jié)果已經(jīng)超出了signedlong所能表示的范圍了。所以,在這種情況下,除了要檢測除數(shù)是否為零外,還要檢測除法是否溢出。

1. #include <limits.h>    
2.signedlong sl1,sl2,result;
3./*初始化sl1和sl2*/    
4.if((sl2==0)||(sl1==LONG_MIN && sl2==-1))
5. {
6.     //處理錯誤    
7. }
8.else   
9. {
10.     result = sl1 / sl2;
11. }

5.2 檢測運算溢出

整數(shù)的加減乘運算都有可能發(fā)生溢出,在討論未定義行為時,給出過一個有符號整形加法溢出判斷代碼,這里再給出一個無符號整形加法溢出判斷代碼段:

1. #include <limits.h>    
2.unsignedint a,b,result;
3./*初始化a,b*/    
4.if(UINT_MAX-a<b)
5. {
6.     //處理溢出    
7. }
8.else   
9. {
10.     result=a+b;
11. }

嵌入式硬件一般沒有浮點處理器,浮點數(shù)運算在嵌入式也比較少見并且溢出判斷嚴重依賴C庫支持,這里不討論。

5.3檢測移位

在討論未定義行為時,提到有符號數(shù)右移、移位的數(shù)量是負值或者大于操作數(shù)的位數(shù)都是未定義行為,也提到不對有符號數(shù)進行位操作,但要檢測移位的數(shù)量是否大于操作數(shù)的位數(shù)。下面給出一個無符號整數(shù)左移檢測代碼段:

1. unsignedint ui1;
2.unsignedint ui2;
3.unsignedint uresult;
4.   
5./*初始化ui1,ui2*/
6.if(ui2>=sizeof(unsignedint)*CHAR_BIT)
7. {
8.     //處理錯誤  
9. }
10.else
11. {
12.     uresult=ui1<<ui2;
13. }

6 如果有硬件看門狗,則使用它

在其它一切措施都失效的情況下,看門狗可能是最后的防線。它的原理特別簡單,但卻能大大提高設(shè)備的可靠性。如果設(shè)備有硬件看門狗,一定要為它編寫驅(qū)動程序。

  • 要盡可能早的開啟看門狗

這是因為從上電復(fù)位結(jié)束到開啟看門狗的這段時間內(nèi),設(shè)備有可能被干擾而跳過看門狗初始化程序,導(dǎo)致看門狗失效。盡可能早的開啟看門狗,可以降低這種概率;

  • 不要在中斷中喂狗,除非有其他聯(lián)動措施

在中斷程序喂狗,由于干擾的存在,程序可能一直處于中斷之中,這樣會導(dǎo)致看門狗失效。如果在主程序中設(shè)置標志位,中斷程序喂狗時與這個標志位聯(lián)合判斷,也是允許的;

  • 喂狗間隔跟產(chǎn)品需求有關(guān),并非特定的時間

產(chǎn)品的特性決定了喂狗間隔。對于不涉及安全性、實時性的設(shè)備,喂狗間隔比較寬松,但間隔時間不宜過長,否則被用戶感知到,是影響用戶體驗的。對于設(shè)計安全性、有實時控制類的設(shè)備,原則是盡可能快的復(fù)位,否則會造成事故。

克萊門汀號在進行第二階段的任務(wù)時,原本預(yù)訂要從月球飛行到太空深處的Geographos小行星進行探勘,然而這艘太空探測器在飛向小行星時卻由于一個軟件缺陷而使其中斷運作20分鐘,不但未能到達小行星,也因為控制噴嘴燃燒了11分鐘使電力供應(yīng)降低,無法再透過遠端控制探測器,最終結(jié)束這項任務(wù),但也導(dǎo)致了資源與資金的浪費。

“克萊門汀太空任務(wù)失敗這件事讓我感到十分震驚,它其實可以透過硬件中一款簡單的看門狗計時器避免掉這項意外,但由于當時的開發(fā)時間相當緊縮,程序設(shè)計人員沒時間編寫程序來啟動它,”Ganssle說。

遺憾的是,1998年發(fā)射的近地號太空船(NEAR)也遇到了相同的問題。由于編程人員并未采納建議,因此,當推進器減速器系統(tǒng)故障時,29公斤的儲備燃料也隨之報銷──這同樣是一個本來可經(jīng)由看門狗定時器編程而避免的問題,同時也證明要從其他程序設(shè)計人員的錯誤中學(xué)習(xí)并不容易。

7 關(guān)鍵數(shù)據(jù)儲存多個備份,取數(shù)據(jù)采用“表決法”

RAM中的數(shù)據(jù)在受到干擾情況下有可能被改變,對于系統(tǒng)關(guān)鍵數(shù)據(jù)應(yīng)該進行保護。關(guān)鍵數(shù)據(jù)包括全局變量、靜態(tài)變量以及需要保護的數(shù)據(jù)區(qū)域。備份數(shù)據(jù)與原數(shù)據(jù)不應(yīng)該處于相鄰位置,因此不應(yīng)由編譯器默認分配備份數(shù)據(jù)位置,而應(yīng)該由程序員指定區(qū)域存儲。

可以將RAM分為3個區(qū)域,第一個區(qū)域保存原碼,第二個區(qū)域保存反碼,第三個區(qū)域保存異或碼,區(qū)域之間預(yù)留一定量的“空白”RAM作為隔離。可以使用編譯器的“分散加載”機制將變量分別存儲在這些區(qū)域。需要進行讀取時,同時讀出3份數(shù)據(jù)并進行表決,取至少有兩個相同的那個值。

假如設(shè)備的RAM從0x1000_0000開始,我需要在RAM的0x1000_0000~0x10007FFF內(nèi)存儲原碼,在0x1000_9000~0x10009FFF內(nèi)存儲反碼,在0x1000_B000~0x1000BFFF內(nèi)存儲0xAA的異或碼,編譯器的分散加載可以設(shè)置為:

1. LR_IROM1 0x000000000x00080000  {    ; load region size_region
2.   ER_IROM1 0x000000000x00080000  {  ; load address = execution address
3.    *.o (RESET, +First)
4.    *(InRoot$$Sections)
5.    .ANY (+RO)
6.   }
7.   RW_IRAM1 0x100000000x00008000  {  ;保存原碼
8.    .ANY (+RW +ZI )
9.   }
10.     
11.   RW_IRAM3 0x100090000x00001000{    ;保存反碼
12.    .ANY (MY_BK1)
13.   }
14.     
15.   RW_IRAM2 0x1000B0000x00001000  {  ;保存異或碼
16.    .ANY (MY_BK2)
17.   }
18. }

如果一個關(guān)鍵變量需要多處備份,可以按照下面方式定義變量,將三個變量分別指定到三個不連續(xù)的RAM區(qū)中,并在定義時按照原碼、反碼、0xAA的異或碼進行初始化。

1. uint32  plc_pc=0;                                                       //原碼  
2. __attribute__((section("MY_BK1"))) uint32 plc_pc_not=~0x0;              //反碼  
3. __attribute__((section("MY_BK2"))) uint32 plc_pc_xor=0x0^0xAAAAAAAA;    //異或碼

當需要寫這個變量時,這三個位置都要更新;讀取變量時,讀取三個值做判斷,取至少有兩個相同的那個值。

為什么選取異或碼而不是補碼?這是因為MDK的整數(shù)是按照補碼存儲的,正數(shù)的補碼與原碼相同,在這種情況下,原碼和補碼是一致的,不但起不到冗余作用,反而對可靠性有害。比如存儲的一個非零整數(shù)區(qū)因為干擾,RAM都被清零,由于原碼和補碼一致,按照3取2的“表決法”,會將干擾值0當做正確的數(shù)據(jù)。

8 對非易失性存儲器進行備份存儲

非易失性存儲器包括但不限于Flash、EEPROM、鐵電。僅僅將寫入非易失性存儲器中的數(shù)據(jù)再讀出校驗是不夠的。強干擾情況下可能導(dǎo)致非易失性存儲器內(nèi)的數(shù)據(jù)錯誤,在寫非易失性存儲器的期間系統(tǒng)掉電將導(dǎo)致數(shù)據(jù)丟失,因干擾導(dǎo)致程序跑飛到寫非易失性存儲器函數(shù)中,將導(dǎo)致數(shù)據(jù)存儲紊亂。一種可靠的辦法是將非易失性存儲器分成多個區(qū),每個數(shù)據(jù)都將按照不同的形式寫入到這些分區(qū)中,需要進行讀取時,同時讀出多份數(shù)據(jù)并進行表決,取相同數(shù)目較多的那個值。

9 軟件鎖

對于初始化序列或者有一定先后順序的函數(shù)調(diào)用,為了保證調(diào)用順序或者確保每個函數(shù)都被調(diào)用,我們可以使用環(huán)環(huán)相扣,實質(zhì)上這也是一種軟件鎖。此外對于一些安全關(guān)鍵代碼語句(是語句,而不是函數(shù)),可以給它們設(shè)置軟件鎖,只有持有特定鑰匙的,才可以訪問這些關(guān)鍵代碼。也可以通俗的理解為,關(guān)鍵安全代碼不能按照單一條件執(zhí)行,要額外的多設(shè)置一個標志。

比如,向Flash寫一個數(shù)據(jù),我們會判斷數(shù)據(jù)是否合法、寫入的地址是否合法,計算要寫入的扇區(qū)。之后調(diào)用寫Flash子程序,在這個子程序中,判斷扇區(qū)地址是否合法、數(shù)據(jù)長度是否合法,之后就要將數(shù)據(jù)寫入Flash。由于寫Flash語句是安全關(guān)鍵代碼,所以程序給這些語句上鎖:必須具有正確的鑰匙才可以寫Flash。這樣即使是程序跑飛到寫Flash子程序,也能大大降低誤寫的風(fēng)險。

1. /**************************************************************************** 
2. * 名稱:RamToFlash() 
3. * 功能:復(fù)制RAM的數(shù)據(jù)到FLASH,命令代碼51。 
4. * 入口參數(shù):dst        目標地址,即FLASH起始地址。以512字節(jié)為分界 
5. *           src        源地址,即RAM地址。地址必須字對齊 
6. *           no         復(fù)制字節(jié)個數(shù),為512/1024/4096/8192 
7. *           ProgStart  軟件鎖標志    
8. * 出口參數(shù):IAP返回值(paramout緩沖區(qū)) CMD_SUCCESS,SRC_ADDR_ERROR,DST_ADDR_ERROR, 
9. SRC_ADDR_NOT_MAPPED,DST_ADDR_NOT_MAPPED,COUNT_ERROR,BUSY,未選擇扇區(qū) 
10. ****************************************************************************/

11.void  RamToFlash(uint32 dst, uint32 src, uint32 no,uint8 ProgStart)  
12. 
{
13.     PLC_ASSERT("Sector number",(dst>=0x00040000)&&(dst<=0x0007FFFF));
14.     PLC_ASSERT("Copy bytes number is 512",(no==512));
15.     PLC_ASSERT("ProgStart==0xA5",(ProgStart==0xA5));
16.       
17.     paramin[0] = IAP_RAMTOFLASH;             // 設(shè)置命令字  
18.     paramin[1] = dst;                        // 設(shè)置參數(shù)  
19.     paramin[2] = src;
20.     paramin[3] = no;
21.     paramin[4] = Fcclk/1000;
22.     if(ProgStart==0xA5)                     //只有軟件鎖標志正確時,才執(zhí)行關(guān)鍵代碼  
23.     {
24.         iap_entry(paramin, paramout);       // 調(diào)用IAP服務(wù)程序                 
25.         ProgStart=0;
26.     }
27.     else
28.     {
29.         paramout[0]=PROG_UNSTART;
30.     }
31. }

該程序段是編程lpc1778內(nèi)部Flash,其中調(diào)用IAP程序的函數(shù)iap_entry(paramin, paramout)是關(guān)鍵安全代碼,所以在執(zhí)行該代碼前,先判斷一個特定設(shè)置的安全鎖標志ProgStart,只有這個標志符合設(shè)定值,才會執(zhí)行編程Flash操作。如果因為意外程序跑飛到該函數(shù),由于ProgStart標志不正確,是不會對Flash進行編程的。

10 通信

通訊線上的數(shù)據(jù)誤碼相對嚴重,通訊線越長,所處的環(huán)境越惡劣,誤碼會越嚴重。拋開硬件和環(huán)境的作用,我們的軟件應(yīng)能識別錯誤的通訊數(shù)據(jù)。對此有一些應(yīng)用措施:

  • 制定協(xié)議時,限制每幀的字節(jié)數(shù);

每幀字節(jié)數(shù)越多,發(fā)生誤碼的可能性就越大,無效的數(shù)據(jù)也會越多。對此以太網(wǎng)規(guī)定每幀數(shù)據(jù)不大于1500字節(jié),高可靠性的CAN收發(fā)器規(guī)定每幀數(shù)據(jù)不得多于8字節(jié),對于RS485,基于RS485鏈路應(yīng)用最廣泛的Modbus協(xié)議一幀數(shù)據(jù)規(guī)定不超過256字節(jié)。因此,建議制定內(nèi)部通訊協(xié)議時,使用RS485時規(guī)定每幀數(shù)據(jù)不超過256字節(jié);

  • 使用多種校驗

編寫程序時應(yīng)使能奇偶校驗,每幀超過16字節(jié)的應(yīng)用,建議至少編寫CRC16校驗程序;

  • 增加額外判斷

1)增加緩沖區(qū)溢出判斷。這是因為數(shù)據(jù)接收多是在中斷中完成,編譯器檢測不出緩沖區(qū)是否溢出,需要手動檢查,在上文介紹數(shù)據(jù)溢出一節(jié)中已經(jīng)詳細說明。

2)增加超時判斷。當一幀數(shù)據(jù)接收到一半,長時間接收不到剩余數(shù)據(jù),則認為這幀數(shù)據(jù)無效,重新開始接收。可選,跟不同的協(xié)議有關(guān),但緩沖區(qū)溢出判斷必須實現(xiàn)。這是因為對于需要幀頭判斷的協(xié)議,上位機可能發(fā)送完幀頭后突然斷電,重啟后上位機是從新的幀開始發(fā)送的,但是下位機已經(jīng)接收到了上次未發(fā)送完的幀頭,所以上位機的這次幀頭會被下位機當成正常數(shù)據(jù)接收。這有可能造成數(shù)據(jù)長度字段為一個很大的值,填滿該長度的緩沖區(qū)需要相當多的數(shù)據(jù)(比如一幀可能1000字節(jié)),影響響應(yīng)時間;另一方面,如果程序沒有緩沖區(qū)溢出判斷,那么緩沖區(qū)很可能溢出,后果是災(zāi)難性的。

  • 重傳機制

如果檢測到通訊數(shù)據(jù)發(fā)生了錯誤,則要有重傳機制重新發(fā)送出錯的幀。

11 開關(guān)量輸入的檢測、確認

開關(guān)量容易受到尖脈沖干擾,如果不進行濾除,可能會造成誤動作。一般情況下,需要對開關(guān)量輸入信號進行多次采樣,并進行邏輯判斷直到確認信號無誤為止。

12 開關(guān)量輸出

開關(guān)信號簡單的一次輸出是不安全的,干擾信號可能會翻轉(zhuǎn)開關(guān)量輸出的狀態(tài)。采取重復(fù)刷新輸出可以有效防止電平的翻轉(zhuǎn)。

13 初始化信息的保存和恢復(fù)

微處理器的寄存器值也可能會因外界干擾而改變,外設(shè)初始化值需要在寄存器中長期保存,最容易被破壞。由于Flash中的數(shù)據(jù)相對不易被破壞,可以將初始化信息預(yù)先寫入Flash,待程序空閑時比較與初始化相關(guān)的寄存器值是否被更改,如果發(fā)現(xiàn)非法更改則使用Flash中的值進行恢復(fù)。

公司目前使用的4.3寸LCD顯示屏抗干擾能力一般。如果顯示屏與控制器之間的排線距離過長或者對使用該顯示屏的設(shè)備打靜電或者脈沖群,顯示屏有可能會花屏或者白屏。對此,我們可以將初始化顯示屏的數(shù)據(jù)保存在Flash中,程序運行后,每隔一段時間從顯示屏的寄存器讀出當前值和Flash存儲的值相比較,如果發(fā)現(xiàn)兩者不同,則重新初始化顯示屏。下面給出校驗源碼,僅供參考。

定義數(shù)據(jù)結(jié)構(gòu):

1. typedef struct {  
2.     uint8_t  lcd_command;           //LCD寄存器  
3.     uint8_t  lcd_get_value[8];      //初始化時寫入寄存器的值  
4.     uint8_t  lcd_value_num;         //初始化時寫入寄存器值的數(shù)目  
5. }lcd_redu_list_struct;

定義const修飾的結(jié)構(gòu)體變量,存儲LCD部分寄存器的初始值,這個初始值跟具體的應(yīng)用初始化有關(guān),不一定是表中的數(shù)據(jù),通常情況下,這個結(jié)構(gòu)體變量被存儲到Flash中。

1. /*LCD部分寄存器設(shè)置值列表*/
2. lcd_redu_list_struct const lcd_redu_list_str[]=
3. {
4.   {SSD1963_Get_Address_Mode,{0x20}                                   ,1}, /*1*/
5.   {SSD1963_Get_Pll_Mn      ,{0x3b,0x02,0x04}                         ,3}, /*2*/
6.   {SSD1963_Get_Pll_Status  ,{0x04}                                   ,1}, /*3*/
7.   {SSD1963_Get_Lcd_Mode    ,{0x24,0x20,0x01,0xdf,0x01,0x0f,0x00}     ,7}, /*4*/
8.   {SSD1963_Get_Hori_Period ,{0x02,0x0c,0x00,0x2a,0x07,0x00,0x00,0x00},8}, /*5*/
9.   {SSD1963_Get_Vert_Period ,{0x01,0x1d,0x00,0x0b,0x09,0x00,0x00}     ,7}, /*6*/
10.   {SSD1963_Get_Power_Mode  ,{0x1c}                                   ,1}, /*7*/
11.   {SSD1963_Get_Display_Mode,{0x03}                                   ,1}, /*8*/
12.   {SSD1963_Get_Gpio_Conf   ,{0x0F,0x01}                              ,2}, /*9*/
13.   {SSD1963_Get_Lshift_Freq ,{0x00,0xb8}                              ,2}, /*10*/
14. };

實現(xiàn)函數(shù)如下所示,函數(shù)會遍歷結(jié)構(gòu)體變量中的每一個命令,以及每一個命令下的初始值,如果有一個不正確,則跳出循環(huán),執(zhí)行重新初始化和恢復(fù)措施。

這個函數(shù)中的MY_DEBUGF宏是我自己的調(diào)試函數(shù),使用串口打印調(diào)試信息,在接下來的第五部分將詳細敘述。

通過這個函數(shù),我可以長時間監(jiān)控顯示屏的哪些命令、哪些位容易被干擾。程序里使用了一個被妖魔化的關(guān)鍵字:goto。大多數(shù)C語言書籍對goto關(guān)鍵字談之色變,但你應(yīng)該有自己的判斷。

在函數(shù)內(nèi)部跳出多重循環(huán),除了goto關(guān)鍵字,又有哪種方法能如此簡潔高效!

1. /** 
2. * lcd 顯示冗余 
3. * 每隔一段時間調(diào)用該程序一次 
4. */

5.void lcd_redu(void)  
6. 
{
7.     uint8_t  tmp[8];
8.     uint32_t i,j;
9.     uint32_t lcd_init_flag;
10.       
11.     lcd_init_flag =0;
12.     for(i=0;i<sizeof(lcd_redu_list_str)/sizeof(lcd_redu_list_str[0]);i++)
13.     {
14.         LCD_SendCommand(lcd_redu_list_str[i].lcd_command);
15.         uyDelay(10);
16.         for(j=0;j<lcd_redu_list_str[i].lcd_value_num;j++)
17.         {
18.             tmp[j]=LCD_ReadData();
19.             if(tmp[j]!=lcd_redu_list_str[i].lcd_get_value[j])
20.             {
21.                 lcd_init_flag=0x55;
22.                 MY_DEBUGF(MENU_DEBUG,("讀lcd寄存器值與預(yù)期不符,命令為:0x%x,第%d個參數(shù),
23.             該參數(shù)正確值為:0x%x,實際讀出值為:0x%x\n"
,lcd_redu_list_str[i].lcd_command,j+1,
24.             lcd_redu_list_str[i].lcd_get_value[j],tmp[j]));
25.                 goto handle_lcd_init;
26.             }
27.         }
28.     }
29.       
30.     handle_lcd_init:
31.     if(lcd_init_flag==0x55)
32.     {
33.         //重新初始化LCD  
34.         //一些必要的恢復(fù)措施  
35.     }
36. }

14 陷阱

對于8051內(nèi)核單片機,由于沒有相應(yīng)的硬件支持,可以用純軟件設(shè)置軟件陷阱,用來攔截一些程序跑飛。對于ARM7或者Cortex-M系列單片機,硬件已經(jīng)內(nèi)建了多種異常,軟件需要根據(jù)硬件異常來編寫陷阱程序,用來快速定位甚至恢復(fù)錯誤。

15 阻塞處理

有時候程序員會使用while(!flag);語句阻塞在此等待標志flag改變,比如串口發(fā)送時用來等待一字節(jié)數(shù)據(jù)發(fā)送完成。這樣的代碼時存在風(fēng)險的,如果因為某些原因標志位一直不改變則會造成系統(tǒng)死機。

一個良好冗余的程序是設(shè)置一個超時定時器,超過一定時間后,強制程序退出while循環(huán)。

2003年8月11日發(fā)生的W32.Blaster.Worm蠕蟲事件導(dǎo)致全球經(jīng)濟損失高達5億美元,這個漏洞是利用了Windows分布式組件對象模型的遠程過程調(diào)用接口中的一個邏輯缺陷:在調(diào)用GetMachineName()函數(shù)時,循環(huán)只設(shè)置了一個不充分的結(jié)束條件。

原代碼簡化如下所示:

1. HRESULT GetMachineName ( WCHAR *pwszPath,  
2. WCHARwszMachineName[MAX_COMPUTTERNAME_LENGTH_FQDN+1])

3. 
{
4.        WCHAR *pwszServerName = wszMachineName;
5.        WCHAR *pwszTemp = pwszPath + 2;
6.        while ( *pwszTemp != L’\\’ )           /* 這句代碼循環(huán)結(jié)束條件不充分 */  
7.              *pwszServerName++= *pwszTemp++;
8.        /*… */  
9. }

微軟發(fā)布的安全補丁MS03-026解決了這個問題,為GetMachineName()函數(shù)設(shè)置了充分終止條件。

一個解決代碼簡化如下所示(并非微軟補丁代碼):

1. HRESULT GetMachineName( WCHAR *pwszPath,  
2. WCHARwszMachineName[MAX_COMPUTTERNAME_LENGTH_FQDN+1])

3. 
{
4.        WCHAR *pwszServerName = wszMachineName;
5.        WCHAR *pwszTemp = pwszPath + 2;
6.        WCHAR *end_addr = pwszServerName +MAX_COMPUTTERNAME_LENGTH_FQDN;
7.        while ((*pwszTemp != L’\\’ ) && (*pwszTemp != L’\0’)
8. && (pwszServerName<end_addr))  /*充分終止條件*/  
9.              *pwszServerName++= *pwszTemp++;
10.        /*… */  
11. }


版權(quán)聲明:本文來源網(wǎng)絡(luò),版權(quán)歸原作者所有。版權(quán)問題,請聯(lián)系刪除。


最后

??兄弟們!一個人單打獨斗確實能沖得挺快,但要想走得更遠、更穩(wěn),還得靠一群志同道合的伙伴啊!

?? 麥鴿的知識星球現(xiàn)在已經(jīng)聚集了一波人,大家都在這里互相學(xué)習(xí)、共同進步。


如果你也想找個靠譜的學(xué)習(xí)圈子,趕緊 戳鏈接 ??加入我們吧!

在這里,你能讀到星球?qū)诘母韶洠瑑?yōu)質(zhì)教程,練手項目,隨時向麥鴿提問,還能幫你定制學(xué)習(xí)計劃。別猶豫了,兄弟,一起沖!??



往期推薦



電子工程師必考,示波器100問:答對10題才算剛?cè)腴T!

一次斷電,設(shè)備報廢?揭秘嵌入式OTA技術(shù)的核心原理,90%的工程師都踩過坑!

同樣的STM32教程,你的學(xué)習(xí)效果卻差50%?STM32高手絕不透露幾個妙招...

閑魚賣家不會告訴你的秘密:三角測距雷達的協(xié)議“破解”野路子

小麥大叔 一位熱衷技術(shù)的攻城獅,懂點技術(shù),會講故事,交個朋友?
評論
  • 文:杜杰編輯:侯煜當?shù)貢r間7月28日,美國特朗普政府落地最新科技封鎖政策,美國聯(lián)邦通信委員會(FCC)正式更新《受管制清單》,新增兩大類設(shè)備——境外生產(chǎn)的先進機器人設(shè)備、境外生產(chǎn)的聯(lián)網(wǎng)電力逆變器。FCC在官方情況說明書中明確,該類境外制造產(chǎn)品,“會對美國國家安全或美國民眾的人身安全構(gòu)成無法承受的風(fēng)險”。本次新規(guī)設(shè)置明確豁免機制:經(jīng)美國國防部(DoW)、電力逆變器品類經(jīng)美國國土安全部(DHS)審核并授予“有條件批準”,認定對應(yīng)設(shè)備品類不存在重大安全風(fēng)險,即可獲得準入豁免。同時政策嚴格執(zhí)行新老劃斷原
    華爾街科技眼 2026-08-03 21:28 367瀏覽
  • 在物聯(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 205瀏覽
  • 導(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 365瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成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 15427瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 214305瀏覽
  • 一、方案簡介在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 160瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學(xué)應(yīng)該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節(jié) 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應(yīng)該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責(zé)這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創(chuàng)知音語音芯片 2026-08-07 14:44 177瀏覽
  • 產(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 482瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產(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)互通的“通用語言”。新風(fēng)機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 203瀏覽
  •        很多人只見過封裝在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 524瀏覽
  • 摘要東莞市恒創(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 162瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 女员工们:2对2百度网盘| 绿水青山带笑颜电视剧| 加勒比海盗女版电影完整版| 恋之欲室百度影音| 骨王第一季免费观看完整版| 人生特别档案| 金瓶梅在线电影完整版播放| 卖百科全书的女人在线观看 | 高庄监狱免费观看网站| 笑傲江湖29| 无贼43| 甜美姐姐动漫1-2集| 红豆女之恋| 角斗士3满天星哪里看| 熏肉怎么吃| 等你说爱我电视剧| 黑拳粤语| 叛逆者电视剧全集免费| 日本美女视频| 新还珠格格高清在线观看| 五亿探长雷洛传电影| 高清临租家庭未删减| 赘婿之吉兴高照电影| 男女生一起愁愁愁电视剧在线观看 漫画| 欢乐喜剧人下载| 电影意大利无法满足| 时寒冰说经济大棋局我们怎么办| 李丽珍电影免费观看粤语| 香气迷人| 电影热辣滚烫今日正式上映| 交换俱乐部女警交换| 误判粤语电影免费观看| 情迷电影| 金牌售楼销售的秘密5HD中字| 专治各种不服| 斯托雅《法国女仆》| 爱情宝鉴叶子楣版| 如意芳霏在线观看| 拥抱太阳的月亮国语版| 50岁寡妇下面水多好紧| 《法国航空》6| 北大女生包里最全聊天记录| 需要父亲播种籽| 冰河时代2| 青梅竹马是消防员未增删| 女人的选择韩剧在线看免费| 惊艳一枪国语| 电视剧白色城堡| 沂蒙电视剧| 《八尺夫人》意大利电影完整版免费 | 迪斯科舞厅| 卖百科全书的女人法国版本| 边城破晓| 韩国关于美容店的电影有哪些| rhts 040| 《迷失东京》| 梦幻诛仙电影| 新的哥哥在线| 权力的游戏第7季无删减完整观看| 大岛由加利电影全集| xL司令第二季无马赛免费观看高清| 电视剧烈火凤凰| 警探迷案| 黑白配在线观看免费版全集| 消失的她完整版| 韩国伦理水电工 | 夫上司装饰全集观看| 无限春光27 豆瓣| 角斗士百度影音| 1984美式保罗中文1—4| 雨果 百度影音| 女员工的付出 中文5| 迪奥特曼全集| 《社长夫人的美貌》全集| 偷窥 莎朗斯通| 美国女儿需要爸爸播种怎么读| 美版流星花园| 墨菲的战争高清| 《罚罪2》在线观看| 接吻床戏| 18jack| 亲吻姐姐下载| 大内密探零零性| 金钱帝国粤语高清| 《束缚游戏》免费完整版在线观看 | 湖南省乌兰父亲| 木下檀檀子电影免费观看2024年上映时| 绝对权势电影| 加勒比海盗成人版无删减免费观看 | 小蜜桃3美丽人生完整版| 天网追踪电视剧| 《停不了的爱》床戏| 巴啦啦小魔仙2| 人之初1-40集免费观看| 娱乐百分百20100401| 台剧恋爱之瘾在线观看| 《新来的瑜伽教练》完整版| 冰雪尖刀连免费观看| 电影《布兰迪之军事不当行为》在线| 第一次爱的人免费观看韩剧| 杰森鲁夫满天星电影合集| 自制ipad| 《新人类毒医肥尸电影》| 你比星光更美丽免费观看全集| xl司令34集全免费观看| 最新二人转| 铯妮玛亚洲欧洲夫妻轮换| 太空部队在线观看| 混血女学生按摩电影合集| 同龄人电视剧| 妈妈母乳1-5H| 三毛从军记| 我爱下电影3d| 九九在线观看免费高清电视剧| 欣德·拉贾布之声| 闵度允在线| 逃亡者planb| 《替夫还债》女律师| 我家有个日本女人| 《示范销售避孕套》| 美国队长高清完整版| 中文字幕凯帕克在线观看| 纵有疾风起免费观看全集| 麻花传奇天美mv免费观看| 听说你喜欢我电视剧| 男女一起愁愁愁第一集在线观看| 恐怖电影免费高清在线观看| 高清《解语花》曹宝儿| 奔跑吧第十一季免费观看完整版| 警察故事3 超级警察| 玉女心经3之阴阳结合电视剧免费| 火遮眼未删减| 人完美体型的油画| 《漂白》电视剧在线播放| 妈妈的职业5观看 | 一年一度喜剧大赛第一季免费观看| 壮志凌云凯登克劳斯版| 街头俏妞| 王朝的女人·杨贵妃完整版| 永远的君主韩剧| 怪奇物语第三季在线观看完整版| 情爱天空| 曹云金官场斗| 世界上毛最多的人| 风月宝鉴之云雨之欢在线观看| 王星越五福临门免费观看| 南斗六圣拳| 绣春刀高清迅雷下载| 点点星光免费观看完整版| 关于莉莉周的一切高清| 江南1970| 中华英雄| 特利迦奥特曼第一集免费看| 追光的日子电视剧免费观看| 满天星电影在线观看完整免费高清原声满天| 再见18班在线观看免费版| 酒店1-90集免费观看高清| 白蛇后传剧情介绍| 《和讨厌的部长出差旅》| 韩剧疯狂的爱情| 角斗士3满天星版| 印度电影爱经2013版| 美乃雀主演《替夫还债》剧免费观看| 97社在线观看| 韩国r电影| 隔壁的女孩3在线观看| 售楼部的秘密| 大丈夫2粤语| 萌宝神助攻电视剧免费观看 | 夫妇联欢回不去的晚会 | 电视剧《烟火人家》| 女帝谋全集免费| 高清《扫黑风暴》免费观看完整版| 美国荷尔蒙2免费观看| 电锯魔术失误| 哈利波波| 金南佶美人图| 男人和女人愁愁愁电视剧在线观op | 《新人类之毒医肥尸2》在线播放| 隔壁邻居很美味免费观看电视剧| 智酱是女生| 绿春县| 九重紫电视剧在线播放视频观看高清| 疯了因为你| 今天坐在我的棍子上写作业| 吴尊演的电视剧| 真探电影版免费播放完整版| 历史的天空| 高清《偷窥》电影| 风风风韩剧原版| 借种传奇| 发誓英语| 粉红女郎高清| 花心赌圣粤语| 美人制造| 仙逆1到54集免费观看高清| 传闻中的七公主国语版全集优酷| 篱笆女人和井| 卜案下载| 方谬神探结局| 韩国电影两个女人在线观看| 冰河世纪2快播| 上门推油| 1984美式保罗2| 爱神电影| 动漫《迷情4》全集免费观看| 年轻的小搜子2| 暴躁的少女国语版在线观看| 巜与上司的妻子佐佐木| 郝板栗牙医无删减版在线观看电视剧| 《隋唐英雄传》| 电影私人航空| 成龙a计划续集| 《法国空乘8》完整版| 喜爱夜蒲快播观看| 《悲惨遭遇》1980年| 漂亮的年轻继坶中文2| 阿宾房东太太| lx司令第一季动漫真人版| 塔日酒店| 甄嬛传33| 越西县| 蜡笔小新全集播放| 白鹿范丞丞合唱狂恋| 为争一口气短剧在线观看| 悬崖 电视剧| 最后一条美人鱼| 没什么大不了电影| 五亿探长雷洛传1国语版免费观看| 梦在海这边电视剧| 日本电影《姐妹牙医》在线播放| 反恐电影《沙漠》| 《部长出差的日子》完整版| 太平年未删减| 俘虏之锁全集下载| 《绝情》电影完整版| 花子vs倔强驱魔师动漫在线观看| 军刺电视剧全集优酷| 凯登克罗斯合集免费观看| 《机智的医生生活》电视剧| 世界杯巴西对克罗地亚| 乡村爱情13部全集免费刘能| 风流女管家免费观看电视剧| 菠萝蜜菠萝菠萝| 庞贝末日在线观看| 今夕是何年电视剧免费观看| 新济公活佛电视剧| 萨顶顶快去歌手顶一顶| 一个真正的女人| 仁者黄飞鸿国语| 六福喜事百度影音| 易建联29分| 他母亲的房子| 法国空姐四级片| 监控人1到100集免费看| 赤板栗《牙医姐妹》完整| 日喀则怎么读| 《女超人》麦乐迪版观看网站| 月升沧海电视剧| 姐妹医生在线观看| 大叔爱上小姑娘韩剧| 男女愁电视剧高清在线观看| 大兵日记全集| 女律师的坠落2理伦片| 空既是色| 《我的舞蹈女教练》| 战狼6免费国语版高清| 我女朋友的新妈妈双字ID免费| 动物的尾巴都有什么作用用处| 息烽县| 活命直播电影完整版免费观看国语 | 乡村欲妇肥臀| 五笔偏旁| 女和尚满天星第三季在线观看| 开战日电影在线看免费观看| 四大名捕大结局电影| 执法者们粤语电视剧在线观看| xl司令第一季全集在线观看完整版| 5哈第一季| 超人麦乐迪电影满天星在线播放| 刘老根第三部| 伦理片销售皇后 | 安姨在线| 华人城小说| 《丈夫邀部长来家吃饭》日剧部长看| 林师傅在首尔第二部| 给女儿播种| 《夕颜》动漫番剧全集| 女军医满天星免费观看| 非凡中文| 肉蒲电影完整版| 金瓶梅1-5电影观看完整版丿| 奶爸战神:打仗带娃完整版观看 | 美容院的特殊待遇 在线| 高清他和她的谎| 世间始终你好完整版原唱| 日本一本到道免费| 凯登克里斯版《壮志凌云》 | 侦探成旭3| 决杀令电视剧| 无声爆破| 爱的阶梯国语版| 和部长出差旅电视剧免费观看| 你微笑时很美全集| 伦理片京东塔俘虏女兵在线观看| 《梅根2.0》| 金银梅普通话免费观看完整版| 狂飙在线电视剧免费观| 日本战狼10完整版免费| 电影追龙2| 还珠格格之燕儿翩翩飞爱奇艺| 太九在线观看免费版电视剧| 胶囊旅馆樱花未增删| 梁飞大英雄电视剧全集在线观看免费| 剿匪英雄 电视剧| 美国禁忌1年转一代| 全职高手动漫在线观看| 莉亚戈蒂满天星免费观看全部剧情| 密爱 优酷| 韩国r电影在线| 菠萝蜜新区口| 缘来一家人第一季| 九歌电影| 哈马斯与法塔赫在北京磋商| 画江湖之不良人7季免费观看全集| 选调生之家| 八尺夫人意大利电影观看| 核污水排海个人防护指南| 《over flow》原版| 能登的新娘| 总统夫人| 夏目彩春出演的电影中文字幕| 浴火危城电视剧| 奶酪陷阱 韩剧| 孙红雷打黑风暴在线观看| 越南姑娘500元排毒的电影| 安吉拉怀特在线观看免费版英语单词 | 美国禁忌三| 需要爸爸播种子2全集免费看| 需要爸爸种子| 乡村爱情圆舞曲大结局| 3d豪情字幕下载| 法国极右翼领导人勒庞被查| 足球小将初中篇| 大男孩电影| 孤独摇滚动漫在线观看免费| 夫妻的世界完整版| 至尊无上| 美国粉红大白莱| 19岁姑娘电视剧免费观看| ooozzz| 高楞青年| 须要爸爸播种| 黑鸽子电视剧| 维修工人的绝遇2中文版免费观看| 高清《猎杀》免费观看| 斯巴达(大人版)满天星| 似火流年电视剧免费观看| 约翰尼盖尔克奇| 蝙蝠侠 猫女| 官方通报柳州一干部相关情况| 刺客伍六七第6季| 雨是眼泪| 肉写得很好的糙汉文| 交换温柔 快播| 杨敏思版1-5集电视剧在线观看 | 《机械师6》在线观看| 一站到底2018| 暴躁老妈妈46集全免费看| 家事法庭全集观看| 贝拉1980免费高清原声满天星美版| 你是我的眼 毛宁| HD版泰山《激战丛林》完整版免费国语 | 大陆年轻帅小伙飞机GAY| 三国62| 健身教练 35话 所以我们是| 女友被添荫蒂舒服极了| 爱在独木桥韩剧在线观看| 罗曼蒂克消亡史电影未删除完整版| 花之蛇2| 华人城小说| 代替不孕的丈夫HD中字| 葫芦娃兄弟动画片| 销售的销售秘密6| 电击小子第3部四圣团| 美味快递在线| 慕海情深 电视剧泰剧在线观看| 新娃娃脸经典版| 理智派生活电视剧免费观看| 秦雪梅哭灵| 乡村首富短剧全集| 斗罗大陆在线观看218| 《品味人生》全集免费看| 盲盒旅行局综艺免费观看完整版| 年轻的空姐4| 那小子不可爱电视剧| 巜人妻初次按摩忍不住| 全城热恋粤语版| 我要涩女郎| 鬼宫电视剧免费高清版| 爱情有烟火免费观看| 高清抢钱女王团| 卢湾区| 厨神王妃短剧全集| 唐朝诡事录电视剧免费观看| 冀天海免费观看| 免费电影网站在线观看完整版| 男人女人一起愁愁愁电视剧观看全集| 万万没想到之小兵过年| 伊能静和秦昊对唱的歌 | 芈月传电视剧全集下载| 电影《美味快递员2》免费完整版 《法国空乘4》免费完整版 | 青楼十2房在线观看| 油饼的热量| 美人心计第二部| 小蜜蜂电影| 我好兄弟女朋友| 欧美vivoestv高清| 大掌门电视剧全集| 伊波拉病毒2未删减完整国语版| 宁安如梦35集| 吕布戏貂蝉| 姐姐的男友2| 妻子的叛乱国语版| 鬼灭之刃锻刀村篇第五集| 《诱人的岳母| 乡村爱情8免费完整版电视剧全集| 仙剑奇侠传3 电视剧| 孩子们的秘密| 暗算电视剧免费高清完整版在线观看| 禁忌7年转一代| 一梦浮生电视剧在线观看 | 《窃欲无罪》电影| 《私人航空》法国在线播放| 恋情望你察觉动漫在线观看第一集| 上将许世友下载| 赤板丽的牙医姐妹电影观看| 抓娃娃电影下载| 在你灿烂的季节电视剧| 妹妹最近有点怪真人电影原声| 温柔的谎言 杨桃| 电影聊斋兰若寺免费观看 | 点燃我温暖你电视剧免费观看高清| 等着你回来粤语| 都市仙医| 八戒8免费观看完整版| 新金银2008普通话版| 电影灰姑娘的故事2| 宜昌保卫战电视剧| 最新泰剧大全| 溜溜影视| 我需要爸爸种子英文| 噬血狂袭第二季| 斗罗大陆电视剧第二部| 战狼9欧式少女高清资源下载| 长相思第二季免费全集电视剧| 强摸秘书人妻大乳BD| 需要爸爸播种电视剧| 最美的时光第一集| 乐亭县| 探案电影| 《愤怒的小鸟》| 《高压监狱2》法国| 唐朝好男人下载| 少女动漫免费观看全集| 需要爸爸播种手机在线观看| 昔有琉璃瓦全集免费看| 高清《我老公的朋友2》| 金并梅电视剧全集免费观看| 《青春变形记》国语版在线观看| 盗墓笔记12集| 特殊的游泳课4在线观看| 森林狼vs火箭| 无憾坎贝奇无删减版在线播放免费观| 诛仙电影版在线观看| 东北往事之黑道风云全集| 巜新婚人妻初次按摩2| 明明不喜欢免费观看电视剧| 柯南国语版全集高清| eeuss.| 神偷奶爸3(普通话)| 黑帮大佬我和我的365第二部| 巨茎挺进李淑芬,体内| 一路芬芳| 灭火宝贝未删减版| 丈夫的上司来拜访| 电影人肉玩具| 忘年恋电影在线观看免费| 东京塔之越南战俘营完整版电影在线观看| 黄梅戏秋风飒飒| 沙月由奈| 法国空姐3在线观看完整免费高清原声满天星奔跑吧ep | 哇嘎全部免费观看| 逃英乱港分子染上奥密克戎| 变形金刚2主演| 《晚安为我而眠》免费观看全集| 公浮之手理伦电影| 《借妻》完整版观看| 小辣椒1983年美国| 长乐曲电视剧免费播放| 芒果香谢军| 女儿国3满天星版美国| 对你不止是喜欢你电视剧免费观看| 甄嬛传46| 特邀外卖员在线免费观看完整版| 军医电视剧| 黑道大佬爱上我的365天| 修理工艳遇在线观看| 宫斗之步步为营全集免费| 黑豹天下国语版| 大江大河3免费看全集技巧| 花朵动漫| 皮囊之下在线观看| 《我的舞蹈女教练》| 现在是和相爱的人一起生活吗| 猛兽侠全集| 品味人生无憾电影免费观看| 马龙结了三次婚| YES4444视频在线观看| 《爱你几何》高清全集免费播放| 电视剧兰陵王吧| 情逆三世缘结局| 飞机特殊待遇5| 咱爸咱妈60年| 张雨筱人体| 电影《和部长一起去出差旅》免费观 | 哆啦a梦免费版在线观看| 我在伊丽莎白截取了一个小片段 | 特邀外卖员| 魔鬼天使 杨思敏| 电视剧血脉| 《急诊护士》电影| 心之全蚀| 女子跳水10米台决赛| 韩国电影在线观看修理工的艳遇| 遥远的距离电视剧| 同学的妈妈李采潭主演叫什么| 夜空中最亮的星电视剧| 笑咏春粤语| 女儿国3在线观看国语版| 罗刹海市歌完整版| 疯狂的节日1987| 天美影院在线观看免费观看电视剧大全 | 缘分五月在线看片| 男女一起愁愁愁高清全集| 前抛实心球| 风火雷电破手势图解| 电影《姐妹牙医》完整版免费播放| 春草全集| 三年中国在线高清观看观看| 免费vip电影电视剧| 李贞贤阿里阿里高清| 爸爸播种子,电视剧免费观看| 《我的砍价女王》电视剧| 荫道BBWBBB高潮潮喷| 朋友互换麦子在线观看| 女拳霸2国语| 理论片2018理论| 熊出没重启未来免费观看完整版| 天才基本法在线观看| 水月洞天全集| 产品定位五步法| 美版咒怨1| 《双女任务》完整版电影| 中国惊奇先生14| 篠田步美| 刘玉玲电影《满天星》| 高清《在你眉梢种红豆》电视剧| 蜜糖姐姐恋爱吧短剧免费观看| 交换年长的麦子哪里能看| 谭晶 我是歌手| 吕不韦传奇| 东京塔之越南女兵被俘| 徐锦江电影| 熊出没之年货动画片| 女子护卫队满天星1973完整版| 爸爸的3次婚礼| 伦理厨房与继牳3 | 代表建议严炒作网红儿童账号| 爱有几何莫妮卡免费观看完整版| 电视剧软弱| 老枪国语版在线观看免费| 巨乳小姨按摩电影| 缺宅男女大结局| 战狼6免费观看在线播放下载高清 《卖房子的女销售》完整版 | 少帅的秘密情人| 白峰在线免费观看| 阳阳电影| 桃花劫电视剧| 逍遥1-40集全免费观看电视剧| 爸爸去哪儿第一季免费观看| 蜗居电视剧35剧情全集在线观看 | 德田重男电影| 在天亮前离开 周程成| jiZZ日本ZZZ日本护士在线| 夺命金电影| 审查元素| 都市战神短剧全集| 安徽泗县地图| 黄秋生电影人肉叉烧包| 爱转角遇到爱全集| 电影殊死搏斗免费观看高清| 按摩店的特殊待遇| 蛋仔派对钩爪教程| 日本电影牙医姐妹在线观看 | 熟睡被义子侵犯完整版| 电影泪痕在线观看完整版| 贵妇人街电影版免费观看中文| 圣特罗佩女孩1982满天星| 《女教师》佐山爱电影| 海洋之恋番外篇| 乌拉特前旗| 婚姻保卫战电视剧1| 短裙公主超可爱| 越狱第五季在哪看| 暴躁100集全部免费观看下载 | 泛而不精的我被逐出勇者队伍| 电影姐妹牙医在线观看| 不扣钮的女孩子国语歌完整版| 扫黑风暴免费高清全集| 维修师傅的艳遇HD韩国免费观看| 庶女有毒:嫡姐避让全集免费| 龙山县| 电视剧爱情睡醒了| 食尚玩家| 神机妙算刘伯温2015| 安斋拉拉在线观看免费版全集高清| 扫黑行动在线观看免费高清完整版 | 高清《法利赛人》在线观看播放| 千方百计爱上你2015| 韩国电影美容店的特别待遇5中字| 终极笔记电视剧免费观看超清 | 高压监狱在线观看完整免费高清原声满天星2019法国 | 《美国农场1976达达》| 分界线电视剧全集免费观看完整版| 给社长当秘书替老公还债| 终结者6:黑暗命运| 动感之星168妖精全集免费观看| 史前战纪 第三季| 苗圃和李亚鹏| 塞罗奥特曼电影版| 电影天赐| 妈妈的味道韩国中字| 麻辣变形计2| 尺井芽衣| 柱训练篇| 无间道风云下载| 招待外卖员电影| 折腰电视剧免费观看全集在线播放| 美丽猎人在线观看| 斯巴达女勇士hr版 在线观看| 火线追凶2全集| 缘之空动画| 战狼六电影在线观看正版免费播放| 平泽里菜子| 小麻薯百变衣柜教程| 临泉县| 与君相刃电视剧免费观看 | 砍贝奇品味人生| 天下足球 歌曲| 婚姻料理电视剧免费观看完整版高清| 黄色仓库免费看| 恶意电影| 蜗牛电影在线观看免费| 汉寿县| 渔民家姑娘2幕后花絮| 我唾弃你的坟墓1| 女人当官电视剧全集| 《水电工人的艳遇》免费| 圣特鲁佩斯的姑娘们| 生命之树迅雷下载| 法国女仆在线播放| 电影一帘幽梦| 不识泰山| 电影麦乐迪女超人完整版免费观看| 在那遥远的地方电视剧| 《哈哈哈哈哈 第六季》未删减| 快播电影理论片| 菠萝蜜在线观看视频| 千山暮雪续集8| 假面超人rx全集| 爱我几何电影在线观看免费莫尼卡| 完美伴侣电视连续剧46集| 余姚市| 易建联29分| 青岛一酒店疑闪爆| 《女超人-麦乐迪版》百度云 | 保姆的特别待遇免费 | 速度与激情5完整版| 桃花映江山短剧免费观看完整版| x迷宫罗丽星克莱尔| 蜜桃成熟时3蜜桃仙子| 深夜姐妹会| 《金牌销售的秘密3》| 《陈圆圆》谭干聪| 完整的恶魔之眼| 《二对一的商务模式2》影视| 乡村爱情13电视剧免费观看| 《我的老师中字ID》免费观看| 揭东县| 吞噬星空104| 灯草和尚电影下载| 喜盈门电影免费播放| 坎贝奇无憾| 甄嬛传电视剧免费观看全集完整版| 笑傲江湖高清| 日本大学生特殊混血按摩电影| 相扑避难所| 2025《哪吒3》在线观看| 八戒7| 抗日奇侠演员表| 福尔摩斯小姐| 太平年电视剧免费观看完整版高清| 战狼10免费观看高清版电影在线 | 聊斋艳谭2| qingchunqi| 月光宝盒免费观看全集| 爆操老母1一46集| 美姐妹牙医电影完整观看视频在线| 吾岸更新至15集| 美丽的小瘦子7| 潜龙行动全集高清版| 美丽的桃子美国版5娃娃脸 | 让子弹飞解密| 电影《分娩按摩2》在线看| 坎贝奇电影《无憾》完整版| 全职猎人34| 美国式保罗2原版| 真命天子朱元璋| 张雪峰建议大学举行入学考| 下一站婚姻主题曲| 白雪公主成人版在线免费观看| 守护解放西纪录片| 高清良药苦口 第一季未删减| 《牙医姐妹》1986版| 蓝军出击电视剧免费观看全集| 电影《捍战2》| 苦尽甘来遇见你免费播放| 职场下属的妻子HD中字在线观看 | 城南花正开短剧免费全集完整版| 大江大河3第53集免费观看| 再说一次我爱你 刘德华| 河南坠子小八义| 1—5集普通话版免费观看| 圣诞节舞蹈| 西班牙肉体之罪未删减版| 阿信电视剧| 地心游记3| 飘香在线观看免费完整版| 电影美容室的特殊待遇7| 《仙剑奇侠传三》电视剧| 龙鸣少年| 坎贝奇无憾完整版| 《江湖夜雨十年灯》| 法国少女农场| 午夜狂情| 新月格格电视剧全集播放免费观看| 巨龙复仇者| 法国高压监狱伦理片| 幸福的黄手帕完整版| 最终幻想15王者之剑| 《花与蛇·牙医之绳》| 娃娃脸5在线观看完整免费高清原声满 | 浪漫女家教电视剧免费完整版 | 大红灯笼高高挂电影| 夏日里的春天优酷| 二人免费高清第27集在线观看 | 会昌县| 我朋友的年轻搜子8| 幸福的面包| 华灯初上在线观看| 铿锵锵锵锵锵全集免费看| 我的抗战之猎豹突击| 1959特赦| 《需要爸爸播种子》HD免费在线播放 - 全集电影 - 独角影视网 | 《二十一世纪爱情指南》免费观看俄 | 需要爸爸播种子美国电影1976完整版电 | 台湾硬汉兄弟| 我和岳交换夫妇交换系列| 21世纪免费观看完整版| 神秘人质电视剧全集优酷| 星落凝成糖电视剧免费观看西瓜 | 龙年档案剧情简介详细| 高清《恶意》电影| 传奇大掌柜剧情| 漂亮妈妈7中字开头7个字 | 爱情睡醒了21| 日剧《和讨厌的部长》中字| 电影《我要上学》| 大岛优子快播| 燕归来电视剧| 水润女人刘智贤主演| 西瓜英文| 饥饿游戏2:星火燎原| 追踪者第二季电视剧| 我的不良义姐| 波牛电影| 禁室培欲终结篇| 黑白配在线观看国语版| 智者无敌白鸽| 幸运星国语版| 《妻子与游泳教练》主演是谁瑜伽教| 珍馐记在线观看免费完整版| 归去来结局| 天赐之女电影完整版在线观看免费| 修理公艳遇之手中2完整版| 七彩云端APP下载安装| 罗小黑战记40| 我在魔界当大佬| 八戒,八戒神马网剧观看| 宠物小精灵剧场版6| 紫禁惊雷下载| 扇娘电视剧全集| 瓜达卢佩的玫瑰哪里能免费看| 广场舞玩腻| 电锯人女主| 酒店1-40集在线观看| 《女超人》2013麦乐迪视频| 手机qq4.1| 在异世界迷宫开宫口樱花| 台剧黛比浪漫女家教1最新集数和剧情| 谢孟伟《无主之城》在线观看 | 老严有女不愁嫁片尾曲| 韩剧三个出轨的女人剧情解析| 法国电影《塔日酒店》正片在线观看| 指挥战歌| 夏目彩春的| 星际迷航1百度影音| 浮之手HD版免费观看了| 暮光之城:破晓| 蝴蝶效应1| 《通往你的地图》| 欧美白雪公主h级成人版| 妈妈说带套可以给我| 甄嬛传53| 加百列的地狱| 女员工的付出5| 姜昕言吻戏| 《定风波》电视剧| 麦迪逊河谷 第一季| 需要爸爸播种子美国2019电影在线| 金沙朗电影| 房奴电视剧全集免费观看| 美女如云第四季| 无忧天堂| 女朋友的男朋友| 吕不韦传奇| 熟睡中突然被义子侵犯在线观看| 隐婚娇妻全集免费| 星克莱尔迷宫在线播放| 驯服有夫之妇HD中字日本 |