#define TCCR0 (*(volatile unsigned char*)0x53)
当要实现TCCR0=0x30,就要把0x53这个地址的内容修改成0x30,地址就是指针,强制类型转化(unsigned char *)0x53,这一句就表示0x53就是TCCR0的地址了 ,而*(unsigned char*)0x53就是取这个地址的值。
那为什么要用到volalite,一个变量用voliate关键字修饰,是要告诉编译器,这个变量的值随时可能发生变化,所以编译器每次都必须从变量对应的内存地址中获取该变量的值。
voliate的常用方式:
当一个变量表示某寄存器的值时,需要用voliate修饰,这样编译器就不会优化,所谓优化,就是每次去读取寄存器里面的数据,作为这个变量的值,问题在于,如果程序中已经改变了该变量的值,那么就会导致这个变量值跟寄存器里面的值不一样,从而导致冲突,用voliate就会避免这个问题,因为不会再去寄存器读取数据作为该变量的值了,而是直接去变量对应的内存地址去找。
本文解释了在C语言中使用volatile关键字的原因及其在嵌入式系统中的应用,特别是针对寄存器操作的情况。通过一个具体例子说明了如何将特定值赋给TCCR0寄存器。
1308

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



