新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機嵌入式系統軟件復位的幾種方式

        單片機嵌入式系統軟件復位的幾種方式

        作者: 時間:2012-08-28 來源:網絡 收藏

        飛思系列的8位沒有特定的控制寄存器可以實現,當程序運行過程中代碼需要強行產生一個時必須通過一些技巧實現:

        本文引用地址:http://www.104case.com/article/148513.htm

        ,程序從頭運行,硬件不復位。復位腳無復位脈沖輸出

        這可以通過直接獲取復位向量的來實現:

        void ForceReset(void)

        {

        uniON {

        void (*vector)(void);

        byte c[2];

        } softReset;

        softReset.c[0] = *(byte*)0xFFFE; //get the reset vector

        softReset.c[1] = *(byte*)0xFFFF;

        softReset.vector(); //re-STart the code flow

        }

        硬復位,程序從頭運行,內部所有硬件模塊和寄存器同時復位,復位腳有復位脈沖輸出

        這必須結合FSL 8位內部的架構特點來實現:

        1)COP(看門狗)復位

        這是最簡單的一種。程序死循環然后等看門狗作用產生復位。你必須事先啟動看門狗功能,復位過程將有少許延時。

        void ForceReset(void)

        {

        DisableInterrupts; //disable all interrupt

        for(;;); //wait for watch-dog reset

        }

        2)非法尋址復位

        當指令對某一個不存在的內存空間進行尋址操作時會產生硬件復位。

        void ForceReset(void)

        {

        asm JMP 0xD000; //jump to illegal address will result a RESET

        }

        注意不同芯片其有效內存空間配置不同,具體地址需參考芯片數據手冊做適當調整。

        3)非法指令復位

        當執行一條不存在的指令編碼時單片機會產生硬件復位。這里又可以分兩種手段:

        a) 利用“合法”指令在特定配置模式下的“非法性”,例如STOP指令。

        如果在芯片的配置寄存器SOPT中設定STOPE位為0禁止STOP指令,你若再執行STOP就會認為是非法指令從而立即產生復位。

        void ForceReset(void)

        {

        asm STOP; //illegal STOP will result a RESET, note SOPT_STOPE must be 0

        }

        如果你的應用中正常情況下不會用到STOP,就可以用這種。如果你本來就要用STOP指令就不能用這種方式產生復位,因為SOPT寄存器在復位后只能被寫一次。

        b) 人為制造非法指令然后強行運行。

        這是比較通用的一種方法,這個S08內核系列均可適用。在單片機的指令表中確認一條不可能出現的指令編碼,例如0x9E10,將其填入RAM中然后強制運行,即可立即產生復位。

        void ForceReset(void)

        {

        byte illegalCode[2];

        illegalCode[0] = 0x9e;

        illegalCode[1] = 0x10; //illegal instruction

        ((void (*)(void))illegalCode)(); //execute illegal instruction will result a RESET

        }

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 邳州市| 汝州市| 益阳市| 始兴县| 且末县| 华阴市| 神木县| 葫芦岛市| 宜黄县| 锡林浩特市| 芦溪县| 柏乡县| 永川市| 颍上县| 新源县| 县级市| 汝城县| 容城县| 沂水县| 盈江县| 根河市| 临清市| 忻城县| 类乌齐县| 永吉县| 峡江县| 郧西县| 石门县| 江陵县| 醴陵市| 田东县| 阜康市| 山东| 迭部县| 永宁县| 马山县| 德化县| 南陵县| 祁连县| 邵阳市| 专栏|