杂碎知识记录

杂碎知识记录,第1张

笔试知识杂碎
  • 杂碎知识
    • 关于网络通信
    • 关于C++
    • 关于 *** 作系统
    • 关于算法
    • 关于嵌入式知识
    • 软件开发
    • 控制方面
    • 程序管理
    • 综合面

杂碎知识

遇到的问题的杂碎整理学习

关于网络通信

1.ping 过程中用到的协议
a. DNS 域名转化为ip地址
b. ARP 解析服务 由ip地址转化为MAC地址
c. ICMP internet control message protocol tcp/ip协议族的一个子协议,可用于在ip主机,路由器之间传递消息

2.拥塞控制
拥塞控制是TCP避免网络拥塞的算法。主要的目的是提高网络利用率、降低丢包率,保证网络资源对每条数据流的公平性。
主要包括四个部分:
慢启动:初始化拥塞窗口cwnd, 大小为n,慢开始门限ssthresh初始值
每收到一个ACK, cwnd大小加一,呈线性上升
每过一个往返延时时间RTT,cwnd=cwnd*2
当cwnd>=ssthreshs时,进入拥塞避免算法
拥塞避免算法:
没收到一个ACK,cwnd加1
每经过一个RTT的时长,cwnd增加一个MSS(报文)大小
快速重传:
当出现RTO超时,重传数据包,将ssthresh值设为当前cwnd的一半
将cwnd值设置为新的ssthresh的值
重新进入拥塞避免阶段
快速恢复算法:
(在进入快速恢复前,cwnd 和 sshthresh已被更新为:ssthresh = cwnd /2,cwnd = ssthresh)
cwnd设置为ssthresh+3,重传duplicated Acks指定的数据包
如果再收到duplicated acks,那么cwnd=cwnd+1
收到的是ACK而非duplicated Ack,将cwnd重新设置为ssthresh,进入拥塞避免状态

3.二三层交换机
OSI 模型分为7层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。二层交换机工作在OSI模型的二层,数据链路层,故称为二层交换机,主要功能包括物理编址,错误校验,帧序列以及流控。而三层交换机位于三层(网络层),是一个具有三层交换功能的设备,即带有三层路由功能的二层交换机。

4.三次握手和四次挥手
三次握手:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SENT状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
四次挥手:
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
5.2.4G协议及其特点

6.私有网段
因特网分配编号***会(IANA)保留了3块IP地址做为私有IP地址:
A类:10.0.0.0 ——— 10.255.255.255

B类:172.16.0.0——— 172.31.255.255

C类:192.168.0.0———192.168.255.255

7.网络协议

8.在TCP/IP模型中,数据从应用层到网际接口层所经历的传输格式:
报文或字节流-》传输协议分组-》ip数据报-》网络帧
9.网络状态
1xx(临时响应)表示临时响应并需要请求者继续执行 *** 作的状态代码
2xx(成功) 表示成功处理了请求的状态代码
3xx(重定向) 表示要完成请求需要进一步 *** 作。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

关于C++

1.程序开发过程中的六大原则
a、单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
避免一个类负责多个功能的实现,当发生更改时影响其他功能而致使复用成为不可能。
b、里氏替换原则:派生类(子类)对象能够替换其基类(父类)对象被调用。
即在程序中,任何调用基类对象实现的功能,都可以调用派生类对象来替换。
c、依赖倒置原则:程序设计应该依赖抽象接口,而不应该依赖具体实现。
即接口编程思想,接口是稳定的,实现是不稳定的,一旦接口确定,就不应该再进行修改了。根据接口的实现,是可以根据具体问题和情况,采用不同的手段去实现。
d、接口隔离原则:使用多个隔离接口,比使用单个接口要好。
经常提到的降低耦合,降低依赖,主要也是通过这个原则来达到的
e、迪米特法则:一个实体应当尽可能少的与其他实体之间发生相互作用。
f、开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

2.友元函数
友元是一种允许非类的成员函数访问类非公有成员的一种机制。
友元函数在类的作用域外定义,但需要在类体中加上关键字friend进行说明
作用:提高程序的效率——类的非公有成员,在类外访问需要通过函数调用和返回来实现,若定义友元函数,则不需要,效率会提高
注意点:

  1. 友元函数不是类的成员函数,在函数体中访问对象的成员,要用对象名加运算符”.”加对象成员名。
  2. 友元函数可以访问类中的所有成员,不受publicprivate protected 的限制
  3. 友元函数的作用域不是该类的作用域。
  4. 友元函数破坏了类的封装性,尽量少用

