嵌入式开发基础知识总结

196 阅读8分钟

嵌入式开发基础知识总结

  1. 请问程序中局部变量、全局变量、动态申请的数据分别存储在哪里?
  • 程序的局部变量存在于栈区、全局变量存在于静态区、动态申请数据存在于堆区。
  1. 请问关键字const有什莫含义?
  • 只读
  • 使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改
  1. 请问什么是预编译,何时需要预编译?
  • 不经常改动的大型代码体,程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译器选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
  • 预编译指令指示了在程序正式编译之前就由编译器进行的操作,可以放在程序中的任何位置。
  1. 请问局部变量能否和全局变量重名?
  • 能,局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。
  1. 请问引用与指针有什么区别?
  • 引用必须初始化,指针不必
  • 引用初始化以后不能被改变,指针可以改变所指的对象
  • 不存在指向空值的引用,但是存在指向空值的指针
  1. 一个32位的机器,该机器的指针是多少位?
  • 指针是多少位只要看地址总线的位数就行了。32的数据总线,所以指针的位数就是4个字节。
  1. 请问以下代码有什么问题?
int main(){
char a;
char *str=&a;
strcpy(str, "hello");
printf(str);
return 0;
}
  • 没有为str分配内存空间将会发生异常,问题出在将一个字符串复制进一个字符变量指针所指地址,即指向的内存空间不够大,无法存储"hello"这个字符数组。 更改后的代码如下:
int main(){ 
char str[6]; // 内存空间要足够存储字符串 "hello" 和 空字符 '\0' 
strcpy(str, "hello");
printf("%s", str); return 0; 
} 
  • 注意,在使用printf函数输出字符串时,需要使用格式化字符串,即%s,这样才能正确输出字符串。
  1. c语言中,关键字static有那三个明显的作用?
  • 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变
  • 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问
  • 在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用。
  1. 请写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
  • #define MIN(A,B)((A)<=(B)?(A):(B))
  1. 用变量a给出下面的定义:
  • 一个有10个整型数的数组
  • 一个有10个指针的数组,该指针是指向一个整型数的数组
  • int a[10];
  • int *a[10];
  1. 请使用c语言中的#define来定义一个常量来表示一年有多少秒?
  • #define SECONDS_PER_YEAR 606024*365UL
  • UL:这是后缀,表示常量的类型。在这种情况下,UL表示无符号长整型(unsigned long)。这样的后缀可以确保宏定义的常量的数据类型与需要使用的上下文一致
  1. 请问进程和线程有什么区别?
  • 进程:资源分配的最小单位
  • 线程:程序运行的最小单位
  • 进程有自己的地址空间,当一个进程建立系统就会为它分配地址空间,而线程是共享进程的数据,使用相同的地址空间。
  • 一个进程中包含多个线程,一个进程死掉不会影响其他进程;一个线程死掉,整个进程都死了
  • 线程之间的通信更加方便,同一进程下的线程共享全局变量,静态变量等,而进程通信需要以IPC方式进行。进程之间要保持相对独立,一个进程不能随便访问另一个进程的地址空间(信号通信、管道通信、消息队列、共享内存、socket)。
  1. 请问预处理器标识#error的作用是什么?
#ifdef XXX
#error "XXX has been defined"
#else 
...
#endif

这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义。 14. 请解释以下三个变量声明的含义:

  • int const *p;
  • int const *p 中const修饰的是指针p,表示指针p的值不能改变,而p(即地址)是可以改变的。
  • int * const p;
  • int * const p中const修饰的p(即地址)是常量,不可改变,但是*p 的值可以改变。
  1. 请简述OSI七层模型和TCP/IP模型的组成?
  • OSI模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
  • TCP/IP四层模型:应用层、传输层、网络层、网络接口层。
    • TCP/IP五层模型:应用层、传输层、网络层、数据链路层、物理层 image.png
  1. 请问TCP与UDP协议有什么区别?
  • TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接;
  • TCP提供可靠的服务,它通过校验和、丢包时的重传控制、序号标识、滑动窗口、确认应答、实现可靠传输,即传输的数据无差错、不丢失、不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
  • UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信或广播通信场景
  • 每一条TCP只能是点到点的:UDP支持一对一、一对多、多对一和多对多的交互通信方式;
  • TCP对系统资源要求多,UDP对系统资源要求较少。
  1. 请写一下strcpy函数的代码?
#include <stdio.h>
char * strcpy (char *dest,const char *src){
    char *p = dest;
    while (*src != '\0'){
    *dest = *src;
    dest++;
    src++;
    }
    *dest = '\0';//添加字符串结尾的空字符
    return p;
}

int main(){
    char source[] = "Hello, world!";
    char destination[20];
    
    strcpy(destination, sourcce);
    
    printf("Copied string: %s\n",destination);
    
    return 0;
}

在这个示例中,strcpy 函数接收两个参数:dest(目标字符串的指针)和 src(源字符串的指针)。 函数将 src 指针所指向的字符串复制到 dest 指针所指向的位置,直到遇到源字符串的结束标志(\0)。 最后,函数返回目标字符串的指针。

