DSP

嵌入式C语言那点事(一)几个重要关键字

2019-07-13 21:07发布

一、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和中断中,至于多线程的问题有个帖子可供参考。 http://www.soft-bin.com/html/2010/07/30/concurrent-multithread-code-problem-and-volatile-and-atomic-opration.html   四、堆与栈(heap and stack) 1) 堆是由用户维护的。比如我们malloc一段空间,此时开辟的空间便在堆中,调用free时再释放。过于频繁的malloc与free会导致堆中产生碎片(一个空间的地址不连续),影响读写速度。 2) 栈是由编译器控制的,我们无需干涉。比如我们定义的局部变量或是调用了一个函数。以函数调用为例,此时系统会将现场数据(主要是部分寄存器中的数据,如PC的保存可以在调用结束时程序回归此处继续运行)压入栈内,将寄存器空出迎接被调函数中的一系列计算和控制。被调函数执行完后再进行出栈操作,流程继续。