当前位置: 代码迷 >> 单片机 >> msp430 进去中断后修改堆栈内的PC值
  详细解决方案

msp430 进去中断后修改堆栈内的PC值

热度:335   发布时间:2016-04-28 15:21:00.0
msp430 进入中断后修改堆栈内的PC值
430 进入中断先保存PC,SR然后保存R12~R15,我只在堆栈中修改了PC值,其他都没改,我调试了下可以跳转到指定函数运行,不过再往下运行就会出现各种错误。

------解决方案--------------------
你在堆栈中修改PC是想干什么,想要做多线程还是什么?

中断中修改了保存在栈中的PC值,可以跳转到指定的函数,是,没错。但是,跳转到新的函数之后,栈指针可还是指向在中断前被打断的那个函数时用到的栈哦。你现在新函数是用的原来的函数的栈,里面运行时的寄存器全部都这样被“修改”了,原来的函数,其他的函数用的栈全部都乱套了,你的程序能不出问题嘛。

如果是想做多线程,可不单单是修改个栈里面的PC就够了,现场的保存和恢复你不做是不行的。
------解决方案--------------------
基本上是楼上说的那样。
如果想细究,你可以看下中断跳转那部分的代码。
例如Cortex-M3,任务呗中断后 指向任务的堆栈(中断时已经把相关值入栈),跳转到了MSP去,堆栈完成后,将切换到任务堆栈,恢复现场。你自己通过修改PC跳转的话,现场没有被恢复,结果当然是异常的!
------解决方案--------------------
LZ可以参考一下部分实时系统里的移植文件

像UCOS,有现成的上下文切换的文件,看看人家是怎么做的
------解决方案--------------------
在中断里修改PC,然后跳到指定函数,的确没任何问题,因为这是RTOS的最基本设计。至于跳到函数内部后执行错误,是因为你的上下文没有保存,堆栈没有恢复,跳到新的pfn后,堆栈还是原来的堆栈,上下文还是原来函数的上下文。开源免费的freertos有专门针对430的中断处理.s文件,你可以参考。