嵌入式C语言学习笔记
一、static
关键字static,修饰变量时:
1、限制该变量的作用域:比如静态全局变量,只能在该模块中使用(本c文件中)。
2、决定该变量的存储位置:修饰为静态的变量,存储在静态数据区(非堆栈内)。(同比,全局变量也都存放在静态数据区中。)
带初值和不带初值的静态变量:(以TI DSP 54XX为例)
a.不带初值的静态变量,存储在.bss段中。
b.带初值的静态变量,存储在.bss段中,但其初值存储在.init中。在DSP Booter完成加载初始化后已经将init段的值赋值到.bss对应变量中。
关键字static,修饰函数时:限制该函数的作用域,仅能在本模块中使用(本c文件中)。
结论:static关键字对于使用者而言,最重要的是对变量或函数作用域的限制。
二、const
关键字const意味着“不变的”:
1、什么时候该用:定义一个函数时如果在输入参数前加上const,可以防止该输入变量被改写而引出的错误;函数定义时使用const可以起到函数API自注释作用;
2、怎么用:
以下摘录经典面试题中的例子:
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
三、volatile
关键字volatile意味着“易改变的”:
修饰为volatile的变量,编译器不会对其进行任何优化,每次求值时会到指定地址(物理或映射)去读取。因此适用于“并行设备的硬件寄存器(如:状态寄存器) ;一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) ;多线程应用中被几个任务共享的变量 ”,我个人只用到在IO和中断中。
四、堆与栈(heap and stack)
1) 堆是由用户维护的。比如我们malloc一段空间,此时开辟的空间便在堆中,调用free时再释放。过于频繁的malloc与free会导致堆中产生碎片(一个空间的地址不连续),影响读写速度。
2) 栈是由编译器控制的,我们无需干涉。比如我们定义的局部变量或是调用了一个函数。以函数调用为例,此时系统会将现场数据(主要是部分寄存器中的数据,如PC的保存可以在调用结束时程序回归此处继续运行)压入栈内,将寄存器空出迎接被调函数中的一系列计算和控制。被调函数执行完后再进行出栈操作,流程继续。