小智 5
你的回答是我所知道的最好的方式.关键是你在函数调用中有汇编指令,它们都是自己的.编译器不会优化其中包含内联汇编的函数,因此如果将重置指令内联到一个非常大的函数,编译器将不会优化该函数中的任何代码.您可以通过将Reset置于其自己的函数中来避免这种情况.这个函数中的代码不会被优化,但是谁在乎,因为它是一个如此小的功能.
这里有一个常见问题解答。
问:如何重置微控制器?
一种方法是将所有变量重置为其默认值,如 PIC 手册中所列。然后,使用汇编语言跳转到micro中的0x0000位置。
#asm ljmp 0x0000
#endasm
即使在中断或过程中调用,这也非常安全。PIC 16x 系列微处理器有 8 个堆栈级别。每次调用过程时,都会使用一层堆栈作为返回地址。它是一个循环缓冲区,因此即使微程序深度为 7 个程序级别并且在调用重置时处于中断状态,这也是堆栈缓冲区的新开始,并且微程序将照常继续。
另一种方法是在芯片编程时设置看门狗定时器,并在整个代码中使用 CLRWDT() 指令。当您希望微控制器复位时,请停止清除看门狗位,微控制器将在大约 18 毫秒到 2 秒后复位,具体取决于预分频器。