3.c++ 和c的区别
C是C++的子集。
C是面向过程编程,C++支持面向过程和面向对象的编程范式,支持多态,封装和继承。
C++支撑函数和运算符重载,而C不支持。
C++使用Namespace 来避免名称冲突而C没有
C++使用对象作为输入输出,例如cin,cout。C使用函数进行输入/输出,例如scanf,printf。
C++支持引用变量而C不支持。
C++支撑虚函数和友元函数而C不支持。
C++提供new内存分配和delete内存释放 *** 作符。C提供malloc()用于动态储存器分配功能,free()为储存器解除分配。
C++提供对异常处理的支持。C不直接支持错误处理。
C++用const修饰的变量可以用在定义数组时的大小,但是C不行

4.多态
静态多态:函数重载和运算符重载属于静态多态,复用函数名
动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
静态多态的函数地址早绑定 - 编译阶段确定函数地址
动态多态的函数地址晚绑定 - 运行阶段确定函数地址

5.封装
1.将属性和行为作为一个整体,表现生活中的事物
2.将属性和行为加以权限控制
封装的意义:在设计类的时候,属性和行为作为一个整体,来表现事物
6.继承

7.虚函数,虚函数表
定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
虚函数,是指被virtual关键字修饰的成员函数。
在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
每个包含虚函数的类都包含一个虚表vtbl,用于保护自己类中函数的地址
vptr指针指向vtbl,这个指针存放在各自的实例对象里。

8.纯虚函数
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。在基类中实现纯虚函数的方法是在函数原型后加"=0"

virtual void funtion1()=0

9.抽象类
抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层。
抽象类的定义:称带有纯虚函数的类为抽象类。
抽象类的作用:抽象类的主要作用是将有关的 *** 作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的 *** 作。所以派生类实际上刻画了一组子类的 *** 作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。
使用抽象类时注意:a、抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。b、抽象类是不能定义对象的。

10.const 修饰符
const关键字修饰指针,const在*号的左边还是右边(左定值,右定向)

const int a;      //a是一个常整形数
int const a;      //a是一个常整形数
const int *a;      //a是一个指向常整数型的指针(整形数是不可修改的,但指针可以)
int const *a;      //a是一个指向常整数型的指针(同上)
int *const a;      //a是一个指向整形数的常指针(指针保存内容不可修改)
int const * const a;  //a是一个指向常整形数的常指针(指针指向的整形数是不可修改的,同时指针也是不可修改的)

11.运算符优先级
第一级:圆括号【()】、下标运算符【[]】、分量运算符的指向结构体成员运算符【->】、结构体成员运算符【.】。

第二级:逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】。

第三级:乘法运算符【*】、除法运算符【/】、取余运算符【%】。

第四级:加法运算符【+】、减法运算符【-】。

第五级:左移动运算符【<<】、右移动运算符【>>】。

第六级:关系运算符【< > <= >= 】。

第七级:等于运算符【==】、不等于运算符【!=】。

第八级:按位与运算符【&】。

第九级:按位异或运算符【^】。

第十级:按位或运算符【|】。

第十一级:逻辑与运算符【&&】。

第十二级:逻辑或运算符【||】。

第十三级:条件运算符【?:】。

第十四级:赋值运算符【= += -= *= /= %= >>= <<.= &= |= ^=】。

第十五级:逗号运算符【,】

11.静态库和动态库的区别
.命名方式不同:
静态库libxxx.a:库名前加”lib”,后缀用”.a”,“xxx”为静态库名。
动态库libxxx.so:库名前加”lib”,后缀变为“.so”。
.链接时间不同:
静态库的代码是在编译过程中被载入程序中。
动态库的代码是当程序运行到相关函数才调用动态库的相应函数
.链接方式不同:
静态库的链接是将整个函数库的所有数据在编译时都整合进了目标代码。
动态库的链接是程序执行到哪个函数链接哪个函数的库。(用哪个链接哪个)
静态库:
优点是:在编译后的执行程序不再需要外部的函数库支持,运行速度相对快些;
缺点是:如果所使用的静态库发生更新改变,你的程序必须重新编译。
优点是:动态库的改变并不影响你的程序,所以动态函数库升级比较方便;
缺点是:因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。

