1.什么是动态库和静态库
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
2.串口如何发送浮点类型数据
直接把float数据拆分为4个unsigned char(由于数字没法拆分,所以只能用指针的),发过去,在合并为float。
3.A传输一个buffer给B串口,请问B接收后如何解析出来
缓冲区、一字节一字节
4.操作系统和编译器如何区分全局变量和局部变量?
操作系统只管调度进程,编译器通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在栈里面 。
5.Makefile文件的作用?
makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
6.键字registr,typdef的作用?
register关键字的作用:
请求CPU尽可能让变量的值保存在CPU内部的寄存器中,减去CPU从内存中抓取数据的时间,提高程序运行效率。
使用register关键字应注意什么?
1.只有局部变量才可以被声明用register修饰
(register不能修饰全局变量和函数的原因:全局变量可能被多个进程访问,而用register修饰的变量,只能被当前进程访问)
2.不能用取地址获取用register修饰的变量的地址(原因:变量保存在寄存器中,而取地址获取的地址的是内存的地址)
3. 用register修饰的变量一定要是CPU所接受的数据类型
typedef关键字的作用:
给数据类型定义一个新名字,
1. 提高了移植性
2. 简化复杂的类型声明,提高编码效率
3. 解释数据类型的作用
7.异步IO和同步IO区别
1. 同步,就是调用一个功能,该功能没有结束前,我死等结果。
2. 异步,就是调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)。
3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。scanf
4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过select通知调用者
异步IO模型需要一个消息循环,在消息循环中,主线程不断地重复“读取消息-处理消息”这一过程
8.中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。
具代表性的是,产生了一个新的关键字__interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt void compute_area (void)
{
double area = PI * radius * radius;
printf(" Area = %f", area);
return area;
}
ISR不可能有参数和返回值的!
ISR尽量不要使用浮点数处理程序,浮点数的处理程序一般来说是不可重入的,而且是消耗大量CPU时间的!!
printf函数一般也是不可重入的,UART属于低速设备,printf函数同样面临大量消耗CPU时间的问题!
9.整数数组清零:bzero(),memset()。
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
extern void bzero(void *s, int n);
参数说明:s 要置零的数据的起始地址; n 要置零的数据字节个数,且包括‘\0’。
10.宏定义是在预编译阶段被处理的。
11.Norflash与Nandflash的区别
(1)、NAND闪存的容量比较大
(2)、由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具备特殊的功能,
如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据到地址0的SRAM中。
(3)、NAND Flash一般地址线和数据线共用,对读写速度有一定影响。NOR Flash闪存数据线和地址线分开,
所以相对而言读写速度快一些。
(4)nor没有坏块。
12.内存管理MMU的作用
它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
*内存分配和回收
*内存保护
*内存扩充
*地址映射
13.ROM是只读存储器,掉电不丢失
RAM是读写存储器,掉电丢失
14.SRAM:CPU的缓存就是SRAM,静态的随机存取存储器,加电情况下,不需要刷新,数据不会丢失
DRAM,动态随机存取存储器最为常见的系统内存,需要不断刷新,才能保存数据
SDRAM:同步动态随机存储器,即数据的读取需要时钟来同步。
15.编译和链接有什么不同?(如外部符号的处理)
编译生成的是目标文件(object *.o);
编译过程中对于外部符号不做任何解释和处理。外部符号对应的就是“符号”
链接生成的是可执行程序
链接将会解释和处理外部符号。外部符号对应的是地址
c语言编译过程:
预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
编译, 检查语法,生成汇编 ( test.s main .s)
汇编, 汇编代码转换机器码 (test.o main.o)
链接 链接到一起生成可执行程序 a.out
16.请列举常用的串行通信方式(两种以上),并简述串行通信和并行通信不同之处、优缺点。
异步通信和同步通信;并行速度快,串行口线间干扰小
17.路由协议:网关-网关协议,外部网关协议,内部网关协议(RIP-1、RIP-IGRP、EIGRP、IS-IS和OSPF)
18.WLAN:无线局域网络:利用射频技术进行数据传输的系统。
WLAN是指应用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。无线局域网本质的特点是不再使用通信电缆将计算机与网络连接起来,而是通过无线的方式连接,从而使网络的构建和终端的移动更加灵活。
19.定义一个两个参数的标准宏MAX,总是输出最大值。
#define MAX(a,b) ((a)>(b)?(a):(b))
20.进程调度策略。
先来先服务,优先级,时间轮转法,多级反馈队列
21.时间换空间、空间换时间的例子。
冒泡排序 --- 时间换空间
快速排序,堆排序 --- 空间换时间
22.进程间通信方式:管道、命名管道、消息队列、共享内存、信号、信号量、套接字。
(1)、 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
进程的亲缘关系通常是指父子进程关系。pipe
(2)、有名管道 (mkfifo) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
(3)、信号量(semget ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
(4)、消息队列( struct msg_queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。
消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(5)、信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
(6)、共享内存( mmap ) :共享内存就是映射一段能被其他进程所访问的内存,
这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,
如信号两,配合使用,来实现进程间的同步和通信。
(7)、套接字( socket ) : 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
23.大小端格式问题。
大端模式 小端模式
地址:0x00 0x01 0x02 0x03 地址:0x00 0x01 0x02 0x03
数据:0x12 0x34 0x56 0x78 数据:0x78 0x56 0x34 0x12
24.由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack):由上到下, 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap): 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(static): 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,
未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后有系统释放 。
4、文字常量区: 常量字符串就是放在这里的, 程序结束后由系统释放。
5、程序代码区: 存放函数体的二进制代码。
24.物理地址,虚拟地址,逻辑地址和总线地址
26.tcp/udp属于哪一层?
传输层
27.tcp可靠的四大手段:
顺序编号:tcp在传输文件的时候,会将文件拆分为多个tcp数据包,每个装满的数据包大小大约在1k左右,tcp协议为保证可靠传输,会将这些数据包顺序编号
确认机制:当数据包成功的被发送方发送给接收方,接收方会根据tcp协议反馈给发送方一个成功接收的ACK信号,信号中包含了当前包的序号
超时重传:当发送方发送数据包给接收方时,会为每一个数据包设置一个定时器,当在设定的时间内,发送方仍没有收到接收方的ACK信号,会再次发送该数据包,直到收到接收方的ACK信号或者连接已断开
校验信息:tcp首部校验信息较多,udp首部校验信息较少
27.PPP协议属于哪一层协议?
--》数据链路层
28.应用程序ping发出的是ICMP请求报文
29.中断活动的全过程大致为:
请求、响应、保护现场、中断处理、恢复现场、中断返回。
30.如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和
什么是线程池:
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务,以默认的优先级运行,线程池中的线程达到最大数时,其他线程就会排队等候
31.操作系统的内存分配一般有哪几种方式,各有什么优缺点?
32.ICMP(ICMP协议对于网络安全具有极其重要的意义)功能主要有:
ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息
其功能主要有:
· 侦测远端主机是否存在。
· 建立及维护路由资料。
· 重导资料传送路径(ICMP重定向)。
· 资料流量控制。
33.int (*s[10])(int) 表示的是什么啊?
答案:int(*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。
33.列举几种进程的同步机制,并比较其优缺点。答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统
34.进程死锁的原因
答案:资源竞争及进程推进顺序非法
36.在c语言库函数中将一个字符转换成整型的函数是atol()吗,这个函数的原型是什么?
答案:函数名: atol 功 能: 把字符串转换成长整型数 用 法: long atol(const char *nptr); 程序例: #include <stdlib.h> #include <stdio.h> int main(void){ long l; char *str = "98765432"; l = atol(lstr); printf("string= %s integer = %ld\n", str, l); return(0); }
37.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
答案:c用宏定义,c++用inline
38.do……while和while……do有什么区别?
答案:前一个循环一遍再判断,后一个判断以后再循环。