婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av

電子開發網

電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

MCS-51單片機系統軟復位的深入研究

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2009-6-12
摘要 在沒有硬件看門狗的系統以及一些對單片機I/O口線狀態高度敏感的系統中,軟復位功能相當重要。標準MCS-51以及很多常見的51內核單片機沒有提供“軟復位”方法。本文分別以5lasm子程序和C51函數的形式,為MCS-51單片機系統提供完善的“軟復位”方法。
關鍵詞 MCS-51單片機軟復位51asm C51


引 言
    復位是單片機的初始化操作,其作用是使單片機和系統中其他部件處于一個確定的初始狀態,并從這個狀態開始工作。
    標準MCS-51的復位邏輯比較簡單,只有通過復位引腳RST進行外部擴展。對于具有外部看門狗芯片的系統,當單片機由于某種原因程序“跑飛”而沒有按時“喂狗”,或由軟件陷阱捕捉到程序運行的異常,而故意不“喂狗”時,看門狗芯片會給單片機的RST引腳提供一個復位信號,讓單片機進行一次“硬”復位,以恢復程序的正常運行;有些5l內核的單片機具有片內的看門狗,或者提供可訪問的寄存器實現“軟件復位”。一般實現的也都是與在RST引腳提供復位信號等價的“硬”復位。
    在有些應用中,由于單片機所接外設嚴格依附干單片機口線的時序,甚至不允許硬件復位時對口線的復位操作;或由于系統沒有外部看門狗,只能用軟件監測程序運行異常并重新對單片機進行初始化操作,這時就需要所謂的“軟復位”了。
    在互聯網上可以找到一些軟復位的方法,但都不夠完善或不方便使用,基于C5l的軟復位更是一個難點。本文提出一種功能完善、占用資源少的實現方法,在51asm和C51下都可方便使用。


1 “軟復位”要實現的功能
    對于MCS-51系統,所謂“軟復位”是一種由用戶軟件控制的復位活動,利用一系列指令來模擬硬件復位所實現的各種操作內容,并且重新從頭開始執行用戶程序。其內容包括:
    ①程序計數器PC的復位,從0000H開始執行程序;
    ②中斷優先級狀態觸發器的復位;
    ③特殊功能寄存器的復位;
    ④程序跑飛前狀態的盡量恢復。
    其中,特殊功能寄存器的復位可根據具體系統的需要,在軟復位以前對相關寄存器逐個賦值再軟復位的方法完成,或在復位以后的初始化程序中實現;程序跑飛前狀態的恢復也可根據RAM中存留的數據來進行判斷處理。本文重點討論關于程序計數器的復位和中斷優先級狀態觸發器的復位,在此基礎上不難再增加特殊功能寄存器的復位和程序跑飛前狀態的恢復,下文不再涉及相關代碼。
    程序計數器的復位容易實現,一條“LJMP 0000H”即可。中斷優先級狀態觸發器的復位則比較困難,由于它們對于用戶程序是不可見的,無法直接讀寫其內容,只有用RETI指令才能清除。又由于51單片機兩級中斷機制,低優先級中斷有可能被高優先級中斷再次中斷而形成中斷再入,而一次RETl只能退出當前優先級中斷并清除相應的中斷優先級狀態觸發器,因此最壞情況下需要兩次RETI才能確保中斷優先級狀態觸發器的復位。綜合考慮,可先用壓棧的方法準備跳轉后的入口地址,再用RETI來完成跳轉和清除中斷優先級狀態觸發器的雙重任務,把以上過程執行兩次,前一次的目標地址是后一次的入口,后一次則跳轉到0000H,完成復位過程。


2 軟復位的實現方法
    前已述及軟復位要完成的功能,包含程序計數器PC的復位、中斷優先級狀態觸發器的復位、特殊功能寄存器的復位(略)和程序跑飛前狀態的恢復(略)。下面分別用匯編程序和C51程序來實現,重點介紹C51程序的實現方法。
2.1 51asm匯編程序實現

    使用時,在軟件陷阱處理程序段或軟件看門狗中用“LJMP #RST_O”指令跳轉到此段程序入口處即可。
