色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C8051Fxxx程序丟失問題及預(yù)防措施分析

          C8051Fxxx程序丟失問題及預(yù)防措施分析

          作者: 時(shí)間:2012-07-29 來源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://cafeforensic.com/article/171115.htm

          ③ 將Flash寫/擦除指針指向data或idata區(qū)。
           ?、?減少將PSWE置1的指令操作。理想的情況是只有兩個(gè)操作將PSWE置1,即寫1個(gè)Flash字節(jié)和擦除1個(gè)Flash字節(jié)。
           ?、?在Flash寫/擦除函數(shù)中,使能VDD監(jiān)視并設(shè)置復(fù)位源。使能和設(shè)置操作必須在實(shí)際的寫操作發(fā)生之前,置PSWE=1之后完成。
           ?、?代碼中所有的對(duì)RSTSRC的寫操作均用直接賦值方式完成(如RSTSRC = 0x02),不能用讀/寫指令(如ORL或ANL)來完成。例如,代碼“RSTSRC |= 0x02”是非法的。
           ?、?對(duì)于能用PORSF位來設(shè)置VDD為復(fù)位源的器件,保證在寫RSTSRC時(shí)置PORSF=1,即先使能VDD為復(fù)位源,再使能其他復(fù)位源的操作,如時(shí)鐘監(jiān)測(cè)(missing clock detector)、比較單元和軟件復(fù)位。

          4 一個(gè)實(shí)際應(yīng)用方案

            在有的應(yīng)用場(chǎng)合,由于需要較快的執(zhí)行速度,不能使用單片機(jī)的內(nèi)部時(shí)鐘作系統(tǒng)時(shí)鐘源,所以使用外部晶振來提供時(shí)鐘。在這種情況下,首先要在硬件上確保系統(tǒng)工作參數(shù)正常。

            在軟件上,由于最常見的Flash原因是,所以可以在代碼中用多種方法來預(yù)防Flash數(shù)據(jù)。首先,在初始化單片機(jī)時(shí),使能VDD檢測(cè),并設(shè)置VDD和時(shí)鐘丟失為復(fù)位源。如果中有寫/擦除Flash的代碼,則在寫/擦除操作前切換系統(tǒng)時(shí)鐘,將系統(tǒng)時(shí)鐘切到內(nèi)部時(shí)鐘或?qū)ν獠繒r(shí)鐘2分頻;寫/擦除操作完成之后,再恢復(fù)系統(tǒng)時(shí)鐘,通過增加Flash修改操作時(shí)的時(shí)間開銷來實(shí)現(xiàn)系統(tǒng)的穩(wěn)定[2]。以下以C8051F126為例,給出了系統(tǒng)時(shí)鐘切換的清單:

            void SYSCLKAdjust(unsigned char select) {
              EA_Save=EA;
              SFRPAGE=0x0f;
              switch(select) {
                case 0x01:
                  OSCICN_Save = OSCICN;
                  CLKSEL_Save = CLKSEL;
                  OSCICN = 0xc3;//內(nèi)部時(shí)鐘,不分頻
                  CLKSEL = 0x00;
                  break;
                case 0x02:
                  OSCXCN_Save = OSCXCN;
                  OSCXCN |= 0x70;//外部時(shí)鐘2分頻
                  break;
                default://選擇內(nèi)部時(shí)鐘
                  OSCICN_Save = OSCICN;
                  CLKSEL_Save = CLKSEL;
                  OSCICN = 0xc3;
                  CLKSEL = 0x00;
                  break;
              }
            }

            要恢復(fù)系統(tǒng)時(shí)鐘到Flash操作前的狀態(tài),只需將CLKSEL_Save、OSCICN_Save、OSCXCN_Save重新寫回到CLKSEL、OSCIN、OSCXCN。

            C8051F126的系統(tǒng)時(shí)鐘(SYSCLK)可以在內(nèi)部時(shí)鐘和外部時(shí)鐘之間自由切換,切換時(shí)的操作要求如下:

           ?、?在切換過程中,先設(shè)置所選時(shí)鐘的屬性,再用CLKSEL將其設(shè)置為SYSCLK。
            ② 在還原過程中,先用CLKSEL選擇時(shí)鐘源,再設(shè)置其屬性。
            ③ 如果切換過程中關(guān)閉外部晶振,要再恢復(fù)外部時(shí)鐘,啟動(dòng)后至少要等1 ms,再去讀XTLVLD(OSCXCN.7)來判斷晶振時(shí)鐘是否穩(wěn)定。否則,可能讀到錯(cuò)誤值。
            ④ 在外部時(shí)鐘穩(wěn)定運(yùn)行后,再對(duì)其分頻,不必插入等待周期。
            ⑤ 在切換過程中,可以保持外部時(shí)鐘繼續(xù)運(yùn)行,這樣在還原過程中就不必等待外部時(shí)鐘穩(wěn)定,從而節(jié)省時(shí)間開銷,代價(jià)是系統(tǒng)功耗有所增加。

          5 總結(jié)

            程序丟失會(huì)帶來各種不良的后果,最嚴(yán)重時(shí)致使程序無法正常運(yùn)行,從而造成整個(gè)系統(tǒng)崩潰,給產(chǎn)品的應(yīng)用帶來麻煩。在系統(tǒng)的硬件設(shè)計(jì)和代碼編寫過程中,通過對(duì)以上的注意,可以有效地防止程序丟失的出現(xiàn)。另外,由于系統(tǒng)時(shí)鐘的切換只發(fā)生在Flash的寫/擦除過程中,操作結(jié)束后又恢復(fù)成原來的設(shè)置,因而對(duì)系統(tǒng)運(yùn)行速度的影響很小,從而保證了系統(tǒng)其他功能的實(shí)現(xiàn)。


          上一頁 1 2 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