简介: 嵌入式笔试相关题目、考点。
一、static关键词
1)、用于声明函数体内的变量为静态局部变量,存储在静态数据存储区,在函数被调用过程中维持其值保持不变。
2)、在文件内(函数体外)被声明为静态的变量,可以被文件内的所有函数访问,但不能被其他文件的函数访问,是一个本地的局部变量。
3)、在文件内,被声明为静态的函数只可被文件内的其他函数调用,但不能被其他文件的函数调用。
二、const关键词
常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。不管出现在任何上下文都是为这个目的而服务的。
注意:非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。
1 | const int a; |
1 | /* const具有"左结合"性,即const修饰*,那么,不难理解,该句表示一个指向整数的常指针, |
1 | const char *p; //*p是const,p可变 |
三、数组越界问题
1 | void test() |
四、C语言中宏定义的使用
==预处理==命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对 它们进行编译,必须在对程序进行编译之前,先对程序中这些特殊的命令进行“预处理” 。经过预处理后,程序就不再包括预处理命令了,最后再由编译程序对==预处理==之后的源程序进行==编译==处理,得到可供执行的目标代码。C 语言提供的预处理功能有三种,分别为==宏定义==、文件包含和条件编译。
1 | // 不带参数的宏定义 |
参考文章:宏定义正确处理a++
五、递归算N!
1 |
|
六、中断服务子程序(ISR)
中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展-让标准C支持中断。其代表事实是,产生了一个新的关键字 interrupt(51即如此)。下面的代码就使用了interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
1 | __interrupt double compute_area (double radius) |
七、位运算符
1 | //5=>0101,7=>0111 |
八、register 关键词
寄存器存在于CPU内部,运算速度非常快, 因为内存中的数据必须载入寄存器才能计算。如果直接定义一个变量为寄存器变量,则少了载入等过程自然会快。对于频繁使用的变量可以把它放在寄存器中来提速度。
1.寄存器变量可以用来优化加速c语言程序
2.声名只需在类型前多加register 即可,eg register int quick; (quick 就是一个整形的寄存器变量)
3.register只是一个建议型关键字,能不能声名成功还取决于编译器(建议型的关键字还有c++中的 inline),若不幸没有请求成功,则变量变成一个普通的自动变量。
4.是无法对一个register变量取地址的(因为寄存器变量多放在寄存器而非内存中,内存有地址,而寄存器是无地址的)
1 | //全局变量最好不要占用寄存器,会影响程序的速度 |
九、volatile 关键词
volatile的作用是告知编译器,它修饰的变量随时都可能被改变,因此,编译后的程序每次在使用该变量的值时,都会从变量的地址中读取数据,而不是从寄存器中获取。
1 | /*volatile的本意是“易变的” |
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
十、C 库函数 - memset()
C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
1 | void *memset(void *str, int c, size_t n) |
十一、printf函数从右到左压栈
注意:函数printf从右到左压栈,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所以我们看见的结果是,从右边开始处理的。
1 |
|
十二、排序算法
冒泡排序:基本思想:比较相邻的两个数,如果前者比后者大,则进行交换。每一轮排序结束,选出一个未排序中最大的数放到数组后面。
1 |
|
参考文章:七大经典排序算法总结(C语言描述)