CrazyBingo

volatile 指针指来指去干嘛呀->nios2 PIO中断ISR

0
阅读(3160)

volatile int key_edge;

void* key_edge_ptr = (void*) &key_edge;   

volatile int* key_edge_ptr = (volatile int*) key_isr_context;

(1) volatile int key_edge;

a) 定义整型参数key_edge。

b) Volatile是type-modifier,类型修饰符,限定一个对象可被外部进程(操作系统、硬件或并发进程等)改变,volatile与变量连 用,可以让变量被不同的线程访问和修改。volatile就是告诉编译器,别对这个变量做任何优化,因为它随时都会改变。

c) 不会被编译器优化,随时都可以访问,可以改变的整型key_edge。

 

(2) void* key_edge_ptr = (void*) &key_edge;

a) void * 是“无类型指针”,void * 可以指向任何类型的数据。

b) (void*)表示强制转换为空指针类型,括号表示优先级。

c) 取key_edge的地址,强制转换为void*类型的指针。

d) 定义了一个空指针类型Key_edge_ptr。

e) 将强制转换的空指针类型(&key_edge)赋值给空指针类型的key_edge_ptr。

f) gcc这种比较严谨的编译器要求必须类型匹配才能赋值:

i. 类型 = 类型, 否则警告

ii. 指针 = 指针, 地址映射

 

(3) volatile int* key_edge_ptr = (volatile int*) key_isr_context;

a) 强制转换空类型指针key_isr_context为异变的整型指针

b) 定义了易变的整型指针key_edge_ptr

c) 将强制转换的易变整型指针类型(key_isr_context)赋值给易变整型指针类型key_edge_ptr