c语言中的_attribute_()和(volatile unsigned long *)怎么用?
小技巧:用c语言写代码的时候,要先设置栈。
作用:
1.attribute__可以设置函数属性,变量属性和类型属性。
属性有哪些:
当__attribute 用于修饰对象时,它就如同C 语言语法体系结构的类型限定符,跟const , volatile , restrict 等属一类。
当__attribute__ 用于修饰函数时,它就相当于一个函数说明符,跟inline,Noreturn 属同一类。
当__attribute_ 用于修饰一个结构体,联合体或者枚举类型,该限定符只能放在类型标识符之前。
这些属性有什么用?
2.函数属性可以帮助开发者把一些特性添加到函数声明中,从而可以使编译器在错误检查方面的功能更强大。__attribute__机制也很容易同非GNU应用程序做到兼容之功效。
#define GPJ2CON (*(volatile unsigned long *) 0xE0200280)
开始对于上面的语法不太理解,但通过拆分,我们可以看的更明白:
1、(unsigned long *)变量,代表“变量”是一个unsigned long类型的指针;例如:(unsigned long *)i ,语句中 i 即为 (unsigned long *)的一个指针;
2、volatile是一个修饰符,告诉编译器此段代码不要优化;因此,(volatile unsigned long *)变量,意思是未优化指针类型的变量;例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针;
3、(volatile unsigned long *) 0xE0200280,*此处把变量换成了固定地址,意思是(volatile unsigned long )指针指向固定的地址 0xE0200280
4、前面再加一个*(这个*在volatile 前面),即 (volatile unsigned long *) 0xE0200280 代表 GPJ2CON 是一个变量,我们既可以给固定地址中赋值,也可以从固定地址中取值。例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针,而 *i 即代表 i 中存储的值,我们既可以对其赋值,又可以从其中取值;
回归正题:#define PGAS (*((volatile unsinged long *)(x)))
其中,x 是一个常量,代表内存地址值,(volatile unsinged long )(x) 是把这个常量x强制转换为一个unsigned int 指针,(((volatile unsinged long *)(x)))表示的是地址x中的数据。