原文地址:何登成的技术博客
http://hedengcheng.com/?p=725\
* int setjmp(jmp_buf env)
创建本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序[1] 保存程序的调用环境于env参数所指的缓冲区,env将被longjmp使用。如果是从setjmp直接调用返回,setjmp返回值为0。如果是从longjmp恢复的程序调用环境返回,setjmp返回非零值。
* void longjmp(jmp_buf env, int value)
恢复env所指的缓冲区中的程序调用环境上下文,env所指缓冲区的内容是由setjmp子程序[1]调用所保存。value的值从longjmp传递给setjmp。longjmp完成后,程序从对应的setjmp调用处继续执行,如同setjmp调用刚刚完成。如果value传递给longjmp零值,setjmp的返回值为1;否则,setjmp的返回值为value。
volatile(易变的),编译器不做优化,直接读取原始的内存地址
嵌入式开发中寄存器数据定义时经常使用
#define CONDATA ((volatile int )0x80000000)
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
static jmp_buf buf;
main()
{
int a;
volatile int b;
a = 2;
b = 3;
if(setjmp(buf) != 0)
{
printf("a:%d,b:%d\n", a, b);
exit(0);
}
a = 5;
b = 5;
longjmp(buf,1);
}
volatile修饰后,访问都要取内存中的值,而不是当前环境的值
volatile的应用位置
- 硬件寄存器数据访问时,如果这个寄存器的数据可能被硬件修改。一定使用volatile修饰这个变量
- 中断服务程序中的一些非自动变量
- 在多线程中被几个线程共享的变量
volatile**不能保证程序执行的原子性以及只能一定程度上保证有序性(能禁止指令重排序),但是这里只能保证volatile所修饰的变量之前的程序不会在该变量之后执行,该变量之后的代码不会在变量之前执行。**
明确的说,volatile 跟多线程无关,它不是一种同步手段,用它来实现线程安全是错的。
本文详细解析了setjmp与longjmp函数的工作原理及其应用场景,并深入探讨了volatile关键字的作用与限制,尤其是在多线程和嵌入式开发中的应用。
618

被折叠的 条评论
为什么被折叠?