12.面向对象和面向过程
面向对象就是:把数据及对数据的 *** 作方法放在一起,作为一个相互依存的整体——对象。对同类对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信。程序流程由用户在使用中决定。对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。
面向过程是“自上而下”的设计语言,先定好框架,再增砖添瓦。通俗点,就是先定好main()函数,然后再逐步实现mian()函数中所要用到的其他方法。

13.浅拷贝和深拷贝

浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
深拷贝拷贝多层,每一级别的数据都会拷贝
C++中浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。

关于 *** 作系统

1.父子进程
fork()
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
在linux中fork()函数是非常重要的函数,它的作用是从已经存在的进程中创建一个子进程,而原进程称为父进程。
fork 方法被调用,成功就会有两次返回;
在父进程中返回一次,返回的是子进程的pid(非0)
在子进程中返回一次,返回值为0
调用fork(),当控制转移到内核中的fork代码后,内核开始做:
分配新的内存块和内核数据结构给子进程。
将父进程部分数据结构内容拷贝至子进程。
将子进程添加到系统进程列表。
fork返回开始调度器,调度。
fork之后父子进程的执行顺序是不确定的,父子进程是并发执行的,内核能够以任意的方式交替执行他们的逻辑控制流中的指令。
每个进程都会有以下类型的数据:
全局数据(.data .bss)
栈区数据(.stack)
堆区数据(.heap)
复制进程必须要 *** 作系统支持
因为父进程和子进程是独立的进程,他们都有自己私有的地址空间,当父进程或者子进程单独改变时,不会影响到彼此,类似于c++的写实拷贝的形式自建一个副本
写时拷贝技术:不修改某些区域就共享,一旦试图修改就利用写时拷贝技术。
2.顺序储存的优点
3.中断
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行
硬件中断:
可屏蔽中断、非可屏蔽中断、处理器中断、伪中断
软件中断:由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。
是一条CPU指令,用以自陷一个中断。
4.不会产生内存碎片的储存管理
分段式储存管理
5.内核态和用户态
用户态和内核态是 *** 作系统的两种运行级别,两者最大的区别就是特权级不同
用户态拥有最低的特权级,内核态具有较高的特权级
运行在用户态的程序不能直接访问 *** 作系统内核结构和数据
*** 作系统数据都是存放于系统空间的,用户态进程的数据是存放在用户空间的,分开来存放就是为了让系统的数据和用户的数据互不干扰,保证系统的稳定性,分开存放,管理上比较方便,并且对于两部分数据的访问就可以进行控制,避免用户态程序恶意修改 *** 作系统的数据和结构
当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。
两种状态的转换方式:
系统调用
异常
外围设备中断
6.fork之后子进程和父进程的文件共享
当一个进程fork之后,整个进程表项被复制,包括所有的文件描述符。
但是文件表项并不会被复制。父进程和子进程共享相同的文件表项。
 注意:文件的偏移量是储存在文件表项中,所以当一个进程读取了文件之后,另一个进程读取相同的文件会从上一个进程停止的地方开始读取。
7.相同进程下的线程不能共享的是
线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
不能共享的部分是:线程ID,寄存器组的值,线程的堆桟,错误返回码,线程的信号屏蔽码,线程的优先级
8.linux下外部中断
完成中断三要素:中断号,中断服务函数,中断触发方式(电平触发,边沿触发)
获取中断号 gpio_to_irq

int gpio_to_irq(unsigned gpio)
函数功能: 获取中断号
返回值: 成功返回对应GPIO的中断号irq

注册中断request_irq

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev)
函数功能: 注册中断
形 参: irq --中断号,gpio_to_irq函数返回值。
    handler --中断服务函数。
     服务函数原型:typedef irqreturn_t (*irq_handler_t)(int, void *);
    flags --中断触发方式。
     #define IRQF_TRIGGER_RISING 0x00000001 //上升沿
     #define IRQF_TRIGGER_FALLING 0x00000002 //下升沿
     #define IRQF_TRIGGER_HIGH 0x00000004//高电平
    #define IRQF_TRIGGER_LOW 0x00000008//低电平

    #define IRQF_SHARED 0x00000080 //共享中断
   name --中断注册标志。
   dev --传给中断服务函数的参数。
返回值: 成功返回0,失败返回其它值。

中断服务函数