2.2 C51程序實現
    用C語言實現MCS-51系統的軟復位,互聯網上出現過多種版本,但都不夠完善。以下基于業界應用最廣泛的編譯器Keil C51來討論。如:

    這段程序,用強制類型轉換把地址0000H轉換成re-set_not_best_O()函數的入口。實際上調用函數reset_not_best_O()等價于“LJMP 0000H”,沒有處理可能的中斷狀態問題。
    又如:

    這段代碼中,一維字符數組中為復位代碼的機器碼。“(*((Void(*)())(rst)))()”是把rst這個字符數組的地址強制轉換成函數指針,并調用。實際上調用函數reset_not_best_1()是執行了一段如下代碼:

    可見,調用一次reset_not_best_l()函數相當于執行了1次清除中斷優先級狀態觸發器的動作,然后跳轉到0000H重新執行。但此段代碼仍然可能被再次中斷失效,或者當原來堆棧已經溢出時導致對0000H地址的壓棧錯誤,不能正確實現“軟復位”功能。除此之外,由于KeilC5l在把控制權交給函數main()之前對內部RAM進行初始化的代碼是:

    此處R0作為循環變量使用,對內部RAM從7FH單元開始,按照每次遞減的方法對內部RAM逐一進行清零。當R0指向00H時,以上程序可以很好地完成清零工作;然而R0依據RS0、RSl取值的不同,可以指向00H、08H、10H或18H單元。當:R0指向08H、10H或18H時,上面所列清零程序將陷入死循環。分析如下:
    以RS0=1、RSl=0,即RO指向08H為例。自標號LOOP處起始的循環進入時的狀態是:R0=7FH,PC=#LOOP。設程序已執行到R0=08H,PC=#LOOP,此時執行PC指向處的指令“MOV @RO,A”,將把(RO)清零,也即08H單元清零。由于R0指向08H,實際上R0也被清零了,此時RO=00H,PC=#LOOPl;再執行一條指令“DJNZ R0,LOOP”,R0將由00H自減為OFFH,回到R0=OFFH,PC=#LOOP的狀態;繼續執行,將再次出現R0==08H,PC=#LOOP的狀態,陷入死循環。當R0指向10H或18H單元時也類似會陷入死循環。為了避免上述問題,可以把字符數組中機器碼改為與以下程序段對應:

    調用改造后的reset_not_best_l()函數將清除中斷優先級狀態觸發器,并跳轉到0000H單元繼續執行,從而實現了軟復位。但由于只執行了1次RETT指令,在復位前出現了中斷再入的極端情況下,仍會出現低優先級中斷放鎖死的現象。由于無法在字符數組中實現對最終代碼地址的取得,無法如2.1節匯編程序中的“MOV DPTR,#RSTl”一樣讀取絕對地址,因此也無法實現如同2.1節中的兩次RETl來保證清除全部的中斷優先級狀態觸發器。解決的辦法是,在內存中設置標志flag,每次復位后都檢查特定標志,接如下偽代碼來判定(假定復位標志設為0x55,若復位后發現標志字為0x55則轉正常初始化程序,否則置復位標志為0x55,再次復位):

    但這種辦法有兩個弊端:其一,萬一在程序跑飛時剛好處在中斷再入中,且flag所在的RAM地址中由于某種原因恰好是0x55,低級中斷仍是被鎖死的;其二,Keil C5l的缺省編譯模式是加上了初始化程序段startup.A51的,在這段程序中對全部的內部RAM都進行了初始化,復位標志也會被清0,flag將失效。因此要正常使用標志flag必須手工修改startup.A5l,不要清除flag單元,或者禁止stanup.A5l的使用,自己對內部RAM進行初始化,都比較繁瑣。
    若用以下reset_best()函數,則可順利解決上述問題:

    在此函數中,首先定義了結構體類型ResetStruct,它包含字符數組rstcode和16位整型數addr兩個成員。在結構體變量的RST實例中,RST.rstcode是復位代碼對應的機器碼,RST.addr的值是RST.rstcode這個數組的首地址+偏移量0x15。其實是以下匯編代碼中標號rstl處的地址,也即是“#rstl”,由Keil C51在編譯時自動計算得到。


    此reset_best()函數巧妙地利用C語言中數組名即是數組首地址(其實質就是這一段“軟復位”代碼的入口地址!),把數組名+偏移量0x15賦值給結構體的int型的成員addr,則正好把軟復位代碼中標號rstl的入口地址兩個字節取了出來(由KeilC51在編譯連接時完成),存放在RST.addr中,由于結構體連續存儲,RST.addr會緊接著軟復位代碼RST.rstcode存放。見上段程序中的“DB #LOW(rstcode+OFH)”和“DB #HIGH(rstcode+09H)”。
    當本程序被調用并執行到“MOVC A,@A+PC”時,分兩次取到的分別是“#rstl”的低位和高位字節,把它們壓棧以后再調用RETI指令,除了清除可能有的中斷優先級狀態記錄外,還會跳轉到rstl執行后續的連續兩次壓棧操作,把第2次RETI的返回地址設為0000H,再通過緊接著的RETI指令,清除可能還有的中斷優先級狀態記錄,并跳轉到0000H完成完整的復位操作。
    本程序使用一個C51函數完成了完整的包含兩次RETI在內的復位操作,消除了所有已知隱患,只需在應用程序中包含此reset_best()函數,在需要軟復位時調用即可。2.1節中所列匯編語言的子程序也可使用本節分析時所用匯編代碼代替。


