| Libin 的个人资料绿色家园照片日志列表 | 帮助 |
|
9月30日 嵌入式系统中用setjmp和longjmp在中断服务程序中实现跳转仔细看了MSDN,标准c的库函数中提供setjmp和longjmp。
当setjmp和longjmp组合一起使用时,它们能提供一种在程序中实现“非本地局部跳转”("non-local goto")的机制。这种机制常常被用于来实现,把程序的控制流传递到错误处理模块之中;或者程序中不采用正常的返回(return)语句,或函数的正常调用等方法,而使程序能被恢复到先前的一个调用例程(也即函数)中。----好方法,正是我正在寻找的。
但是再仔细看longjmp的说明。
不要使用longjmp函数,来实现把控制流,从一个中断处理例程中传出,除非被捕获的异常是一个浮点数异常。----这里明显说明了不能简单的在中断服务程序中调用longjmp,来做非本地局部跳转。
问题来了,在简单的嵌入式系统中不方便而且不需要做复杂的信号量,或者软中断处理,怎么办呢?
经过仔细考虑和检查中断处理函数的原代码,发现一些端倪。之所以不能在中断处理函数中调用longjmp是因为,通常的中断服务程序退出前,必须做系统环境的恢复,这里主要的操作有:
1. 恢复中断优先等级;
2. 恢复进入中断服务程序前的寄存器;
3. 开中断;
说到这里,你可能明白了,其实主要原因是,调用longjmp必须在这些操作之后才不会出导致系统无法运行了。可是,这些一般的交叉编译工具都会为你做了,你没办法再去控制到这些操作了,怎么办呢?
我的做法是:在调用longjmp之前,恢复系统初始化时设定的中断优先等级,开中断(至于进入中断服务程序前的寄存器已经完全没有必要了)。你会看到longjmp后,中断服务函数中在longjmp之后的汇编代码都不会再执行了,而是正确恢复了系统状态,并跳转到了你setjmp的位置了。切忌,这个方法目前只适用于你有交叉编译工具源码的嵌入式系统上。 |
|
|