typedef irqreturn_t (*irq_handler_t)(int, void *);
函数功能: 中断服务函数
形 参: 第一个参数为中断号;第二个参数为注册函数传入的参数dev
返回值:
   enum irqreturn {
    IRQ_NONE = (0 << 0), //如果不是本中断的则返回这个值,只在共享中断中使用
    IRQ_HANDLED = (1 << 0), //正确执行中断程序返回这个值,常用
    IRQ_WAKE_THREAD = (1 << 1), //表示去唤醒中断处理者的线程
  };

注销free_irq

free_irq(unsigned int irq, void *dev_id)
函数功能: 注销中断
形 参: irq --中断号,gpio_to_irq函数返回值。
   dev --传给中断服务函数的参数。需和注册时保持一致
  1. 进程和线程的区别
    进程的本质:PCB(process control block),PCB包括了:进程ID,进程状态,优先级,记账信息(CPU使用次数和执行间隔),上下文信息,一组内存(指定进程需要使用的资源)
    根本区别:进程是 *** 作系统进行资源分配的最小单元,线程是 *** 作系统进行运算调度的最小单元。
    从属关系不同:进程中包含了线程,线程属于进程
    开销不同:进程的创建、销毁和切换的开销都远大于线程
    拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源
    控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程及其所在进程的子线程
    CPU利用率不同:进程的CPU利用率低,因为上下文切换开销较大,而线程CPU利用率较高,上下文的切换速度快
    *** 纵者不同:进程的 *** 纵者一般是 *** 作系统,线程的 *** 纵者一般是编程人员

10.死锁产生的四个条件,如何避免死锁
产生条件:
互斥条件,同一时间某一资源仅为一进程所占有
请求和保持条件,当进程因请求资源而阻塞时,对已获得的资源保持不放
不剥夺条件:进程已获得的资源在未使用完前,不能剥夺,只能在使用完时由自己释放
环路等待条件:在发生死锁时,必然存在一个进程-资源的环形链
预防死锁:
资源一次性分配
只有一个资源得不到分配,也不给这个进程分配其他资源
可剥夺资源
资源有序分配,系统给每类资源赋予一个编号,每一个进程按照编号递增的顺序请求资源,释放则相反