結 語
    本文對MCS-51單片機的“軟復位”進行了深入討論,給出了分別基于51asm的匯編子程序和基于C5l的函數。使用本文所述的“軟復位”方法,無論是5lasm程序還是C51程序,所需的資源消耗都很小,只占用二三十個字節的程序存儲器,使用也非常簡單,不會增加編程負擔。當具體應用系統還需進行特殊功能寄存器的復位以度程序跑飛前狀態的恢復時,在此基礎上也很容易實現。特別是當單片機所接外設嚴格依附于單片機口線的時序,須盡量避免硬件復位對口線的復位操作或系統不具備硬件看門狗時,對于提高單片機系統的抗干擾能力有較大的實用價值。實際應用表明,這種軟復位方法是非常有效的。
Tags:單片機,復位,知識,單片機研究  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢
婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av
<button id="4i884"></button>
  • <abbr id="4i884"><source id="4i884"></source></abbr>
  • <code id="4i884"><tr id="4i884"></tr></code>
  • <rt id="4i884"></rt>
    <li id="4i884"></li>
  • <rt id="4i884"><tr id="4i884"></tr></rt>
  • 99热这里只有精品7| 妞干网在线免费视频| 欧美 亚洲 视频| 日韩中字在线观看| 国产乱子伦农村叉叉叉| 国产aaaaa毛片| 国产精品igao激情视频| 久久久亚洲国产精品| 女人高潮一级片| 久久在线中文字幕| 男女激烈动态图| 182午夜视频| 欧美午夜aaaaaa免费视频| 国产美女主播在线播放| 99久久久精品视频| 天天做天天爱天天高潮| 久热精品在线播放| 欧美国产日韩在线播放| 黄色免费视频大全| 成人在线观看黄| 可以看毛片的网址| www亚洲国产| 亚洲成人动漫在线| 欧美 日韩 国产 高清| 高清欧美精品xxxxx| 日韩少妇内射免费播放18禁裸乳| 特级黄色录像片| ijzzijzzij亚洲大全| 无遮挡又爽又刺激的视频| 欧美伦理片在线观看| 91香蕉视频污版| 偷拍盗摄高潮叫床对白清晰| 黄色录像特级片| 国内自拍视频一区| 手机av在线网站| 国产在线xxxx| 邪恶网站在线观看| 人妻少妇精品无码专区二区| av免费在线播放网站| 三日本三级少妇三级99| 少妇高潮喷水在线观看| 国产成人美女视频| 国产二级片在线观看| 樱花草www在线| 三级av免费观看| 国产一级大片免费看| 99色精品视频| 青青草原网站在线观看| 亚洲一二区在线观看| 激情视频综合网| 欧美一级片中文字幕| 亚洲熟妇无码一区二区三区| www亚洲国产| 国产一二三四五| 91蝌蚪视频在线观看| 亚洲黄色片免费看| 手机免费av片| 国风产精品一区二区| 手机在线看福利| 日韩av片免费观看| 精品一区二区成人免费视频| 精品一区二区三区毛片| 成人在线免费观看网址| 国产黄色激情视频| 欧美一区二区激情| 男女午夜激情视频| 加勒比av中文字幕| 97干在线视频| 蜜臀av免费观看| 亚洲啊啊啊啊啊| 国产免费视频传媒| 久久香蕉视频网站| 能在线观看的av| 黑人巨大国产9丨视频| 日韩a∨精品日韩在线观看| 99草草国产熟女视频在线| 小说区视频区图片区| aa在线免费观看| 久久观看最新视频| 手机在线国产视频| 国产又黄又猛又粗| 91麻豆天美传媒在线| 波多野结衣天堂| 一本久道综合色婷婷五月| 99er在线视频| 尤物国产在线观看| 成人久久久久久久久| 超碰在线公开97| 亚洲色图偷拍视频| 亚洲国产精品无码观看久久| 一区二区三区 欧美| 亚洲欧美久久久久| xx欧美撒尿嘘撒尿xx| 九九热视频免费| wwww.国产| 久久久久xxxx| 成人高清dvd| 麻豆av免费在线| 爱爱爱爱免费视频| 日本激情视频在线| 分分操这里只有精品| 丰满少妇被猛烈进入高清播放| 乱子伦一区二区| 农村妇女精品一二区| 伊人国产在线视频| 男人添女人下部视频免费| 69堂免费视频| 91手机视频在线| 欧美 国产 综合| 成人污网站在线观看| 97视频在线免费播放| 99在线观看视频免费| 91在线视频观看免费| 97超碰国产精品| 三级黄色片免费看| 亚洲一区二区三区av无码| 一级片视频免费观看| 国产精品-区区久久久狼| 天天操夜夜操很很操| 欧美精品无码一区二区三区| 国产午夜大地久久| 日本a在线免费观看| 色哟哟免费网站| 黄黄视频在线观看| 男女污污视频网站| 亚洲一级片网站| 九九热99视频| 欧美丝袜在线观看| 国产免费中文字幕| 色噜噜狠狠一区二区| 污污的网站18| 91极品视频在线观看| 无尽裸体动漫2d在线观看| 天天爽人人爽夜夜爽| 日韩一区二区三区不卡视频| 视色视频在线观看| 香港日本韩国三级网站| 波多野结衣在线免费观看| 99久久久无码国产精品性色戒| 国产在线视频在线| 国产v亚洲v天堂无码久久久| 亚洲欧美在线精品| 日本中文字幕一级片| 九九九在线观看视频| 91九色国产ts另类人妖| 免费的一级黄色片| 成人免费看片视频在线观看| 日韩亚洲欧美视频| 毛片在线视频播放| 2021狠狠干| 成人在线看视频| 91成人综合网| 亚洲一二三av| 欧美婷婷精品激情| 亚洲熟妇无码一区二区三区| 偷拍盗摄高潮叫床对白清晰| 97视频在线免费播放| 国产日韩av网站| 亚洲成色www.777999| 97干在线视频| bt天堂新版中文在线地址| 国模无码视频一区二区三区| 污污网站免费观看| 91黄色在线看| 中文字幕精品在线播放| 国产一伦一伦一伦| 国产三级三级看三级| 免费看黄在线看| 欧美成人xxxxx| 日本999视频| 日韩在线xxx| 天天操天天干天天做| 蜜桃视频成人在线观看| 成人高清在线观看视频| 久久人人爽人人爽人人av| 国产91沈先生在线播放| 97超碰在线人人| 精品久久久99| 中文字幕成人在线视频| 在线观看18视频网站| 精品人妻少妇一区二区| 777久久久精品一区二区三区| av在线免费观看国产| 国产91对白刺激露脸在线观看| 国产妇女馒头高清泬20p多| 在线观看国产福利| jizz18女人| 国产精品12345| 黄色一级视频播放| 亚洲免费黄色录像| 美女网站视频黄色| 小早川怜子一区二区三区| 成熟丰满熟妇高潮xxxxx视频| 欧美黄色一级片视频| 成人在线免费观看网址| 国产色视频在线播放| 99sesese| 国产精品嫩草影视| 嫩草影院国产精品| 日本黄色的视频|