单片机 学习要点

一、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

 

posted @ 2014-02-23 21:41  侠梦千年  阅读(221)  评论(0编辑  收藏  举报