main 函数中,我们创建了一个源字符串 source 和一个目标字符串 destination。 然后,我们调用 strcpy 函数将源字符串复制到目标字符串,并打印结果。

请注意,在实际的应用程序中,为了避免缓冲区溢出等问题,我们应该确保目标字符串具有足够的空间来容纳源字符串及其终止符。

  1. 如何引用一个已经定义过的全局变量?
  • 可以用引用头文件的方式,也可以用extern关键字
  1. 全局变量可不可以定义在可被多个.c文件包含的头文件中?
  • 可以,在不同的c文件中以static形式来声明同名全局变量
  1. 请问Internet物理地址和IP地址转换采用什么协议?
  • ARP(Address Resolution Protocol)地址解析协议
  1. 请问IP地址的编码分为那俩部分?
  • IP地址有两部分组成,网络号和主机号。不过要和子网掩码按位与上之后才能区分哪些是网络位哪些是主机位。
  1. 从在浏览器中输入百度网址到看到百度首页,这个过程中间经历了什么?
  • 按照时间顺序
  • 1.浏览器获取用户在地址栏输入的域名。
  • 2.浏览器将域名发送给DNS域名系统,请求解析。
  • 3.DNS解析域名得到相应的IP,返回给客户端浏览器。
  • 4.客户端浏览器根据IP向服务器发起TCP三次握手,建立TCP连接。
  • 5.浏览器向服务器发送http请求,请求百度首页。
  • 6.服务器通过http响应向浏览器返回百度首页文件
  • 7.释放TCP连接
  • 8.浏览器解析html文件,根据文件内容获取css、js等资源文件,将页面渲染展示给用户。
  1. 上述过程都涉及到哪些网络协议: -TCP/IP五层模型中网络层及以上用到的协议:
  • 应用层:Http、DNS、Https
  • 传输层:TCP、UDP
  • 网络层:IP、ARP
  1. 请写出下列代码的输出内容

image.png 25. 请解释时钟周期、状态周期、机器周期和指令周期?

  • 时钟周期:也称为震荡周期,定义为时钟频率的倒数(外接晶振的倒数)是单片机中最基本、最小的时间单位
  • 状态周期:它是时钟周期的2倍
  • 机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读写等。它由12个时钟周期组成。
  • 指令周期:指CPU执行一条指令所需要的时间。一般一个指令周期含有1-4个机器周期。
  1. 请简述你对单片机空闲与掉电模式的了解?
  • 空闲模式:除CPU处于休眠状态之外,其余硬件全部处于活动状态。
  • 掉电模式:外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断继续工作。
  1. 请问51单片机如何模拟I2C总线通信?
  • 单片机在模拟I2C通信时,需要写出如下关键的程序:总线的初始化、启动信号、应答信号、停止信号、写一个字节、读一个字节。
  1. 请简述数码管的显示原理?
  • 电路方面有共阴极和共阳极之分,让数码管显示不同的数字就是先定义一个保存16进制数的数组,然后再程序中把这个16进制数赋值给相应的引脚。
  1. 请问什么是看门狗?
  • 单片机的工作有可能受到外部磁场的影响,造成程序跑飞陷入死循环,产生的一种专门用于监测单片机程序运行状态的信片,俗称看门狗。
  1. 请简述看门狗的工作原理?
  • 看门狗有两个重要信号:时钟输入和复位输出
  • 电路工作时,CPU送出时钟信号给看门狗,即喂狗。如果系统出现故障,CPU无法送出连续的时钟信号,看门狗即输出复位信号给CPU,复位系统。8 31.请简述A/D电路组成和工作原理?
  • A/D电路由采样、保持、量化和编码四部分组成。
  • 由于模拟信号在时间上是连续信号,数字信号是离散信号,A/D转换首先要按照那奎斯特采样定理对模拟信号进行采样;由于数字信号在数值上是不连续的,数字信号的取值只有有限个数值,因此需要对采样后的数据进行量化,使其量化到有效电平上,编码就是对量化后的数值进行多进制到二进制的转换。 32.请问进程和线程都有什么优缺点?
  • 线程执行开销小,但是不利于资源的管理和保护。
  • 进程执行开销大,但是能够很好的进行资源管理和保护,可以跨机器迁移。
  1. 合适使用多进程、何时使用多线程?
  • 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
  • 要求效率高,频繁切换时,资源的管理要求不是很高时,使用多线程。
  1. 请问线程是否具有相同的栈堆?
  • 真正的程序执行都是由线程完成的,程序启动的时候操作系统就帮你创建了一个主线程。
  • 每个线程都有自己的堆栈,
  1. 单片机使用外部中断时应注意什么?
  • 把某个引脚设置为外部中断后,该引脚为输入模式,由于没有内部上拉,必须外接一个上拉电阻,确保引脚不被悬空;除了引脚连接模块的设置,还需要设置VIC模块,才能产生外部中断,否则中断只能反映在EXTINT寄存器中。