11.线程同步的方法
临界区(是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占)
事件
信号量(信号量是维护0到指定最大值之间的同步对象。信号量状态在其计数大于0时是有信号的,而其计数是0时是无信号的。信号量对象在控制上可以支持有限数量共享资源的访问。

信号量的特点和用途可用下列几句话定义:
(1)如果当前资源的数量大于0,则信号量有效;
(2)如果当前资源数量是0,则信号量无效;
(3)系统决不允许当前资源的数量为负值;
(4)当前资源数量决不能大于最大资源数量。

互斥量(采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。)

12.多线程的好处
更好地利用CPU
简单的程序设计
程序更多的响应
多任务下CPU资源分配公平性

13.linux 的开机过程
了解系统启动过程的原因:主动让软件开机自启,电脑不能正常启动,排查出错的环节,排查黑客植入木马程序,到底将木马放到哪里

开机自检(BIOS,basic input output system)
启动顺序 下一阶段的启动程序具体放在哪个设备里
主引导记录MBR 告诉计算机到硬盘的那个位置去找 *** 作系统 512 字节
启动管理器grub 读取主引导记录前446字节的机器码后,不再把控制权转交给某一个分区,而是运行事先安装的“启动管理器”(boot loader),由用户选择启动哪一个 *** 作系统
*** 作系统, *** 作系统的内核载入内存,运行第一个程序systemd,执行默认target配置文件/etc/systemd/system/default.target
运行级别 runlevel 单用户,多用户,图形界面
用户登陆 首先读取/etc/profile 配置文件 ,加载/etc/profile.d/*.sh,再去用户的家目录,读取~/.bash_profile,然后去 ~/.bashrc,最后读取/etc/bashrc

1、主机加电自检,加载 BIOS 硬件信息。
2、读取 MBR 的引导文件(GRUB、LILO)。
3、引导 Linux 内核。
4、运行第一个进程 init (进程号永远为 1 )。
5、进入相应的运行级别。
6、运行终端,输入用户名和密码。

13.什么是linux内核
Linux 系统的核心就是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并 根据需要执行软件
系统内存管理
应用程序管理
硬件设备管理
文件系统管理

关于算法

1.稳定排序算法
插入排序,冒泡排序, 二叉树排序,二路归并排序

2.非稳定排序算法
选择排序,希尔排序,快速排序, 堆排序

3.凸优化

关于嵌入式知识

1.常用的通讯方式及其特点
uart :通用异步串行数据总线
IIC :同步串行总线,多主设备,通过发地址选择器件 由数据线SDA和时钟SCL构成的串行总线,可发送和接受数据。在传输过程中共有三种类型信号,开始信号,结束信号,应答信号。这些信号中只有起始信号是必须的。
can :控制器局域网络 串行半双工接口,具有优先级,错误处理,故障隔离等功能,是国际上应用最广泛的现场总线之一。
8080/6800: intel 总线/moto 总线 并行接口常用于MCU,小尺寸液晶显示屏
SPI: MISO,MOSI,SCLK,CS四线通信,应用在EEPROM,FLASH,实时时钟,AD转化器等器件之间的通信等。

SPI,IIC是同步通信 uart 是异步通信 usart是同步/异步通信
IIC半双工,SPI全双工,uart是全双工

2.memcy, strncpy, strcpy
void *memcpy( void *dest, const void *src, size_t count );
char *strcpy(char *dest, const char *src);
char * strncpy(char *dest, const char *src, size_t n);
memcpy 不像strncpy函数一样只能拷贝字符,memcpy函数可以拷贝任意类型的内容
memcpy 如果拷贝在内容超过目的空间大小,就会溢出,编译器会报出警告
尽量避免dest和src所指向的地址有内存重叠的部分
不像strcpy(),strncpy()不会向dest追加结束标记’\0’
strcpy 函数在拷贝的时候,如果遇到 ‘\0’,那么拷贝直接结束
使用 strcpy 的时候 strDestination 内存大小比 strSource 内存大小更小,程序运行会崩溃,strcpy 函数在字符串拷贝的时候并不会检查两个字符串大小

3.NULL == strDest是将 常量写在表达式的左边,如果将表达式写错了,写成了赋值,则马上报错;如果 将表达式改成 strDest ==NULL,在写的过程中 漏写了 一个=,变成了 strDest = NULL,则检查不出错误来,可能会出现意想不到的错误
4.写中断函数注意事项:
中断函数代码尽量简洁,避免在中断函数内调用其他自定义函数;
任何情况下都不能直接调用中断函数
5.什么是可重入性

可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断) 。可重入 函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。 可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据 。

6.中断函数必须采用可重入函数
在实时 *** 作系统中,常常会出现多个task同时调用同一个function 的状况。改function必须设计成可重入函数
IO函数是不可重入函数,中断中不能使用scanf和printf,malloc和free函数

7.RS485和RS232的区别
485是半双工通信只需要RX,TX两根线通信,通过差分信号传输
232是全双工通信至少需要RX,TX,GND三根线通信,通过同分信号传输
485可以一对多,232只能点对点
485采用的是电流环方式,抗干扰强,传输距离远
232是电压型信号,传输距离较短
232:-3至-15V 逻辑1 +3至15V逻辑0
485: 2至6 逻辑0 -2至-6逻辑1

8.stm32通用定时器中断步骤
使能定时器时钟
初始化定时器,配置ARR(重装载值),PSC(分頻系数)
开启定时器中断,配置中断NVIC
使能定时器
编写中断服务函数
T(out)=(ARR+1)*(PSC+1)/Tclk

9.stm32 gpio中断功能步骤
初始化GPIO,配置io口为输入
开启IO口复用时钟
设置IO口和中断线的映射关系
初始化线上中断,设置触发条件
配置NVIC IRQ通道,并使能中断
编写中断服务函数
清除中断标志位

软件开发

1.设计模式
创造型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式
结构模式:
适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
行为模式:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
2.开发模式
传统瀑布开发模式
基于V模型开发模式

基于W模型开发模型

敏捷开发流程 快速迭代,积极反馈

控制方面

1.PLC编程
PLC编程是一种数字运算 *** 作的电子系统,专为在工业环境下应用而设计。它采用可编程序的存储器,用来在其内部存储执行逻辑运算、顺序控制、定时、计数和算术运算等 *** 作的指令,并通过数字式、模拟式的输入和输出,控制各种类型的机械或生产过程。可编程序控制器及其有关设备,都应按易于使工业控制系统形成一个整体,易于扩充其功能的原则设计。
2.模糊控制器

程序管理


综合面

1.你是什么样的人,举例
2.遇到的最大困难是什么,怎么解决,从中学到什么
3.你的职业规划

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/3002769.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存