C语言-寄存器的宏定义

#define TCCR0 (*(volatile unsigned char*)0x53)

当要实现TCCR0=0x30,就要把0x53这个地址的内容修改成0x30,地址就是指针,强制类型转化(unsigned char *)0x53,这一句就表示0x53就是TCCR0的地址了 ,而*(unsigned char*)0x53就是取这个地址的值。
那为什么要用到volalite,一个变量用voliate关键字修饰,是要告诉编译器,这个变量的值随时可能发生变化,所以编译器每次都必须从变量对应的内存地址中获取该变量的值。

voliate的常用方式:
 当一个变量表示某寄存器的值时,需要用voliate修饰,这样编译器就不会优化,所谓优化,就是每次去读取寄存器里面的数据,作为这个变量的值,问题在于,如果程序中已经改变了该变量的值,那么就会导致这个变量值跟寄存器里面的值不一样,从而导致冲突,用voliate就会避免这个问题,因为不会再去寄存器读取数据作为该变量的值了,而是直接去变量对应的内存地址去找。