一、列举一个指针跑飞的例子:
1、 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象。
2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。
3. 地址溢出,常见错误为指针操作错误。我要着重说的是数组下标使用循环函数中循环变量,如果循环变量没控制好则会出现数组下标越界,意外修改系统的寄存器造成死机,这种情况下如果死机说明运气好,否则后面不知道发生什么头疼的事。
4. 无条件的死循环;比如使用while(x);等待电平变化,正常情况下x都会变成0,就怕万一,因此最好加上时间限制。
5. 看门狗没有关闭。有的单片机即使没使用看门狗开机时也有可能意外自动开启了最小周期的看门狗,导致软件不断复位,造成死机,这个要看芯片手册,最好在程序复位后首先应该显式清除看门狗再关闭看门狗。
6. 栈溢出。最难查找的问题,对于容量小的单片机,尽量减少函数调用层级,减少局部变量,从而减少压栈的时候所需的空间。
用的地方并且把占用RAM大的局部变量改成全局变量。
二、关键字const是什么含意?
只要能说出const意味着“只读”。
三、什么是预编译,何时需要预编译
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。
四、关键字static的作用是什么?
答案:定义静态变量
五、char * constp char const * pconst char *p 上述三个有什么区别?
答案:
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p
char * const p是一个char型指针,指针是常量,不允许修改,即类似p=q的语句是错误的; char const * p和const char * p是同一种char型指针,指针指向的字符被看作是常量,不允许修改,即类似*p = q的语句是错误的。
六、一个32位的机器,该机器的指针是多少位答案:
指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。
七、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
答案:while(1){}或者for(;;)
八、关键字volatile有什么含意?并给出三个不同的例子
Volatile 关键字告诉编译器不要持有变量的临时性拷贝。一般用在多线程程序中,以避免在其中一个线程操作该变量时,将其拷贝入寄存器。
九、进程之间通信的途径
答案:共享存储系统消息传递系统管道:以文件系统为基础
十、程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中。
答案:栈;静态区;堆