单片机 学习要点
一、volatile 修饰符
volatile标识一个变量意味着这个变量可能被非本程序的其他过程改变,例如某个访问这一变量的某中断程序。为变量加上这一标识可以禁止编译器的优 化,使程序正确地按设计者的意图运行。例如下面的程序,我们将intr_func注册为中断函数,某个中断发生时触发这一函数:
unsigned char flag = 1; int main(int argc, char **argv) { reg_intr(XXX, intr_func); while(flag) { printf("hello\n"); } return 0; } void intr_func(void) { flag = 0; }
当不加volatile时,编译器会直接将while条件中的flag换成1,因此即使中断发生也无法结束循环;如果给flag加上volatile标识,编译器就不会做前述的优化,程序得以按设计的意图工作。
二、字符串相加
两个直接字符串之间不能添加 + 号,因为字符串相当于一个字符指针,添加加号之后会提示,在char* 之间不能用 符号‘+’ 操作。
比如说: printf(“abc" "def"); 这点跟C#是有区别的!谨记!
三、编译日期用法 __DATE__, __TIME__
#define BuildTime __DATE__" "__TIME__
在编译该文件的时候,会自动将BuildTime宏定义成 当前的编译时间,然后每次调用的时候都是这个值,如果源文件比较大。那么每个文件的编译时间会有明显差别。
四、编译
Code, RO-data,RW-data,ZI-data
Code为程序代码部分
RO-data 表示 程序定义的常量const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
Program Size: Code="18248" RO-data=320 RW-data=260 ZI-data=3952
Code, RO-data,RW-data ............flash
RW-data, ZIdata...................RAM